diff --git a/crates/aiken-lang/src/ast.rs b/crates/aiken-lang/src/ast.rs index df6087ad..fea4e2f0 100644 --- a/crates/aiken-lang/src/ast.rs +++ b/crates/aiken-lang/src/ast.rs @@ -400,6 +400,19 @@ impl TypedDataType { doc: None, } } + + pub fn is_never(&self) -> bool { + self.name == well_known::NEVER + && self.constructors.len() == well_known::NEVER_CONSTRUCTORS.len() + && self.location == Span::empty() + && self + .constructors + .iter() + .zip(well_known::NEVER_CONSTRUCTORS) + .all(|(constructor, name)| { + name == &constructor.name && constructor.arguments.is_empty() + }) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] diff --git a/crates/aiken-lang/src/ast/well_known.rs b/crates/aiken-lang/src/ast/well_known.rs index 497b9d4c..74e4a71e 100644 --- a/crates/aiken-lang/src/ast/well_known.rs +++ b/crates/aiken-lang/src/ast/well_known.rs @@ -16,6 +16,8 @@ pub const LIST: &str = "List"; pub const MILLER_LOOP_RESULT: &str = "MillerLoopResult"; pub const OPTION: &str = "Option"; pub const OPTION_CONSTRUCTORS: &[&str] = &["Some", "None"]; +pub const NEVER: &str = "Never"; +pub const NEVER_CONSTRUCTORS: &[&str] = &["__hole", "Never"]; pub const ORDERING: &str = "Ordering"; pub const ORDERING_CONSTRUCTORS: &[&str] = &["Less", "Equal", "Greater"]; pub const PAIR: &str = "Pair"; @@ -297,6 +299,17 @@ impl Type { }) } + pub fn never() -> Rc { + Rc::new(Type::App { + public: true, + contains_opaque: false, + name: NEVER.to_string(), + module: "".to_string(), + args: vec![], + alias: None, + }) + } + pub fn ordering() -> Rc { Rc::new(Type::App { public: true, diff --git a/crates/aiken-lang/src/builtins.rs b/crates/aiken-lang/src/builtins.rs index 8e47c432..592b41be 100644 --- a/crates/aiken-lang/src/builtins.rs +++ b/crates/aiken-lang/src/builtins.rs @@ -168,6 +168,19 @@ pub fn prelude(id_gen: &IdGenerator) -> TypeInfo { ), ); + // Never + prelude.types.insert( + well_known::NEVER.to_string(), + TypeConstructor::primitive(Type::never()), + ); + prelude.types_constructors.insert( + well_known::NEVER.to_string(), + ValueConstructor::known_adt( + &mut prelude.values, + &[(well_known::NEVER_CONSTRUCTORS[1], Type::never())], + ), + ); + // Cardano ScriptContext prelude.types.insert( well_known::SCRIPT_CONTEXT.to_string(), @@ -1503,6 +1516,15 @@ pub fn prelude_data_types(id_gen: &IdGenerator) -> IndexMap Self { + DataType::known_enum(well_known::NEVER, well_known::NEVER_CONSTRUCTORS) + } } diff --git a/crates/aiken-lang/src/gen_uplc.rs b/crates/aiken-lang/src/gen_uplc.rs index 7ad7c590..eb9d0d82 100644 --- a/crates/aiken-lang/src/gen_uplc.rs +++ b/crates/aiken-lang/src/gen_uplc.rs @@ -1434,7 +1434,9 @@ impl<'a> CodeGenerator<'a> { .unwrap_or_else(|| unreachable!("Failed to find definition for {}", name)); let then = if props.kind.is_expect() - && (data_type.constructors.len() > 1 || props.full_check) + && (data_type.constructors.len() > 1 + || props.full_check + || data_type.is_never()) { let (index, _) = data_type .constructors @@ -1459,8 +1461,8 @@ impl<'a> CodeGenerator<'a> { ) } else { assert!( - data_type.constructors.len() == 1, - "attempted expect on a type with more or less than 1 constructor: \nis_expect? {}\nfull_check? {}\ndata_type={data_type:#?}\n{}", + data_type.constructors.len() == 1 || data_type.is_never(), + "attempted let-assignment on a type with more or less than 1 constructor: \nis_expect? {}\nfull_check? {}\ndata_type={data_type:#?}\n{}", props.kind.is_expect(), props.full_check, name, @@ -1978,9 +1980,20 @@ impl<'a> CodeGenerator<'a> { let otherwise_delayed = AirTree::local_var("otherwise_delayed", Type::void()); + let is_never = data_type.is_never(); + let constr_clauses = data_type.constructors.iter().enumerate().rfold( otherwise_delayed.clone(), |acc, (index, constr)| { + // NOTE: For the Never type, we have an placeholder first constructor + // that must be ignored. The Never type is considered to have only one + // constructor starting at index 1 so it shouldn't be possible to + // cast from Data into the first constructor. There's virtually no + // constructor at index 0. + if is_never && index == 0 { + return acc; + } + let mut constr_args = vec![]; let constr_then = constr.arguments.iter().enumerate().rfold( @@ -2169,7 +2182,7 @@ impl<'a> CodeGenerator<'a> { ), ) } else if let Some(data_type) = data_type { - if data_type.constructors.len() > 1 { + if data_type.constructors.len() > 1 && !data_type.is_never() { AirTree::clause( &props.original_subject_name, clause_cond, @@ -5584,8 +5597,18 @@ impl<'a> CodeGenerator<'a> { } => { let tail_name_prefix = "__tail_index"; - let data_type = lookup_data_type_by_tipo(&self.data_types, &tipo) - .unwrap_or_else(|| panic!("HOW DID YOU DO THIS ON BOOL OR VOID")); + let data_type = + lookup_data_type_by_tipo(&self.data_types, &tipo).unwrap_or_else(|| { + panic!( + "Attempted record update on an unknown type!\ntype: {:#?}", + tipo + ) + }); + + assert!( + !data_type.is_never(), + "Attempted record update on a Never type.", + ); let constructor_field_count = data_type.constructors[0].arguments.len(); let record = arg_stack.pop().unwrap(); diff --git a/crates/aiken-project/src/tests/gen_uplc.rs b/crates/aiken-project/src/tests/gen_uplc.rs index 318787d9..a8b5ef29 100644 --- a/crates/aiken-project/src/tests/gen_uplc.rs +++ b/crates/aiken-project/src/tests/gen_uplc.rs @@ -83,9 +83,11 @@ fn assert_uplc(source_code: &str, expected: Term, should_fail: bool) { format!("{:#?}", eval.logs()) ); - if !should_fail { - assert_eq!(eval.result().unwrap(), Term::bool(true)); - } + assert!(if should_fail { + eval.failed(false) + } else { + !eval.failed(false) + }); } TestType::Validator(func) => { let program = generator.generate(func, &script.1); @@ -6137,3 +6139,51 @@ fn pattern_bytearray() { assert_uplc(src, program, false) } + +#[test] +fn cast_never() { + let src = r#" + test never_ok_cast() { + let none: Option = None + let data: Data = none + expect _: Never = data + } + "#; + + let none_or_never = || Term::Constant(Constant::Data(Data::constr(1, vec![])).into()); + + let expect_otherwise = Term::Error + .delayed_trace(Term::string("expect _: Never = data")) + .delay(); + + let assert_constr_index = Term::equals_integer() + .apply(Term::integer(1.into())) + .apply(Term::fst_pair().apply(Term::unconstr_data().apply(none_or_never()))); + + let assert_empty_fields = |then: Term, expect_otherwise: Rc| { + Term::snd_pair() + .apply(Term::unconstr_data().apply(none_or_never())) + .delay_empty_choose_list(then, Term::Var(expect_otherwise)) + }; + + let program = expect_otherwise.as_var("expect_:Never=data", |expect_otherwise| { + let otherwise = Term::Var(expect_otherwise.clone()); + + let when_constr = assert_constr_index.delay_true_if_then_else( + assert_empty_fields(Term::unit(), expect_otherwise.clone()), + Term::Var(expect_otherwise), + ); + + none_or_never() + .choose_data( + when_constr.delay(), + otherwise.clone(), + otherwise.clone(), + otherwise.clone(), + otherwise, + ) + .force() + }); + + assert_uplc(src, program, false) +} diff --git a/crates/uplc/src/tx/snapshots/uplc__tx__script_context__tests__script_context_certificates.snap b/crates/uplc/src/tx/snapshots/uplc__tx__script_context__tests__script_context_certificates.snap index 5349e185..e59033d1 100644 --- a/crates/uplc/src/tx/snapshots/uplc__tx__script_context__tests__script_context_certificates.snap +++ b/crates/uplc/src/tx/snapshots/uplc__tx__script_context__tests__script_context_certificates.snap @@ -570,20 +570,9 @@ Constr( ), Constr( Constr { - tag: 121, + tag: 122, any_constructor: None, - fields: [ - BigInt( - Int( - Int( - Int { - neg: false, - val: 3000000, - }, - ), - ), - ), - ], + fields: [], }, ), ], @@ -638,20 +627,9 @@ Constr( ), Constr( Constr { - tag: 121, + tag: 122, any_constructor: None, - fields: [ - BigInt( - Int( - Int( - Int { - neg: false, - val: 3000000, - }, - ), - ), - ), - ], + fields: [], }, ), ], diff --git a/crates/uplc/src/tx/to_plutus_data.rs b/crates/uplc/src/tx/to_plutus_data.rs index 670f8654..aab60880 100644 --- a/crates/uplc/src/tx/to_plutus_data.rs +++ b/crates/uplc/src/tx/to_plutus_data.rs @@ -52,6 +52,8 @@ struct WithArrayRational<'a, T>(&'a T); struct WithPartialCertificates<'a, T>(&'a T); +struct WithNeverRegistrationDeposit<'a, T>(&'a T); + pub trait ToPlutusData { fn to_plutus_data(&self) -> PlutusData; } @@ -203,6 +205,29 @@ impl<'a> ToPlutusData for WithWrappedTransactionId<'a, KeyValuePairs ToPlutusData for WithNeverRegistrationDeposit<'a, Vec> { + fn to_plutus_data(&self) -> PlutusData { + self.0 + .iter() + .map(WithNeverRegistrationDeposit) + .collect::>() + .to_plutus_data() + } +} + +impl<'a> ToPlutusData for WithNeverRegistrationDeposit<'a, KeyValuePairs> { + fn to_plutus_data(&self) -> PlutusData { + let mut data_vec: Vec<(PlutusData, PlutusData)> = vec![]; + for (key, value) in self.0.iter() { + data_vec.push(( + WithNeverRegistrationDeposit(key).to_plutus_data(), + value.to_plutus_data(), + )) + } + PlutusData::Map(KeyValuePairs::Def(data_vec)) + } +} + impl ToPlutusData for Option { fn to_plutus_data(&self) -> PlutusData { match self { @@ -549,14 +574,16 @@ impl<'a> ToPlutusData for WithPartialCertificates<'a, Certificate> { vec![pool_keyhash.to_plutus_data(), epoch.to_plutus_data()], ), - certificate => unreachable!("unexpected in V1/V2 script context: {certificate:?}"), + certificate => { + unreachable!("unexpected certificate type in V1/V2 script context: {certificate:?}") + } } } } -impl ToPlutusData for Certificate { +impl<'a> ToPlutusData for WithNeverRegistrationDeposit<'a, Certificate> { fn to_plutus_data(&self) -> PlutusData { - match self { + match self.0 { Certificate::StakeRegistration(stake_credential) => wrap_multiple_with_constr( 0, vec![ @@ -565,11 +592,11 @@ impl ToPlutusData for Certificate { ], ), - Certificate::Reg(stake_credential, deposit) => wrap_multiple_with_constr( + Certificate::Reg(stake_credential, _) => wrap_multiple_with_constr( 0, vec![ stake_credential.to_plutus_data(), - Some(*deposit).to_plutus_data(), + None::.to_plutus_data(), ], ), @@ -581,11 +608,11 @@ impl ToPlutusData for Certificate { ], ), - Certificate::UnReg(stake_credential, deposit) => wrap_multiple_with_constr( + Certificate::UnReg(stake_credential, _) => wrap_multiple_with_constr( 1, vec![ stake_credential.to_plutus_data(), - Some(*deposit).to_plutus_data(), + None::.to_plutus_data(), ], ), @@ -835,32 +862,44 @@ impl ToPlutusData for TxInInfo { } } +// NOTE: This is a _small_ abuse of the 'WithWrappedTransactionId'. We know the wrapped +// is needed for V1 and V2, and it also appears that for V1 and V2, the certifying +// purpose mustn't include the certificate index. So, we also short-circuit it here. impl<'a> ToPlutusData for WithWrappedTransactionId<'a, ScriptPurpose> { fn to_plutus_data(&self) -> PlutusData { match self.0 { + ScriptPurpose::Minting(policy_id) => wrap_with_constr(0, policy_id.to_plutus_data()), ScriptPurpose::Spending(out_ref, ()) => { wrap_with_constr(1, WithWrappedTransactionId(out_ref).to_plutus_data()) } - // NOTE: This is a _small_ abuse of the 'WithWrappedTransactionId'. We know the wrapped - // is needed for V1 and V2, and it also appears that for V1 and V2, the certifying - // purpose mustn't include the certificate index. So, we also short-circuit it here. - ScriptPurpose::Certifying(_, dcert) => wrap_with_constr(3, dcert.to_plutus_data()), - otherwise => otherwise.to_plutus_data(), + ScriptPurpose::Rewarding(stake_credential) => { + wrap_with_constr(2, stake_credential.to_plutus_data()) + } + ScriptPurpose::Certifying(_, dcert) => { + wrap_with_constr(3, WithPartialCertificates(dcert).to_plutus_data()) + } + purpose => { + unreachable!("unsupported purpose for V1 or V2 script context: {purpose:?}") + } } } } -impl ToPlutusData for ScriptPurpose { +impl<'a> ToPlutusData for WithNeverRegistrationDeposit<'a, ScriptPurpose> { fn to_plutus_data(&self) -> PlutusData { - match self { + match self.0 { ScriptPurpose::Minting(policy_id) => wrap_with_constr(0, policy_id.to_plutus_data()), ScriptPurpose::Spending(out_ref, ()) => wrap_with_constr(1, out_ref.to_plutus_data()), ScriptPurpose::Rewarding(stake_credential) => { wrap_with_constr(2, stake_credential.to_plutus_data()) } - ScriptPurpose::Certifying(ix, dcert) => { - wrap_multiple_with_constr(3, vec![ix.to_plutus_data(), dcert.to_plutus_data()]) - } + ScriptPurpose::Certifying(ix, dcert) => wrap_multiple_with_constr( + 3, + vec![ + ix.to_plutus_data(), + WithNeverRegistrationDeposit(dcert).to_plutus_data(), + ], + ), ScriptPurpose::Voting(voter) => { wrap_multiple_with_constr(4, vec![voter.to_plutus_data()]) } @@ -1240,12 +1279,12 @@ impl ToPlutusData for Vote { } } -impl ToPlutusData for ScriptInfo +impl<'a, T> ToPlutusData for WithNeverRegistrationDeposit<'a, ScriptInfo> where T: ToPlutusData, { fn to_plutus_data(&self) -> PlutusData { - match self { + match self.0 { ScriptInfo::Minting(policy_id) => wrap_with_constr(0, policy_id.to_plutus_data()), ScriptInfo::Spending(out_ref, datum) => { wrap_multiple_with_constr(1, vec![out_ref.to_plutus_data(), datum.to_plutus_data()]) @@ -1253,9 +1292,13 @@ where ScriptInfo::Rewarding(stake_credential) => { wrap_with_constr(2, stake_credential.to_plutus_data()) } - ScriptInfo::Certifying(ix, dcert) => { - wrap_multiple_with_constr(3, vec![ix.to_plutus_data(), dcert.to_plutus_data()]) - } + ScriptInfo::Certifying(ix, dcert) => wrap_multiple_with_constr( + 3, + vec![ + ix.to_plutus_data(), + WithNeverRegistrationDeposit(dcert).to_plutus_data(), + ], + ), ScriptInfo::Voting(voter) => wrap_multiple_with_constr(4, vec![voter.to_plutus_data()]), ScriptInfo::Proposing(ix, procedure) => { wrap_multiple_with_constr(5, vec![ix.to_plutus_data(), procedure.to_plutus_data()]) @@ -1311,11 +1354,11 @@ impl ToPlutusData for TxInfo { tx_info.outputs.to_plutus_data(), tx_info.fee.to_plutus_data(), tx_info.mint.to_plutus_data(), - tx_info.certificates.to_plutus_data(), + WithNeverRegistrationDeposit(&tx_info.certificates).to_plutus_data(), tx_info.withdrawals.to_plutus_data(), tx_info.valid_range.to_plutus_data(), tx_info.signatories.to_plutus_data(), - tx_info.redeemers.to_plutus_data(), + WithNeverRegistrationDeposit(&tx_info.redeemers).to_plutus_data(), tx_info.data.to_plutus_data(), tx_info.id.to_plutus_data(), tx_info.votes.to_plutus_data(), @@ -1347,7 +1390,7 @@ impl ToPlutusData for ScriptContext { vec![ tx_info.to_plutus_data(), redeemer.to_plutus_data(), - purpose.to_plutus_data(), + WithNeverRegistrationDeposit(purpose).to_plutus_data(), ], ), } diff --git a/examples/acceptance_tests/110/aiken.lock b/examples/acceptance_tests/110/aiken.lock new file mode 100644 index 00000000..6e350cda --- /dev/null +++ b/examples/acceptance_tests/110/aiken.lock @@ -0,0 +1,7 @@ +# This file was generated by Aiken +# You typically do not need to edit this file + +requirements = [] +packages = [] + +[etags] diff --git a/examples/acceptance_tests/110/aiken.toml b/examples/acceptance_tests/110/aiken.toml new file mode 100644 index 00000000..4cd28fba --- /dev/null +++ b/examples/acceptance_tests/110/aiken.toml @@ -0,0 +1,9 @@ +name = "aiken-lang/acceptance_test_110" +version = "0.0.0" +license = "Apache-2.0" +description = "Aiken contracts for project 'aiken-lang/110'" + +[repository] +user = "aiken-lang" +project = "110" +platform = "github" diff --git a/examples/acceptance_tests/110/lib/foo.ak b/examples/acceptance_tests/110/lib/foo.ak new file mode 100644 index 00000000..2608e4e7 --- /dev/null +++ b/examples/acceptance_tests/110/lib/foo.ak @@ -0,0 +1,39 @@ +type Foo { + Foo(Int, Never) + Bar +} + +test never_is_none() { + let none: Option = None + + trace @"Never": Never + trace @"None": none + + let data_never: Data = Never + let data_none: Data = none + + data_never == data_none +} + +test never_pattern_match() { + when Foo(14, Never) is { + Foo(x, Never) -> x == 14 + Bar -> False + } +} + +test never_assignment() { + let Never = Never + True +} + +test never_wrong_cast() fail { + let data: Data = Some(42) + expect _: Never = data +} + +test never_ok_cast() { + let none: Option = None + let data: Data = none + expect _: Never = data +} diff --git a/examples/acceptance_tests/script_context/v3/aiken.lock b/examples/acceptance_tests/script_context/v3/aiken.lock index 93dd153b..0be3fb39 100644 --- a/examples/acceptance_tests/script_context/v3/aiken.lock +++ b/examples/acceptance_tests/script_context/v3/aiken.lock @@ -13,4 +13,4 @@ requirements = [] source = "github" [etags] -"aiken-lang/stdlib@v2" = [{ secs_since_epoch = 1724491200, nanos_since_epoch = 427525000 }, "cdbbce58b61deb385e7ea787a2e0fc2dc8fe94db9999e0e6275bc9c70e5796be"] +"aiken-lang/stdlib@v2" = [{ secs_since_epoch = 1724760716, nanos_since_epoch = 700202000 }, "cdbbce58b61deb385e7ea787a2e0fc2dc8fe94db9999e0e6275bc9c70e5796be"] diff --git a/examples/acceptance_tests/script_context/v3/plutus.json b/examples/acceptance_tests/script_context/v3/plutus.json index b431b6f2..81fdf1a4 100644 --- a/examples/acceptance_tests/script_context/v3/plutus.json +++ b/examples/acceptance_tests/script_context/v3/plutus.json @@ -6,7 +6,7 @@ "plutusVersion": "v3", "compiler": { "name": "Aiken", - "version": "v1.0.31-alpha+95241f9" + "version": "v1.0.31-alpha+3521a8c" }, "license": "Apache-2.0" }, @@ -19,13 +19,13 @@ "$ref": "#/definitions/Void" } }, - "compiledCode": "5919bb0101003232323232323232323232253330053232323232533300a3370e900318061baa00113232323232323253330113005301337540022a66602266e1d2080dac409375a602e60286ea80044c94ccc048c018c050dd50008a99980919b8748070dd6980c180a9baa0011323253330143375e9812dd8799fd8799fd87a9f581c22222222222222222222222222222222222222222222222222222222ffd87a80ffff00330010054800054ccc050cdd7a612dd8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054800854ccc050cdd7a612dd8799fd87a9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054801054ccc050cdd7a6149d8799fd905009f581c1111111111111111111111111111111111111111111111111111111158209999999999999999999999999999999999999999999999999999999999999999ffff00330010054801854ccc050cdd7a612ad8799fd905019f581c11111111111111111111111111111111111111111111111111111111190539ffff00330010054802054ccc050cdd7a6133d8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f1a002dc6c0ffffff00330010054802854ccc050cdd7a6133d8799fd87a9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f1a002dc6c0ffffff00330010054803054ccc050cdd7a6154d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffffffffff00330010054803854ccc050cdd7a6154d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd8799fd87a9f581c00000000000000000000000000000000000000000000000000000000ffffffffff00330010054804054ccc050cdd7a6131d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87a80ffffff00330010054804854ccc050cdd7a6131d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87b80ffffff00330010054805054ccc050cdd7a614fd8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87b9f581c11111111111111111111111111111111111111111111111111111111d87b80ffffff00330010054805854ccc050cdd7a6151d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f581c11111111111111111111111111111111111111111111111111111111ff1a002dc6c0ffff00330010054806054ccc050cdd7a6136d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87b80ff1a002dc6c0ffff00330010054806854ccc050cdd7a6154d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87b9f581c11111111111111111111111111111111111111111111111111111111d87b80ff1a002dc6c0ffff00330010054807054ccc050cdd7a614dd8799fd905029fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f581c22222222222222222222222222222222222222222222222222222222ffffff00330010054807854ccc050cdd7a612bd8799fd905039fd8799f581c00000000000000000000000000000000000000000000000000000000ffffff00330010054808054ccc050cdd7a612fd8799fd87d9fd8799f581c00000000000000000000000000000000000000000000000000000000ff1a002dc6c0ffff00330010054808854ccc050cdd7a612fd8799fd87f9fd8799f581c00000000000000000000000000000000000000000000000000000000ff1a002dc6c0ffff00330010054809054ccc050cdd7a612ad8799fd87e9fd8799f581c00000000000000000000000000000000000000000000000000000000ffffff0033001005480984c94ccc054c024c05cdd5000899299980b19b8748010c060dd500089919299980c19b8748008c068dd5180f0010a99980c1806180d1baa00114a202e02e603a603c00260326ea8004054c06cc060dd500080a19800802a40502a6602a9201a56578706563740a202020202020536f6d65280a202020202020202055706461746544656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031392900161533015491c66578706563740a202020202020536f6d65280a2020202020202020556e726567697374657244656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031382900161533015491c56578706563740a202020202020536f6d65280a2020202020202020526567697374657244656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031372900161533015491b26578706563740a202020202020536f6d65280a202020202020202052657469726546726f6d436f6e737469747574696f6e616c436f6d6d6974746565207b0a20202020202020202020636f6e737469747574696f6e616c5f636f6d6d69747465655f6d656d6265723a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031362900161533015491e06578706563740a202020202020536f6d65280a2020202020202020417574686f72697a65436f6e737469747574696f6e616c436f6d6d697474656550726f7879207b0a20202020202020202020636f6e737469747574696f6e616c5f636f6d6d69747465655f6d656d6265723a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202070726f78793a20566572696669636174696f6e4b6579286f6e6c793273292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031352900161533015491ff6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426f7468207b0a2020202020202020202020207374616b655f706f6f6c3a206f6e6c7931732c0a20202020202020202020202064656c65676174655f726570726573656e7461746976653a20416c776179734e6f436f6e666964656e63652c0a202020202020202020207d2c0a20202020202020202020646541706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031342900161533015491ed6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734e6f436f6e666964656e6365292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031332900161533015491ec6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426c6f636b50726f64756374696f6e286f6e6c793173292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031322900161533015491ff6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426f7468207b0a2020202020202020202020207374616b655f706f6f6c3a206f6e6c7931732c0a20202020202020202020202064656c65676174655f726570726573656e7461746976653a20416c776179734e6f436f6e666964656e63652c0a202020202020202020207d2c0a20202020202020207d2c0a20202020202029203d3d206c186973742e6174286365727469666963617465732c2031312900161533015491c46578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734e6f436f6e666964656e6365292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031302900161533015491be6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734162737461696e292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20392900161533015491cb6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f7465285265676973746572656428536372697074286f6e6c7930732929292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20382900161533015491d46578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f7465285265676973746572656428566572696669636174696f6e4b6579286f6e6c7930732929292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20372900161533015491b26578706563740a202020202020536f6d65280a2020202020202020556e726567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a20536f6d6528335f3030305f303030292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20362900161533015491b16578706563740a202020202020536f6d65280a2020202020202020526567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a20536f6d6528335f3030305f303030292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c203529001615330154917e6578706563740a202020202020536f6d65285265746972655374616b65506f6f6c207b207374616b655f706f6f6c3a206f6e6c7931732c2061745f65706f63683a2031333337207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020342c0a20202020202029001615330154917d6578706563740a202020202020536f6d652852656769737465725374616b65506f6f6c207b207374616b655f706f6f6c3a206f6e6c7931732c207672663a206f6e6c793973207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020332c0a2020202020202900161533015491a76578706563740a202020202020536f6d65280a2020202020202020556e726567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20322900161533015491a66578706563740a202020202020536f6d65280a2020202020202020526567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20312900161533015491886578706563740a202020202020536f6d6528526567697374657243726564656e7469616c207b2063726564656e7469616c3a20536372697074286f6e6c793273292c206465706f7369743a204e6f6e65207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020302c0a2020202020202900163001001222533301900214c103d87a8000132325333017300b00313374a90001980e00125eb804ccc014014004cdc0001a4002603a0066036004020020602e60306030603060306030603060306030603060306030603060306030603060286ea802c038038c058c05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc04cdd50051bac3015301630163016301630163012375401264a66601e66e1d20043011375400226464a66602266ebd300122d8799f581c11111111111111111111111111111111111111111111111111111111ff0030173018002153330113370e900118099baa001149854cc04924011e65787065637420536372697074282e2e29203d2063726564656e7469616c00161533012491416578706563742044656c6567617465426c6f636b50726f64756374696f6e207b207374616b655f706f6f6c3a206f6e6c793173207d203d3d2064656c656761746500163016001301237540022a66020921406578706563742044656c656761746543726564656e7469616c207b2063726564656e7469616c2c2064656c6567617465207d203d206365727469666963617465001630143015004533300d3001300f375400a2a66602260206ea80145261616370e90001bad3011001300d37540022c601e6020004601c002601c004601800260106ea8004526153300649011856616c696461746f722072657475726e65642066616c73650013656153300449013d65787065637420536f6d652831305f3030305f30303029203d207472616e73616374696f6e2e63757272656e745f74726561737572795f616d6f756e74001615330034912f65787065637420536f6d6528313429203d207472616e73616374696f6e2e74726561737572795f646f6e6174696f6e001615330024918e65787065637420536f6d652844656c656761746543726564656e7469616c207b0a20202020202063726564656e7469616c3a20536372697074282e2e292c0a20202020202064656c65676174653a2044656c6567617465426c6f636b50726f64756374696f6e282e2e292c0a202020207d29203d206c6973742e6174286365727469666963617465732c2032302900165734ae7155ceaab9e5573eae815d0aba21", - "hash": "8f82504c078bda7809945a066d47ef23931a3745f4ec2d272cb7f250" + "compiledCode": "5919990101003232323232323232323232253330053232323232533300a3370e900318061baa00113232323232323253330113005301337540022a66602266e1d2080dac409375a602e60286ea80044c94ccc048c018c050dd50008a99980919b8748070dd6980c180a9baa0011323253330143375e9812dd8799fd8799fd87a9f581c22222222222222222222222222222222222222222222222222222222ffd87a80ffff00330010054800054ccc050cdd7a612dd8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054800854ccc050cdd7a612dd8799fd87a9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054801054ccc050cdd7a6149d8799fd905009f581c1111111111111111111111111111111111111111111111111111111158209999999999999999999999999999999999999999999999999999999999999999ffff00330010054801854ccc050cdd7a612ad8799fd905019f581c11111111111111111111111111111111111111111111111111111111190539ffff00330010054802054ccc050cdd7a612dd8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054802854ccc050cdd7a612dd8799fd87a9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054803054ccc050cdd7a6154d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffffffffff00330010054803854ccc050cdd7a6154d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd8799fd87a9f581c00000000000000000000000000000000000000000000000000000000ffffffffff00330010054804054ccc050cdd7a6131d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87a80ffffff00330010054804854ccc050cdd7a6131d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87b80ffffff00330010054805054ccc050cdd7a614fd8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87b9f581c11111111111111111111111111111111111111111111111111111111d87b80ffffff00330010054805854ccc050cdd7a6151d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f581c11111111111111111111111111111111111111111111111111111111ff1a002dc6c0ffff00330010054806054ccc050cdd7a6136d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87b80ff1a002dc6c0ffff00330010054806854ccc050cdd7a6154d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87b9f581c11111111111111111111111111111111111111111111111111111111d87b80ff1a002dc6c0ffff00330010054807054ccc050cdd7a614dd8799fd905029fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f581c22222222222222222222222222222222222222222222222222222222ffffff00330010054807854ccc050cdd7a612bd8799fd905039fd8799f581c00000000000000000000000000000000000000000000000000000000ffffff00330010054808054ccc050cdd7a612fd8799fd87d9fd8799f581c00000000000000000000000000000000000000000000000000000000ff1a002dc6c0ffff00330010054808854ccc050cdd7a612fd8799fd87f9fd8799f581c00000000000000000000000000000000000000000000000000000000ff1a002dc6c0ffff00330010054809054ccc050cdd7a612ad8799fd87e9fd8799f581c00000000000000000000000000000000000000000000000000000000ffffff0033001005480984c94ccc054c024c05cdd5000899299980b19b8748010c060dd500089919299980c19b8748008c068dd5180f0010a99980c1806180d1baa00114a202e02e603a603c00260326ea8004054c06cc060dd500080a19800802a40502a6602a9201a56578706563740a202020202020536f6d65280a202020202020202055706461746544656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031392900161533015491c66578706563740a202020202020536f6d65280a2020202020202020556e726567697374657244656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031382900161533015491c56578706563740a202020202020536f6d65280a2020202020202020526567697374657244656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031372900161533015491b26578706563740a202020202020536f6d65280a202020202020202052657469726546726f6d436f6e737469747574696f6e616c436f6d6d6974746565207b0a20202020202020202020636f6e737469747574696f6e616c5f636f6d6d69747465655f6d656d6265723a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031362900161533015491e06578706563740a202020202020536f6d65280a2020202020202020417574686f72697a65436f6e737469747574696f6e616c436f6d6d697474656550726f7879207b0a20202020202020202020636f6e737469747574696f6e616c5f636f6d6d69747465655f6d656d6265723a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202070726f78793a20566572696669636174696f6e4b6579286f6e6c793273292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031352900161533015491ff6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426f7468207b0a2020202020202020202020207374616b655f706f6f6c3a206f6e6c7931732c0a20202020202020202020202064656c65676174655f726570726573656e7461746976653a20416c776179734e6f436f6e666964656e63652c0a202020202020202020207d2c0a20202020202020202020646541706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031342900161533015491ed6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734e6f436f6e666964656e6365292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031332900161533015491ec6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426c6f636b50726f64756374696f6e286f6e6c793173292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031322900161533015491ff6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426f7468207b0a2020202020202020202020207374616b655f706f6f6c3a206f6e6c7931732c0a20202020202020202020202064656c65676174655f726570726573656e7461746976653a20416c776179734e6f436f6e666964656e63652c0a202020202020202020207d2c0a20202020202020207d2c0a20202020202029203d3d206c186973742e6174286365727469666963617465732c2031312900161533015491c46578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734e6f436f6e666964656e6365292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031302900161533015491be6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734162737461696e292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20392900161533015491cb6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f7465285265676973746572656428536372697074286f6e6c7930732929292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20382900161533015491d46578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f7465285265676973746572656428566572696669636174696f6e4b6579286f6e6c7930732929292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20372900161533015491a76578706563740a202020202020536f6d65280a2020202020202020556e726567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20362900161533015491a66578706563740a202020202020536f6d65280a2020202020202020526567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c203529001615330154917e6578706563740a202020202020536f6d65285265746972655374616b65506f6f6c207b207374616b655f706f6f6c3a206f6e6c7931732c2061745f65706f63683a2031333337207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020342c0a20202020202029001615330154917d6578706563740a202020202020536f6d652852656769737465725374616b65506f6f6c207b207374616b655f706f6f6c3a206f6e6c7931732c207672663a206f6e6c793973207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020332c0a2020202020202900161533015491a76578706563740a202020202020536f6d65280a2020202020202020556e726567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20322900161533015491a66578706563740a202020202020536f6d65280a2020202020202020526567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20312900161533015491886578706563740a202020202020536f6d6528526567697374657243726564656e7469616c207b2063726564656e7469616c3a20536372697074286f6e6c793273292c206465706f7369743a204e6f6e65207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020302c0a2020202020202900163001001222533301900214c103d87a8000132325333017300b00313374a90001980e00125eb804ccc014014004cdc0001a4002603a0066036004020020602e60306030603060306030603060306030603060306030603060306030603060286ea802c038038c058c05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc04cdd50051bac3015301630163016301630163012375401264a66601e66e1d20043011375400226464a66602266ebd300122d8799f581c11111111111111111111111111111111111111111111111111111111ff0030173018002153330113370e900118099baa001149854cc04924011e65787065637420536372697074282e2e29203d2063726564656e7469616c00161533012491416578706563742044656c6567617465426c6f636b50726f64756374696f6e207b207374616b655f706f6f6c3a206f6e6c793173207d203d3d2064656c656761746500163016001301237540022a66020921406578706563742044656c656761746543726564656e7469616c207b2063726564656e7469616c2c2064656c6567617465207d203d206365727469666963617465001630143015004533300d3001300f375400a2a66602260206ea80145261616370e90001bad3011001300d37540022c601e6020004601c002601c004601800260106ea8004526153300649011856616c696461746f722072657475726e65642066616c73650013656153300449013d65787065637420536f6d652831305f3030305f30303029203d207472616e73616374696f6e2e63757272656e745f74726561737572795f616d6f756e74001615330034912f65787065637420536f6d6528313429203d207472616e73616374696f6e2e74726561737572795f646f6e6174696f6e001615330024918e65787065637420536f6d652844656c656761746543726564656e7469616c207b0a20202020202063726564656e7469616c3a20536372697074282e2e292c0a20202020202064656c65676174653a2044656c6567617465426c6f636b50726f64756374696f6e282e2e292c0a202020207d29203d206c6973742e6174286365727469666963617465732c2032302900165734ae7155ceaab9e5573eae815d0aba21", + "hash": "a02054fde28a3bf37a20ffb4eb34d84ab50eb5980a9b2b44789dc3bd" }, { "title": "certificates.purposes.else", - "compiledCode": "5919bb0101003232323232323232323232253330053232323232533300a3370e900318061baa00113232323232323253330113005301337540022a66602266e1d2080dac409375a602e60286ea80044c94ccc048c018c050dd50008a99980919b8748070dd6980c180a9baa0011323253330143375e9812dd8799fd8799fd87a9f581c22222222222222222222222222222222222222222222222222222222ffd87a80ffff00330010054800054ccc050cdd7a612dd8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054800854ccc050cdd7a612dd8799fd87a9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054801054ccc050cdd7a6149d8799fd905009f581c1111111111111111111111111111111111111111111111111111111158209999999999999999999999999999999999999999999999999999999999999999ffff00330010054801854ccc050cdd7a612ad8799fd905019f581c11111111111111111111111111111111111111111111111111111111190539ffff00330010054802054ccc050cdd7a6133d8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f1a002dc6c0ffffff00330010054802854ccc050cdd7a6133d8799fd87a9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f1a002dc6c0ffffff00330010054803054ccc050cdd7a6154d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffffffffff00330010054803854ccc050cdd7a6154d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd8799fd87a9f581c00000000000000000000000000000000000000000000000000000000ffffffffff00330010054804054ccc050cdd7a6131d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87a80ffffff00330010054804854ccc050cdd7a6131d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87b80ffffff00330010054805054ccc050cdd7a614fd8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87b9f581c11111111111111111111111111111111111111111111111111111111d87b80ffffff00330010054805854ccc050cdd7a6151d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f581c11111111111111111111111111111111111111111111111111111111ff1a002dc6c0ffff00330010054806054ccc050cdd7a6136d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87b80ff1a002dc6c0ffff00330010054806854ccc050cdd7a6154d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87b9f581c11111111111111111111111111111111111111111111111111111111d87b80ff1a002dc6c0ffff00330010054807054ccc050cdd7a614dd8799fd905029fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f581c22222222222222222222222222222222222222222222222222222222ffffff00330010054807854ccc050cdd7a612bd8799fd905039fd8799f581c00000000000000000000000000000000000000000000000000000000ffffff00330010054808054ccc050cdd7a612fd8799fd87d9fd8799f581c00000000000000000000000000000000000000000000000000000000ff1a002dc6c0ffff00330010054808854ccc050cdd7a612fd8799fd87f9fd8799f581c00000000000000000000000000000000000000000000000000000000ff1a002dc6c0ffff00330010054809054ccc050cdd7a612ad8799fd87e9fd8799f581c00000000000000000000000000000000000000000000000000000000ffffff0033001005480984c94ccc054c024c05cdd5000899299980b19b8748010c060dd500089919299980c19b8748008c068dd5180f0010a99980c1806180d1baa00114a202e02e603a603c00260326ea8004054c06cc060dd500080a19800802a40502a6602a9201a56578706563740a202020202020536f6d65280a202020202020202055706461746544656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031392900161533015491c66578706563740a202020202020536f6d65280a2020202020202020556e726567697374657244656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031382900161533015491c56578706563740a202020202020536f6d65280a2020202020202020526567697374657244656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031372900161533015491b26578706563740a202020202020536f6d65280a202020202020202052657469726546726f6d436f6e737469747574696f6e616c436f6d6d6974746565207b0a20202020202020202020636f6e737469747574696f6e616c5f636f6d6d69747465655f6d656d6265723a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031362900161533015491e06578706563740a202020202020536f6d65280a2020202020202020417574686f72697a65436f6e737469747574696f6e616c436f6d6d697474656550726f7879207b0a20202020202020202020636f6e737469747574696f6e616c5f636f6d6d69747465655f6d656d6265723a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202070726f78793a20566572696669636174696f6e4b6579286f6e6c793273292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031352900161533015491ff6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426f7468207b0a2020202020202020202020207374616b655f706f6f6c3a206f6e6c7931732c0a20202020202020202020202064656c65676174655f726570726573656e7461746976653a20416c776179734e6f436f6e666964656e63652c0a202020202020202020207d2c0a20202020202020202020646541706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031342900161533015491ed6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734e6f436f6e666964656e6365292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031332900161533015491ec6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426c6f636b50726f64756374696f6e286f6e6c793173292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031322900161533015491ff6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426f7468207b0a2020202020202020202020207374616b655f706f6f6c3a206f6e6c7931732c0a20202020202020202020202064656c65676174655f726570726573656e7461746976653a20416c776179734e6f436f6e666964656e63652c0a202020202020202020207d2c0a20202020202020207d2c0a20202020202029203d3d206c186973742e6174286365727469666963617465732c2031312900161533015491c46578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734e6f436f6e666964656e6365292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031302900161533015491be6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734162737461696e292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20392900161533015491cb6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f7465285265676973746572656428536372697074286f6e6c7930732929292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20382900161533015491d46578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f7465285265676973746572656428566572696669636174696f6e4b6579286f6e6c7930732929292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20372900161533015491b26578706563740a202020202020536f6d65280a2020202020202020556e726567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a20536f6d6528335f3030305f303030292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20362900161533015491b16578706563740a202020202020536f6d65280a2020202020202020526567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a20536f6d6528335f3030305f303030292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c203529001615330154917e6578706563740a202020202020536f6d65285265746972655374616b65506f6f6c207b207374616b655f706f6f6c3a206f6e6c7931732c2061745f65706f63683a2031333337207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020342c0a20202020202029001615330154917d6578706563740a202020202020536f6d652852656769737465725374616b65506f6f6c207b207374616b655f706f6f6c3a206f6e6c7931732c207672663a206f6e6c793973207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020332c0a2020202020202900161533015491a76578706563740a202020202020536f6d65280a2020202020202020556e726567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20322900161533015491a66578706563740a202020202020536f6d65280a2020202020202020526567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20312900161533015491886578706563740a202020202020536f6d6528526567697374657243726564656e7469616c207b2063726564656e7469616c3a20536372697074286f6e6c793273292c206465706f7369743a204e6f6e65207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020302c0a2020202020202900163001001222533301900214c103d87a8000132325333017300b00313374a90001980e00125eb804ccc014014004cdc0001a4002603a0066036004020020602e60306030603060306030603060306030603060306030603060306030603060286ea802c038038c058c05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc04cdd50051bac3015301630163016301630163012375401264a66601e66e1d20043011375400226464a66602266ebd300122d8799f581c11111111111111111111111111111111111111111111111111111111ff0030173018002153330113370e900118099baa001149854cc04924011e65787065637420536372697074282e2e29203d2063726564656e7469616c00161533012491416578706563742044656c6567617465426c6f636b50726f64756374696f6e207b207374616b655f706f6f6c3a206f6e6c793173207d203d3d2064656c656761746500163016001301237540022a66020921406578706563742044656c656761746543726564656e7469616c207b2063726564656e7469616c2c2064656c6567617465207d203d206365727469666963617465001630143015004533300d3001300f375400a2a66602260206ea80145261616370e90001bad3011001300d37540022c601e6020004601c002601c004601800260106ea8004526153300649011856616c696461746f722072657475726e65642066616c73650013656153300449013d65787065637420536f6d652831305f3030305f30303029203d207472616e73616374696f6e2e63757272656e745f74726561737572795f616d6f756e74001615330034912f65787065637420536f6d6528313429203d207472616e73616374696f6e2e74726561737572795f646f6e6174696f6e001615330024918e65787065637420536f6d652844656c656761746543726564656e7469616c207b0a20202020202063726564656e7469616c3a20536372697074282e2e292c0a20202020202064656c65676174653a2044656c6567617465426c6f636b50726f64756374696f6e282e2e292c0a202020207d29203d206c6973742e6174286365727469666963617465732c2032302900165734ae7155ceaab9e5573eae815d0aba21", - "hash": "8f82504c078bda7809945a066d47ef23931a3745f4ec2d272cb7f250" + "compiledCode": "5919990101003232323232323232323232253330053232323232533300a3370e900318061baa00113232323232323253330113005301337540022a66602266e1d2080dac409375a602e60286ea80044c94ccc048c018c050dd50008a99980919b8748070dd6980c180a9baa0011323253330143375e9812dd8799fd8799fd87a9f581c22222222222222222222222222222222222222222222222222222222ffd87a80ffff00330010054800054ccc050cdd7a612dd8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054800854ccc050cdd7a612dd8799fd87a9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054801054ccc050cdd7a6149d8799fd905009f581c1111111111111111111111111111111111111111111111111111111158209999999999999999999999999999999999999999999999999999999999999999ffff00330010054801854ccc050cdd7a612ad8799fd905019f581c11111111111111111111111111111111111111111111111111111111190539ffff00330010054802054ccc050cdd7a612dd8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054802854ccc050cdd7a612dd8799fd87a9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffff00330010054803054ccc050cdd7a6154d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffffffffff00330010054803854ccc050cdd7a6154d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd8799fd87a9f581c00000000000000000000000000000000000000000000000000000000ffffffffff00330010054804054ccc050cdd7a6131d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87a80ffffff00330010054804854ccc050cdd7a6131d8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87b80ffffff00330010054805054ccc050cdd7a614fd8799fd87b9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87b9f581c11111111111111111111111111111111111111111111111111111111d87b80ffffff00330010054805854ccc050cdd7a6151d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f581c11111111111111111111111111111111111111111111111111111111ff1a002dc6c0ffff00330010054806054ccc050cdd7a6136d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87b80ff1a002dc6c0ffff00330010054806854ccc050cdd7a6154d8799fd87c9fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87b9f581c11111111111111111111111111111111111111111111111111111111d87b80ff1a002dc6c0ffff00330010054807054ccc050cdd7a614dd8799fd905029fd8799f581c00000000000000000000000000000000000000000000000000000000ffd8799f581c22222222222222222222222222222222222222222222222222222222ffffff00330010054807854ccc050cdd7a612bd8799fd905039fd8799f581c00000000000000000000000000000000000000000000000000000000ffffff00330010054808054ccc050cdd7a612fd8799fd87d9fd8799f581c00000000000000000000000000000000000000000000000000000000ff1a002dc6c0ffff00330010054808854ccc050cdd7a612fd8799fd87f9fd8799f581c00000000000000000000000000000000000000000000000000000000ff1a002dc6c0ffff00330010054809054ccc050cdd7a612ad8799fd87e9fd8799f581c00000000000000000000000000000000000000000000000000000000ffffff0033001005480984c94ccc054c024c05cdd5000899299980b19b8748010c060dd500089919299980c19b8748008c068dd5180f0010a99980c1806180d1baa00114a202e02e603a603c00260326ea8004054c06cc060dd500080a19800802a40502a6602a9201a56578706563740a202020202020536f6d65280a202020202020202055706461746544656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031392900161533015491c66578706563740a202020202020536f6d65280a2020202020202020556e726567697374657244656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031382900161533015491c56578706563740a202020202020536f6d65280a2020202020202020526567697374657244656c6567617465526570726573656e746174697665207b0a2020202020202020202064656c65676174655f726570726573656e7461746976653a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031372900161533015491b26578706563740a202020202020536f6d65280a202020202020202052657469726546726f6d436f6e737469747574696f6e616c436f6d6d6974746565207b0a20202020202020202020636f6e737469747574696f6e616c5f636f6d6d69747465655f6d656d6265723a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031362900161533015491e06578706563740a202020202020536f6d65280a2020202020202020417574686f72697a65436f6e737469747574696f6e616c436f6d6d697474656550726f7879207b0a20202020202020202020636f6e737469747574696f6e616c5f636f6d6d69747465655f6d656d6265723a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202070726f78793a20566572696669636174696f6e4b6579286f6e6c793273292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031352900161533015491ff6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426f7468207b0a2020202020202020202020207374616b655f706f6f6c3a206f6e6c7931732c0a20202020202020202020202064656c65676174655f726570726573656e7461746976653a20416c776179734e6f436f6e666964656e63652c0a202020202020202020207d2c0a20202020202020202020646541706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031342900161533015491ed6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734e6f436f6e666964656e6365292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031332900161533015491ec6578706563740a202020202020536f6d65280a20202020202020205265676973746572416e6444656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426c6f636b50726f64756374696f6e286f6e6c793173292c0a202020202020202020206465706f7369743a20335f3030305f3030302c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031322900161533015491ff6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465426f7468207b0a2020202020202020202020207374616b655f706f6f6c3a206f6e6c7931732c0a20202020202020202020202064656c65676174655f726570726573656e7461746976653a20416c776179734e6f436f6e666964656e63652c0a202020202020202020207d2c0a20202020202020207d2c0a20202020202029203d3d206c186973742e6174286365727469666963617465732c2031312900161533015491c46578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734e6f436f6e666964656e6365292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c2031302900161533015491be6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f746528416c776179734162737461696e292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20392900161533015491cb6578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f7465285265676973746572656428536372697074286f6e6c7930732929292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20382900161533015491d46578706563740a202020202020536f6d65280a202020202020202044656c656761746543726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a2020202020202020202064656c65676174653a2044656c6567617465566f7465285265676973746572656428566572696669636174696f6e4b6579286f6e6c7930732929292c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20372900161533015491a76578706563740a202020202020536f6d65280a2020202020202020556e726567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20362900161533015491a66578706563740a202020202020536f6d65280a2020202020202020526567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c203529001615330154917e6578706563740a202020202020536f6d65285265746972655374616b65506f6f6c207b207374616b655f706f6f6c3a206f6e6c7931732c2061745f65706f63683a2031333337207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020342c0a20202020202029001615330154917d6578706563740a202020202020536f6d652852656769737465725374616b65506f6f6c207b207374616b655f706f6f6c3a206f6e6c7931732c207672663a206f6e6c793973207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020332c0a2020202020202900161533015491a76578706563740a202020202020536f6d65280a2020202020202020556e726567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a20202020202020202020726566756e643a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20322900161533015491a66578706563740a202020202020536f6d65280a2020202020202020526567697374657243726564656e7469616c207b0a2020202020202020202063726564656e7469616c3a20566572696669636174696f6e4b6579286f6e6c793073292c0a202020202020202020206465706f7369743a204e6f6e652c0a20202020202020207d2c0a20202020202029203d3d206c6973742e6174286365727469666963617465732c20312900161533015491886578706563740a202020202020536f6d6528526567697374657243726564656e7469616c207b2063726564656e7469616c3a20536372697074286f6e6c793273292c206465706f7369743a204e6f6e65207d29203d3d206c6973742e6174280a20202020202020206365727469666963617465732c0a2020202020202020302c0a2020202020202900163001001222533301900214c103d87a8000132325333017300b00313374a90001980e00125eb804ccc014014004cdc0001a4002603a0066036004020020602e60306030603060306030603060306030603060306030603060306030603060286ea802c038038c058c05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc05cc04cdd50051bac3015301630163016301630163012375401264a66601e66e1d20043011375400226464a66602266ebd300122d8799f581c11111111111111111111111111111111111111111111111111111111ff0030173018002153330113370e900118099baa001149854cc04924011e65787065637420536372697074282e2e29203d2063726564656e7469616c00161533012491416578706563742044656c6567617465426c6f636b50726f64756374696f6e207b207374616b655f706f6f6c3a206f6e6c793173207d203d3d2064656c656761746500163016001301237540022a66020921406578706563742044656c656761746543726564656e7469616c207b2063726564656e7469616c2c2064656c6567617465207d203d206365727469666963617465001630143015004533300d3001300f375400a2a66602260206ea80145261616370e90001bad3011001300d37540022c601e6020004601c002601c004601800260106ea8004526153300649011856616c696461746f722072657475726e65642066616c73650013656153300449013d65787065637420536f6d652831305f3030305f30303029203d207472616e73616374696f6e2e63757272656e745f74726561737572795f616d6f756e74001615330034912f65787065637420536f6d6528313429203d207472616e73616374696f6e2e74726561737572795f646f6e6174696f6e001615330024918e65787065637420536f6d652844656c656761746543726564656e7469616c207b0a20202020202063726564656e7469616c3a20536372697074282e2e292c0a20202020202064656c65676174653a2044656c6567617465426c6f636b50726f64756374696f6e282e2e292c0a202020207d29203d206c6973742e6174286365727469666963617465732c2032302900165734ae7155ceaab9e5573eae815d0aba21", + "hash": "a02054fde28a3bf37a20ffb4eb34d84ab50eb5980a9b2b44789dc3bd" }, { "title": "mint.test_1.mint", diff --git a/examples/acceptance_tests/script_context/v3/validators/certificates.ak b/examples/acceptance_tests/script_context/v3/validators/certificates.ak index 82f75d0b..feffda0f 100644 --- a/examples/acceptance_tests/script_context/v3/validators/certificates.ak +++ b/examples/acceptance_tests/script_context/v3/validators/certificates.ak @@ -71,7 +71,7 @@ validator purposes { Some( RegisterCredential { credential: VerificationKey(only0s), - deposit: Some(3_000_000), + deposit: None, }, ) == list.at(certificates, 5) @@ -79,7 +79,7 @@ validator purposes { Some( UnregisterCredential { credential: VerificationKey(only0s), - refund: Some(3_000_000), + refund: None, }, ) == list.at(certificates, 6)