From 06065054c2bf8a450e7677e773eb275fc90607e5 Mon Sep 17 00:00:00 2001 From: cchudant Date: Tue, 10 Sep 2024 01:45:36 -0700 Subject: [PATCH] feat: devnet (#238) Co-authored-by: antiyro <74653697+antiyro@users.noreply.github.com> --- .github/workflows/coverage.yml | 4 + .github/workflows/linters-cargo.yml | 4 + .github/workflows/rust-check.yml | 4 + .gitignore | 2 +- CHANGELOG.md | 1 + Cargo.lock | 123 +++++ Cargo.toml | 5 + cairo/.gitignore | 7 + cairo/README.md | 7 + cairo/Scarb.lock | 100 ++++ cairo/Scarb.toml | 21 + cairo/src/account.cairo | 55 +++ cairo/src/erc20.cairo | 69 +++ cairo/src/lib.cairo | 4 + cairo/src/udc.cairo | 60 +++ ...cts_AccountUpgradeable.contract_class.json | 1 + ...madara_contracts_ERC20.contract_class.json | 1 + ...acts_UniversalDeployer.contract_class.json | 1 + cairo/tests/test_contract.cairo | 4 + crates/client/block_import/src/lib.rs | 19 +- .../client/block_import/src/pre_validate.rs | 59 ++- crates/client/block_import/src/rayon.rs | 7 +- crates/client/block_import/src/types.rs | 37 +- .../client/block_import/src/verify_apply.rs | 18 +- crates/client/db/src/class_db.rs | 3 +- crates/client/db/src/devnet_db.rs | 40 ++ crates/client/db/src/lib.rs | 6 + crates/client/devnet/Cargo.toml | 58 +++ crates/client/devnet/build.rs | 11 + crates/client/devnet/src/balances.rs | 66 +++ crates/client/devnet/src/classes.rs | 115 +++++ crates/client/devnet/src/contracts.rs | 21 + crates/client/devnet/src/entrypoint.rs | 67 +++ crates/client/devnet/src/lib.rs | 433 ++++++++++++++++++ .../devnet/src/predeployed_contracts.rs | 121 +++++ crates/client/exec/Cargo.toml | 13 + crates/client/exec/src/block_context.rs | 9 +- .../exec/src/blockifier_state_adapter.rs | 21 +- crates/client/mempool/Cargo.toml | 13 +- crates/client/mempool/src/block_production.rs | 62 ++- crates/client/mempool/src/close_block.rs | 8 +- crates/client/mempool/src/inner.rs | 1 + crates/client/mempool/src/l1.rs | 1 + crates/client/mempool/src/lib.rs | 136 +++++- crates/client/rpc/src/errors.rs | 6 +- crates/client/rpc/src/lib.rs | 2 +- crates/client/rpc/src/providers/mempool.rs | 126 +---- crates/client/rpc/src/utils/mod.rs | 20 +- .../src/versions/v0_7_1/methods/read/call.rs | 2 +- .../v0_7_1/methods/read/estimate_fee.rs | 2 +- .../methods/read/estimate_message_fee.rs | 2 +- .../methods/trace/simulate_transactions.rs | 2 +- .../methods/trace/trace_block_transactions.rs | 2 +- .../v0_7_1/methods/trace/trace_transaction.rs | 2 +- crates/client/sync/src/fetch/fetchers.rs | 26 +- crates/client/sync/src/l2.rs | 22 +- crates/client/sync/src/lib.rs | 2 +- crates/node/Cargo.toml | 2 + crates/node/src/cli/block_production.rs | 8 + crates/node/src/cli/mod.rs | 4 + crates/node/src/main.rs | 14 +- crates/node/src/service/block_production.rs | 60 ++- crates/node/src/service/l1.rs | 7 +- crates/node/src/service/rpc/server.rs | 4 +- .../chain_config/src/chain_config.rs | 4 +- crates/primitives/transactions/src/lib.rs | 14 +- crates/primitives/utils/src/lib.rs | 11 +- 67 files changed, 1904 insertions(+), 258 deletions(-) create mode 100644 cairo/.gitignore create mode 100644 cairo/README.md create mode 100644 cairo/Scarb.lock create mode 100644 cairo/Scarb.toml create mode 100644 cairo/src/account.cairo create mode 100644 cairo/src/erc20.cairo create mode 100644 cairo/src/lib.cairo create mode 100644 cairo/src/udc.cairo create mode 100644 cairo/target/dev/madara_contracts_AccountUpgradeable.contract_class.json create mode 100644 cairo/target/dev/madara_contracts_ERC20.contract_class.json create mode 100644 cairo/target/dev/madara_contracts_UniversalDeployer.contract_class.json create mode 100644 cairo/tests/test_contract.cairo create mode 100644 crates/client/db/src/devnet_db.rs create mode 100644 crates/client/devnet/Cargo.toml create mode 100644 crates/client/devnet/build.rs create mode 100644 crates/client/devnet/src/balances.rs create mode 100644 crates/client/devnet/src/classes.rs create mode 100644 crates/client/devnet/src/contracts.rs create mode 100644 crates/client/devnet/src/entrypoint.rs create mode 100644 crates/client/devnet/src/lib.rs create mode 100644 crates/client/devnet/src/predeployed_contracts.rs diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 3cf8ed410..9abafa9a3 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -24,6 +24,10 @@ jobs: - name: Install cargo-llvm-cov uses: taiki-e/install-action@cargo-llvm-cov + - uses: software-mansion/setup-scarb@v1 + with: + scarb-version: "2.8.1" + - uses: foundry-rs/foundry-toolchain@v1 with: version: nightly diff --git a/.github/workflows/linters-cargo.yml b/.github/workflows/linters-cargo.yml index 434692654..fd61bc734 100644 --- a/.github/workflows/linters-cargo.yml +++ b/.github/workflows/linters-cargo.yml @@ -18,6 +18,10 @@ jobs: toolchain: 1.78 components: rustfmt, clippy + - uses: software-mansion/setup-scarb@v1 + with: + scarb-version: "2.8.1" + - name: Setup build deps run: | sudo apt-get update diff --git a/.github/workflows/rust-check.yml b/.github/workflows/rust-check.yml index e3548e0dc..547f67595 100644 --- a/.github/workflows/rust-check.yml +++ b/.github/workflows/rust-check.yml @@ -17,6 +17,10 @@ jobs: with: toolchain: 1.78 + - uses: software-mansion/setup-scarb@v1 + with: + scarb-version: "2.8.1" + - name: Check the project run: | cargo check --release --workspace diff --git a/.gitignore b/.gitignore index c8b377245..935bbdb15 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # Generated by Cargo # will have compiled files and executables -**/target/ +/target # These are backup files generated by rustfmt **/*.rs.bk diff --git a/CHANGELOG.md b/CHANGELOG.md index a8e3400f5..4d8fa566c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Next release +- feat: add devnet via `--devnet` cli argument - refactor: class import from FGW - code docs: documented how get_storage_at is implemented - fix: L1 rpc <=> network mismatch diff --git a/Cargo.lock b/Cargo.lock index 5caf6eedd..db63b951e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3650,6 +3650,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + [[package]] name = "dunce" version = "1.0.4" @@ -3982,6 +3988,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + [[package]] name = "funty" version = "2.0.0" @@ -5344,7 +5356,9 @@ dependencies = [ "ip_network", "jsonrpsee", "log", + "mc-block-import", "mc-db", + "mc-devnet", "mc-eth", "mc-mempool", "mc-metrics", @@ -5437,6 +5451,43 @@ dependencies = [ "tokio", ] +[[package]] +name = "mc-devnet" +version = "0.7.0" +dependencies = [ + "anyhow", + "assert_matches", + "async-trait", + "blockifier", + "env_logger 0.11.3", + "hyper 0.14.29", + "log", + "mc-block-import", + "mc-db", + "mc-exec", + "mc-mempool", + "mockall", + "mp-block", + "mp-chain-config", + "mp-class", + "mp-convert", + "mp-receipt", + "mp-state-update", + "mp-transactions", + "mp-utils", + "proptest", + "proptest-derive", + "rayon", + "rstest 0.18.2", + "serde_json", + "starknet-core", + "starknet-signers", + "starknet-types-core", + "starknet_api", + "thiserror", + "tokio", +] + [[package]] name = "mc-e2e-tests" version = "0.7.0" @@ -5504,18 +5555,27 @@ dependencies = [ name = "mc-exec" version = "0.7.0" dependencies = [ + "anyhow", "blockifier", "cairo-vm", + "lazy_static", "log", + "mc-block-import", "mc-db", "mp-block", "mp-chain-config", "mp-class", "mp-convert", + "mp-state-update", + "rand", + "rstest 0.18.2", + "serde_json", "starknet-core", + "starknet-signers", "starknet-types-core", "starknet_api", "thiserror", + "tokio", ] [[package]] @@ -5523,6 +5583,7 @@ name = "mc-mempool" version = "0.7.0" dependencies = [ "anyhow", + "assert_matches", "async-trait", "bitvec", "blockifier", @@ -5532,6 +5593,7 @@ dependencies = [ "mc-block-import", "mc-db", "mc-exec", + "mockall", "mp-block", "mp-chain-config", "mp-class", @@ -5542,6 +5604,9 @@ dependencies = [ "mp-utils", "proptest", "proptest-derive", + "rstest 0.18.2", + "starknet-core", + "starknet-signers", "starknet-types-core", "starknet_api", "thiserror", @@ -5686,6 +5751,32 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mockall" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c28b3fb6d753d28c20e826cd46ee611fda1cf3cde03a443a974043247c065a" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "341014e7f530314e9a1fdbc7400b244efea7122662c96bfa248c31da5bfb2020" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "mp-block" version = "0.7.0" @@ -6428,6 +6519,32 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "predicates" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" +dependencies = [ + "anstyle", + "predicates-core", +] + +[[package]] +name = "predicates-core" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" + +[[package]] +name = "predicates-tree" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "pretty_assertions" version = "1.4.0" @@ -8264,6 +8381,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + [[package]] name = "thiserror" version = "1.0.61" diff --git a/Cargo.toml b/Cargo.toml index 776c2d09b..b4d6b69f0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "crates/client/rpc", "crates/client/telemetry", "crates/client/metrics", + "crates/client/devnet", "crates/client/mempool", "crates/client/block_import", "crates/node", @@ -30,6 +31,7 @@ default-members = [ "crates/client/rpc", "crates/client/telemetry", "crates/client/metrics", + "crates/client/devnet", "crates/client/mempool", "crates/client/block_import", "crates/node", @@ -101,12 +103,14 @@ mc-eth = { path = "crates/client/eth" } mc-metrics = { path = "crates/client/metrics" } mc-mempool = { path = "crates/client/mempool" } mc-block-import = { path = "crates/client/block_import" } +mc-devnet = { path = "crates/client/devnet" } # Starknet dependencies cairo-vm = "=1.0.1" starknet-core = "0.11" starknet-crypto = "0.7" starknet-providers = "0.11" +starknet-signers = "0.9" starknet = "0.11.0" starknet-types-core = { version = "0.1.5", default-features = false, features = [ @@ -168,6 +172,7 @@ dotenv = "0.15.0" httpmock = "0.7.0" tempfile = "3.10.1" env_logger = "0.11.3" +mockall = "0.13.0" [patch.crates-io] starknet-core = { git = "https://github.com/kasarlabs/starknet-rs.git", branch = "fork" } diff --git a/cairo/.gitignore b/cairo/.gitignore new file mode 100644 index 000000000..d4e869f9e --- /dev/null +++ b/cairo/.gitignore @@ -0,0 +1,7 @@ +target/* +!target/dev +target/dev/* +!target/dev/madara_contracts_ERC20.contract_class.json +!target/dev/madara_contracts_UniversalDeployer.contract_class.json +!target/dev/madara_contracts_AccountUpgradeable.contract_class.json +.snfoundry_cache/ diff --git a/cairo/README.md b/cairo/README.md new file mode 100644 index 000000000..8f46c5a50 --- /dev/null +++ b/cairo/README.md @@ -0,0 +1,7 @@ +# Devnet contracts + +These contracts are used for the genesis block in devnet mode. For real world use, the [madara bootstrapper] is used instead. +We use [OpenZeppelin] contracts. + +[OpenZeppelin]: https://docs.openzeppelin.com +[madara bootstrapper]: https://github.com/madara-alliance/madara-bootstrapper diff --git a/cairo/Scarb.lock b/cairo/Scarb.lock new file mode 100644 index 000000000..673ccad4d --- /dev/null +++ b/cairo/Scarb.lock @@ -0,0 +1,100 @@ +# Code generated by scarb DO NOT EDIT. +version = 1 + +[[package]] +name = "madara_contracts" +version = "0.1.0" +dependencies = [ + "openzeppelin", + "snforge_std", +] + +[[package]] +name = "openzeppelin" +version = "0.15.1" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f8a93d762858714095a1d391afffa9e21df6983" +dependencies = [ + "openzeppelin_access", + "openzeppelin_account", + "openzeppelin_governance", + "openzeppelin_introspection", + "openzeppelin_presets", + "openzeppelin_security", + "openzeppelin_token", + "openzeppelin_upgrades", + "openzeppelin_utils", +] + +[[package]] +name = "openzeppelin_access" +version = "0.15.1" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f8a93d762858714095a1d391afffa9e21df6983" +dependencies = [ + "openzeppelin_introspection", + "openzeppelin_utils", +] + +[[package]] +name = "openzeppelin_account" +version = "0.15.1" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f8a93d762858714095a1d391afffa9e21df6983" +dependencies = [ + "openzeppelin_introspection", + "openzeppelin_utils", +] + +[[package]] +name = "openzeppelin_governance" +version = "0.15.1" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f8a93d762858714095a1d391afffa9e21df6983" +dependencies = [ + "openzeppelin_access", + "openzeppelin_introspection", +] + +[[package]] +name = "openzeppelin_introspection" +version = "0.15.1" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f8a93d762858714095a1d391afffa9e21df6983" + +[[package]] +name = "openzeppelin_presets" +version = "0.15.1" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f8a93d762858714095a1d391afffa9e21df6983" +dependencies = [ + "openzeppelin_access", + "openzeppelin_account", + "openzeppelin_introspection", + "openzeppelin_token", + "openzeppelin_upgrades", +] + +[[package]] +name = "openzeppelin_security" +version = "0.15.1" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f8a93d762858714095a1d391afffa9e21df6983" + +[[package]] +name = "openzeppelin_token" +version = "0.15.1" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f8a93d762858714095a1d391afffa9e21df6983" +dependencies = [ + "openzeppelin_account", + "openzeppelin_governance", + "openzeppelin_introspection", +] + +[[package]] +name = "openzeppelin_upgrades" +version = "0.15.1" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f8a93d762858714095a1d391afffa9e21df6983" + +[[package]] +name = "openzeppelin_utils" +version = "0.15.1" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f8a93d762858714095a1d391afffa9e21df6983" + +[[package]] +name = "snforge_std" +version = "0.27.0" +source = "git+https://github.com/foundry-rs/starknet-foundry?tag=v0.27.0#2d99b7c00678ef0363881ee0273550c44a9263de" diff --git a/cairo/Scarb.toml b/cairo/Scarb.toml new file mode 100644 index 000000000..503d9300d --- /dev/null +++ b/cairo/Scarb.toml @@ -0,0 +1,21 @@ +[package] +name = "madara_contracts" +version = "0.1.0" +edition = "2023_11" +cairo-version = "2.7.0" +scarb-version = "2.7.0" +authors = ["The Madara Committee "] +description = "Cairo contracts for boostrapping a madara network." + +[dependencies] +openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", tag = "v0.15.1" } +starknet = "2.7.0" + +[dev-dependencies] +snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry", tag = "v0.27.0" } + +[[target.starknet-contract]] +sierra = true + +[scripts] +test = "snforge test" diff --git a/cairo/src/account.cairo b/cairo/src/account.cairo new file mode 100644 index 000000000..7df1c9443 --- /dev/null +++ b/cairo/src/account.cairo @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts for Cairo v0.15.1 (presets/account.cairo) + +#[starknet::contract(account)] +pub mod AccountUpgradeable { + use openzeppelin_account::AccountComponent; + use openzeppelin_introspection::src5::SRC5Component; + use openzeppelin_upgrades::UpgradeableComponent; + use openzeppelin_upgrades::interface::IUpgradeable; + use starknet::ClassHash; + + component!(path: AccountComponent, storage: account, event: AccountEvent); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent); + + #[abi(embed_v0)] + pub(crate) impl AccountMixinImpl = + AccountComponent::AccountMixinImpl; + impl AccountInternalImpl = AccountComponent::InternalImpl; + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl; + + #[storage] + struct Storage { + #[substorage(v0)] + account: AccountComponent::Storage, + #[substorage(v0)] + src5: SRC5Component::Storage, + #[substorage(v0)] + upgradeable: UpgradeableComponent::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + AccountEvent: AccountComponent::Event, + #[flat] + SRC5Event: SRC5Component::Event, + #[flat] + UpgradeableEvent: UpgradeableComponent::Event + } + + #[constructor] + pub fn constructor(ref self: ContractState, public_key: felt252) { + self.account.initializer(public_key); + } + + #[abi(embed_v0)] + impl UpgradeableImpl of IUpgradeable { + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) { + self.account.assert_only_self(); + self.upgradeable.upgrade(new_class_hash); + } + } +} diff --git a/cairo/src/erc20.cairo b/cairo/src/erc20.cairo new file mode 100644 index 000000000..18b996503 --- /dev/null +++ b/cairo/src/erc20.cairo @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +// Compatible with OpenZeppelin Contracts for Cairo ^0.15.0 + +#[starknet::contract] +mod ERC20 { + use openzeppelin::access::ownable::OwnableComponent; + use openzeppelin::token::erc20::ERC20Component; + use openzeppelin::token::erc20::ERC20HooksEmptyImpl; + use openzeppelin::upgrades::UpgradeableComponent; + use openzeppelin::upgrades::interface::IUpgradeable; + use starknet::ClassHash; + use starknet::ContractAddress; + + component!(path: ERC20Component, storage: erc20, event: ERC20Event); + component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent); + + #[abi(embed_v0)] + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl; + #[abi(embed_v0)] + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl; + + impl ERC20InternalImpl = ERC20Component::InternalImpl; + impl OwnableInternalImpl = OwnableComponent::InternalImpl; + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl; + + #[storage] + struct Storage { + #[substorage(v0)] + erc20: ERC20Component::Storage, + #[substorage(v0)] + ownable: OwnableComponent::Storage, + #[substorage(v0)] + upgradeable: UpgradeableComponent::Storage, + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC20Event: ERC20Component::Event, + #[flat] + OwnableEvent: OwnableComponent::Event, + #[flat] + UpgradeableEvent: UpgradeableComponent::Event, + } + + #[constructor] + fn constructor( + ref self: ContractState, + name: ByteArray, + symbol: ByteArray, + fixed_supply: u256, + recipient: ContractAddress, + owner: ContractAddress, + ) { + self.erc20.initializer(name, symbol); + self.ownable.initializer(owner); + self.erc20.mint(recipient, fixed_supply); + } + + #[abi(embed_v0)] + impl UpgradeableImpl of IUpgradeable { + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) { + self.ownable.assert_only_owner(); + self.upgradeable.upgrade(new_class_hash); + } + } +} diff --git a/cairo/src/lib.cairo b/cairo/src/lib.cairo new file mode 100644 index 000000000..bd16ec7ea --- /dev/null +++ b/cairo/src/lib.cairo @@ -0,0 +1,4 @@ + +pub mod erc20; +pub mod udc; +pub mod account; diff --git a/cairo/src/udc.cairo b/cairo/src/udc.cairo new file mode 100644 index 000000000..07a1fe4f1 --- /dev/null +++ b/cairo/src/udc.cairo @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts for Cairo v0.15.1 (presets/universal_deployer.cairo) + +#[starknet::contract] +pub mod UniversalDeployer { + use core::hash::{HashStateTrait, HashStateExTrait}; + use core::poseidon::PoseidonTrait; + use openzeppelin_utils::interfaces::IUniversalDeployer; + use starknet::ClassHash; + use starknet::ContractAddress; + use starknet::SyscallResultTrait; + use starknet::get_caller_address; + + #[storage] + struct Storage {} + + #[event] + #[derive(Drop, PartialEq, starknet::Event)] + pub(crate) enum Event { + ContractDeployed: ContractDeployed + } + + #[derive(Drop, PartialEq, starknet::Event)] + pub(crate) struct ContractDeployed { + pub(crate) address: ContractAddress, + pub(crate) deployer: ContractAddress, + pub(crate) from_zero: bool, + pub(crate) class_hash: ClassHash, + pub(crate) calldata: Span, + pub(crate) salt: felt252, + } + + #[abi(embed_v0)] + impl UniversalDeployerImpl of IUniversalDeployer { + fn deploy_contract( + ref self: ContractState, + class_hash: ClassHash, + salt: felt252, + from_zero: bool, + calldata: Span + ) -> ContractAddress { + let deployer: ContractAddress = get_caller_address(); + let mut _salt: felt252 = salt; + if !from_zero { + _salt = PoseidonTrait::new().update_with(deployer).update_with(salt).finalize() + } + + let (address, _) = starknet::syscalls::deploy_syscall( + class_hash, _salt, calldata, from_zero + ) + .unwrap_syscall(); + + self + .emit( + ContractDeployed { address, deployer, from_zero, class_hash, calldata, salt } + ); + return address; + } + } +} diff --git a/cairo/target/dev/madara_contracts_AccountUpgradeable.contract_class.json b/cairo/target/dev/madara_contracts_AccountUpgradeable.contract_class.json new file mode 100644 index 000000000..bfca45d69 --- /dev/null +++ b/cairo/target/dev/madara_contracts_AccountUpgradeable.contract_class.json @@ -0,0 +1 @@ +{"sierra_program":["0x1","0x6","0x0","0x2","0x7","0x0","0x31f","0xe1","0x83","0x52616e6765436865636b","0x800000000000000100000000000000000000000000000000","0x436f6e7374","0x800000000000000000000000000000000000000000000002","0x1","0xf","0x2","0x6163636570745f6f776e657273686970","0x537461726b4e6574204d657373616765","0x4f7074696f6e3a3a756e77726170206661696c65642e","0x4563506f696e74","0x800000000000000700000000000000000000000000000000","0x45635374617465","0x5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f","0x1ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca","0x4e6f6e5a65726f","0x800000000000000700000000000000000000000000000001","0x4","0x800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f","0x426f78","0x3c","0x2db340e6c609371026731f47050d3976552c89b4fbb012941663841c59d1af3","0xca58956845fecb30a8cb3efe23582630dbe8b80cc1fb8fd5d5e866b1356ad","0x38f6a5b87c23cee6e7294bcc3302e95019f70f81586ff3cac38581f5ca96381","0x456e756d","0x0","0x36d10a19e25e7fb08e9fe0a0165350e891a6ee840ec5c4b1a4fb45c8302f498","0x66656c74323532","0x537472756374","0x800000000000000700000000000000000000000000000002","0x2487213a2e92e8c6a8727c551b670514a7796fa30e2e4c9ef4309fa53c3c313","0x2ceccef7f994940b3962a6c67e0ba4fcd37df7d131417c604f91e03caecc1cd","0x2fe1537d7dffde0dbd94fc224408520c88ff07f0ccba33d6d1c9c547e1bd8f2","0x322190232f5f6591b78bfbe0182656eb01ef96a6ed2b904047de7d6fad0c90d","0x800000000000000700000000000000000000000000000003","0x1dae0ba1f47a39607dc385c9306a152068b0f0e7941e4f856da9b44330722c9","0x12","0x13","0x800000000000000f00000000000000000000000000000001","0x2ee1e2b1b89f8c495f200e4956278a4d47395fe262f27b52e5865c9524c08c3","0x800000000000000f00000000000000000000000000000002","0x15","0x16a4c8d7c05909052238a862d8cc3e7975bf05a07b3a69c6b28951083a6d672","0x4172726179","0x800000000000000300000000000000000000000000000001","0x800000000000000300000000000000000000000000000003","0x17","0x18","0xcc5e86243f861d2d64b08c35db21013e773ac5cf10097946fe0011304886d5","0x16","0x19","0x53746f726167654261736541646472657373","0x31448060506164e4d1df7635613bacfbea8af9c3dc85ea9a55935292a4acddc","0x1b","0x7533325f737562204f766572666c6f77","0x496e646578206f7574206f6620626f756e6473","0x3a","0x4163636f756e743a20696e76616c6964207369676e6174757265","0x39","0x1f5d91ca543c7f9a0585a1c8beffc7a207d4af73ee640223a154b1da196a40d","0x22","0x536e617073686f74","0x24","0x556e696e697469616c697a6564","0x800000000000000200000000000000000000000000000001","0x25","0x4163636f756e743a20696e76616c69642063616c6c6572","0x800000000000000300000000000000000000000000000004","0x28","0x32cb17bdb0d0d053909169ec443a25462b7e27237007511f772a7d957ce924c","0x29","0x800000000000000000000000000000000000000000000003","0x30","0x2d","0x31","0x4163636f756e743a20696e76616c69642074782076657273696f6e","0x2f","0x75313238","0x25e2ca4b84968c2d8b83ef476ca8549410346b00836ce79beaf538155990bb2","0x36","0x32","0x1597b831feeb60c71f259624b79cf66995ea4f7e383403583674ab9c33b9cec","0x33","0x753634","0x800000000000000700000000000000000000000000000004","0x3342418ef16b3e2799b906b1e4e89dbb9b111332dd44f72458ce44f9895b508","0x35","0x436f6e747261637441646472657373","0x1baeba72e79e9db2587cf44fedb2f3700b2075a5e8e39a562584862c4b71f62","0x38","0x753332","0x80000000000000070000000000000000000000000000000e","0x348a62b7a38c0673e61e888d83a3ac1bf334ee7361a8514593d3d9532ed8b39","0x37","0x34","0x3693aea200ee3080885d21614d01b9532a8670f69e658a94addaadd72e9aca","0x18508a22cd4cf1437b721f596cd2277fc0a5e4dcd247b107ef2ef5fd2752cf7","0x3d","0x8416421239ce8805ed9d27e6ddae62a97ab5d01883bb8f5246b4742a44b429","0x3e","0x4163636f756e743a20756e617574686f72697a6564","0x436c61737348617368","0x142ea2d2fd5397fde7c79b95d51ea4a79991de55600cb7c1e6148f4a627dbc0","0x41","0x358f4bf88951260abbc2ca3e111e2e32432b563fa321326f0a408b880755514","0x42","0x23ed079bcb59046bba6d3a4278331d9ae8d77ed4a783e9fd5c3148534586741","0x14","0xe","0x43","0x436c61737320686173682063616e6e6f74206265207a65726f","0x3b","0x48","0x3808c701a5d13e100ab11b6c02f91f752ecae7e420d21b56c90ec0a475cc7e5","0x800000000000000700000000000000000000000000000006","0x7d4d99e9ed8d285b5c61b493cedb63976bc3d9da867933d829f49ce838b5e7","0x47","0x46","0x49","0x28a1868d4e0a4c6ae678a74db4e55a60b628ba8668dc128cf0c8e418d0a7945","0x357f22cfa0a31436fa9d89042e9ee63e7cd722921741927f2de8c1800f046a5","0x10e5fcd68658d0cf6ed280e34d0d0da9a510b7a6779230c9912806a2c939b9","0x3f918d17e5ee77373b56385708f855659a07f75997f365cf87748628532a055","0x506564657273656e","0x34f39bef1cbafd5a3595fa7afadc8a5f89c1820b0ff6534555f6dbba07e0eae","0x800000000000000f00000000000000000000000000000003","0x52","0x4d774598278bb52712908c4ef0c8def1af01933705a5396279179893ab52af","0x53","0x506f736569646f6e","0x1d49f7a4b277bf7b55a2664ce8cef5d6922b5ffb806b89644b9e0cdbbcac378","0x56","0x13fdd7105045794a99550ae1c4ac13faa62610dfab62c16422bfcf5803baa6e","0x57","0x4661696c656420746f20646573657269616c697a6520706172616d202333","0x4661696c656420746f20646573657269616c697a6520706172616d202332","0x56414c4944","0x3288d594b9a45d15bb2fcb7903f06cdb06b27f0ba88186ec4cfaa98307cb972","0x5d","0xa853c166304d20fb0711becf2cbdf482dee3cac4e9717d040b7a7ab1df7eec","0x5e","0x53746f7261676541646472657373","0x145cc613954179acf89d43c94ed0e091828cbddcca83f5b408785785036d36d","0x17b6ecc31946835b0d9d92c2dd7a9c14f29af0371571ae74a1b228828b2242","0x63","0x34f9bd7c6cb2dd4263175964ad75f1ff1461ddc332fbfb274e0fb2a5d7ab968","0x64","0x10203be321c62a7bd4c060d69539c1fbe065baa9e253c74d2cc48be163e259","0x67","0x45634f70","0x74584e9f10ffb1a40aa5a3582e203f6758defc4a497d1a2d5a89f274a320e9","0x6a","0x28f8d296e28032baef1f420f78ea9d933102ba47a50b1c5f80fc8a3a1041da","0x800000000000000300000000000000000000000000000002","0x25abf8fd76a01c7e2544d26b0a2e29212b05a36781e0330b46d878e43b307d1","0x6d","0x28f184fd9e4406cc4475e4faaa80e83b54a57026386ee7d5fc4fa8f347e327d","0x6f","0xc1f0cb41289e2f6a79051e9af1ead07112b46ff17a492a90b3944dc53a51c8","0x70","0x29d7d57c04a880978e7b3689f6218e507f3be17588744b58dc17762447ad0e7","0x72","0x53797374656d","0x74","0x4661696c656420746f20646573657269616c697a6520706172616d202331","0x4f7574206f6620676173","0xaaa68be88796cfac4d1a00e58a823f4a2269029794e901716ac246c4b88b6d","0x3d309fe5993982cf823eb797823285c48537004481a7f0752d6b7338577199e","0x800000000000000f00000000000000000000000000000004","0x2f81f2bb85bad899ebe305f7a00fb94156e39bb9758e98477caafc308152233","0x79","0x7a","0x7b","0x44caca9cec7306c0063df30835bf5885df8b43ce3e1cc23175e45963158844","0x7c","0x4275696c74696e436f737473","0x9931c641b913035ae674b400b61a51476d506bbe8bba2ff8a6272790aba9e6","0x78","0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473","0x11c6d8087e00642489f92d2821ad6ebd6532ad1a3b6d12833da6d6810391511","0x4761734275696c74696e","0x163","0x7265766f6b655f61705f747261636b696e67","0x77697468647261775f676173","0x6272616e63685f616c69676e","0x7374727563745f6465636f6e737472756374","0x656e61626c655f61705f747261636b696e67","0x73746f72655f74656d70","0x61727261795f736e617073686f745f706f705f66726f6e74","0x756e626f78","0x72656e616d65","0x656e756d5f696e6974","0x81","0x6a756d70","0x7374727563745f636f6e737472756374","0x656e756d5f6d61746368","0x636c6173735f686173685f7472795f66726f6d5f66656c74323532","0x64697361626c655f61705f747261636b696e67","0x64726f70","0x61727261795f6e6577","0x636f6e73745f61735f696d6d656469617465","0x80","0x61727261795f617070656e64","0x7f","0x82","0x6765745f6275696c74696e5f636f737473","0x7e","0x77697468647261775f6761735f616c6c","0x66756e6374696f6e5f63616c6c","0x3","0xd","0x7d","0x736e617073686f745f74616b65","0x77","0x76","0x616c6c6f635f6c6f63616c","0x66696e616c697a655f6c6f63616c73","0x73","0x71","0x75","0x73746f72655f6c6f63616c","0x6e","0x647570","0x61727261795f6c656e","0x7533325f746f5f66656c74323532","0x6c","0x10","0x6b","0x69","0x11","0x68","0x65","0x73746f726167655f626173655f616464726573735f636f6e7374","0x1379ac0624b939ceb9dede92211d7db5ee174fe28be72245b0a1a2abd81c98f","0x62","0x73746f726167655f616464726573735f66726f6d5f62617365","0x60","0x61","0x73746f726167655f726561645f73797363616c6c","0x5f","0x5c","0x5b","0x5a","0x66","0x59","0x58","0x55","0x54","0x51","0x50","0x66656c743235325f737562","0x66656c743235325f69735f7a65726f","0x4f","0x4e","0x4d","0x706564657273656e","0xad292db4ff05a993c318438c1b6c8a8303266af2da151aa28ccece6726f1f1","0x4c","0x626f6f6c5f6e6f745f696d706c","0x4b","0x6765745f657865637574696f6e5f696e666f5f76325f73797363616c6c","0x4a","0x636f6e74726163745f616464726573735f746f5f66656c74323532","0x636c6173735f686173685f746f5f66656c74323532","0x45","0x7265706c6163655f636c6173735f73797363616c6c","0x44","0x40","0x3f","0x75313238735f66726f6d5f66656c74323532","0x2e","0x753132385f6f766572666c6f77696e675f737562","0x753132385f6571","0x2c","0x2b","0x2a","0x27","0x23","0x1a","0x26","0x21","0x20","0x7533325f6571","0x61727261795f676574","0x1f","0x1e","0x7533325f7472795f66726f6d5f66656c74323532","0x61727261795f736c696365","0x7533325f6f766572666c6f77696e675f737562","0x1d","0x1c","0x73746f726167655f77726974655f73797363616c6c","0x626f6f6c5f746f5f66656c74323532","0xc","0xb","0x656d69745f6576656e745f73797363616c6c","0x21adb5788e32c84f69a1863d85ef9394b7bf761a0ce1190f826984e5075c371","0x61727261795f706f705f66726f6e74","0x63616c6c5f636f6e74726163745f73797363616c6c","0x9","0x65635f706f696e745f66726f6d5f785f6e7a","0x8","0x7","0x6","0x65635f706f696e745f7472795f6e65775f6e7a","0x65635f73746174655f696e6974","0x5","0x65635f73746174655f6164645f6d756c","0x65635f73746174655f7472795f66696e616c697a655f6e7a","0x65635f706f696e745f756e77726170","0x65635f73746174655f616464","0x756e777261705f6e6f6e5f7a65726f","0x65635f6e6567","0x65635f706f696e745f69735f7a65726f","0x66656c743235325f616464","0x68616465735f7065726d75746174696f6e","0xfac","0xffffffffffffffff","0xa","0x129","0x8e","0x93","0xb1","0xa9","0xba","0x119","0xce","0x10a","0x103","0xfc","0x1c8","0x144","0x149","0x167","0x15f","0x170","0x1b8","0x184","0x1aa","0x1a2","0x2be","0x1e7","0x1ec","0x2ac","0x1f5","0x1fa","0x219","0x210","0x222","0x29b","0x237","0x28b","0x27a","0x271","0x25f","0x263","0x282","0x84","0x85","0x86","0x87","0x88","0x3b5","0x2de","0x2e3","0x3a3","0x2ec","0x2f1","0x310","0x307","0x319","0x392","0x32e","0x382","0x371","0x368","0x356","0x35a","0x379","0x433","0x3d3","0x3d8","0x422","0x3ed","0x414","0x40c","0x4f2","0x450","0x455","0x4e1","0x460","0x465","0x4d0","0x470","0x475","0x4bf","0x48a","0x4b1","0x4a9","0x54c","0x516","0x53f","0x536","0x5f8","0x568","0x56d","0x5e6","0x5db","0x5c8","0x58e","0x5b7","0x5ae","0x653","0x61d","0x646","0x63d","0x6ff","0x66f","0x674","0x6ed","0x6e2","0x6cf","0x695","0x6be","0x6b5","0x7bf","0x71d","0x722","0x7ae","0x737","0x79f","0x74e","0x77c","0x89","0x8a","0x8b","0x8c","0x8d","0x8f","0x90","0x91","0x92","0x795","0x770","0x775","0x94","0x784","0x788","0x95","0x83b","0x7dc","0x7e1","0x82a","0x7f6","0x81b","0x96","0x813","0x97","0x8b8","0x98","0x99","0x9a","0x8b0","0x9b","0x9c","0x9d","0x9e","0x9f","0x8a4","0xa0","0xa1","0x875","0xa2","0xa3","0x89d","0xa4","0x897","0xa5","0xa6","0xa7","0xa8","0x88f","0xaa","0xab","0xac","0xad","0xae","0x8be","0xaf","0x8fa","0x8d4","0xb0","0xb2","0xb3","0xb4","0xb5","0x8f2","0xb6","0xb7","0x8e8","0xb8","0xb9","0x9f3","0x9e4","0x9da","0xbb","0xbc","0xbd","0xbe","0xbf","0xc0","0x93d","0xc1","0xc2","0x941","0xc3","0xc4","0xc5","0xc6","0x98a","0xc7","0x950","0x957","0x986","0xc8","0x972","0x964","0x96b","0x96d","0xc9","0x9a5","0x979","0xca","0xcb","0xcc","0x98f","0xcd","0x9c5","0x99e","0x9a4","0x9c0","0xcf","0xd0","0xd1","0x9b9","0xd2","0xd3","0xd4","0x9cd","0xd5","0xd6","0xa40","0xd7","0xd8","0xa0b","0xd9","0xda","0xdb","0xa10","0xdc","0xdd","0xde","0xa35","0xdf","0xe0","0xe1","0xe2","0xe3","0xa2e","0xe4","0xe5","0xe6","0xe7","0xe8","0xe9","0xea","0xab4","0xeb","0xaa4","0xa9b","0xa90","0xec","0xed","0xee","0xef","0xf0","0xaab","0xf1","0xaf7","0xacd","0xf2","0xf3","0xf4","0xf5","0xad9","0xade","0xaec","0xf6","0xf7","0xf8","0xb18","0xf9","0xfa","0xfb","0xb42","0xfd","0xfe","0xb33","0xff","0x100","0x101","0xb58","0xb5d","0x102","0xbaf","0xba6","0x104","0x105","0xb99","0x106","0xb8a","0xb7e","0x107","0x108","0x109","0x10b","0x10c","0x10d","0xc71","0xc68","0xc5b","0x10e","0x10f","0x110","0x111","0xc4d","0x112","0x113","0xc41","0x114","0x115","0x116","0x117","0xc36","0x118","0xc29","0x11a","0xc1f","0x11b","0x11c","0x11d","0x11e","0xc78","0x11f","0x120","0x121","0x122","0x123","0x124","0xcce","0xcc2","0xcb9","0x125","0x126","0x127","0xcf5","0xcf7","0x128","0xceb","0x12a","0xd03","0x12b","0x12c","0x12d","0x12e","0x12f","0x130","0x131","0x132","0xd12","0xd24","0xd29","0xd6c","0x133","0xd68","0xd39","0xd3e","0xd60","0xd59","0xd50","0x134","0x135","0x136","0x137","0x138","0x139","0x13a","0xd70","0xdad","0x13b","0xd82","0x13c","0x13d","0xd87","0xda2","0x13e","0x13f","0xd96","0x140","0x141","0x142","0x143","0xde6","0xdc8","0xdcd","0xddb","0xe03","0x145","0xe17","0xe2b","0x146","0xecf","0x147","0xec2","0x148","0x14a","0xeb4","0x14b","0x14c","0x14d","0x14e","0x14f","0xea6","0x150","0xe9b","0x151","0x152","0xe68","0xe65","0x153","0x154","0xe69","0x155","0x156","0x157","0x158","0xe7b","0x159","0xe91","0xe8e","0xe93","0x15a","0xef0","0x15b","0xeff","0x15c","0x15d","0xf0c","0xf18","0xf9a","0xf31","0xf3d","0xf49","0xf55","0xf61","0xf6b","0xf91","0xf85","0x15e","0x160","0x161","0x162","0x1d7","0x2ce","0x3c5","0x442","0x501","0x55a","0x608","0x661","0x70f","0x7ce","0x84a","0x8c5","0x909","0x9fd","0xa4f","0xabe","0xb06","0xb51","0xbb9","0xc82","0xcda","0xd1b","0xd76","0xdbc","0xdf4","0xedb","0x8534","0xc0340c02c0a01c060140400c0901c060140400c0801c060140400c0200400","0x50441404c070180501003048050441003c070180501003038070180501003","0xc0701b068110641801c060140400c1701c060140400c1601c060140400c15","0x19018050881a0781d018050841a0781d0800701805010030180507c1a0781d","0x60142d0b02b068270742a0142806829074280682707426014250142406823","0x30d8050d41a0781d030340cc050c8050c41a0b8190c0050bc050a01a0b81d","0x400c0701c390140400c0501c390140400c3801c060140400c3701c0601404","0x400fc050443e0ec050b42c0a8050f4050f01a08c190ec05044140e80701805","0x2e0642a0143f014450142806844074150142d0b04301c060140400c4201441","0x7134050100313007018050100312c051280512405120030cc0511c051181a","0x1a01c4d0140400c4d0144d0144f068230740c1384a0144b014490144800c05","0x515c05018051581a1541d0305414c051481a0781d144050443e140050b42c","0x4d0145e014060145d0685c0740c16c5a014590681e07430014110f80c1604d","0x51801a1541d0ec050e4050e4050ec051340517c050180501805018050ec05","0x630682e064620143b01428068230742a0141501461068230643b014060145e","0x191a8051a41a078191a00519c1a0781d030661940701805010030cc0519005","0x55074710141105070014110506f01c060140400c6e0146d0146c0146b06855","0x5044140180517805178051d8051d4051d01a1cc1d1780515c0515c051c81a","0x7a01c060140400c06014790681e07436014780681e0740501c060140400c77","0x190a8051fc050a01a1f81d1f41a09c1d0087c1ec0701805010030180504410","0x840143b01428068230742a0143b0148306823064022083301481014800682e","0x7018050100322007018050100321c0701805010030cc05218052141a0b819","0x8c0682e0648b014280681e0742a0142a0148a068230641a01c060140400c89","0x50c0052401a0b8190d80523c1a0781d0308e068070e405010030cc0523405","0x280681e07406014411003301493014920682e064910143b014280682e0742a","0x525c1a0b8190a8050c0050a01a0b81d008960cc05254052501a0b81901805","0x2e064330149c0149b0682e0643f014280689a07442014990681e0743301498","0x5044140cc052800527c1a0b819278050ec050a01a0b81d0a805114052741a","0x60140400ca501c060140400ca4014411000228c2a014a2014a10682306406","0x52ac051fc052a81a2a41d2a01a09c1d29c1a09c1d0ec050a01a0781d29807","0xb2014b10682e0640c2c033014af014ae0682e0642a014ad014280687e074ac","0x1a2e41a2e01a2dcb6008b50a805018052d01a08c192cc0701805010030cc05","0x501cc001805014bf01805014be01805014bd06805014bc068bb0ec05014ba","0x53100501cc1014073002a0140530c1a308c1014052f05a014052f01a01cc1","0x5014c901805014c81a005014c728805014c716805014c7068c6068c530405","0x52f00501ccc01407300330140530c2f0140530c060140532c06014052f0ca","0x5014c31fc05014c3068d033c05014bc068ce33005014bc29005014bc33405","0xaf0140531cd401405310d33480534468014052f0ad0140530cac0140530cab","0x5014c9068073300501cc02c805014c30ec05014c30c005014c70c005014d5","0x1a01cda014073001a364a4014053603b0140531cd7014053242a0140531cd6","0x5014bc0ec05014bc05405014c836805014c4014073680501cc036805014bc","0x9e01407300dc0140531c9e014052f0a0014052e8db014053106d3480534445","0x5014dd018d2014d11fc05014c71fc05014d511405014c727805014c401407","0x3b01405380420140537c3f0140531c3f014053549c014052e8de01405310a4","0x5014ba39005014c438cd2014d10c005014bc38805014bc38805014c3068e1","0x601405374060140536095014052e8e701405310e634805344e5014052f098","0x72440501cc001805014c724405014bc24c05014ba3a005014c4094d2014d1","0xeb014052e8eb0140531ceb01405354eb0140530cea01c053a4910140531005","0xc4098d2014d1068ef3b805014bc0e405014bc3b405014c9068ec0d805014bf","0x531c33014052e8f201405324f1014053248b014053108d014052e8f001405","0x5014ba3d805014c41b0d2014d13d405014c93d005014c73cc05014c90bc05","0xf9014052f0810140531cf8014053102a34805344f7014052f0840140531086","0x5014c722c05014bc0140722c0501cc0068fc068fb01805014df3e805014c9","0x1a4041a400ff014052e8ff0140531cff01405354ff0140530cfe01405324fd","0xc9069030680722c0501cc040805014ba40805014c740805014d540805014c3","0x77014052e877014052f077014052f906014052f01a41432348053450401405","0xc92b405014c7069081a005014df0690717805014c71d805014c71d405014c7","0x10b014052f00701d0b014073001a01c6e014073006a0140530c1a4290901405","0xc9014073500501cc035005014bc068073500501cc02bc05014c30bcd2014d1","0x52f01a01cdb01407300a00140530c1a01c9e01407300770140531d0c01405","0x501cc005405014cb18805014c419005014ba43405014c40c0d2014d136c05","0x531c5f0140531c4d0140531c70014052e870014052f876014052f00501cdb","0x11013405014df12405014ba43c05014c913405014bc12c05014c90690e0e405","0xde014052f00501cde0140730112014053241a014052fc4a014053241a4441a","0xc311c05014ba45005014c40ccd2014d10fc05014bc0ec05014c844c05014c9","0x3b014052f4e2014052e8420140536115014053241a01cde014073009c01405","0xc410805014dd014074580501cc045805014bc10805014bc068074580501cc0","0x531d173480534406014053803b014052fc3b0140537c3b014052f91601405","0x5014c7068073900501cc026005014c339005014bc014073900501cc010805","0x530ce7014052f00501ce701407301190140532470014052f0e20140531d18","0x501cc024c05014c3068072440501cc01c005014c70680739c0501cc025405","0x73008d0140530c1a46d1a014053240501ce801407300e8014052f01a01ce8","0xc90d8d2014d147405014c928805014bc018050151c3c005014bc068073c005","0x1a4840601405480390140537c1a47c5a0140537c0501cf0014073011e01405","0x73d80501cc03d805014bc068073d80501cc021805014c3068072100501cc0","0x52e9230140531d2301405355230140530c0501c8401407301220140532405","0xc0014071b00501cc009805014c30c805014c745c05014c448cd2014d148c05","0xf801407300810140530c1a01c6c01407300250140530c1a4901a01d0b01407","0xc738c05014d538c05014c339805014c9014073e00501cc03e005014bc06807","0x6c014053110b014053110b0140531d0b014053541a494e3014052e8e301405","0xc91b805014c41b405014c409805014ba49805014c909405014ba34c05014c9","0x1a01c6201407300150140530c1a4a41a4a068014052fc6a014052e92701405","0x74340501cc0014071880501cc043405014bc068074340501cc019005014c3","0x73003b0140532c1a4ac15014052e862014052f015014052f815014054a805","0xbc0692d4b005014c9068074500501cc011c05014c345005014bc0140745005","0x133014052f01a4d1330140537c1a4c81a4c530014053252f014053252e01405","0xbc0693904805015384b805014c74cc05014c7069374b805014df0693606935","0x1170140730005014053241a4f01a4ec0701405324d2014053241a4e81201405","0x50681a0693d22c05014c70680745c0501cc00c805014c345c05014bc01407","0x53481a0693e0141a01c1a4bd3001ca24cc1201d3e01c05068070141a0693e","0x13e01d2e01530068120153e01412015330681a4f805068120692e0153e014d2","0x5498054b81a498054f8054fc054bc1a0693e0141a01c1a49c051b53f4b007","0x13e0146d01527068060153e0152c0153f0686d0153e014d30152c068d30153e","0xe60146d068e60153e0141a34c1a0693e0141a01c1a068260141a4981a38c05","0x738c050181a38c054f8050940549c1a018054f80549c054fc1a094054f805","0x2f0148b0c82a01d3e01c260480738c1a0693e0141a01c1a1b0053b8260153e","0x5450330c0074f807018054c01a0a8054f8050a8054cc1a0693e0141a01c1a","0x50cc050981a0693e01430014250681a4f805068e60681a4f8050680706917","0x2f069230153e0141a0c81a0d8054f8050682a0681a4f8050c8051b01a0693e","0x745c1a478054f80506833069220153e015230d8070c01a48c054f80548c05","0x548c1a0a8054f8050a8054cc1a468054f805474050d81a474054f8054891e","0x1330a8120151a0153e0151a0151e068070153e0140701522069330153e01533","0x50691d0681a4f80545c050941a0693e0141a3981a0693e0141a01c1a46807","0x3f01cfd4583d01d3e01d194cc2a34919069190153e015190151a069190153e","0x50683f069150153e0141a4581a460054f8050683d0681a4f8050680706842","0x701522069160153e0151601523068470153e014454551834842068450153e","0x11244d143493e0143211c07458124541a0c8054f8050c8054601a01c054f805","0x1a4f805068070690f01471128054f807448051141a0f4054f8050f4054cc1a","0x1130684b124074f805134054501a134054f8050682a0681a4f8051280511c1a","0x530150f068530153e014510144a068510153e0144b015120681a4f80512405","0x544c054881a450054f8054500548c1a0f4054f8050f4054cc1a17c054f805","0x360681a4f805068070685f44d140f4120145f0153e0145f0151e069130153e","0x54881a450054f8054500548c1a0f4054f8050f4054cc1a15c054f80543c05","0x1a4f805068070685744d140f412014570153e014570151e069130153e01513","0x5e0142f0685e0153e0141a1341a140054f8050682a0681a4f8050c8051b01a","0x5a0ec0745c1a0ec054f805068330685a0153e0145e140070c01a178054f805","0x51080548c1a0fc054f8050fc054cc1a1c0054f8050e4050d81a0e4054f805","0x7001c420fc12014700153e014700151e068070153e0140701522068420153e","0x506926068150153e0142f015330681a4f805018050941a0693e0141a01c1a","0x54cc1a0693e01406014250681a4f8051b0051241a0693e0141a01c1a068e8","0x640153e0141a12c1a188054f8050682a0681a4f805068e6068150153e01412","0x1a430054f805068330690d0153e01464188070c01a190054f805190050bc1a","0x1a054054f805054054cc1a1a8054f8051a0050d81a1a0054f8054350c01d17","0x120146a0153e0146a0151e068070153e0140701522069330153e0153301523","0x1a1b8054f8050682a0681a4f805348051441a0693e0141a01c1a1a8074cc15","0x33069090153e0150b1b8070c01a42c054f80542c050bc1a42c054f8050684d","0x54cc1a1c4054f8051d4050d81a1d4054f8054247601d17068760153e0141a","0x710151e068070153e01407015220692f0153e0152f01523069300153e01530","0x1a0681a4f8050685f069330153e0141a14c1a1c4074bd30048051c4054f805","0x1a0693e0141a01c1a4b12e01d404bd3001d3e01c05068070141a0693e0141a","0x13f01530069300153e01530015330681a4f805068120693f0153e014d2014d2","0x54fc1a1b4054f8054980515c1a0693e0141a01c1a34c055052649c074f807","0x1a4f805068070681a5080506926068e30153e0146d01450068060153e01527","0x50068060153e014d30153f068250153e014e60145e068e60153e0141a34c1a","0xe60681a4f805068070686c01543098054f80738c051681a38c054f80509405","0x13e0140601512068320153e0141a0ec1a0a8054f805098054bc1a0693e0141a","0x54f8054bc0548c1a4c0054f8054c0054cc1a0c0054f8050a8054b81a0bc05","0x300153e014300142f068320153e01432014700682f0153e0142f014390692f","0x1220154448c054f8070d8051881a0d9170ccd24f8050c0320bd2f4c1330541a","0x1330691a0153e0151e014d20691d478074f80548c051901a0693e0141a01c1a","0x54341a458054f805468054fc1a0f4054f80545c0548c1a464054f8050cc05","0x1a0693e015330150c0681a4f805068070681a51405069260683f0153e0151d","0x122069170153e0151701523068330153e0143301533068420153e0152201436","0x13e0141a01c1a1080745c3304805108054f805108054781a01c054f80501c05","0x11801468069180153e0141a34c1a0693e0146c014490681a4f805068e60681a","0x5018054fc1a0f4054f8054bc0548c1a464054f8054c0054cc1a454054f805","0x1a01c1a11c05518450153e01c3f0146a0683f0153e015150150d069160153e","0x114014250681a4f80506807069120154744d1401d3e01d16015300681a4f805","0x1a0693e014450146e0681a4f8054cc054301a0693e01513014260681a4f805","0x4a01c300690f0153e0150f0142f0690f0153e0141a0c81a128054f8050682a","0x4b014360684b0153e0144d1240745c1a124054f805068330684d0153e0150f","0x501c054881a0f4054f8050f40548c1a464054f805464054cc1a144054f805","0x250681a4f805068070685101c3d46412014510153e014510151e068070153e","0x3d464d24641a14c054f80514c054681a14c054f8050691d0681a4f80544805","0x10b0685a0153e0141a0f41a0693e0141a01c1a1785001d4815c5f01d3e01c53","0x548c1a17c054f80517c054cc1a0693e0143b01509068390ec074f80516805","0x5f4cc76068450153e0144501470068070153e0140701522068570153e01457","0x7188051c41a048054f8050493301c7506862048151c0124f8051143901c57","0x13e01464014770690c0153e0141a0a81a0693e0141a01c1a43405524640153e","0x74f8051b8054081a0693e0146a015040686e1a8074f8051a0054181a1a005","0x54f8051d8050bc1a1d8054f805424053f81a424054f80542c053fc1a42c6e","0x54f8051c0054cc1a1c4054f8051b8053f41a1d4054f8051d90c01c3006876","0x750153e01475014f9068710153e01471014fa068150153e014150152306870","0x1a3fc05529020153e01d040148106904418773493e014751c4151c0121fc1a","0xfe015140681a4f8053f4051241a3f4fe01d3e01502014f80681a4f80506807","0x51fc051281a1fc054f8053e4054481a0693e014fa01513068f93e8074f805","0x13e0150601523068770153e0147701533068f80153e014810150f068810153e","0x1a3e01241877048053e0054f8053e0054781a048054f805048054881a41805","0x10601523068770153e0147701533068f70153e014ff014360681a4f80506807","0x1241877048053dc054f8053dc054781a048054f805048054881a418054f805","0x123068700153e0147001533068840153e0150d014360681a4f80506807068f7","0x7004805210054f805210054781a048054f805048054881a054054f80505405","0x2a0681a4f805114051b81a0693e015330150c0681a4f805068070688404815","0xf6218070c01a3d8054f8053d8050bc1a3d8054f8050684d068860153e0141a","0x53c8050d81a3c8054f8053d4f301d17068f30153e0141a0cc1a3d4054f805","0x13e01407015220685e0153e0145e01523068500153e0145001533068f10153e","0x51241a0693e0141a01c1a3c40717850048053c4054f8053c4054781a01c05","0x8b0153e0141a0a81a0693e01516014250681a4f8054cc054301a0693e01447","0x1a3c0054f8052348b01c300688d0153e0148d0142f0688d0153e0141a12c1a","0x133068eb0153e014ee01436068ee0153e014f03b40745c1a3b4054f80506833","0x54781a01c054f80501c054881a0f4054f8050f40548c1a464054f80546405","0x1a0693e015330150c0681a4f80506807068eb01c3d46412014eb0153e014eb","0x524c050bc1a24c054f8050684d068910153e0141a0a81a0693e014d201451","0x53a0f401d17068f40153e0141a0cc1a3a0054f80524c9101c30068930153e","0x13e0152c015230692e0153e0152e01533068e70153e0149501436068950153e","0x1a39c074b12e0480539c054f80539c054781a01c054f80501c054881a4b005","0x1a4f805068070692e4bc0752d304cc074f80701c1a01c050681a4f8050681a","0x54c01a4cc054f8054cc054cc1a0693e0141a0481a4b0054f805048053481a","0x13f068d30153e01527014570681a4f80506807069260154c49d3f01d3e01d2c","0x13e0141a01c1a0694d0141a4981a018054f80534c051401a1b4054f8054fc05","0x1a1b4054f805498054fc1a398054f80538c051781a38c054f805068d30681a","0x1a0693e0141a01c1a09805538250153e01c060145a068060153e014e601450","0x51b4054481a0a8054f8050683b0686c0153e014250152f0681a4f805068e6","0x13e0153001523069330153e01533015330682f0153e0146c0152e068320153e","0x54f8050bc050bc1a0a8054f8050a8051c01a0c8054f8050c8050e41a4c005","0x553c360153e01d1701462069170cc303493e0142f0a8324c1334cc150682f","0x1a474054f805488053481a4792201d3e01436014640681a4f8050680706923","0x10d0683d0153e0151d0153f069190153e01433015230691a0153e0143001533","0x54f80548c050d81a0693e0141a01c1a069500141a4981a458054f80547805","0x330153e0143301523068050153e01405014f7068300153e01430015330683f","0x70683f34833014304cc050fc054f8050fc054781a348054f805348054881a","0x1a108054f805068d30681a4f805098051241a0693e0141a3981a0693e0141a","0x13f069190153e01530015230691a0153e0153301533069180153e0144201468","0x4501551454054f807458051a81a458054f805460054341a0f4054f8051b405","0x113015524504701d3e01c3d015300681a4f805454051b81a0693e0141a01c1a","0x13e0141a0a81a0693e01514014260681a4f80511c050941a0693e0141a01c1a","0x54f8051291201c300684a0153e0144a0142f0684a0153e0141a0c81a44805","0x4b0153e0144901436068490153e0150f1340745c1a134054f805068330690f","0x1a464054f8054640548c1a014054f805014053dc1a468054f805468054cc1a","0x1a01c1a12cd246405469330144b0153e0144b0151e068d20153e014d201522","0x510153e014510151a068510153e0141a4741a0693e01513014250681a4f805","0x50683d0681a4f805068070685015c0754c5f14c074f80714519468d24641a","0x13e01453015330681a4f805168054241a0ec5a01d3e0145e0150b0685e0153e","0x54f805348054881a17c054f80517c0548c1a014054f805014053dc1a14c05","0x10d0153e01c640148606864188151c0394cd3e0143b3485f014534cc84068d2","0x1a1a8054f805434053d81a1a0054f8050682a0681a4f805068070690c01554","0x1a0693e0150b015130690942c074f8051b8054501a1b8054f8051a86801c30","0x133068710153e014750150f068750153e014760144a068760153e0150901512","0x54881a054054f8050540548c1a1c0054f8051c0053dc1a0e4054f8050e405","0x13e0141a01c1a1c462054700e533014710153e014710151e068620153e01462","0x700153e01470014f7068390153e0143901533068770153e0150c014360681a","0x51dc054f8051dc054781a188054f805188054881a054054f8050540548c1a","0x54f8050684d069060153e0141a0a81a0693e0141a01c1a1dc62054700e533","0xff0153e0141a0cc1a408054f8054110601c30069040153e015040142f06904","0x570153e0145701533068fd0153e014fe01436068fe0153e015023fc0745c1a","0x1a348054f805348054881a140054f8051400548c1a014054f805014053dc1a","0x5114051241a0693e0141a01c1a3f4d21400515d33014fd0153e014fd0151e","0x2f068f90153e0141a12c1a3e8054f8050682a0681a4f8050f4050941a0693e","0x745c1a204054f805068330687f0153e014f93e8070c01a3e4054f8053e405","0x53dc1a468054f805468054cc1a3dc054f8053e0050d81a3e0054f8051fc81","0xf70151e068d20153e014d201522069190153e0151901523068050153e01405","0x1a0693e01412014510681a4f80506807068f7349190151a4cc053dc054f805","0x8401c30068860153e014860142f068860153e0141a1341a210054f8050682a","0xf301436068f30153e014f63d40745c1a3d4054f80506833068f60153e01486","0x54b80548c1a014054f805014053dc1a4bc054f8054bc054cc1a3c8054f805","0xd24b8054bd33014f20153e014f20151e068d20153e014d2015220692e0153e","0x7068070141a0693e0141a0681a0693e0141a17c1a4c0054f805068f5068f2","0x12069270153e01412014d20681a4f805068070693f4b0075552e4bc074f807","0x1a1b405558d3498074f80749c054c01a4bc054f8054bc054cc1a0693e0141a","0xe30152c068e30153e014060152e068060153e014d30152f0681a4f80506807","0x1570141a4981a098054f8053980549c1a094054f805498054fc1a398054f805","0x54fc1a0a8054f8051b0051b41a1b0054f805068d30681a4f805068070681a","0x1a0c805561330153e01c2601406068260153e0142a01527068250153e0146d","0x5564300bc074f807094054c01a4cc054f8054cd3001cf30681a4f80506807","0x50068360153e0142f0153f069170153e01430014570681a4f8050680706833","0x1220153e0141a34c1a0693e0141a01c1a0695a0141a4981a48c054f80545c05","0x1a48c054f805478051401a0d8054f8050cc054fc1a478054f805488051781a","0x54bc1a0693e0141a3981a0693e0141a01c1a4680556d1d0153e01d230145a","0x5464054b81a458054f8050d8054481a0f4054f8050682a069190153e0151d","0x13e01516014390692e0153e0152e015230692f0153e0152f015330683f0153e","0x3d4592e4bd333c81a0fc054f8050fc050bc1a0f4054f8050f4053e41a45805","0x1a0693e0141a01c1a11c05570450153e01d15014f106915460423493e0143f","0x1a128054f805108054cc1a448054f805450053481a44d1401d3e014450148b","0x126068490153e015130148d0684d0153e015120153f0690f0153e0151801523","0x4b0153e01447014360681a4f8054cc053c01a0693e0141a01c1a0695d0141a","0x1a460054f8054600548c1a014054f805014053dc1a108054f805108054cc1a","0x1a01c1a12cd246005109330144b0153e0144b0151e068d20153e014d201522","0xed068510153e0141a34c1a0693e0151a014490681a4f805068e60681a4f805","0x54fc1a43c054f8054b80548c1a128054f8054bc054cc1a14c054f80514405","0x1a15c055785f0153e01c49014ee068490153e014530148d0684d0153e01436","0x250681a4f805068070685a0155f1785001d3e01c4d015300681a4f80506807","0x13e01533014f00681a4f80517c0544c1a0693e0145e014260681a4f80514005","0x30068390153e014390142f068390153e0141a0c81a0ec054f8050682a0681a","0x36068620153e014700540745c1a054054f80506833068700153e014390ec07","0x548c1a014054f805014053dc1a128054f805128054cc1a190054f80518805","0x512933014640153e014640151e068d20153e014d2015220690f0153e0150f","0x11a0690d0153e0141a4741a0693e0145a014250681a4f80506807068643490f","0x5068070686e1a80758068430074f8074350f128d24641a434054f80543405","0x7601d3e0150901493069090153e0150b014910690b0153e0141a3ac1a0693e","0x1a1dc054f8051c4052541a1c4054f8051d4053d01a0693e01476014e806875","0x53901a410054f805410052601a410054f805068e5069060153e01477014e7","0xff408d24f8074190434868048e20690c0153e0150c01533069060153e01506","0x7f01513068811fc074f80517c054501a0693e0141a01c1a3e4fa3f4d2584fe","0x13e01405014f70690c0153e0150c01533068f80153e01481015120681a4f805","0x54f8053e0050e41a3f8054f8053f8050bc1a4cc054f8054cc050bc1a01405","0x122069020153e015020152306886210f73493e014f83f9330150c4cc9c068f8","0x9e0681a4f80506807068f5015623d8054f807218053781a3fc054f8053fc05","0x7068f1015633c8054f8073cc052801a0693e0141a0481a3cc054f8053d805","0x54f80522c050bc1a22c054f805068db0681a4f8053c8051241a0693e0141a","0x13e0141a2881a0693e014f1014490681a4f805068070681a59005069260688d","0x30068ed0153e0141a0a81a0693e0141a3981a234054f8053c0050bc1a3c005","0x1120681a4f8053ac0544c1a244eb01d3e014ee01514068ee0153e0148d3b407","0x54cc1a3d0054f8053a00543c1a3a0054f80524c051281a24c054f80524405","0xff01522069020153e0150201523068840153e01484014f7068f70153e014f7","0x1a4f80506807068f43fd02210f74cc053d0054f8053d0054781a3fc054f805","0x1a394054f8053dc054cc1a0693e01495014a4068e7254074f8053d4053681a","0xf9068e20153e014ff01522068e40153e0150201523068980153e01484014f7","0x1a4f80517c0544c1a0693e0141a01c1a069650141a4981a270054f80539c05","0x123068980153e01405014f7068e50153e0150c015330681a4f8054cc053c01a","0x1a0cc1a270054f8053e4053e41a388054f8053e8054881a390054f8053f405","0xe501533068a00153e0149e014360689e0153e0149c3780745c1a378054f805","0x5388054881a390054f8053900548c1a260054f805260053dc1a394054f805","0x1a0693e0141a01c1a280e23909839533014a00153e014a00151e068e20153e","0x13e0141a1341a36c054f8050682a0681a4f8054cc053c01a0693e0145f01513","0x54f80506833068da0153e014a236c070c01a288054f805288050bc1a28805","0x54f8051a8054cc1a35c054f805370050d81a370054f805368a401d17068a4","0xd20153e014d2015220686e0153e0146e01523068050153e01405014f70686a","0x57014490681a4f80506807068d73486e0146a4cc0535c054f80535c054781a","0x1a358054f8050682a0681a4f8054cc053c01a0693e0144d014250681a4f805","0x33068ab0153e014b2358070c01a2c8054f8052c8050bc1a2c8054f805068dc","0x54cc1a2bc054f8052b4050d81a2b4054f8052acac01d17068ac0153e0141a","0xd2015220690f0153e0150f01523068050153e01405014f70684a0153e0144a","0x1a4f80506807068af3490f0144a4cc052bc054f8052bc054781a348054f805","0x54c00535c1a0693e01425014250681a4f8050c8051241a0693e0141a3981a","0x1a33c054f80533c050bc1a33c054f8050684b068d40153e0141a0a81a0693e","0x1a304054f805330ca01d17068ca0153e0141a0cc1a330054f80533cd401c30","0x123068050153e01405014f70692f0153e0152f01533068cd0153e014c101436","0x12f4cc05334054f805334054781a348054f805348054881a4b8054f8054b805","0x1a0693e01412014510681a4f8054c00535c1a0693e0141a01c1a334d24b805","0x1c30069660153e015660142f069660153e0141a1341a000054f8050682a","0x16901436069690153e015675a00745c1a5a0054f80506833069670153e01566","0x54fc0548c1a014054f805014053dc1a4b0054f8054b0054cc1a5a8054f805","0xd24fc054b1330156a0153e0156a0151e068d20153e014d2015220693f0153e","0x7068070141a0693e0141a0681a0693e0141a17c1a4c0054f805068f50696a","0x12069270153e01412014d20681a4f805068070693f4b0075ad2e4bc074f807","0x1a1b4055b0d3498074f80749c054c01a4bc054f8054bc054cc1a0693e0141a","0xe30152c068e30153e014060152e068060153e014d30152f0681a4f80506807","0x16d0141a4981a098054f8053980549c1a094054f805498054fc1a398054f805","0x54fc1a0a8054f8051b0051b41a1b0054f805068d30681a4f805068070681a","0x1a0c8055b9330153e01c2601406068260153e0142a01527068250153e0146d","0x55bc300bc074f807094054c01a4cc054f8054cd3001cf30681a4f80506807","0x50068360153e0142f0153f069170153e01430014570681a4f8050680706833","0x1220153e0141a34c1a0693e0141a01c1a069700141a4981a48c054f80545c05","0x1a48c054f805478051401a0d8054f8050cc054fc1a478054f805488051781a","0x54bc1a0693e0141a3981a0693e0141a01c1a468055c51d0153e01d230145a","0x5464054b81a458054f8050d8054481a0f4054f8050682a069190153e0151d","0x13e01516014390692e0153e0152e015230692f0153e0152f015330683f0153e","0x3d4592e4bd333c81a0fc054f8050fc050bc1a0f4054f8050f4053e41a45805","0x1a0693e0141a01c1a11c055c8450153e01d15014f106915460423493e0143f","0x1a128054f805108054cc1a448054f805450053481a44d1401d3e014450148b","0x126068490153e015130148d0684d0153e015120153f0690f0153e0151801523","0x4b0153e01447014360681a4f8054cc053c01a0693e0141a01c1a069730141a","0x1a460054f8054600548c1a014054f805014053dc1a108054f805108054cc1a","0x1a01c1a12cd246005109330144b0153e0144b0151e068d20153e014d201522","0xed068510153e0141a34c1a0693e0151a014490681a4f805068e60681a4f805","0x54fc1a43c054f8054b80548c1a128054f8054bc054cc1a14c054f80514405","0x1a15c055d05f0153e01c49014ee068490153e014530148d0684d0153e01436","0x250681a4f805068070685a015751785001d3e01c4d015300681a4f80506807","0x13e01533014f00681a4f80517c0544c1a0693e0145e014260681a4f80514005","0x30068390153e014390142f068390153e0141a0c81a0ec054f8050682a0681a","0x36068620153e014700540745c1a054054f80506833068700153e014390ec07","0x548c1a014054f805014053dc1a128054f805128054cc1a190054f80518805","0x512933014640153e014640151e068d20153e014d2015220690f0153e0150f","0x11a0690d0153e0141a4741a0693e0145a014250681a4f80506807068643490f","0x5068070686e1a8075d868430074f8074350f128d24641a434054f80543405","0x7601d3e0150901493069090153e0150b014910690b0153e0141a3ac1a0693e","0x1a1dc054f8051c4052541a1c4054f8051d4053d01a0693e01476014e806875","0x53901a410054f805410052601a410054f805068e5069060153e01477014e7","0xff408d24f8074190434868048e20690c0153e0150c01533069060153e01506","0x7f01513068811fc074f80517c054501a0693e0141a01c1a3e4fa3f4d25dcfe","0x13e01405014f70690c0153e0150c01533068f80153e01481015120681a4f805","0x54f8053e0050e41a3f8054f8053f8050bc1a4cc054f8054cc050bc1a01405","0x122069020153e015020152306886210f73493e014f83f9330150c4cc9c068f8","0x9e0681a4f80506807068f5015783d8054f807218053781a3fc054f8053fc05","0x7068f1015793c8054f8073cc052801a0693e0141a0481a3cc054f8053d805","0x54f80522c050bc1a22c054f805068db0681a4f8053c8051241a0693e0141a","0x13e0141a2881a0693e014f1014490681a4f805068070681a5e805069260688d","0x30068ed0153e0141a0a81a0693e0141a3981a234054f8053c0050bc1a3c005","0x1120681a4f8053ac0544c1a244eb01d3e014ee01514068ee0153e0148d3b407","0x54cc1a3d0054f8053a00543c1a3a0054f80524c051281a24c054f80524405","0xff01522069020153e0150201523068840153e01484014f7068f70153e014f7","0x1a4f80506807068f43fd02210f74cc053d0054f8053d0054781a3fc054f805","0x1a394054f8053dc054cc1a0693e01495014a4068e7254074f8053d4053681a","0xf9068e20153e014ff01522068e40153e0150201523068980153e01484014f7","0x1a4f80517c0544c1a0693e0141a01c1a0697b0141a4981a270054f80539c05","0x123068980153e01405014f7068e50153e0150c015330681a4f8054cc053c01a","0x1a0cc1a270054f8053e4053e41a388054f8053e8054881a390054f8053f405","0xe501533068a00153e0149e014360689e0153e0149c3780745c1a378054f805","0x5388054881a390054f8053900548c1a260054f805260053dc1a394054f805","0x1a0693e0141a01c1a280e23909839533014a00153e014a00151e068e20153e","0x13e0141a1341a36c054f8050682a0681a4f8054cc053c01a0693e0145f01513","0x54f80506833068da0153e014a236c070c01a288054f805288050bc1a28805","0x54f8051a8054cc1a35c054f805370050d81a370054f805368a401d17068a4","0xd20153e014d2015220686e0153e0146e01523068050153e01405014f70686a","0x57014490681a4f80506807068d73486e0146a4cc0535c054f80535c054781a","0x1a358054f8050682a0681a4f8054cc053c01a0693e0144d014250681a4f805","0x33068ab0153e014b2358070c01a2c8054f8052c8050bc1a2c8054f805068dc","0x54cc1a2bc054f8052b4050d81a2b4054f8052acac01d17068ac0153e0141a","0xd2015220690f0153e0150f01523068050153e01405014f70684a0153e0144a","0x1a4f80506807068af3490f0144a4cc052bc054f8052bc054781a348054f805","0x54c00535c1a0693e01425014250681a4f8050c8051241a0693e0141a3981a","0x1a33c054f80533c050bc1a33c054f8050684b068d40153e0141a0a81a0693e","0x1a304054f805330ca01d17068ca0153e0141a0cc1a330054f80533cd401c30","0x123068050153e01405014f70692f0153e0152f01533068cd0153e014c101436","0x12f4cc05334054f805334054781a348054f805348054881a4b8054f8054b805","0x1a0693e01412014510681a4f8054c00535c1a0693e0141a01c1a334d24b805","0x1c30069660153e015660142f069660153e0141a1341a000054f8050682a","0x16901436069690153e015675a00745c1a5a0054f80506833069670153e01566","0x54fc0548c1a014054f805014053dc1a4b0054f8054b0054cc1a5a8054f805","0xd24fc054b1330156a0153e0156a0151e068d20153e014d2015220693f0153e","0x5068070692e4bc075f1304cc074f80701c1a01c050681a4f8050681a0696a","0x1a4cc054f8054cc054cc1a0693e0141a0481a4b0054f805048053481a0693e","0xd30153e015270152f0681a4f80506807069260157d49d3f01d3e01d2c01530","0x1a38c054f8054fc054fc1a018054f8051b4054b01a1b4054f80534c054b81a","0x54f805068d30681a4f805068070681a5f80506926068e60153e0140601527","0xe60153e0142601527068e30153e015260153f068260153e014250146d06825","0x1a0693e0146c014f00681a4f805068070682a0157f1b0054f807398050181a","0x250681a4f805068e60681a4f8050680706830015800bc3201d3e01ce301530","0x54f80506832068330153e0141a0a81a0693e0142f014260681a4f8050c805","0x1230153e0141a0cc1a0d8054f80545c3301c30069170153e015170142f06917","0x1330153e01533015330691e0153e0152201436069220153e0143648c0745c1a","0x1a348054f805348054881a4c0054f8054c00548c1a014054f805014053dc1a","0x13e0141a3981a0693e0141a01c1a478d24c0054cd330151e0153e0151e0151e","0x1190691d0153e0151d0151a0691d0153e0141a4741a0693e01430014250681a","0x54f8050683d0681a4f80506807069160f40760519468074f807475304ccd2","0x11a0153e0151a015330681a4f805108054241a4604201d3e0143f0150b0683f","0x1a348054f805348054881a464054f8054640548c1a014054f805014053dc1a","0x5609120153e01d13014860691345047115154cd3e01518349190151a4cc84","0x70c01a134054f805448053d81a43c054f8050682a0681a4f805068070684a","0x54481a0693e0144b015130685112c074f805124054501a124054f8051350f","0x11501533068570153e0145f0150f0685f0153e014530144a068530153e01451","0x5450054881a11c054f80511c0548c1a114054f805114053dc1a454054f805","0x1a0693e0141a01c1a15d1411c4545533014570153e014570151e069140153e","0x123068450153e01445014f7069150153e0151501533068500153e0144a01436","0x1154cc05140054f805140054781a450054f805450054881a11c054f80511c05","0x1a168054f8050684d0685e0153e0141a0a81a0693e0141a01c1a1411411c45","0x117068390153e0141a0cc1a0ec054f8051685e01c300685a0153e0145a0142f","0xf70683d0153e0143d01533068150153e0147001436068700153e0143b0e407","0x54781a348054f805348054881a458054f8054580548c1a014054f80501405","0x1a0693e0141a3981a0693e0141a01c1a054d2458050f533014150153e01415","0x13e0141a12c1a188054f8050682a0681a4f80538c050941a0693e0142a01449","0x54f805068330690d0153e01464188070c01a190054f805190050bc1a19005","0x54f8054cc054cc1a1a8054f8051a0050d81a1a0054f8054350c01d170690c","0xd20153e014d201522069300153e0153001523068050153e01405014f706933","0x12014510681a4f805068070686a34930015334cc051a8054f8051a8054781a","0x10b0153e0150b0142f0690b0153e0141a1341a1b8054f8050682a0681a4f805","0x750153e015091d80745c1a1d8054f80506833069090153e0150b1b8070c01a","0x1a014054f805014053dc1a4bc054f8054bc054cc1a1c4054f8051d4050d81a","0x133014710153e014710151e068d20153e014d2015220692e0153e0152e01523","0x12e4bc0760d304cc074f80701c1a01c050681a4f8050681a068713492e0152f","0x54cc054cc1a0693e0141a0481a4b0054f805048053481a0693e0141a01c1a","0x1270152f0681a4f80506807069260158449d3f01d3e01d2c01530069330153e","0x54fc054fc1a018054f8051b4054b01a1b4054f80534c054b81a34c054f805","0xd30681a4f805068070681a6140506926068e60153e0140601527068e30153e","0x2601527068e30153e015260153f068260153e014250146d068250153e0141a","0x6c014f00681a4f805068070682a015861b0054f807398050181a398054f805","0x2f0152f0681a4f8050680706830015870bc3201d3e01ce3015300681a4f805","0x50c8054fc1a0d8054f80545c054b01a45c054f8050cc054b81a0cc054f805","0xd30681a4f805068070681a6200506926069220153e0143601527069230153e","0x11d01527069230153e014300153f0691d0153e0151e0146d0691e0153e0141a","0x11a014f00681a4f805068070691901589468054f807488050181a488054f805","0x1160152f0681a4f805068070683f0158a4583d01d3e01d23015300681a4f805","0x50f4054fc1a454054f805460054b01a460054f805108054b81a108054f805","0xd30681a4f805068070681a62c0506926068470153e0151501527068450153e","0x11301527068450153e0143f0153f069130153e015140146d069140153e0141a","0x112014f00681a4f805068070684a0158c448054f80711c050181a11c054f805","0x5068e60681a4f80506807068490158d1350f01d3e01c45015300681a4f805","0x320684b0153e0141a0a81a0693e0144d014260681a4f80543c050941a0693e","0x1a0cc1a14c054f8051444b01c30068510153e014510142f068510153e0141a","0x13301533068500153e0145701436068570153e0145317c0745c1a17c054f805","0x5348054881a4c0054f8054c00548c1a014054f805014053dc1a4cc054f805","0x1a0693e0141a01c1a140d24c0054cd33014500153e014500151e068d20153e","0x13e0145e0151a0685e0153e0141a4741a0693e01449014250681a4f805068e6","0x3d0681a4f80506807068700e4076383b168074f807179304ccd24641a17805","0x5a015330681a4f805188054241a1906201d3e014150150b068150153e0141a","0x5348054881a0ec054f8050ec0548c1a014054f805014053dc1a168054f805","0x13e01c6e014860686e1a8684310d4cd3e014643483b0145a4cc84068d20153e","0x54f80542c053d81a1d8054f8050682a0681a4f80506807069090158f42c05","0x13e0147701513069061dc074f8051c4054501a1c4054f8051d47601c3006875","0xff0153e015020150f069020153e015040144a069040153e01506015120681a","0x1a1a0054f8051a00548c1a430054f805430053dc1a434054f805434054cc1a","0x1a01c1a3fc6a1a10c43533014ff0153e014ff0151e0686a0153e0146a01522","0x13e0150c014f70690d0153e0150d01533068fe0153e01509014360681a4f805","0x54f8053f8054781a1a8054f8051a8054881a1a0054f8051a00548c1a43005","0x50684d068fd0153e0141a0a81a0693e0141a01c1a3f86a1a10c43533014fe","0x13e0141a0cc1a3e4054f8053e8fd01c30068fa0153e014fa0142f068fa0153e","0x13e0143901533068f80153e0148101436068810153e014f91fc0745c1a1fc05","0x54f805348054881a1c0054f8051c00548c1a014054f805014053dc1a0e405","0x1a3981a0693e0141a01c1a3e0d21c0050e533014f80153e014f80151e068d2","0x1a3dc054f8050682a0681a4f805114050941a0693e0144a014490681a4f805","0x33068860153e014843dc070c01a210054f805210050bc1a210054f805068d6","0x54cc1a3cc054f8053d4050d81a3d4054f805218f601d17068f60153e0141a","0xd201522069300153e0153001523068050153e01405014f7069330153e01533","0x1a4f80506807068f334930015334cc053cc054f8053cc054781a348054f805","0x13e0141a0a81a0693e01523014250681a4f805464051241a0693e0141a3981a","0x54f8053c4f201c30068f10153e014f10142f068f10153e0141a3701a3c805","0xed0153e014f001436068f00153e0148b2340745c1a234054f805068330688b","0x1a4c0054f8054c00548c1a014054f805014053dc1a4cc054f8054cc054cc1a","0x1a01c1a3b4d24c0054cd33014ed0153e014ed0151e068d20153e014d201522","0x2a0681a4f80538c050941a0693e0142a014490681a4f805068e60681a4f805","0xeb3b8070c01a3ac054f8053ac050bc1a3ac054f8050684b068ee0153e0141a","0x53a0050d81a3a0054f8052449301d17068930153e0141a0cc1a244054f805","0x13e0153001523068050153e01405014f7069330153e0153301533068f40153e","0xf434930015334cc053d0054f8053d0054781a348054f805348054881a4c005","0x13e0141a1341a254054f8050682a0681a4f805048051441a0693e0141a01c1a","0x54f80506833068e50153e014e7254070c01a39c054f80539c050bc1a39c05","0x54f8054bc054cc1a388054f805390050d81a390054f8053949801d1706898","0xd20153e014d2015220692e0153e0152e01523068050153e01405014f70692f","0x1a01c050681a4f8050681a068e23492e0152f4cc05388054f805388054781a","0x1a4b8054f805348053481a0693e0141a01c1a4bd3001d904cc1201d3e01c05","0x1a4f8050680706927015914fd2c01d3e01d2e01530068120153e0141201533","0x506832069260153e0141a0a81a0693e0153f014260681a4f8054b0050941a","0x13e0141a0cc1a1b4054f80534d2601c30068d30153e014d30142f068d30153e","0x13e0141201533068e60153e014e301436068e30153e0146d0180745c1a01805","0x54f805398054781a01c054f80501c054881a4cc054f8054cc0548c1a04805","0x13e0141a4741a0693e01527014250681a4f80506807068e601d3304812014e6","0x320a8076486c098074f80709533048d24641a094054f805094054681a09405","0x3001493068300153e0142f014910682f0153e0141a3ac1a0693e0141a01c1a","0x50d8052541a0d8054f80545c053d01a0693e01433014e8069170cc074f805","0x54f805478052601a478054f805068e5069220153e01523014e7069230153e","0x74891e01c6c048e2068260153e0142601533069220153e01522014e40691e","0x2f068420153e0141a0a81a0693e0141a01c1a0fd160f4d264d194691d3493e","0x1a1151501d3e0151801514069180153e01519108070c01a464054f80546405","0x543c1a450054f80511c051281a11c054f805114054481a0693e0151501513","0x11a015220691d0153e0151d01523068260153e0142601533069130153e01514","0x1a0693e0141a01c1a44d1a474260480544c054f80544c054781a468054f805","0x1330690f0153e0144a014360684a0153e0143f4480745c1a448054f80506833","0x54781a458054f805458054881a0f4054f8050f40548c1a098054f80509805","0x1a134054f8050682a0681a4f805068070690f4583d098120150f0153e0150f","0x330684b0153e01449134070c01a124054f805124050bc1a124054f8050684d","0x54cc1a17c054f80514c050d81a14c054f80512c5101d17068510153e0141a","0x5f0151e068070153e0140701522068320153e01432015230682a0153e0142a","0x2a0681a4f805348051441a0693e0141a01c1a17c070c82a0480517c054f805","0x5015c070c01a140054f805140050bc1a140054f8050684d068570153e0141a","0x50ec050d81a0ec054f8051785a01d170685a0153e0141a0cc1a178054f805","0x13e01407015220692f0153e0152f01523069300153e0153001533068390153e","0x70141a0693e0141a0681a0e4074bd30048050e4054f8050e4054781a01c05","0x13f0153e01533014d20681a4f805068070692c4b8076512f4c0074f8073481a","0x56552649c074f8074fc054c01a4c0054f8054c0054cc1a0693e0141a0481a","0x12c068060153e0146d0152e0686d0153e015260152f0681a4f80506807068d3","0x1a4981a094054f80538c0549c1a398054f80549c054fc1a38c054f80501805","0x1a1b0054f805098051b41a098054f805068d30681a4f805068070681a65805","0x565c2a0153e01c2501406068250153e0146c01527068e60153e014d30153f","0x39069300153e01530015330682f0153e014e6015120681a4f8050680706832","0x19845c054f8070cc052ac1a0cc3001d3e0142f4c0072c81a0bc054f8050bc05","0x11e0153e01d22014ad0692248c074f80545c052b01a0693e0141a01c1a0d805","0x11901d3e01d1a015300691a0153e01523014d20681a4f805068070691d01599","0x260681a4f805464050941a0693e0141a3981a0693e0141a01c1a458056683d","0x54f8050682a0681a4f8050a8053c01a0693e0151e014510681a4f8050f405","0x1180153e014420fc070c01a108054f805108050bc1a108054f805068320683f","0x1a11c054f805114050d81a114054f8054611501d17069150153e0141a0cc1a","0x123068070153e01407014af068050153e01405014f7068300153e0143001533","0x304c00511c054f80511c054781a048054f805048054881a4bc054f8054bc05","0x1a0693e01516014250681a4f805068e60681a4f80506807068470492f01c05","0x11244c074f8074512f0c0d24641a450054f805450054681a450054f8050691d","0x1130153e01513015330684d0153e0141a0f41a0693e0141a01c1a43c4a01d9b","0x1a01c054f80501c052bc1a448054f8054480548c1a014054f805014053dc1a","0xd40691e0153e0151e014390682a0153e0142a0142f068120153e0141201522","0x54f80715c0533c1a15c5f14c5112c494c13e0151e0a84d048074480544d2e","0x1a168054f8050682a0681a4f805140053301a0693e0141a01c1a1780567050","0x4a068700153e01439015120681a4f8050ec0544c1a0e43b01d3e0145a01514","0x53dc1a124054f805124054cc1a188054f8050540543c1a054054f8051c005","0x5f01522068510153e0145101523068530153e01453014af0684b0153e0144b","0x13e0141a01c1a1885f1445312c494c005188054f805188054781a17c054f805","0x4b0153e0144b014f7068490153e0144901533068640153e0145e014360681a","0x1a17c054f80517c054881a144054f8051440548c1a14c054f80514c052bc1a","0x11e014510681a4f805068070686417c5114c4b12530014640153e014640151e","0x1a430054f8050684d0690d0153e0141a0a81a0693e0142a014f00681a4f805","0x1170686a0153e0141a0cc1a1a0054f8054310d01c300690c0153e0150c0142f","0xf70684a0153e0144a015330690b0153e0146e014360686e0153e014681a807","0x54881a43c054f80543c0548c1a01c054f80501c052bc1a014054f80501405","0x5068070690b0490f01c05129300150b0153e0150b0151e068120153e01412","0x53c01a0693e01523014510681a4f805474051241a0693e0141a3981a0693e","0x54f8051d8050bc1a1d8054f805068dc069090153e0141a0a81a0693e0142a","0x54f8051d47101d17068710153e0141a0cc1a1d4054f8051d90901c3006876","0x50153e01405014f7068300153e0143001533069060153e014770143606877","0x1a048054f805048054881a4bc054f8054bc0548c1a01c054f80501c052bc1a","0x5068e60681a4f80506807069060492f01c050c130015060153e015060151e","0x300153e0143001533069040153e01436014360681a4f8050a8053c01a0693e","0x1a4bc054f8054bc0548c1a01c054f80501c052bc1a014054f805014053dc1a","0x7069040492f01c050c130015040153e015040151e068120153e0141201522","0x1a0693e014e6014250681a4f8050c8051241a0693e0141a3981a0693e0141a","0x10201c30068ff0153e014ff0142f068ff0153e0141a12c1a408054f8050682a","0xfa01436068fa0153e014fe3f40745c1a3f4054f80506833068fe0153e014ff","0x501c052bc1a014054f805014053dc1a4c0054f8054c0054cc1a3e4054f805","0x13e014f90151e068120153e01412015220692f0153e0152f01523068070153e","0x2a0681a4f8054cc051441a0693e0141a01c1a3e4124bc07015304c0053e405","0x811fc070c01a204054f805204050bc1a204054f8050684d0687f0153e0141a","0x5210050d81a210054f8053e0f701d17068f70153e0141a0cc1a3e0054f805","0x13e01407014af068050153e01405014f70692e0153e0152e01533068860153e","0x54f805218054781a048054f805048054881a4b0054f8054b00548c1a01c05","0x133048074f8070141a01c050681a4f8050681a068860492c01c054b93001486","0x54f805048054cc1a4b8054f805348053481a0693e0141a01c1a4bd3001d9d","0x13e0152c014250681a4f80506807069270159e4fd2c01d3e01d2e0153006812","0x50bc1a34c054f80506832069260153e0141a0a81a0693e0153f014260681a","0x601d17068060153e0141a0cc1a1b4054f80534d2601c30068d30153e014d3","0x13301523068120153e0141201533068e60153e014e301436068e30153e0146d","0x74cc1204805398054f805398054781a01c054f80501c054881a4cc054f805","0x250151a068250153e0141a4741a0693e01527014250681a4f80506807068e6","0x1a4f80506807068320a80767c6c098074f80709533048d24641a094054f805","0x1a45c3301d3e0143001493068300153e0142f014910682f0153e0141a3ac1a","0x539c1a48c054f8050d8052541a0d8054f80545c053d01a0693e01433014e8","0x5488053901a478054f805478052601a478054f805068e5069220153e01523","0x1a04651a474d24f8074891e01c6c048e2068260153e0142601533069220153e","0x1190153e015190142f068420153e0141a0a81a0693e0141a01c1a0fd160f4d2","0x1a4f8054540544c1a1151501d3e0151801514069180153e01519108070c01a","0x1a44c054f8054500543c1a450054f80511c051281a11c054f805114054481a","0x11e0691a0153e0151a015220691d0153e0151d01523068260153e0142601533","0x1120153e0141a0cc1a0693e0141a01c1a44d1a474260480544c054f80544c05","0x260153e01426015330690f0153e0144a014360684a0153e0143f4480745c1a","0x543c054f80543c054781a458054f805458054881a0f4054f8050f40548c1a","0x490153e0141a1341a134054f8050682a0681a4f805068070690f4583d09812","0x1a144054f805068330684b0153e01449134070c01a124054f805124050bc1a","0x1a0a8054f8050a8054cc1a17c054f80514c050d81a14c054f80512c5101d17","0x120145f0153e0145f0151e068070153e0140701522068320153e0143201523","0x1a15c054f8050682a0681a4f805348051441a0693e0141a01c1a17c070c82a","0x330685e0153e0145015c070c01a140054f805140050bc1a140054f8050684d","0x54cc1a0e4054f8050ec050d81a0ec054f8051785a01d170685a0153e0141a","0x390151e068070153e01407015220692f0153e0152f01523069300153e01530","0x13001d3e01cd2068070141a0693e0141a0681a0e4074bd30048050e4054f805","0x1a4f805068120693f0153e01533014d20681a4f805068070692c4b8076852f","0x13e0141a01c1a34c056892649c074f8074fc054c01a4c0054f8054c0054cc1a","0xe30153e014060152c068060153e0146d0152e0686d0153e015260152f0681a","0x1a01c1a069a30141a4981a094054f80538c0549c1a398054f80549c054fc1a","0x54f80534c054fc1a1b0054f805098051b41a098054f805068d30681a4f805","0x13e0141a01c1a0c8056902a0153e01c2501406068250153e0146c01527068e6","0x2f0153e0142f01439069300153e01530015330682f0153e014e6015120681a","0x50680706836015a545c054f8070cc052ac1a0cc3001d3e0142f4c0072c81a","0x1a01c1a474056991e0153e01d22014ad0692248c074f80545c052b01a0693e","0x706916015a70f51901d3e01d1a015300691a0153e01523014d20681a4f805","0x1a0693e0143d014260681a4f805464050941a0693e0141a3981a0693e0141a","0x13e0141a0c81a0fc054f8050682a0681a4f8050a8053c01a0693e0151e01451","0x54f80506833069180153e014420fc070c01a108054f805108050bc1a10805","0x54f8050c0054cc1a11c054f805114050d81a114054f8054611501d1706915","0x12f0153e0152f01523068070153e01407014af068050153e01405014f706830","0x1a11c124bc07014304c00511c054f80511c054781a048054f805048054881a","0x1140153e0141a4741a0693e01516014250681a4f805068e60681a4f80506807","0x70690f128076a11244c074f8074512f0c0d24641a450054f805450054681a","0x13e01405014f7069130153e01513015330684d0153e0141a0f41a0693e0141a","0x54f805048054881a01c054f80501c052bc1a448054f8054480548c1a01405","0x1201d12015134b8d40691e0153e0151e014390682a0153e0142a0142f06812","0x70685e015a9140054f80715c0533c1a15c5f14c5112c494c13e0151e0a84d","0x74f805168054501a168054f8050682a0681a4f805140053301a0693e0141a","0x150153e014700144a068700153e01439015120681a4f8050ec0544c1a0e43b","0x1a12c054f80512c053dc1a124054f805124054cc1a188054f8050540543c1a","0x11e0685f0153e0145f01522068510153e0145101523068530153e01453014af","0x5178050d81a0693e0141a01c1a1885f1445312c494c005188054f80518805","0x13e01453014af0684b0153e0144b014f7068490153e0144901533068640153e","0x54f805190054781a17c054f80517c054881a144054f8051440548c1a14c05","0x53c01a0693e0151e014510681a4f805068070686417c5114c4b1253001464","0x54f805430050bc1a430054f8050684d0690d0153e0141a0a81a0693e0142a","0x54f8051a06a01d170686a0153e0141a0cc1a1a0054f8054310d01c300690c","0x50153e01405014f70684a0153e0144a015330690b0153e0146e014360686e","0x1a048054f805048054881a43c054f80543c0548c1a01c054f80501c052bc1a","0x5068e60681a4f805068070690b0490f01c05129300150b0153e0150b0151e","0x2a0681a4f8050a8053c01a0693e01523014510681a4f805474051241a0693e","0x76424070c01a1d8054f8051d8050bc1a1d8054f805068dc069090153e0141a","0x51dc050d81a1dc054f8051d47101d17068710153e0141a0cc1a1d4054f805","0x13e01407014af068050153e01405014f7068300153e0143001533069060153e","0x54f805418054781a048054f805048054881a4bc054f8054bc0548c1a01c05","0x2a014f00681a4f805068e60681a4f80506807069060492f01c050c13001506","0x13e01405014f7068300153e0143001533069040153e01436014360681a4f805","0x54f805048054881a4bc054f8054bc0548c1a01c054f80501c052bc1a01405","0xe60681a4f80506807069040492f01c050c130015040153e015040151e06812","0x1020153e0141a0a81a0693e014e6014250681a4f8050c8051241a0693e0141a","0x1a3f8054f8053fd0201c30068ff0153e014ff0142f068ff0153e0141a12c1a","0x133068f90153e014fa01436068fa0153e014fe3f40745c1a3f4054f80506833","0x548c1a01c054f80501c052bc1a014054f805014053dc1a4c0054f8054c005","0x54c130014f90153e014f90151e068120153e01412015220692f0153e0152f","0x1a1fc054f8050682a0681a4f8054cc051441a0693e0141a01c1a3e4124bc07","0x33068f80153e014811fc070c01a204054f805204050bc1a204054f8050684d","0x54cc1a218054f805210050d81a210054f8053e0f701d17068f70153e0141a","0x12c01523068070153e01407014af068050153e01405014f70692e0153e0152e","0x70152e4c005218054f805218054781a048054f805048054881a4b0054f805","0x70692e4bc076a9304cc074f80701c0501c050681a4f8050681a068860492c","0x54f8054cc054cc1a0693e0141a0481a4b0054f805048053481a0693e0141a","0x13e015270152f0681a4f8050680706926015ab49d3f01d3e01d2c0153006933","0x54f8054fc054fc1a018054f8051b4054b01a1b4054f80534c054b81a34c05","0x5068d30681a4f805068070681a6b00506926068e60153e0140601527068e3","0x13e0142601527068e30153e015260153f068260153e014250146d068250153e","0x13e01ce3015300681a4f805068070682a015ad1b0054f807398050181a39805","0x1a4f8050c8050941a0693e0141a3981a0693e0141a01c1a0c0056b82f0c807","0x506832068330153e0141a0a81a0693e0146c014f00681a4f8050bc050981a","0x13e0141a0cc1a0d8054f80545c3301c30069170153e015170142f069170153e","0x13e0141a014ca0691e0153e0152201436069220153e0143648c0745c1a48c05","0x54f805348054881a4c0054f8054c00548c1a4cc054f8054cc054cc1a06805","0x1a3981a0693e0141a01c1a478d24c133069330151e0153e0151e0151e068d2","0x11d0153e0151d0151a0691d0153e0141a4741a0693e01430014250681a4f805","0x5068c10681a4f80506807069160f4076bd19468074f807475304ccd24641a","0x1180142f069180153e0143f108070001a1086c01d3e0146c014cd0683f0153e","0x1a01c1a454056c01a4f807460055981a468054f805468054cc1a460054f805","0x470153e0144501567068450153e0141a34c1a0693e0146c014f00681a4f805","0x1a448054f8054640548c1a44c054f805468054cc1a450054f805068053281a","0x5068070681a6c405069260690f0153e01447015680684a0153e014d201522","0x1a124054f805134056c81a134054f8050696a0681a4f805454055a41a0693e","0x12e068530153e01451015b50681a4f80512c056d01a1444b01d3e01449015b3","0x5015c074f8051b05f068d26d81a17c054f80517c050bc1a17c054f80514c05","0x54f805168056dc1a1685e01d3e01450468075041a140054f805140050bc1a","0x150153e01470015ba0681a4f8050e4056e41a1c03901d3e0143b015b80683b","0x980690d0153e0141a3941a190054f8051880539c1a188054f805054052541a","0x123881a178054f805178054cc1a15c054f80515c053281a434054f80543405","0x5068120681a4f805068070690942c6e349bb1a868430d24f8071910d34919","0x54f8051a0054881a430054f8054300548c1a1a8054f8051a8050bc1a0693e","0x1a1d4054f805068d30681a4f8050680706876015bc0693e01c6a0156606868","0x5068070681a6f40506926068770153e0147101568068710153e0147501567","0x1a410054f805418055081a418054f805068d30681a4f8051d8055a41a0693e","0x57014ca069020153e01477015be0681a4f805068e6068770153e0150401568","0x51a0054881a448054f8054300548c1a44c054f805178054cc1a450054f805","0x1a0693e0141a0481a3fc054f8050682a0690f0153e01502015680684a0153e","0xdb0681a4f8053f8051241a0693e0141a01c1a3f4056fcfe0153e01d0f014a0","0x1a4f805068070681a7000506926068f90153e014fa0142f068fa0153e0141a","0x1a3981a3e4054f8051fc050bc1a1fc054f805069c10681a4f8053f4051241a","0xf801513068f73e0074f805204054501a204054f8053e4ff01c300681a4f805","0x13e014860150f068860153e014840144a068840153e014f7015120681a4f805","0x54f8054480548c1a44c054f80544c054cc1a450054f805450053281a3d805","0x1a3d84a4491345133014f60153e014f60151e0684a0153e0144a0152206912","0xf301436068f30153e015093d40745c1a3d4054f805068330681a4f80506807","0x51b80548c1a178054f805178054cc1a15c054f80515c053281a3c8054f805","0x10b1b85e15d33014f20153e014f20151e0690b0153e0150b015220686e0153e","0x50684d068f10153e0141a0a81a0693e0146c014f00681a4f80506807068f2","0x13e0141a0cc1a234054f80522cf101c300688b0153e0148b0142f0688b0153e","0x13e0141a014ca068ee0153e014ed01436068ed0153e0148d3c00745c1a3c005","0x54f805348054881a458054f8054580548c1a0f4054f8050f4054cc1a06805","0x1a3981a0693e0141a01c1a3b8d24583d06933014ee0153e014ee0151e068d2","0x1a3ac054f8050682a0681a4f80538c050941a0693e0142a014490681a4f805","0x33068930153e014913ac070c01a244054f805244050bc1a244054f8050684b","0x53281a254054f8053d0050d81a3d0054f80524ce801d17068e80153e0141a","0xd201522069300153e0153001523069330153e01533015330681a0153e0141a","0x1a4f8050680706895349304cc1a4cc05254054f805254054781a348054f805","0xe50142f068e50153e0141a1341a39c054f8050682a0681a4f805048051441a","0x983900745c1a390054f80506833068980153e014e539c070c01a394054f805","0x54bc054cc1a068054f805068053281a270054f805388050d81a388054f805","0x13e0149c0151e068d20153e014d2015220692e0153e0152e015230692f0153e","0x1304cc074f80701c0501c050681a4f8050681a0689c3492e4bc1a4cc0527005","0x1a0693e0141a0481a4b0054f805048053481a0693e0141a01c1a4b92f01dc2","0x1a4f8050680706926015c349d3f01d3e01d2c01530069330153e0153301533","0x1a018054f8051b4054b01a1b4054f80534c054b81a34c054f80549c054bc1a","0x5068070681a7100506926068e60153e0140601527068e30153e0153f0153f","0xe30153e015260153f068260153e014250146d068250153e0141a34c1a0693e","0x1a4f805068070682a015c51b0054f807398050181a398054f8050980549c1a","0x1a0693e0141a3981a0693e0141a01c1a0c0057182f0c8074f80738c054c01a","0x13e0141a0a81a0693e0146c014f00681a4f8050bc050981a0693e0143201425","0x54f80545c3301c30069170153e015170142f069170153e0141a0c81a0cc05","0x11e0153e0152201436069220153e0143648c0745c1a48c054f8050683306836","0x1a4c0054f8054c00548c1a4cc054f8054cc054cc1a068054f805068053281a","0x1a01c1a478d24c133069330151e0153e0151e0151e068d20153e014d201522","0x11a0691d0153e0141a4741a0693e01430014250681a4f805068e60681a4f805","0x506807069160f40771d19468074f807475304ccd24641a474054f80547405","0x1190153e01519015230691a0153e0151a015330683f0153e0141a0f41a0693e","0x1a1b0054f8051b0050bc1a348054f805348054881a068054f805068053281a","0x1c9450054f80711c0533c1a11c4545518109334f8051b03f3481a4651a4c1c8","0x54501a448054f8050682a0681a4f805450053301a0693e0141a01c1a44c05","0x4d0144a0684d0153e0150f015120681a4f8051280544c1a43c4a01d3e01512","0x5108054cc1a454054f805454053281a12c054f8051240543c1a124054f805","0x13e0144b0151e068450153e0144501522069180153e0151801523068420153e","0xca068510153e01513014360681a4f805068070684b11518109154cc0512c05","0x54881a460054f8054600548c1a108054f805108054cc1a454054f80545405","0x13e0141a01c1a144454604245533014510153e014510151e068450153e01445","0x50bc1a17c054f8050684d068530153e0141a0a81a0693e0146c014f00681a","0x5001d17068500153e0141a0cc1a15c054f80517c5301c300685f0153e0145f","0x3d015330681a0153e0141a014ca0685a0153e0145e014360685e0153e01457","0x5168054781a348054f805348054881a458054f8054580548c1a0f4054f805","0x51241a0693e0141a3981a0693e0141a01c1a168d24583d069330145a0153e","0x390153e0141a12c1a0ec054f8050682a0681a4f80538c050941a0693e0142a","0x1a054054f80506833068700153e014390ec070c01a0e4054f8050e4050bc1a","0x1a068054f805068053281a190054f805188050d81a188054f8051c01501d17","0x11e068d20153e014d201522069300153e0153001523069330153e0153301533","0x13e01412014510681a4f8050680706864349304cc1a4cc05190054f80519005","0x300690c0153e0150c0142f0690c0153e0141a1341a434054f8050682a0681a","0x360686e0153e014681a80745c1a1a8054f80506833068680153e0150c43407","0x548c1a4bc054f8054bc054cc1a068054f805068053281a42c054f8051b805","0x12f069330150b0153e0150b0151e068d20153e014d2015220692e0153e0152e","0x1a4f805068070692c4b92f349cb4c133048d24f8070141a01dca0690b3492e","0x1a048054f8050480548c1a4fc054f8054c0057341a4c0054f8054c0057301a","0x7068e30186d349cf34d2649cd24f8074cc1201dca0693f0153e0153f015ce","0x5398057401a398054f80534c057341a34c054f80534c057301a0693e0141a","0x6c015d30681a4f805098057481a0693e01425015d1068320a86c098254cd3e","0x1334f8054fc057401a0bc054f8050a8057501a0693e01432014f00681a4f805","0x13e01436015d30681a4f8050cc057481a0693e01430015d1069230d9170cc30","0x1a0bc054f8050bc050bc1a488054f80545c057501a0693e01523014f00681a","0x1a49c054f80549c0548c1a478054f805478050bc1a478054f8054882f01c00","0x1d60681a4f805068070691d015d50693e01d1e01566069260153e0152601522","0x3d015d80693e01d1901566069190153e0151a015d70691a348074f80534805","0x13e0141a0a81a0693e014d20146c0681a4f80501c057641a0693e0141a01c1a","0x54f8050fd1601c300683f0153e0143f0142f0683f0153e0141a7681a45805","0x450153e01442014f9069150153e0152601522069180153e015270152306842","0x13e014d2015d60681a4f8050f4055a41a0693e0141a01c1a069db0141a4981a","0x1a4f805068070690f12912349dd44d1401d3e01c4749927349dc0684734807","0x1a12c054f805124057801a124054f8051340577c1a134054f805348057781a","0x53144d21081a17c054f8050683f068530153e0141a4581a144054f8050683d","0x4b015e1069130153e0151301522069140153e0151401523068570153e0145f","0x3b0153e01c5a014450685a178503493e0144b15d13450125101a12c054f805","0x1e3068700153e0141a34c1a0693e0143b014470681a4f8050680706839015e2","0x122068500153e0145001523068620153e01415015e4068150153e0147001c07","0x1a4f80506807068621785034805188054f805188057941a178054f80517805","0x1230681a4f805190052901a4346401d3e01439014da0681a4f80501c057641a","0x1a4981a114054f805434053e41a454054f805178054881a460054f80514005","0x1230681a4f805348051b01a0693e01407015d90681a4f805068070681a76c05","0x1a0cc1a114054f80543c053e41a454054f805128054881a460054f80544805","0x118015230686a0153e01468015e6068680153e014454300745c1a430054f805","0x6a45518348051a8054f8051a8057941a454054f805454054881a460054f805","0x5348051b01a0693e01407015d90681a4f805474055a41a0693e0141a01c1a","0x1a42c054f80542c050bc1a42c054f805069e70686e0153e0141a0a81a0693e","0x1a1d4054f805498054881a1d8054f80549c0548c1a424054f80542c6e01c30","0x13e0153f015e90681a4f805068070681a7a00506926068710153e01509014f9","0x122068760153e0146d015230681a4f80501c057641a0693e014d20146c0681a","0x13e0141a01c1a069e80141a4981a1c4054f80538c053e41a1d4054f80501805","0x122068760153e0152f015230681a4f805348051b01a0693e01407015d90681a","0x7701d17068770153e0141a0cc1a1c4054f8054b0053e41a1d4054f8054b805","0x7501522068760153e0147601523069040153e01506015e6069060153e01471","0x50681a4f805068e6069041d47634805410054f805410057941a1d4054f805","0x74f805048053341a0693e0141a01c1a4b92f01dea4c13301d3e01c0506807","0x13e0141a01c1a4fc057ac1a4f8074b0055981a4cc054f8054cc054cc1a4b012","0x1260153e0152701c0750c1a49c054f805348057b01a0693e01412014f00681a","0x1a4c0054f8054c00548c1a4cc054f8054cc054cc1a34c054f805498057b41a","0x1a4f8054fc055a41a0693e0141a01c1a34d304ccd2014d30153e014d3015ee","0x6d01d3e014074cc077bc1a01c054f80501c050e41a4cc054f8054cc054cc1a","0x74f80538c057c81a0693e0141a01c1a398057c4e30153e01c06015f006806","0x51b0d201df50681a4f805068070682a015f41b0054f807098057cc1a09825","0x13e0146d01533068300153e0142f048070001a0bc054f805069c1068320153e","0x54f8050c8051c01a094054f805094050e41a4c0054f8054c00548c1a1b405","0xd20143645c333493e014300c8254c06d4cc15068300153e014300142f06832","0x680681a4f805348051b81a0693e01412014f00681a4f805068070683645c33","0x1330691e0153e01522015ed069220153e015230940750c1a48c054f8050a805","0x6d34805478054f805478057b81a4c0054f8054c00548c1a1b4054f8051b405","0x57d81a0693e014d20146e0681a4f805048053c01a0693e0141a01c1a47930","0x11d015ee069300153e01530015230686d0153e0146d015330691d0153e014e6","0x51b81a0693e01412014f00681a4f805068070691d4c06d34805474054f805","0x1190153e0141a1341a468054f8050682a0681a4f80501c051441a0693e014d2","0x1a458054f805068330683d0153e01519468070c01a464054f805464050bc1a","0x1a4bc054f8054bc054cc1a108054f8050fc057d81a0fc054f8050f51601d17","0x13e0141a3981a1092e4bcd2014420153e01442015ee0692e0153e0152e01523","0x1a4fd2c4b8d27dd2f4c1333493e01c07014077281a0693e014d2015090681a","0x127015d0069270153e0152f015cd0692f0153e0152f015cc0681a4f80506807","0x574c1a0693e014d3015d20681a4f805498057441a38c061b4d3499334f805","0x13e014e60142f068e60153e0146d015d40681a4f80538c053c01a0693e01406","0x1a4f807398055981a4c0054f8054c0054881a4cc054f8054cc0548c1a39805","0x300bc32349f90a86c098d24f8074c13301dca0681a4f8050680706825015f8","0x57401a0cc054f8050a8057341a0a8054f8050a8057301a0693e0141a01c1a","0x1d30681a4f80548c0574c1a0693e01517015d10691e489230d9174cd3e01433","0x50d8057e81a0d8054f8050d8055141a0693e0151e014f00681a4f80548805","0x1d30691244d1411c45455181083f4583d4651a34d3e0151d015fb0691d0153e","0x13e0143f014f00681a4f805458051441a0693e0143d015fc0681a4f80546405","0x57f01a0693e01515015fd0681a4f805460053c01a0693e01442014f00681a","0x1a4f80544c057f81a0693e01514015fe0681a4f80511c051441a0693e01445","0x26015230691a0153e0151a0142f0681a4f805068120681a4f805448051441a","0x4d34a0043c4a01d3e01d1a068077fc1a1b0054f8051b0054881a098054f805","0x202068530153e0144a01533068510153e0141a8041a0693e0141a01c1a12c49","0x13e0141a01c1a06a030141a4981a15c054f805144058081a17c054f80543c05","0x570153e01449016020685f0153e0144b01602068530153e0144d015330681a","0x3b15c074f80515c058181a1685e01d3e0145001605068500153e0141a8101a","0x13e01c390ec5334a07068390153e014390160206839168074f805168058181a","0x515c058181a0693e01415015fc0681a4f805068070686418807820151c007","0x1a01c1a06a0a0693e01c5a434078241a1c0054f8051c0054cc1a4345701d3e","0x1a06a0b0141a4981a430054f8051c0054cc1a0693e0145e015fc0681a4f805","0xd281c1a178054f805178058081a1a05f01d3e0145f016060681a4f80506807","0x1a4f8051b8057f01a0693e0141a01c1a4250b01e0c1b86a01d3e01c5e1a070","0x1a1d45701d3e0145701606068760153e0141a8341a430054f8051a8054cc1a","0x74f8071c475430d281c1a1c4054f8051c4058081a1c47601d3e0147601606","0x13e01477015330681a4f805418057f01a0693e0141a01c1a4090401e0e41877","0x1a4f80517c057f01a0693e0141a01c1a06a0f0693e01c7615c078241a1dc05","0x13e0141a8341a0693e0141a01c1a06a100141a4981a3fc054f8051dc054cc1a","0x7f3e407844fa3f4074f8073f85f1dcd281c1a3f8054f8053f8058081a3f805","0xff01612068ff0153e014fd015330681a4f8053e8057f01a0693e0141a01c1a","0x6e0681a4f8051fc057f01a0693e0141a01c1a06a130141a4981a204054f805","0x1a4f805068070681a8500506926068f80153e014f9015330681a4f80504805","0x5f015fc0681a4f80515c057f01a0693e014120146e0681a4f805408057f01a","0x1a0693e0141a3981a3e0054f805410054cc1a0693e01476015fc0681a4f805","0xf701c30068840153e014840142f068840153e0141a8541a3dc054f8050682a","0xf501616068f50153e014863d80745c1a3d8054f80506833068860153e01484","0x51b0054881a098054f8050980548c1a3e0054f8053e0054cc1a3cc054f805","0x1fc0681a4f80506807068f31b0263e012014f30153e014f3016170686c0153e","0x1a4f805068070681a8600506926068f20153e0150b015330681a4f80542405","0x62015330681a4f805178057f01a0693e0145a015fc0681a4f805190057f01a","0x515c058181a2348b01d3e014f101605068f10153e0141a8641a3c8054f805","0xf234a07068ed0153e014ed01602068ed234074f805234058181a3c05701d3e","0x1a0693e014eb015fc0681a4f805068070689324407868eb3b8074f8073b4f0","0x1fc0681a4f805068070681a86c1a4f8072345701e09068ee0153e014ee01533","0x21c0141a4981a3a0054f8053b8054cc1a0693e0145f015fc0681a4f80522c05","0xf401d3e01c8b17cee34a070688b0153e0148b016020681a4f805068070681a","0x54f8053d0054cc1a0693e01495015fc0681a4f80506807068e539c0787495","0x54cc1a260054f805069470681a4f805068e6068810153e014e801612068e8","0x12014700686c0153e0146c01522068260153e0142601523068810153e01481","0xe2390124f805260121b0262053387c1a260054f805260058781a048054f805","0x13e0149e016220681a4f80506807068a001621278054f807378058801a3789c","0x54f8052880588c1a0693e014da014490681a4f80536c051b81a368a236cd2","0xe20153e014e201523068e40153e014e401533068dc0153e014a401624068a4","0x1a01c1a3709c388e404805370054f8053700585c1a270054f805270054881a","0x13e014e201523068e40153e014e401533068d70153e014a0016160681a4f805","0x1a35c9c388e40480535c054f80535c0585c1a270054f805270054881a38805","0x13e014e7015330681a4f805048051b81a0693e014e5015fc0681a4f80506807","0x120146e0681a4f80524c057f01a0693e0141a01c1a06a250141a4981a35805","0x1a0693e0145f015fc0681a4f80522c057f01a0693e01457015fc0681a4f805","0x13e0141a0a81a0693e0141a3981a358054f805244054cc1a0693e0148d015fc","0x54f8052acb201c30068ab0153e014ab0142f068ab0153e0141a8541a2c805","0xd40153e014af01616068af0153e014ac2b40745c1a2b4054f80506833068ac","0x1a1b0054f8051b0054881a098054f8050980548c1a358054f805358054cc1a","0x13e014120146e0681a4f80506807068d41b02635812014d40153e014d401617","0xca0153e014cc01616068cc0153e0143033c0745c1a33c054f805068330681a","0x1a0bc054f8050bc054881a0c8054f8050c80548c1a068054f805068054cc1a","0x13e01425015690681a4f80506807068ca0bc3206812014ca0153e014ca01617","0x50bc1a334054f80506a26068c10153e0141a0a81a0693e014120146e0681a","0x16601d17069660153e0141a0cc1a000054f805334c101c30068cd0153e014cd","0x133015230681a0153e0141a01533069680153e0156701616069670153e01400","0x1304cc1a048055a0054f8055a00585c1a4c0054f8054c0054881a4cc054f805","0x16901d17069690153e0141a0cc1a0693e014120146e0681a4f8050680706968","0x12e015230681a0153e0141a01533069b20153e0156a016160696a0153e0153f","0x12c4b81a048056c8054f8056c80585c1a4b0054f8054b0054881a4b8054f805","0x5068070141a0693e0141a3981a0693e0141a17c1a4cc054f80506a27069b2","0x120693f0153e01407016290681a4f805068070692c4b8078a12f4c0074f807","0x1a34c058ad2649c074f8074fc058a81a4c0054f8054c0054cc1a0693e0141a","0x6d0162e068120153e015270162d0686d0153e015260162c0681a4f80506807","0x230068e30153e0141a34c1a0693e0141a01c1a06a2f0141a4981a018054f805","0x78c41a018054f805398058b81a048054f80534c058b41a398054f80538c05","0xe60681a4f805068070682601633094054f807018058c81a048054f80504933","0x51b0058d41a1b0054f8051b0050e41a1b0054f805094058d01a0693e0141a","0x50bc058dc1a0bc054f8050c8053481a0c8054f8050a8058d81a0a86c01d3e","0x50ccd201c30068330153e014330142f068330153e01430014fe068300153e","0x13e0152f01523069300153e0153001533068360153e0146c01636069170153e","0x1170d92f4c0128e01a45c054f80545c053e41a0d8054f8050d8050e41a4bc05","0xfd0681a4f805068070691a01639474054f807478052041a4792248cd24f805","0x54cc1a0693e0151601449069160f4074f805474053e01a464054f80504805","0x3d014f9069190153e01519014fa069220153e0152201523069230153e01523","0x1a01c1a460420fcd2015181083f3493e0143d4652248c121fc1a0f4054f805","0x54f80548c054cc1a454054f805468058ec1a0693e014120163a0681a4f805","0x1a01c1a4552248cd2015150153e015150163c069220153e015220152306923","0xd30681a4f805048058e81a0693e01426014490681a4f805068e60681a4f805","0x54cc1a450054f80511c058f81a11c054f805114d201e3d068450153e0141a","0x12f4c0d2015140153e015140163c0692f0153e0152f01523069300153e01530","0x7016400681a4f8053480544c1a0693e015330163f0681a4f8050680706914","0x1120153e015120142f069120153e0141a1341a44c054f8050682a0681a4f805","0x4d0153e0144a43c0745c1a43c054f805068330684a0153e0151244c070c01a","0x1a4b0054f8054b00548c1a4b8054f8054b8054cc1a124054f805134058ec1a","0x73480701dca0681a4f805048054241a1252c4b8d2014490153e014490163c","0x1a4bc054f8054bc057301a0693e0141a01c1a4fd2c4b8d29052f4c1333493e","0x13e01526015d1068e30186d34d264cd3e01527015d0069270153e0152f015cd","0x55141a0693e014e3014f00681a4f8050180574c1a0693e0146d015d30681a","0x5094052441a094054f805068eb068e60153e014d3015fa068d30153e014d3","0x13e0142a014f40681a4f8051b0053a01a0a86c01d3e0142601493068260153e","0x330153e0141a3941a0c0054f8050bc0539c1a0bc054f8050c8052541a0c805","0x1a0c0054f8050c0053901a0cc054f8050cc052601a4cc054f8054cc0548c1a","0x11d4792234a4348c3645cd24f8070c0334c133048e2068e60153e014e601642","0x1134504711515460420fd160f519468d34f805398057ec1a0693e0141a01c1a","0x53c01a0693e0143d015fc0681a4f8054640574c1a0693e0151a014f006912","0x1a4f805114057f01a0693e01515015fd0681a4f805460053c01a0693e01442","0x112014510681a4f80544c057f81a0693e01514015fe0681a4f80511c051441a","0x13e0143f0142f068050153e01405014f70681a0153e0141a015330681a4f805","0x1230fc05069332701a458054f805458050e41a48c054f80548c050bc1a0fc05","0xde068360153e0143601522069170153e01517015230684d43c4a3493e01516","0xa0068510153e014490149e0681a4f805068070684b01644124054f80713405","0x1a0a81a0693e01453014490681a4f805068070685f0164514c054f80714405","0x51405701c30068500153e014500142f068500153e0141a9181a15c054f805","0x13e0143b016470683b0153e0145e1680745c1a168054f805068330685e0153e","0x54f80545c0548c1a43c054f80543c053dc1a128054f805128054cc1a0e405","0x1a0e43645d0f12933014390153e0143901648068360153e014360152206917","0x13e0147001649068700153e0141a2881a0693e0145f014490681a4f80506807","0x54f80543c053dc1a128054f805128054cc1a188054f805054059281a05405","0x620153e0146201648068360153e0143601522069170153e01517015230690f","0x52901a4346401d3e0144b014da0681a4f80506807068620d91743c4a4cc05","0x545c0548c1a1a0054f80543c053dc1a430054f805128054cc1a0693e01464","0x1a92c05069260690b0153e0150d014f90686e0153e01436015220686a0153e","0x5014f70690c0153e0141a015330681a4f805398059301a0693e0141a01c1a","0x5474053e41a1b8054f805478054881a1a8054f8054880548c1a1a0054f805","0x13e0147601647068760153e0150b4240745c1a424054f805068330690b0153e","0x54f8051a80548c1a1a0054f8051a0053dc1a430054f805430054cc1a1d405","0x1a1d46e1a86843133014750153e01475016480686e0153e0146e015220686a","0x7701647068770153e0153f1c40745c1a1c4054f805068330681a4f80506807","0x54b80548c1a014054f805014053dc1a068054f805068054cc1a418054f805","0x12c4b80506933015060153e01506016480692c0153e0152c015220692e0153e","0x5068070692e4bc07935304cc074f8070141a01c050681a4f805068e606906","0x13e01d2c01566069330153e01533015330692c048074f805048053341a0693e","0x1270153e014d20164f0681a4f805048053c01a0693e0141a01c1a4fc059381a","0x1330153e0153301533068d30153e0152601651069260153e0152701c079401a","0x506807068d34c1333480534c054f80534c059481a4c0054f8054c00548c1a","0x1300681a4f805068120686d0153e01407014d20681a4f8054fc055a41a0693e","0x1a094054f80538c054bc1a0693e0141a01c1a3980594ce3018074f8071b405","0x1270682a0153e014060153f0686c0153e014260152c068260153e014250152e","0x2f0153e0141a34c1a0693e0141a01c1a06a540141a4981a0c8054f8051b005","0x1a0c8054f8050c00549c1a0a8054f805398054fc1a0c0054f8050bc051b41a","0x1a0693e0141a01c1a0d805955170153e01c3201406068330153e0142a01512","0x1201c00069220153e0141a7041a48c054f80545cd201c300681a4f805068e6","0x3301439069300153e0153001523069330153e01533015330691e0153e01522","0x1304cd333c81a478054f805478050bc1a48c054f80548c053e41a0cc054f805","0x13e0141a3981a0693e0141a01c1a4651a474d2015194691d3493e0151e48c33","0x2500683d0153e01436014ed0681a4f8053480544c1a0693e01412014f00681a","0x123069330153e01533015330683f0153e0151601651069160153e0143d0cc07","0x1a4f805068070683f4c133348050fc054f8050fc059481a4c0054f8054c005","0x50682a0681a4f80501c051441a0693e014d2015130681a4f805048053c01a","0x13e01518108070c01a460054f805460050bc1a460054f8050684d068420153e","0x54f80511c059581a11c054f8054544501d17068450153e0141a0cc1a45405","0x1140153e01514016520692e0153e0152e015230692f0153e0152f0153306914","0x58dc1a4c0054f8054cc053481a4cc1201d3e0141201635069144b92f34805","0x12e4bc079601a4bc054f8054bc052601a4b8054f80506a570692f0153e01530","0x1a4f805348053c01a0693e01412014510681a4f805068070681a9641a4f807","0x59681a4fc054f8054b0055081a4b0054f805068d30681a4f80501c053c01a","0x5014f70681a0153e0141a01533069260153e015270165b069270153e0153f","0xe50681a4f80506807069260141a34805498054f805498059701a014054f805","0x52601a018054f8051b4053481a1b41201d3e0141201635068d30153e0141a","0x1a4f80506807068250165d398e301d3e01cd30181a3494a068d30153e014d3","0xd20686c0153e0141a97c1a098054f805398054bc1a398054f805398059781a","0xd25281a098054f805098050bc1a1b0054f8051b0052601a0a8054f80504805","0x2f0153e0142f0165e0681a4f8050680706830016600bc3201d3e01c6c0a8e3","0x1a0d8054f8050cc054b81a45c054f805098054b81a0cc054f8050bc054bc1a","0x2f068070153e014070142f068050153e01405014f7068320153e0143201533","0x1309841a0d8054f8050d8050bc1a45c054f80545c050bc1a348054f80534805","0xf00681a4f805068070691e48923348054792248cd24f8050d9173480701432","0x54f8050682a0681a4f80501c053c01a0693e014d2014f00681a4f80509805","0x1190153e0151a474070c01a468054f805468050bc1a468054f80506a620691d","0x1a0fc054f8054580598c1a458054f8054643d01d170683d0153e0141a0cc1a","0xd20143f0153e0143f0165c068050153e01405014f7068300153e0143001533","0xf00681a4f805348053c01a0693e01412014510681a4f805068070683f01430","0x13e015180142f069180153e0141a9881a108054f8050682a0681a4f80501c05","0x13e015151140745c1a114054f80506833069150153e01518108070c01a46005","0x54f805014053dc1a094054f805094054cc1a450054f80511c0598c1a11c05","0x54c01a01c054f805014053481a45005094d2015140153e015140165c06805","0x13f069300153e01412014570681a4f805068070693301664048d201d3e01c07","0x13e0141a01c1a06a650141a4981a4b8054f8054c0051401a4bc054f80534805","0x1a4bc054f8054cc054fc1a4fc054f8054b0051781a4b0054f805068d30681a","0x1a498054f80549c054481a49d2f01d3e0152f016660692e0153e0153f01450","0x1a018054f80534c054bc1a0693e0141a01c1a1b40599cd30153e01d2e0145a","0x25398074f80738c1a01d49068e30153e014e30142f068e30153e014060152e","0x2660686c0153e0141a3941a0693e01526014510681a4f805068070682601668","0x1a1b0054f8051b0052601a0c82501d3e01425016690682a4bc074f8054bc05","0x54bc059981a0693e0141a01c1a0cc059ac300bc074f8070c86c0a8e604a6a","0x360149806923094074f805094059a41a0d8054f80545c058dc1a45d2f01d3e","0x79b51e488074f80748c360bcd29b01a0c0054f8050c0054fc1a0d8054f805","0x7069160166e0f51901d3e01d1e0952f488129a81a0693e0141a01c1a4691d","0x50f4054481a108054f8050fc059bc1a0fc054f8050c0054481a0693e0141a","0x5464054cc1a114054f805454059c41a454054f8051091801e70069180153e","0x30014250681a4f805068070684546407014450153e0144501548069190153e","0x1140153e015140142f069140153e0141a9881a11c054f8050682a0681a4f805","0x4a0153e015134480745c1a448054f80506833069130153e0151411c070c01a","0x543c054f80543c055201a458054f805458054cc1a43c054f805128059c81a","0x250681a4f8050c0050941a0693e0151a015fe0681a4f805068070690f45807","0x54f80506a730684d0153e0141a0a81a0693e01425015fe0681a4f8054bc05","0x510153e0141a0cc1a12c054f8051244d01c30068490153e014490142f06849","0x11d0153e0151d015330685f0153e0145301672068530153e0144b1440745c1a","0x1a4f805094057f81a0693e0141a01c1a17d1d01c0517c054f80517c055201a","0x500142f068500153e0141a9881a15c054f8050682a0681a4f8054bc050941a","0x5e1680745c1a168054f805068330685e0153e0145015c070c01a140054f805","0x50e4055201a0cc054f8050cc054cc1a0e4054f8050ec059c81a0ec054f805","0x13e0141a34c1a0693e0152f014250681a4f80506807068390cc07014390153e","0x13e0146201671068620153e01415498079c01a054054f8051c0059d01a1c005","0x1a01c1a1902601c05190054f805190055201a098054f805098054cc1a19005","0x1a434054f805068d30681a4f8054bc050941a0693e0146d014490681a4f805","0x1a1a8054f8051a0059c41a1a0054f8054312601e700690c0153e0150d01674","0x70480701dca0686a068070146a0153e0146a015480681a0153e0141a01533","0x1a4fc054f8054fc057301a0693e0141a01c1a34d2649cd29d53f4b12e3493e","0x1ca0686d0153e0146d015ce0692e0153e0152e015230686d0153e0153f015cd","0x5398057301a0693e0141a01c1a1b026094d29d8e638c063493e01d2c4b807","0x1d1069170cc300bc324cd3e0142a015d00682a0153e014e6015cd068e60153e","0x13e01517014f00681a4f8050c00574c1a0693e0142f015d20681a4f8050c805","0x123015d10691a4751e489234cd3e0146d015d0068360153e01433015d40681a","0x1a0693e0151a014f00681a4f8054740574c1a0693e01522015d20681a4f805","0x1a0f4054f8054643601c00068360153e014360142f069190153e0151e015d4","0x166068e30153e014e301522068060153e01406015230683d0153e0143d0142f","0x3f016780683f0153e0141a3ac1a0693e0141a01c1a458059dc1a4f8070f405","0x5454059ec1a0693e015180167a06915460074f805108059e41a108054f805","0x54f805068e5069140153e01447014e7068470153e0144501495068450153e","0x74511338c06048e2069140153e01514014e4069130153e015130149806913","0x53144074f8054cc0542c1a0693e0141a01c1a12c49134d29f10f129123493e","0x1a448054f8054480548c1a014054f805014053dc1a068054f805068054cc1a","0xcd0685f0153e0150f0142f0684a0153e0144a01522068d20153e014d2014af","0x1a15c054f80515c050bc1a15d3001d3e01530014cd0690f17c074f80517c05","0x5a178504c13e0152f15c5f14c4a349120141a4b27d0692f0153e0152f01439","0x505405a001a0693e0141a01c1a188059fc150153e01c700167e068700e43b","0x54f80543405a0c1a434054f80519005a081a190054f80543c05a041a0693e","0xd21081a1b8054f8050683f0686a0153e0141a4581a1a0054f8050683d0690c","0x1e1068390153e01439015220685a0153e0145a015230690b0153e0146e1a868","0x13e01c7501445068751d9093493e0150c42c39168125101a430054f80543005","0x1060153e0141a3ac1a0693e01471014470681a4f8050680706877016841c405","0x1a3fd3001d3e01530014cd069020153e0141a3941a410054f8054180539c1a","0x13e01cff411021d9094ce85069040153e01504014e4069020153e0150201498","0x5a1c1a204054f8054c0055181a0693e0141a01c1a1fcf93e8d2a18fd3f807","0x13e0141a4581a210054f8050683d068f70153e014f801683068f80153e01481","0x13e014fe01523068f50153e014f62188434842068f60153e0141a0fc1a21805","0xf73d4fd3f8125101a3dc054f8053dc057841a3f4054f8053f4054881a3f805","0x470681a4f805068070688d0168822c054f8073c4051141a3c4f23ccd24f805","0xed0168a068ed0153e014f014407a241a3c0054f805068d30681a4f80522c05","0x53cc0548c1a178054f805178053dc1a140054f805140054cc1a3b8054f805","0x13e014ee0168b068f20153e014f2015220683b0153e0143b014af068f30153e","0x28c0681a4f805144054241a0693e0141a01c1a3b8f20ecf3178504c0053b805","0x548c1a178054f805178053dc1a140054f805140054cc1a3ac054f80523405","0xeb0168b068f20153e014f2015220683b0153e0143b014af068f30153e014f3","0x1a4f805144054241a0693e0141a01c1a3acf20ecf3178504c0053ac054f805","0x28c068930153e0147f2440745c1a244054f805068330681a4f8054c0053c01a","0x548c1a178054f805178053dc1a140054f805140054cc1a3a0054f80524c05","0xe80168b068f90153e014f9015220683b0153e0143b014af068fa0153e014fa","0x1a4f805144054241a0693e0141a01c1a3a0f90ecfa178504c0053a0054f805","0xf7068500153e0145001533068f40153e014770168c0681a4f8054c0053c01a","0x54881a0ec054f8050ec052bc1a424054f8054240548c1a178054f80517805","0x506807068f41d83b4245e14130014f40153e014f40168b068760153e01476","0x28c0681a4f80543c053c01a0693e01530014f00681a4f805144054241a0693e","0x548c1a178054f805178053dc1a140054f805140054cc1a254054f80518805","0x950168b068390153e01439015220683b0153e0143b014af0685a0153e0145a","0x1a4f8054c0053c01a0693e0141a01c1a254390ec5a178504c005254054f805","0xe701d17068e70153e0141a0cc1a0693e01533015090681a4f8054bc051441a","0x5014f70681a0153e0141a01533068980153e014e50168c068e50153e0144b","0x5124054881a348054f805348052bc1a134054f8051340548c1a014054f805","0x1a4f8050680706898124d21340506930014980153e014980168b068490153e","0x133015090681a4f8054bc051441a0693e01530014f00681a4f805458055a41a","0xe20153e014e20142f068e20153e0141a79c1a390054f8050682a0681a4f805","0x9e0153e014e301522068de0153e01406015230689c0153e014e2390070c01a","0x54c0053c01a0693e0141a01c1a06a8d0141a4981a280054f805270053e41a","0x1230681a4f8051b4057a41a0693e01533015090681a4f8054bc051441a0693e","0x1a4981a280054f8051b0053e41a278054f805098054881a378054f80509405","0x1090681a4f8054bc051441a0693e01530014f00681a4f805068070681aa3405","0xd3014f90689e0153e0152601522068de0153e01527015230681a4f8054cc05","0x528805a301a288054f805280db01d17068db0153e0141a0cc1a280054f805","0x13e014de01523068050153e01405014f70681a0153e0141a01533068da0153e","0x54f80536805a2c1a278054f805278054881a348054f805348052bc1a37805","0x28f0692f0153e0141a5a81a4c0054f80506a8e068da278d23780506930014da","0x5a481a0693e0152c016910693f4b0074f8054b805a401a4b8054f8054bc05","0x1300142f069260153e015260142f069260153e015270152e069270153e0153f","0x1410686d0153e0146d0142f0686d34c074f8054c12601cd26d81a4c0054f805","0x293068250153e014e601567068e60153e0141a34c1a38c0601d3e0146d06807","0x2a014980682a0153e0141a3941a1b0054f80538c0539c1a098054f80509405","0x5018054cc1a34c054f80534c053281a098054f805098050bc1a0a8054f805","0x506807069170cc3034a940bc3201d3e01c261b02a348054ce85068060153e","0x1a488054f805068e5069230153e01436014e7068360153e0141a3ac1a0693e","0x1a488054f805488052601a0c8054f8050c80548c1a4793301d3e01533014cd","0x1160f51934a954691d01d3e01d1e48d220bc324ce85069230153e01523014e4","0x5a0c1a108054f8050fc05a1c1a0fc054f8054cc055181a0693e0141a01c1a","0x54f8050683f068450153e0141a4581a454054f8050683d069180153e01442","0x13e0151a015220691d0153e0151d01523069140153e01447115153484206847","0x450684a449133493e015184511a474125101a460054f805460057841a46805","0x1a34c1a0693e0150f014470681a4f805068070684d0169643c054f80712805","0x601533068510153e0144b0168a0684b0153e0144904807a241a124054f805","0x5448054881a34c054f80534c053281a44c054f80544c0548c1a018054f805","0x1a0693e0141a01c1a1451234d1301933014510153e014510168b069120153e","0x548c1a018054f805018054cc1a14c054f80513405a301a0693e0141201509","0x530168b069120153e0151201522068d30153e014d3014ca069130153e01513","0x1a0693e01412015090681a4f8050680706853448d344c064cc0514c054f805","0x5a301a15c054f8054585f01d170685f0153e0141a0cc1a0693e01533014f0","0xd3014ca069190153e0151901523068060153e0140601533068500153e01457","0xd3464064cc05140054f80514005a2c1a0f4054f8050f4054881a34c054f805","0x1a0cc1a0693e01533014f00681a4f805048054241a0693e0141a01c1a1403d","0x6015330683b0153e0145a0168c0685a0153e015171780745c1a178054f805","0x50cc054881a34c054f80534c053281a0c0054f8050c00548c1a018054f805","0x120153e0141a0a81a0ec3334c30019330143b0153e0143b0168b068330153e","0x2990681a4f8054c005a601a4bd3001d3e014d201697069330153e0141a0a81a","0x54f8074b805a701a0693e0141a01c1a4fc05a6d2c0169a4b8054f8d24bc05","0xd30153e014d30142f068d30153e0141a5001a0693e0141a01c1a49805a7527","0xe30153e014060152e068060153e015270169e0686d0153e014d3048070c01a","0x260153e01533014f9068250153e014e6014f9068e60153e014e31b4070c01a","0x13e0146c0142f0686c0153e0141aa801a0693e0141a01c1a06a9f0141a4981a","0x13e014320152e068320153e01526016a10682a0153e0146c048070c01a1b005","0x13e01533014f9068250153e01430014f9068300153e0142f0a8070c01a0bc05","0x1a4f805068070681a4b005a881a0693e0141a01c1a06a9f0141a4981a09805","0x1170142f069170153e0141aa901a0693e0141a01c1a0cc054f8054fc05a8c1a","0x123016a6069230153e01433016a5068360153e01517048070c01a45c054f805","0x36014f90691d0153e0151e4cc070c01a478054f8054880575c1a488054f805","0x11a0151306919468074f805094054501a098054f805474053e41a094054f805","0x13e01519015120681a4f8050f40544c1a4583d01d3e01426015140681a4f805","0x4534aa84551801d3e01c420fc0506812a9c1a108054f805458054481a0fc05","0x1a448054f80544c0701de3069130153e0141a34c1a0693e0141a01c1a45047","0x1e5069150153e0151501522069180153e01518015230684a0153e01512015e4","0x1a0693e01407015d90681a4f805068070684a4551834805128054f80512805","0x123068490153e0144d015e60684d0153e0151443c0745c1a43c054f80506833","0x4534805124054f805124057941a11c054f80511c054881a114054f80511405","0x1a01c1a4cc05aa412348074f80701c054c01a01c054f805014053481a12447","0x13e0152f0152c0692f0153e015300152e069300153e014120152f0681a4f805","0x1a06aaa0141a4981a4fc054f8054b80549c1a4b0054f805348054fc1a4b805","0x54cc054fc1a498054f80549c051b41a49c054f805068d30681a4f80506807","0x534c054481a34d2c01d3e0152c016660693f0153e01526015270692c0153e","0x606807ab01a0693e0141a01c1a38c05aac060153e01d3f014060686d0153e","0xe6015330681a4f8051b4051441a0693e0141a01c1a09805ab425398074f807","0x54bc1a0693e0141a01c1a0c805ab82a1b0074f8074b0054c01a398054f805","0x6c0153f068330153e014300152c068300153e0142f0152e0682f0153e0142a","0x1a0693e0141a01c1a06aaf0141a4981a0d8054f8050cc0549c1a45c054f805","0x549c1a45c054f8050c8054fc1a488054f80548c051b41a48c054f805068d3","0x1a46805ac11d0153e01c36014060691e0153e0151701512068360153e01522","0xe601cb20691e0153e0151e01439068e60153e014e6015330681a4f80506807","0xac0681a4f805068070683f016b1458054f8070f4052ac1a0f51901d3e0151e","0x1a0693e0141a01c1a11405ac9150153e01d18014ad06918108074f80545805","0x54f8054504201eb5069140153e01447016b4068470153e015154742534ab3","0x1120153e01512016b7069190153e0151901533069120153e01513016b606913","0x1a0693e0151d014f00681a4f8050940574c1a0693e0141a01c1a4491901c05","0x1a134054f80543c05ad81a43c054f8051284201eb50684a0153e01445016b8","0x1a4f805068070684d464070144d0153e0144d016b7069190153e0151901533","0x54cc1a124054f8050fc05ae41a0693e01425015d30681a4f805474053c01a","0x1d30681a4f805068070684946407014490153e01449016b7069190153e01519","0x5ad81a144054f80512d1e01eb50684b0153e0151a016b80681a4f80509405","0x5339807014530153e01453016b7068e60153e014e601533068530153e01451","0x5069260685f0153e01426015330681a4f8054b0050941a0693e0141a01c1a","0x54cc1a0693e0152c014250681a4f80538c051241a0693e0141a01c1a06aba","0x501b407ad41a140054f80515c05ae01a15c054f805068d30685f0153e0141a","0x1a1685f01c05168054f80516805adc1a168054f80517805ad81a178054f805","0x1a4f805068070692e4bc07aed304cc074f8070141a01c050681a4f805068e6","0x5af53f4b0074f80734805af01a4cc054f8054cc054cc1a0693e0141a0481a","0x70068d30153e01526016b4069260153e0153f016be0681a4f8050680706927","0x13e0141a01c1a06ac00141a4981a018054f80534c05afc1a1b4054f8054b005","0x1a1b4054f80549c051c01a398054f80538c05ae01a38c054f805068d30681a","0x1a0693e0141a01c1a09805b04250153e01c06015f3068060153e014e6016bf","0xd2b10330c02f3493e01c320a86c01d304cec3068320a86c3493e01425016c2","0x2c5068330153e01433014390681a4f805068e60681a4f80506807069230d917","0x1220682f0153e0142f01523069330153e0153301533069220153e0143304807","0x13387c1a488054f805488058781a1b4054f8051b4051c01a0c0054f8050c005","0x1a0693e0141a01c1a4651a4751e048054651a4751e0493e015221b4300bd33","0x54f805068330681a4f805048054101a0693e0146d0146e0681a4f805068e6","0x54f8054cc054cc1a0fc054f80545805b181a458054f80548c3d01d170683d","0x3f0153e0143f016c7068360153e0143601522069170153e015170152306933","0x1a4f805098051241a0693e0141a3981a0693e0141a01c1a0fc3645d3304805","0x1150153e015180154c069180153e014420486d34ac8068420153e0141a34c1a","0x1a01c054f80501c054881a4c0054f8054c00548c1a4cc054f8054cc054cc1a","0x13e014d20146e0681a4f805068070691501d304cc12015150153e01515016c7","0x50bc1a11c054f8050684d068450153e0141a0a81a0693e01412015040681a","0x11301d17069130153e0141a0cc1a450054f80511c4501c30068470153e01447","0x12e015230692f0153e0152f015330684a0153e01512016c6069120153e01514","0x74b92f04805128054f80512805b1c1a01c054f80501c054881a4b8054f805","0x5068070692f4c007b2533048074f8070141a01c050681a4f805068e60684a","0x1a048054f805048054cc1a0693e0141a0481a4b8054f80501c053481a0693e","0x1260153e0153f014570681a4f8050680706927016ca4fd2c01d3e01d2e01530","0x1a01c1a06acb0141a4981a1b4054f805498051401a34c054f8054b0054fc1a","0x54f80549c054fc1a38c054f805018051781a018054f805068d30681a4f805","0x13e0141a01c1a09405b30e60153e01c6d0145a0686d0153e014e301450068d3","0x2f0686c0153e014260152e068260153e014e60152f0681a4f805068e60681a","0x133068320153e014d3015120682a0153e0146c348070c01a1b0054f8051b005","0x53e41a0c8054f8050c8050e41a4cc054f8054cc0548c1a048054f80504805","0x7068330c02f348050cc300bcd24f8050a8324cc1204a380682a0153e0142a","0x1a0693e014d3014250681a4f805094051241a0693e0141a3981a0693e0141a","0x133069230153e014360163e068360153e01517348078f41a45c054f805068d3","0x123480548c054f80548c058f01a4cc054f8054cc0548c1a048054f80504805","0x1a0a81a0693e01407014510681a4f8053480544c1a0693e0141a01c1a48d33","0x54792201c300691e0153e0151e0142f0691e0153e0141a1341a488054f805","0x13e015190163b069190153e0151d4680745c1a468054f805068330691d0153e","0x54f8050f4058f01a4bc054f8054bc0548c1a4c0054f8054c0054cc1a0f405","0x12f016cd0693e01d3001566069304cc074f8054cc053341a0f52f4c0d20143d","0x5048053c01a0693e01407014f00681a4f8054cc053c01a0693e0141a01c1a","0x1a4b0054f8054b8055081a4b8054f805068d30681a4f805348053c01a0693e","0xf70681a0153e0141a01533069270153e0153f0165b0693f0153e0152c0165a","0x1a4f80506807069270141a3480549c054f80549c059701a014054f80501405","0x68d34cc074f8054cc053341a498054f80506ace0681a4f8054bc055a41a","0x6016cf0693e01c6d015660686d0153e0146d0142f0686d0153e0152634c07","0x5048053c01a0693e01407014f00681a4f8054cc053c01a0693e0141a01c1a","0x1a398054f80538c055081a38c054f805068d30681a4f805348053c01a0693e","0xf70681a0153e0141a01533068260153e014250165b068250153e014e60165a","0x1a4f80506807068260141a34805098054f805098059701a014054f80501405","0x682a048074f805048053341a1b0054f80506ace0681a4f805018055a41a","0x2f016d00693e01c3201566068320153e014320142f068320153e0146c0a807","0x5048053c01a0693e01407014f00681a4f8054cc053c01a0693e0141a01c1a","0x1a0cc054f8050c0055081a0c0054f805068d30681a4f805348053c01a0693e","0xf70681a0153e0141a01533068360153e015170165b069170153e014330165a","0x1a4f80506807068360141a348050d8054f8050d8059701a014054f80501405","0x13e0141a01c1a47805b492248c074f8073481a01ed10681a4f8050bc055a41a","0x13e01d1d48c07b441a488054f80548805b4c1a4741201d3e01412014cd0681a","0x54f8050694d069160153e0141ab541a0693e0141a01c1a0f405b511946807","0x11a0153e0151a015330683f0153e0143f0142f069160153e015160142f0683f","0x1a4f805068070681ab5c420153e01c3f45807b581a464054f80546405b4c1a","0x13e015194cd1501412b681a4551801d3e01518016d9069180153e0141ab601a","0x13e01445014f7068420153e01442016d3068470153e01447016db0684711407","0x74f80545005b781a0693e0141a01c1a06add450054f80711c05b701a11405","0x4201c4a11412b681a1291801d3e01518016d90681a4f805448053c01a44913","0x4b0153e0144b016db0684b124074f805488124610f04ada0684d43c074f805","0x2df144054f80712c05b701a124054f805124053dc1a134054f80513405b6c1a","0x5f144074f80514405b801a14c4d01d3e0144d016d90681a4f805068070681a","0x500153e01c57016dc068570153e01457016db068570153e0145f14c07b841a","0x1a0693e0145a014f00685a178074f80514005b781a0693e0141a01c1a06ae2","0x390153e014390142f068390153e0143b178070001a0ed1301d3e01513014cd","0x2e40681a4f80544c053c01a0693e0141a01c1a1c005b8c1a4f8070e4055981a","0x13e0141501567068150153e0141a34c1a0693e01451016e50681a4f80513405","0x54f805468054cc1a434054f8051900596c1a190054f805188059681a18805","0x1a01c1a43449468d20150d0153e0150d0165c068490153e01449014f70691a","0x5b9c1a0693e0141a01c1a06ae60141a4981a0693e01470015690681a4f805","0x68016ea068680153e01468016e9068680153e0150c016e80690c0153e01451","0x13e0144d016e40681a4f80544c053c01a0693e0141a01c1a1a805bac1a4f807","0x300690b0153e0150b0142f0690b0153e0141abb01a1b8054f8050682a0681a","0x263068750153e015091d80745c1a1d8054f80506833069090153e0150b1b807","0x59701a124054f805124053dc1a468054f805468054cc1a1c4054f8051d405","0x770153e0146a13407b841a0693e0141a01c1a1c449468d2014710153e01471","0x1a0693e0141a01c1a06aed418054f8071dc05b701a1dc054f8051dc05b6c1a","0x1a3fc054f80544d0401c000681a4f805408053c01a4090401d3e01506016de","0xd30681a4f80506807068fe016ee0693e01cff01566068ff0153e014ff0142f","0xf90165b068f90153e014fa0165a068fa0153e014fd01567068fd0153e0141a","0x51fc059701a124054f805124053dc1a468054f805468054cc1a1fc054f805","0x5069260681a4f8053f8055a41a0693e0141a01c1a1fc49468d20147f0153e","0x55081a204054f805068d30681a4f80544c053c01a0693e0141a01c1a06aef","0x11a01533068840153e014f70165b068f70153e014f80165a068f80153e01481","0x841251a34805210054f805210059701a124054f805124053dc1a468054f805","0x13e0141a34c1a0693e0144d016e40681a4f80544c053c01a0693e0141a01c1a","0x54f8053d40596c1a3d4054f8053d8059681a3d8054f805218055081a21805","0xf30153e014f30165c068490153e01449014f70691a0153e0151a01533068f3","0x1a4f80548805b941a0693e01518016e40681a4f80506807068f31251a34805","0x5068d30681a4f80501c053c01a0693e01442016e50681a4f805048053c01a","0x13e0148b0165b0688b0153e014f10165a068f10153e014f201542068f20153e","0x54f805234059701a114054f805114053dc1a468054f805468054cc1a23405","0x13e01522016e50681a4f80501c053c01a0693e0141a01c1a23445468d20148d","0x1a34c1a0693e01519016e50681a4f8054cc053c01a0693e01412014f00681a","0x53b80596c1a3b8054f8053b4059681a3b4054f8053c0055081a3c0054f805","0x13e014eb0165c068050153e01405014f70691a0153e0151a01533068eb0153e","0x501c053c01a0693e01533014f00681a4f80506807068eb0151a348053ac05","0x142068910153e0141a34c1a0693e01412014f00681a4f80548805b941a0693e","0x54cc1a3d0054f8053a00596c1a3a0054f80524c059681a24c054f80524405","0x50f4d2014f40153e014f40165c068050153e01405014f70683d0153e0143d","0x12014f00681a4f80501c053c01a0693e01533014f00681a4f80506807068f4","0x54f80539c059681a39c054f805254055081a254054f805068d30681a4f805","0x50153e01405014f70691e0153e0151e01533068980153e014e50165b068e5","0x13e0141a36c1a0693e0153301509068980151e34805260054f805260059701a","0x142069260153e0141a34c1a49c054f805068db0693f0153e0141a36c1a4b005","0xd3014a0068d30153e014d3015680686d0153e0141abc01a34c054f80549805","0x54b0050bc1a0693e01406014490681a4f80506807068e3016f1018054f807","0x13e0142501567068250153e0141a34c1a398054f8051b52c01ef20692c0153e","0x54f8054fc050bc1a0a8054f805398050bc1a1b0054f805348052bc1a09805","0x70681abcc0506926068300153e01426015680682f0153e015270142f06832","0x51b53f01ef20693f0153e0153f0142f0681a4f80538c051241a0693e0141a","0x13e015270142f068330153e014330142f0692c0153e0152c0142f068330153e","0x1420691e0153e0141a34c1a489230d9170493e015270cd2c34812bd01a49c05","0x50bc1a0a8054f8050d8050bc1a1b0054f80545c052bc1a474054f80547805","0x506af5068300153e0151d015680682f0153e015220142f068320153e01523","0x5464051241a0693e0141a01c1a0f405bd9190153e01c30014a00691a0153e","0x54f8050fc0559c1a0fc054f805068d3069160153e0151a0a807bc81a0693e","0x450153e014320142f069150153e015160142f069180153e0146c014af06842","0x1a01c1a06af70141a4981a450054f805108055a01a11c054f8050bc050bc1a","0x13e015130142f069130153e0151a0c807bc81a0693e0143d014490681a4f805","0x142068490153e0141a34c1a1350f129120493e0142f44c2a1b012bd01a44c05","0x50bc1a454054f805128050bc1a460054f805448052bc1a12c054f80512405","0x701dca069140153e0144b01568068470153e0144d0142f068450153e0150f","0x54f80517c057301a0693e0141a01c1a1785015cd2be05f14c513493e01c12","0x3b015d106862054700e43b4cd3e0145a015d00685a0153e0145f015cd0685f","0x1a0693e01462014f00681a4f8051c00574c1a0693e01439015d20681a4f805","0x2f068530153e0145301522068510153e0145101523068640153e01415015d4","0x490681a4f805068070690c016f9434054f807450052801a190054f80519005","0x6a015670686a0153e0141a34c1a1a0054f8051911501ef20681a4f80543405","0x5114050bc1a424054f8051a0050bc1a42c054f805460052bc1a1b8054f805","0x1abe80506926068710153e0146e01568068750153e014470142f068760153e","0x50bc1a1dc054f8051904501ef20681a4f805430051241a0693e0141a01c1a","0x54f805068d3068ff40904418124f80511c774551804af4068770153e01477","0x1090153e015040142f0690b0153e01506014af068fd0153e014fe01542068fe","0x1a1c4054f8053f4055a01a1d4054f8053fc050bc1a1d8054f805408050bc1a","0x2f20681a4f8053e8051241a0693e0141a01c1a3e405becfa0153e01c71014a0","0x52bc1a3e0054f8052040559c1a204054f805068d30687f0153e0153042407","0x750142f068860153e014760142f068840153e0147f0142f068f70153e0150b","0x1a0693e0141a01c1a06afc0141a4981a3d4054f8053e0055a01a3d8054f805","0x2f4068f30153e014f30142f068f30153e015301d807bc81a0693e014f901449","0x13e014f001542068f00153e0141a34c1a2348b3c4f20493e014753cd0942c12","0x54f80522c050bc1a210054f8053c4050bc1a3dc054f8053c8052bc1a3b405","0xee0153e01cf5014a0068f50153e014ed01568068f60153e0148d0142f06886","0x2f2068910153e0141a7041a0693e014ee014490681a4f80506807068eb016fd","0x124f8053d88624cf704af4068930153e014930142f068930153e0149121007","0x54f8053a0052bc1a0693e014e7014f00681a4f805254053c01a39c953d0e8","0xeb014490681a4f805068070681abf80506926068980153e014f40142f068e5","0x13e014e20142f068e20153e014e421807bc81a390054f805069c10681a4f805","0xf00681a4f805278053c01a2809e3789c0493e014f6388843dc12bd01a38805","0x1a01533068980153e014de0142f068e50153e0149c014af0681a4f80528005","0x54bc050bc1a260054f805260050bc1a014054f805014053dc1a068054f805","0xda288db3493e0152e4bc980141a4cc9c0692e0153e0152e014390692f0153e","0xd70153e014a40149e0681a4f80506807068dc016ff290054f807368053781a","0x1a0693e014d6014490681a4f80506807068b201700358054f80735c052801a","0xab01c30068ac0153e014ac0142f068ac0153e0141a9181a2ac054f8050682a","0xd401701068d40153e014ad2bc0745c1a2bc054f80506833068ad0153e014ac","0x51440548c1a288054f805288053dc1a36c054f80536c054cc1a33c054f805","0x13e014cf0154f068530153e0145301522068e50153e014e5014af068510153e","0xd30681a4f8052c8051241a0693e0141a01c1a33c5339451288db4c00533c05","0xdb01533068c10153e014ca01703068ca0153e014cc01702068cc0153e0141a","0x5394052bc1a144054f8051440548c1a288054f805288053dc1a36c054f805","0xe5144a236d30014c10153e014c10154f068530153e0145301522068e50153e","0x1a36c054f80536c054cc1a334054f80537005c041a0693e0141a01c1a30453","0x122068e50153e014e5014af068510153e0145101523068a20153e014a2014f7","0x1a01c1a3345339451288db4c005334054f8053340553c1a14c054f80514c05","0x1a0693e0152e014510681a4f805454053c01a0693e01514017040681a4f805","0x54c0053c01a0693e01447014f00681a4f805114053c01a0693e0152f014f0","0x54f80559805c041a598054f8051780001d17068000153e0141a0cc1a0693e","0x570153e0145701523068050153e01405014f70681a0153e0141a0153306967","0x559c054f80559c0553c1a140054f805140054881a460054f805460052bc1a","0x1a0481a348070141a330a43341a0483b290cd06812489671411815c0506930","0xcc290cd3941a4cc3b290cd3941a4ccca348070141a330a43341a0483b290cd","0x133c1412348070141a330a4334e5069330eca4334e506933adc12348070141a","0x1a4cc3b290cd3941a4cf06048d201c05068cc290cd3941a4cc3b290cd3941a","0x70141a330a4334e5069330eca4334e506933c1c12348070141a330a4334e5","0x3b290cd3dce506930c24d201c05068cc290cd068120eca43341a04b08048d2","0x1a330a43341a0483b290cd06812c2933048d201c05068cc290cd3dce506930","0x30c4cc12348070141a330a4334f73941a4c03b290cd3dce506930c2cd201c05","0x1330eca43341a3e533c3412348070141a330a43341a3e5330eca43341a3e533","0x30f348070141a350a4334d21a0ad290cd04b0e048d201c05068cc290cd068f9","0xcd068121147f290cd06933c4012348070141a36ccd068d2018450eccd06933","0xe506933c48d201c05068e43341a34830388cd06812c4412348070141a378a4","0xe83341a348060c03b3341a4cf13048d201c05068e7290cd3941a4cc7f290cd","0x3b06807c5412348070141a3c0e5068d20ec06018e506933c5012348070141a","0x70141a3e0a43dccd3941a4c03b0187f290f7334e50692ec5805068f606807","0x133048d201c05068f8290f93341a4cc061fca43e4cd06930c5d2f4c133048d2","0x133c68050690d068070ec1a01f19348070141a350a4334d242cad290cd04b18","0xe43341a348300eccd06812c6c12348070141a450a43341a0483f114a43341a","0x1a4b31d4cc12348070141a3c0e5068d201806018063941a4c31c348070141a","0x31e4b92f4c133048d201c0506917290f7334e5069300ec060187f290f7334e5"],"sierra_program_debug_info":{"type_names":[[0,"RangeCheck"],[1,"Const"],[2,"Const"],[3,"Const"],[4,"EcPoint"],[5,"EcState"],[6,"Const"],[7,"Const"],[8,"NonZero"],[9,"Const"],[10,"Box"],[11,"Const"],[12,"Const"],[13,"Const"],[14,"openzeppelin_introspection::src5::SRC5Component::Event"],[15,"felt252"],[16,"core::starknet::storage::storage_base::StorageBase::>>"],[17,"Const"],[18,"openzeppelin_account::account::AccountComponent::OwnerAdded"],[19,"openzeppelin_account::account::AccountComponent::OwnerRemoved"],[20,"openzeppelin_account::account::AccountComponent::Event"],[21,"Unit"],[22,"Tuple"],[23,"core::panics::Panic"],[24,"Array"],[25,"Tuple>"],[26,"core::panics::PanicResult::<((),)>"],[27,"StorageBaseAddress"],[28,"core::starknet::storage::StoragePointer0Offset::>"],[29,"Const"],[30,"Const"],[31,"Const"],[32,"Const"],[33,"Const"],[34,"Box>"],[35,"core::option::Option::>>"],[36,"Array>"],[37,"Snapshot>>"],[38,"Uninitialized>>>"],[39,"Const"],[40,"Array"],[41,"Tuple, Array>, Unit>"],[42,"core::panics::PanicResult::<(core::array::Array::, core::array::Array::>, ())>"],[43,"Const, Const>"],[44,"Const"],[45,"Const"],[46,"Const, Const>"],[47,"u128"],[48,"core::integer::u256"],[49,"Const"],[50,"Array"],[51,"Snapshot>"],[52,"core::array::Span::"],[53,"u64"],[54,"core::starknet::info::v2::ResourceBounds"],[55,"ContractAddress"],[56,"Snapshot>"],[57,"core::array::Span::"],[58,"u32"],[59,"core::starknet::info::v2::TxInfo"],[60,"core::starknet::account::Call"],[61,"core::option::Option::"],[62,"Tuple, core::option::Option::>"],[63,"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"],[64,"Const"],[65,"ClassHash"],[66,"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded"],[67,"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event"],[68,"madara_contracts::account::AccountUpgradeable::Event"],[69,"Const"],[70,"Box"],[71,"Box"],[72,"core::starknet::info::BlockInfo"],[73,"core::starknet::info::v2::ExecutionInfo"],[74,"Box"],[75,"Const"],[76,"core::starknet::storage::StoragePointer0Offset::"],[77,"core::starknet::storage::storage_base::StorageBase::>"],[78,"Const"],[79,"NonZero"],[80,"Const"],[81,"Pedersen"],[82,"openzeppelin_account::account::AccountComponent::ComponentState::"],[83,"Tuple, Unit>"],[84,"core::panics::PanicResult::<(openzeppelin_account::account::AccountComponent::ComponentState::, ())>"],[85,"Poseidon"],[86,"core::option::Option::>"],[87,"Tuple, core::option::Option::>>"],[88,"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"],[89,"Const"],[90,"Const"],[91,"Const"],[92,"Const"],[93,"core::bool"],[94,"Tuple"],[95,"core::panics::PanicResult::<(core::bool,)>"],[96,"Const"],[97,"StorageAddress"],[98,"core::starknet::storage::StoragePointer0Offset::"],[99,"core::option::Option::>"],[100,"Tuple, core::option::Option::>>"],[101,"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"],[102,"Uninitialized"],[103,"Tuple"],[104,"core::panics::PanicResult::<(core::felt252,)>"],[105,"EcOp"],[106,"Tuple, Unit>"],[107,"core::panics::PanicResult::<(core::array::Array::, ())>"],[108,"core::array::Span::>"],[109,"Tuple>>"],[110,"core::panics::PanicResult::<(core::array::Array::>,)>"],[111,"core::option::Option::>"],[112,"Tuple, core::option::Option::>>"],[113,"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"],[114,"Box"],[115,"core::option::Option::>"],[116,"System"],[117,"Uninitialized"],[118,"Const"],[119,"Const"],[120,"Tuple>"],[121,"openzeppelin_introspection::src5::SRC5Component::ComponentState::"],[122,"openzeppelin_upgrades::upgradeable::UpgradeableComponent::ComponentState::"],[123,"madara_contracts::account::AccountUpgradeable::ContractState"],[124,"Tuple"],[125,"core::panics::PanicResult::<(madara_contracts::account::AccountUpgradeable::ContractState, ())>"],[126,"BuiltinCosts"],[127,"core::panics::PanicResult::<(core::array::Span::,)>"],[128,"Const"],[129,"core::option::Option::"],[130,"GasBuiltin"]],"libfunc_names":[[0,"revoke_ap_tracking"],[1,"withdraw_gas"],[2,"branch_align"],[3,"struct_deconstruct>"],[4,"enable_ap_tracking"],[5,"store_temp"],[6,"array_snapshot_pop_front"],[7,"unbox"],[8,"rename"],[9,"enum_init, 0>"],[10,"store_temp>>"],[11,"store_temp>"],[12,"jump"],[13,"struct_construct"],[14,"enum_init, 1>"],[15,"enum_match>"],[16,"class_hash_try_from_felt252"],[17,"disable_ap_tracking"],[18,"drop>>"],[19,"drop>"],[20,"drop"],[21,"array_new"],[22,"const_as_immediate>"],[23,"store_temp"],[24,"array_append"],[25,"struct_construct"],[26,"struct_construct>>"],[27,"enum_init,)>, 1>"],[28,"store_temp"],[29,"store_temp"],[30,"store_temp,)>>"],[31,"get_builtin_costs"],[32,"store_temp"],[33,"withdraw_gas_all"],[34,"struct_construct>"],[35,"struct_construct>"],[36,"struct_construct>"],[37,"struct_construct"],[38,"store_temp"],[39,"function_call"],[40,"enum_match>"],[41,"drop>"],[42,"snapshot_take>"],[43,"drop>"],[44,"struct_construct>"],[45,"struct_construct>>"],[46,"enum_init,)>, 0>"],[47,"const_as_immediate>"],[48,"drop"],[49,"const_as_immediate>"],[50,"drop>"],[51,"alloc_local"],[52,"finalize_locals"],[53,"enum_init>, 0>"],[54,"store_temp>>"],[55,"enum_init>, 1>"],[56,"enum_match>>"],[57,"array_new"],[58,"store_temp>"],[59,"store_temp>"],[60,"function_call>"],[61,"enum_match, core::option::Option::>)>>"],[62,"struct_deconstruct, core::option::Option::>>>"],[63,"store_temp>>"],[64,"drop>"],[65,"enum_init>, 1>"],[66,"enum_match>>"],[67,"drop>"],[68,"snapshot_take>"],[69,"drop>"],[70,"function_call::__execute__>"],[71,"store_local"],[72,"enum_match>,)>>"],[73,"struct_deconstruct>>>"],[74,"snapshot_take>>"],[75,"drop>>"],[76,"dup>>>"],[77,"array_len>"],[78,"u32_to_felt252"],[79,"struct_construct>>"],[80,"store_temp>>"],[81,"store_temp>"],[82,"function_call, core::array::SpanFelt252Serde, core::array::SpanDrop::>>"],[83,"enum_match, ())>>"],[84,"struct_deconstruct, Unit>>"],[85,"store_temp"],[86,"function_call::validate_transaction>"],[87,"enum_match>"],[88,"struct_deconstruct>"],[89,"alloc_local"],[90,"store_local"],[91,"function_call>"],[92,"enum_match, core::option::Option::>)>>"],[93,"struct_deconstruct, core::option::Option::>>>"],[94,"store_temp>>"],[95,"drop"],[96,"enum_init>, 1>"],[97,"enum_match>>"],[98,"storage_base_address_const<550557492744938365112574611882025123252567779123164597803728068558738016655>"],[99,"struct_construct>"],[100,"snapshot_take>"],[101,"drop>"],[102,"struct_deconstruct>"],[103,"rename"],[104,"storage_address_from_base"],[105,"const_as_immediate>"],[106,"store_temp"],[107,"store_temp"],[108,"storage_read_syscall"],[109,"function_call"],[110,"enum_match>"],[111,"struct_deconstruct>"],[112,"enum_match"],[113,"const_as_immediate>"],[114,"const_as_immediate>"],[115,"struct_deconstruct>>"],[116,"drop"],[117,"const_as_immediate>"],[118,"drop>"],[119,"const_as_immediate>"],[120,"function_call"],[121,"enum_match, core::option::Option::>)>>"],[122,"struct_deconstruct, core::option::Option::>>>"],[123,"enum_match>>"],[124,"store_temp"],[125,"function_call::set_public_key>"],[126,"enum_match, ())>>"],[127,"drop, Unit>>"],[128,"store_temp"],[129,"const_as_immediate>"],[130,"dup"],[131,"felt252_sub"],[132,"felt252_is_zero"],[133,"enum_init"],[134,"store_temp"],[135,"drop>"],[136,"const_as_immediate>"],[137,"struct_construct>>"],[138,"snapshot_take>>"],[139,"drop>>"],[140,"struct_deconstruct>>"],[141,"pedersen"],[142,"storage_base_address_from_felt252"],[143,"struct_construct>"],[144,"snapshot_take>"],[145,"drop>"],[146,"struct_deconstruct>"],[147,"enum_init"],[148,"bool_not_impl"],[149,"const_as_immediate>"],[150,"function_call::initializer>"],[151,"get_execution_info_v2_syscall"],[152,"store_temp>"],[153,"unbox"],[154,"store_temp"],[155,"struct_deconstruct"],[156,"drop>"],[157,"drop>"],[158,"drop"],[159,"contract_address_to_felt252"],[160,"dup"],[161,"class_hash_to_felt252"],[162,"drop"],[163,"const_as_immediate>"],[164,"replace_class_syscall"],[165,"struct_construct"],[166,"enum_init"],[167,"enum_init"],[168,"store_temp"],[169,"function_call>>"],[170,"struct_construct>"],[171,"enum_init, 0>"],[172,"store_temp>"],[173,"enum_init, 1>"],[174,"const_as_immediate>"],[175,"drop"],[176,"enum_init>, 0>"],[177,"struct_construct, core::option::Option::>>>"],[178,"enum_init, core::option::Option::>)>, 0>"],[179,"store_temp, core::option::Option::>)>>"],[180,"function_call"],[181,"enum_match, core::option::Option::)>>"],[182,"struct_deconstruct, core::option::Option::>>"],[183,"enum_match>"],[184,"array_append"],[185,"enum_init, core::option::Option::>)>, 1>"],[186,"store_temp>"],[187,"unbox"],[188,"struct_deconstruct"],[189,"drop"],[190,"drop>"],[191,"drop"],[192,"u128s_from_felt252"],[193,"const_as_immediate>"],[194,"store_temp"],[195,"const_as_immediate, Const>>"],[196,"struct_deconstruct"],[197,"dup"],[198,"u128_overflowing_sub"],[199,"u128_eq"],[200,"const_as_immediate>"],[201,"rename"],[202,"const_as_immediate>"],[203,"enum_init>,)>, 1>"],[204,"store_temp>,)>>"],[205,"const_as_immediate, Const>>"],[206,"array_new>"],[207,"store_temp>>"],[208,"function_call"],[209,"enum_match, core::array::Array::>, ())>>"],[210,"struct_deconstruct, Array>, Unit>>"],[211,"struct_construct>>>"],[212,"enum_init>,)>, 0>"],[213,"const_as_immediate>"],[214,"alloc_local>>>"],[215,"struct_deconstruct>>"],[216,"array_snapshot_pop_front>"],[217,"enum_init>>, 0>"],[218,"store_temp>>>"],[219,"store_temp>>>"],[220,"enum_init>>, 1>"],[221,"store_local>>>"],[222,"enum_match>>>"],[223,"unbox>"],[224,"dup>"],[225,"rename>"],[226,"array_len"],[227,"function_call>"],[228,"drop>>>"],[229,"enum_init, ())>, 1>"],[230,"store_temp, ())>>"],[231,"struct_construct, Unit>>"],[232,"enum_init, ())>, 0>"],[233,"drop>>>>"],[234,"drop>>"],[235,"store_temp"],[236,"const_as_immediate>"],[237,"enum_init, 1>"],[238,"store_temp>"],[239,"struct_construct>"],[240,"enum_init, 0>"],[241,"drop"],[242,"enum_init>, 0>"],[243,"struct_construct, core::option::Option::>>>"],[244,"enum_init, core::option::Option::>)>, 0>"],[245,"store_temp, core::option::Option::>)>>"],[246,"enum_init, core::option::Option::>)>, 1>"],[247,"const_as_immediate>"],[248,"u32_eq"],[249,"struct_construct>"],[250,"enum_init, 0>"],[251,"store_temp>"],[252,"array_get"],[253,"store_temp>"],[254,"const_as_immediate>"],[255,"function_call"],[256,"const_as_immediate>"],[257,"enum_init, 1>"],[258,"dup>>"],[259,"u32_try_from_felt252"],[260,"dup"],[261,"array_slice"],[262,"u32_overflowing_sub"],[263,"enum_init>, 0>"],[264,"struct_construct, core::option::Option::>>>"],[265,"enum_init, core::option::Option::>)>, 0>"],[266,"store_temp, core::option::Option::>)>>"],[267,"enum_init, core::option::Option::>)>, 1>"],[268,"const_as_immediate>"],[269,"enum_init>, 1>"],[270,"struct_construct>>"],[271,"snapshot_take>>"],[272,"drop>>"],[273,"struct_deconstruct>>"],[274,"function_call::assert_valid_new_owner>"],[275,"enum_match>"],[276,"drop>"],[277,"struct_construct"],[278,"enum_init"],[279,"enum_init"],[280,"storage_write_syscall"],[281,"struct_construct"],[282,"enum_init"],[283,"struct_construct, Unit>>"],[284,"enum_init, ())>, 0>"],[285,"store_temp, ())>>"],[286,"enum_init, ())>, 1>"],[287,"const_as_immediate>"],[288,"struct_construct>>>"],[289,"snapshot_take>>>"],[290,"drop>>>"],[291,"struct_deconstruct>>>"],[292,"bool_to_felt252"],[293,"snapshot_take"],[294,"drop"],[295,"enum_match"],[296,"enum_match"],[297,"const_as_immediate>"],[298,"struct_deconstruct"],[299,"const_as_immediate>"],[300,"struct_deconstruct"],[301,"enum_match"],[302,"enum_match"],[303,"const_as_immediate>"],[304,"struct_deconstruct"],[305,"rename"],[306,"emit_event_syscall"],[307,"contract_address_try_from_felt252"],[308,"struct_construct"],[309,"enum_init, 0>"],[310,"struct_construct, core::option::Option::>>"],[311,"enum_init, core::option::Option::)>, 0>"],[312,"store_temp, core::option::Option::)>>"],[313,"enum_init, 1>"],[314,"enum_init, core::option::Option::)>, 1>"],[315,"array_pop_front"],[316,"unbox"],[317,"store_temp>"],[318,"struct_deconstruct"],[319,"call_contract_syscall"],[320,"array_append>"],[321,"enum_init, core::array::Array::>, ())>, 1>"],[322,"store_temp, core::array::Array::>, ())>>"],[323,"struct_construct, Array>, Unit>>"],[324,"enum_init, core::array::Array::>, ())>, 0>"],[325,"const_as_immediate>"],[326,"ec_point_from_x_nz"],[327,"store_temp>"],[328,"const_as_immediate>"],[329,"const_as_immediate>"],[330,"ec_point_try_new_nz"],[331,"ec_state_init"],[332,"dup"],[333,"ec_state_add_mul"],[334,"store_temp"],[335,"ec_state_try_finalize_nz"],[336,"ec_point_unwrap"],[337,"dup>"],[338,"ec_state_add"],[339,"drop"],[340,"drop>"],[341,"unwrap_non_zero"],[342,"ec_neg"],[343,"store_temp"],[344,"ec_point_is_zero"],[345,"const_as_immediate>"],[346,"const_as_immediate>"],[347,"felt252_add"],[348,"hades_permutation"],[349,"const_as_immediate>"],[350,"enum_init, 1>"],[351,"store_temp>"],[352,"struct_construct>"],[353,"enum_init, 0>"],[354,"drop"]],"user_func_names":[[0,"madara_contracts::account::AccountUpgradeable::__wrapper__UpgradeableImpl__upgrade"],[1,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl____execute__::"],[2,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl____validate__::"],[3,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl__is_valid_signature::"],[4,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl__isValidSignature::"],[5,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl____validate_declare__::"],[6,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl____validate_deploy__::"],[7,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl__get_public_key::"],[8,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl__set_public_key::"],[9,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl__getPublicKey::"],[10,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl__setPublicKey::"],[11,"openzeppelin_account::account::AccountComponent::__wrapper__AccountMixinImpl__supports_interface::"],[12,"madara_contracts::account::AccountUpgradeable::__wrapper__constructor"],[13,"madara_contracts::account::AccountUpgradeable::UpgradeableImpl::upgrade"],[14,"core::array::deserialize_array_helper::"],[15,"openzeppelin_account::account::AccountComponent::SRC6::::__execute__"],[16,"core::array::serialize_array_helper::, core::array::SpanFelt252Serde, core::array::SpanDrop::>"],[17,"openzeppelin_account::account::AccountComponent::InternalImpl::::validate_transaction"],[18,"core::array::deserialize_array_helper::"],[19,"openzeppelin_account::utils::signature::is_valid_stark_signature"],[20,"core::array::SpanFelt252Serde::deserialize"],[21,"openzeppelin_account::account::AccountComponent::PublicKey::::set_public_key"],[22,"openzeppelin_account::account::AccountComponent::InternalImpl::::initializer"],[23,"madara_contracts::account::AccountUpgradeable::ContractStateEventEmitter::emit::>"],[24,"core::starknet::account::CallSerde::deserialize"],[25,"openzeppelin_account::utils::execute_calls[expr16]"],[26,"core::array::serialize_array_helper::"],[27,"core::ecdsa::check_ecdsa_signature"],[28,"openzeppelin_account::account::AccountComponent::InternalImpl::::assert_valid_new_owner"]]},"contract_class_version":"0.1.0","entry_points_by_type":{"EXTERNAL":[{"selector":"0xbc0eb87884ab91e330445c3584a50d7ddf4b568f02fbeb456a6242cce3f5d9","function_idx":10},{"selector":"0xf2f7c15cbe06c8d94597cd91fd7f3369eae842359235712def5584f8d270cd","function_idx":0},{"selector":"0xfe80f537b66d12a00b6d3c072b44afbb716e78dde5c3f0ef116ee93d3e3283","function_idx":11},{"selector":"0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad","function_idx":1},{"selector":"0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775","function_idx":2},{"selector":"0x1a35984e05126dbecb7c3bb9929e7dd9106d460c59b1633739a5c733a5fb13b","function_idx":7},{"selector":"0x1a6c6a0bdec86cc645c91997d8eea83e87148659e3e61122f72361fd5e94079","function_idx":9},{"selector":"0x213dfe25e2ca309c4d615a09cfc95fdb2fc7dc73fbcad12c450fe93b1f2ff9e","function_idx":4},{"selector":"0x28420862938116cb3bbdbedee07451ccc54d4e9412dbef71142ad1980a30941","function_idx":3},{"selector":"0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3","function_idx":5},{"selector":"0x2e3e21ff5952b2531241e37999d9c4c8b3034cccc89a202a6bf019bdf5294f9","function_idx":8},{"selector":"0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895","function_idx":6}],"L1_HANDLER":[],"CONSTRUCTOR":[{"selector":"0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194","function_idx":12}]},"abi":[{"type":"impl","name":"UpgradeableImpl","interface_name":"openzeppelin_upgrades::interface::IUpgradeable"},{"type":"interface","name":"openzeppelin_upgrades::interface::IUpgradeable","items":[{"type":"function","name":"upgrade","inputs":[{"name":"new_class_hash","type":"core::starknet::class_hash::ClassHash"}],"outputs":[],"state_mutability":"external"}]},{"type":"impl","name":"AccountMixinImpl","interface_name":"openzeppelin_account::interface::AccountABI"},{"type":"struct","name":"core::array::Span::","members":[{"name":"snapshot","type":"@core::array::Array::"}]},{"type":"struct","name":"core::starknet::account::Call","members":[{"name":"to","type":"core::starknet::contract_address::ContractAddress"},{"name":"selector","type":"core::felt252"},{"name":"calldata","type":"core::array::Span::"}]},{"type":"enum","name":"core::bool","variants":[{"name":"False","type":"()"},{"name":"True","type":"()"}]},{"type":"interface","name":"openzeppelin_account::interface::AccountABI","items":[{"type":"function","name":"__execute__","inputs":[{"name":"calls","type":"core::array::Array::"}],"outputs":[{"type":"core::array::Array::>"}],"state_mutability":"view"},{"type":"function","name":"__validate__","inputs":[{"name":"calls","type":"core::array::Array::"}],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"},{"type":"function","name":"is_valid_signature","inputs":[{"name":"hash","type":"core::felt252"},{"name":"signature","type":"core::array::Array::"}],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"},{"type":"function","name":"supports_interface","inputs":[{"name":"interface_id","type":"core::felt252"}],"outputs":[{"type":"core::bool"}],"state_mutability":"view"},{"type":"function","name":"__validate_declare__","inputs":[{"name":"class_hash","type":"core::felt252"}],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"},{"type":"function","name":"__validate_deploy__","inputs":[{"name":"class_hash","type":"core::felt252"},{"name":"contract_address_salt","type":"core::felt252"},{"name":"public_key","type":"core::felt252"}],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"},{"type":"function","name":"get_public_key","inputs":[],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"},{"type":"function","name":"set_public_key","inputs":[{"name":"new_public_key","type":"core::felt252"},{"name":"signature","type":"core::array::Span::"}],"outputs":[],"state_mutability":"external"},{"type":"function","name":"isValidSignature","inputs":[{"name":"hash","type":"core::felt252"},{"name":"signature","type":"core::array::Array::"}],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"},{"type":"function","name":"getPublicKey","inputs":[],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"},{"type":"function","name":"setPublicKey","inputs":[{"name":"newPublicKey","type":"core::felt252"},{"name":"signature","type":"core::array::Span::"}],"outputs":[],"state_mutability":"external"}]},{"type":"constructor","name":"constructor","inputs":[{"name":"public_key","type":"core::felt252"}]},{"type":"event","name":"openzeppelin_account::account::AccountComponent::OwnerAdded","kind":"struct","members":[{"name":"new_owner_guid","type":"core::felt252","kind":"key"}]},{"type":"event","name":"openzeppelin_account::account::AccountComponent::OwnerRemoved","kind":"struct","members":[{"name":"removed_owner_guid","type":"core::felt252","kind":"key"}]},{"type":"event","name":"openzeppelin_account::account::AccountComponent::Event","kind":"enum","variants":[{"name":"OwnerAdded","type":"openzeppelin_account::account::AccountComponent::OwnerAdded","kind":"nested"},{"name":"OwnerRemoved","type":"openzeppelin_account::account::AccountComponent::OwnerRemoved","kind":"nested"}]},{"type":"event","name":"openzeppelin_introspection::src5::SRC5Component::Event","kind":"enum","variants":[]},{"type":"event","name":"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded","kind":"struct","members":[{"name":"class_hash","type":"core::starknet::class_hash::ClassHash","kind":"data"}]},{"type":"event","name":"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event","kind":"enum","variants":[{"name":"Upgraded","type":"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded","kind":"nested"}]},{"type":"event","name":"madara_contracts::account::AccountUpgradeable::Event","kind":"enum","variants":[{"name":"AccountEvent","type":"openzeppelin_account::account::AccountComponent::Event","kind":"flat"},{"name":"SRC5Event","type":"openzeppelin_introspection::src5::SRC5Component::Event","kind":"flat"},{"name":"UpgradeableEvent","type":"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event","kind":"flat"}]}]} \ No newline at end of file diff --git a/cairo/target/dev/madara_contracts_ERC20.contract_class.json b/cairo/target/dev/madara_contracts_ERC20.contract_class.json new file mode 100644 index 000000000..ada5a9114 --- /dev/null +++ b/cairo/target/dev/madara_contracts_ERC20.contract_class.json @@ -0,0 +1 @@ +{"sierra_program":["0x1","0x6","0x0","0x2","0x7","0x0","0x498","0x368","0xa1","0x52616e6765436865636b","0x800000000000000100000000000000000000000000000000","0x436f6e7374","0x800000000000000000000000000000000000000000000002","0x1","0x8","0x2","0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff","0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x7533325f6d756c204f766572666c6f77","0x7533325f616464204f766572666c6f77","0x4172726179","0x800000000000000300000000000000000000000000000001","0x62","0x536e617073686f74","0x800000000000000700000000000000000000000000000001","0x5","0x537472756374","0x800000000000000700000000000000000000000000000002","0x0","0x149ee8c97f9cdd259b09b6ca382e10945af23ee896a644de8c7b57da1779da7","0x6","0x66656c74323532","0x800000000000000700000000000000000000000000000000","0x53746f726167654261736541646472657373","0x7538","0x800000000000000f00000000000000000000000000000001","0x2ee1e2b1b89f8c495f200e4956278a4d47395fe262f27b52e5865c9524c08c3","0x456e756d","0x800000000000000300000000000000000000000000000003","0x101dc0399934cc08fa0d6f6f2daead4e4a38cabeea1c743e1fc28d2d6e58e99","0xb","0xc","0x800000000000000300000000000000000000000000000006","0x7","0x9","0xa","0xd","0x16a4c8d7c05909052238a862d8cc3e7975bf05a07b3a69c6b28951083a6d672","0xf","0x1da860b08c8c086977f4d7b1cde9e72ae6fd06254c518bdbf96a0bcaf812e2","0xe","0x10","0x753634","0x2d","0x1f","0x496e76616c69642076616c7565","0x7533325f737562204f766572666c6f77","0x45524332303a20696e73756666696369656e7420616c6c6f77616e6365","0x800000000000000000000000000000000000000000000003","0x36","0x1a","0x2db340e6c609371026731f47050d3976552c89b4fbb012941663841c59d1af3","0x35","0xffffffffffffffffffffffffffffffff","0x264029018ff7e3c0552db60eb00dd04eddf84c86e9b06640ce3731b70dc0bd7","0x1390fd803c110ac71730ece1decfc34eb1d0088e295d4f1b125dda1e0c5b9ff","0x436f6e747261637441646472657373","0x800000000000000700000000000000000000000000000003","0x2f299fcd816fb55f80a1424db439dd511bc7ad82a66cc659834273084e02cff","0x1d","0x45524332303a206d696e7420746f2030","0x800000000000000300000000000000000000000000000002","0x5b9304f5e1c8e3109707ef96fc2ba4cf5360d21752ceb905d488f0aef67c7","0x20","0x268c07a9e3c71581176f9fcc83f680e8fabbdb72e680dff1b97f0002a42923","0x1baeba72e79e9db2587cf44fedb2f3700b2075a5e8e39a562584862c4b71f62","0x23","0x24","0x22","0x177df56e1be57504091f9fb90f158df540a90c0844dca0f662db2b638016929","0x25","0x27f894093975d7c219019eb13b34537f76f17f53008ed7c10470e65ecf02801","0x2049c4157e50f4e4f9e1aac5f369f82789a0e612b8e0989eba981d4d0900f35","0x27","0x1e","0x924583257a47dd83702b92d1bcf41027fba06c39486295102ef8c82b4f8b94","0x426f78","0x18ef5e2178ac6be59ceafd15e6995810f636807e02c51d309c3f65e37000fc5","0x2a","0x496e76616c696420427974654172726179206c656e677468","0x753332","0x800000000000000300000000000000000000000000000007","0x24a2e6c198919387cc3601a2c9b7453f44da145a5a388719853301f9307a9c2","0x2e","0x427974654172726179","0x33","0x13","0x4e6f6e5a65726f","0x556e696e697469616c697a6564","0x800000000000000200000000000000000000000000000001","0x75313238","0x25e2ca4b84968c2d8b83ef476ca8549410346b00836ce79beaf538155990bb2","0x800000000000000700000000000000000000000000000004","0x535eff1cd1c7c61d730ab111a9dcbd1927e9887d8274895bb25aba3b0d9381","0x20c573050f4f72ab687d1e30ab9e3112f066656a1db232d4e8d586e1bc52772","0x45524332303a20617070726f766520746f2030","0x45524332303a20617070726f76652066726f6d2030","0x45524332303a20696e73756666696369656e742062616c616e6365","0x309c836001bf99c123ce040b36c69bc30d3abbfa86d2c07cd5089e4796f50b6","0x2a3d81bde96d1ac50c073f3efc0fa728d4ddce40ffea87cbd4ff0f901bd5d9c","0x3c","0x37","0x753235365f737562204f766572666c6f77","0x1802098ad3a768b9070752b9c76d78739119b657863faee996237047e2cd718","0x11956ef5427d8b17839ef1ab259882b25c0eabf6d6a15c034942faee6617e37","0x753235365f616464204f766572666c6f77","0x74131f8ccbce54c69d6f110fe2e023877ad5757b22c113da2a3f525c6601fe","0x53746f726555313238202d206e6f6e2075313238","0x350d9416f58c95be8ef9cdc9ecb299df23021512fdc0110a670111a3553ab86","0x436c61737348617368","0x142ea2d2fd5397fde7c79b95d51ea4a79991de55600cb7c1e6148f4a627dbc0","0x47","0x358f4bf88951260abbc2ca3e111e2e32432b563fa321326f0a408b880755514","0x48","0x134d5a72e4a62ce81badab848c88977a6b6c7283cc151d7c06066831b7626bd","0x3d","0x28","0x49","0x436c61737320686173682063616e6e6f74206265207a65726f","0x43616c6c6572206973206e6f7420746865206f776e6572","0x43616c6c657220697320746865207a65726f2061646472657373","0x4661696c656420746f20646573657269616c697a6520706172616d202334","0x4661696c656420746f20646573657269616c697a6520706172616d202335","0x16a0c247f81fa3d7cd8642ffb1989c6f6819daf6f17d770f1defc89207dbbae","0x3959cd7154781670289f969a0d3b5d91f81a1d66ea508a6d80226a898a2ffdf","0x3924f4d2cd1156971e453e38298428be95e2738f3aebdb905a83c4d00976ed4","0x800000000000000f00000000000000000000000000000004","0x33aa90b07faed7274852d61741738f2fc161b89228fbd66736c6497ed3b10e7","0x50","0x51","0x52","0x800000000000000f00000000000000000000000000000003","0x53","0x2602a8539ff38b2fa25b6c7cba79d96078b303b0d33eff6151776d835be1df6","0x54","0x800000000000000300000000000000000000000000000004","0x36775737a2dc48f3b19f9a1f4bc3ab9cb367d1e2e827cef96323826fd39f53f","0x1202a7fa2fddcf8a3022c40822f1c5916c5ca2aa21b537f816965f87593a1f9","0x56","0x57","0x5cddec645db2dabee4263ab528bcd4b2cfb408d05fb3604e4e0fcb33b07d36","0x58","0x1e6b01ba306bb6446b9f29d83d46399ae927a4f5920aef5e81fef007ad4d7af","0x5a","0x4e6577206f776e657220697320746865207a65726f2061646472657373","0x4e6f6e20436f6e747261637441646472657373","0x183a1b309b77fa43aa409ee3681db27df849965d2e5d22fb671795a0d00c912","0x12","0x74584e9f10ffb1a40aa5a3582e203f6758defc4a497d1a2d5a89f274a320e9","0x60","0x62797465733331","0x2cbbb45dca0699384ab13c353365d8adcdb90cc4205f689fc51d138a420afb7","0x64","0x276d9c79d6203e68b2f838afaa450f221ee214cd6b6b8cff7f9ebdb09888b70","0x65","0x53746f7261676541646472657373","0x215b9084795980f341464d98262c636d1534e0fa512db8a5247ef60240b829a","0x53797374656d","0x6b","0x506f736569646f6e","0x6d","0x4661696c656420746f20646573657269616c697a6520706172616d202333","0x3288d594b9a45d15bb2fcb7903f06cdb06b27f0ba88186ec4cfaa98307cb972","0x71","0x15c7a059e462f877a1b13f2b4b177e08fc7e24dd614d8d14744c308e66abe19","0x72","0x3d7c4dfa402af5e7cd1736876b3815e395d68815f783a35ff15405e6cae3f5e","0x75","0x45524332303a207472616e7366657220746f2030","0x45524332303a207472616e736665722066726f6d2030","0x7f","0x80","0x81","0x7c","0x1597b831feeb60c71f259624b79cf66995ea4f7e383403583674ab9c33b9cec","0x7d","0x80000000000000070000000000000000000000000000000e","0x348a62b7a38c0673e61e888d83a3ac1bf334ee7361a8514593d3d9532ed8b39","0x7e","0x3808c701a5d13e100ab11b6c02f91f752ecae7e420d21b56c90ec0a475cc7e5","0x3342418ef16b3e2799b906b1e4e89dbb9b111332dd44f72458ce44f9895b508","0x800000000000000700000000000000000000000000000006","0x7d4d99e9ed8d285b5c61b493cedb63976bc3d9da867933d829f49ce838b5e7","0x7b","0x7a","0x82","0x12867ecd09c884a5cf1f6d9eb0193b4695ce3bb3b2d796a8367d0c371f59cb2","0x29d7d57c04a880978e7b3689f6218e507f3be17588744b58dc17762447ad0e7","0x85","0x4661696c656420746f20646573657269616c697a6520706172616d202332","0x1166fe35572d4e7764dac0caf1fd7fc591901fd01156db2561a07b68ab8dca2","0x141ea21bd03254e41074504de8465806cb179228cd769ab9e55224c660a57c4","0x89","0x2a69c3f2ee27bbe2624c4ffcb3563ad31a1d6caee2eef9aed347284f5f8a34d","0x3c87bf42ed4f01f11883bf54f43d91d2cbbd5fec26d1df9c74c57ae138800a4","0x12ec76808d96ca2583b0dd3fb55396ab8783beaa30b8e3bf084a606e215849e","0x2b22539ea90e179bb2e7ef5f6db1255a5f497b922386e746219ec855ba7ab0c","0x3a4e8ec16e258a799fe707996fd5d21d42b29adc1499a370edf7f809d8c458a","0x506564657273656e","0x2ce4352eafa6073ab4ecf9445ae96214f99c2c33a29c01fcae68ba501d10e2c","0x91","0x268e4078627d9364ab472ed410c0ea6fe44919b24eafd69d665019c5a1c0c88","0x110e2f729c9c2b988559994a3daccd838cf52faf88e18101373e67dd061455a","0x4661696c656420746f20646573657269616c697a6520706172616d202331","0x4f7574206f6620676173","0x16659f09aa8e6abd02792f13ecc2c620fe60c6b4e84dc12ce07a1d52b337837","0x98","0x800000000000000f00000000000000000000000000000002","0xcc5e86243f861d2d64b08c35db21013e773ac5cf10097946fe0011304886d5","0x9a","0x4275696c74696e436f737473","0x9931c641b913035ae674b400b61a51476d506bbe8bba2ff8a6272790aba9e6","0x97","0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473","0x11c6d8087e00642489f92d2821ad6ebd6532ad1a3b6d12833da6d6810391511","0x4761734275696c74696e","0x1bf","0x7265766f6b655f61705f747261636b696e67","0x77697468647261775f676173","0x6272616e63685f616c69676e","0x7374727563745f6465636f6e737472756374","0x656e61626c655f61705f747261636b696e67","0x73746f72655f74656d70","0x61727261795f736e617073686f745f706f705f66726f6e74","0x756e626f78","0x72656e616d65","0x656e756d5f696e6974","0x9f","0x6a756d70","0x7374727563745f636f6e737472756374","0x656e756d5f6d61746368","0x636c6173735f686173685f7472795f66726f6d5f66656c74323532","0x64697361626c655f61705f747261636b696e67","0x64726f70","0x61727261795f6e6577","0x636f6e73745f61735f696d6d656469617465","0x9e","0x61727261795f617070656e64","0x9d","0xa0","0x6765745f6275696c74696e5f636f737473","0x9c","0x77697468647261775f6761735f616c6c","0x736e617073686f745f74616b65","0x66756e6374696f6e5f63616c6c","0x3","0x9b","0x14","0x99","0x96","0x95","0x94","0x93","0x15","0x92","0x647570","0x753132385f746f5f66656c74323532","0x21adb5788e32c84f69a1863d85ef9394b7bf761a0ce1190f826984e5075c371","0x90","0x8f","0x8e","0x8d","0x16","0x8c","0x8b","0x8a","0x88","0x17","0x87","0x86","0x75313238735f66726f6d5f66656c74323532","0x84","0x6765745f657865637574696f6e5f696e666f5f76325f73797363616c6c","0x83","0x636f6e74726163745f616464726573735f746f5f66656c74323532","0x66656c743235325f69735f7a65726f","0x78","0x79","0x77","0x18","0x76","0x74","0x19","0x73","0x70","0x6f","0x616c6c6f635f6c6f63616c","0x66696e616c697a655f6c6f63616c73","0x6a","0x6e","0x6c","0x73746f726167655f626173655f616464726573735f636f6e7374","0x341c1bdfd89f69748aa00b5742b03adbffd79b8e80cab5c50d91cd8c2a79be1","0x69","0x73746f726167655f616464726573735f66726f6d5f62617365","0x67","0x68","0x1b","0x73746f72655f6c6f63616c","0x66","0x63","0x7374727563745f736e617073686f745f6465636f6e737472756374","0x61727261795f6c656e","0x7533325f746f5f66656c74323532","0x1c","0x61","0xb6ce5410fca59d078ee9b2a4371a9d684c530d697c64fbef0ae6d5e8f0ac72","0x5f","0x75385f746f5f66656c74323532","0x2bd557f4ba80dfabefabe45e9b2dd35db1b9a78e96c72bc2b69b655ce47a930","0x5e","0x73746f726167655f726561645f73797363616c6c","0x5d","0x5c","0x5b","0x636f6e74726163745f616464726573735f636f6e7374","0x59","0x55","0x4f","0x4e","0x4d","0x66656c743235325f737562","0x4c","0x636c6173735f686173685f746f5f66656c74323532","0x4b","0x7265706c6163655f636c6173735f73797363616c6c","0x4a","0x656d69745f6576656e745f73797363616c6c","0xad292db4ff05a993c318438c1b6c8a8303266af2da151aa28ccece6726f1f1","0x46","0x45","0x2679d68052ccd03a53755ca9169677965fbd93e489df62f5f40d4f03c24f7a4","0x44","0x706564657273656e","0x43","0x21","0x753132385f6f766572666c6f77696e675f616464","0x42","0x73746f726167655f77726974655f73797363616c6c","0x41","0x40","0x3f","0x753132385f6f766572666c6f77696e675f737562","0x753132385f6571","0x3e","0x3b","0x3a","0x39","0x38","0x7533325f7472795f66726f6d5f66656c74323532","0x32","0x7533325f736166655f6469766d6f64","0x73746f726167655f616464726573735f746f5f66656c74323532","0x31","0x68616465735f7065726d75746174696f6e","0x30","0x2f","0x7533325f6571","0x34","0x2c","0x2b","0x627974657333315f746f5f66656c74323532","0x29","0x26","0x627974657333315f7472795f66726f6d5f66656c74323532","0x7533325f6f766572666c6f77696e675f737562","0x75385f6f766572666c6f77696e675f616464","0x66656c743235325f616464","0x7533325f776964655f6d756c","0x646f776e63617374","0x7533325f6f766572666c6f77696e675f616464","0x11","0x4","0x1a84","0xffffffffffffffff","0xe5","0xa7","0xd8","0xd1","0x17d","0x101","0x106","0x16b","0x167","0x11e","0x158","0x150","0x16f","0x244","0x19a","0x19f","0x232","0x22e","0x1ac","0x1b1","0x21b","0x216","0x1ca","0x205","0x1fd","0x220","0x236","0x379","0x261","0x266","0x367","0x363","0x271","0x276","0x2ab","0x2a6","0x284","0x289","0x29c","0x296","0x2b3","0x2a0","0x2ae","0x351","0x2c9","0x340","0x32e","0x2ee","0x328","0x302","0x320","0x337","0x36b","0xa2","0xa3","0xa4","0xa5","0x498","0x396","0x39b","0x486","0x482","0x3a8","0x3ad","0x46f","0x46a","0x3b8","0x3bd","0x3f2","0x3ed","0x3cb","0x3d0","0x3e3","0x3dd","0x3fa","0x3e7","0x3f5","0x457","0x411","0x445","0x43c","0x42b","0x42f","0x474","0x48a","0x59d","0x4b5","0x4ba","0x58b","0x587","0x4c5","0x4ca","0x4ff","0x4fa","0x4d8","0x4dd","0x4f0","0x4ea","0x507","0x4f4","0x502","0x575","0x51d","0x564","0x552","0x549","0x55b","0x58f","0x642","0x5c9","0x631","0x622","0x61e","0xa6","0xa8","0xa9","0xaa","0xab","0xac","0xad","0xae","0xaf","0x615","0xb0","0xb1","0xb2","0xb3","0x627","0x6ea","0x671","0x6d9","0xb4","0x6ca","0x6c6","0x6bd","0x6cf","0x733","0x711","0x726","0xb5","0xb6","0x794","0x756","0x787","0x780","0x82c","0x7b0","0x7b5","0x81a","0x816","0x7cd","0x807","0x7ff","0x81e","0x94b","0x849","0x84e","0x939","0x935","0x85b","0x860","0x922","0x91d","0x86b","0x870","0x8a5","0x8a0","0x87e","0x883","0x896","0x890","0x8ad","0x89a","0x8a8","0x90a","0x8c4","0x8f8","0x8ef","0x8de","0x8e2","0x927","0x93d","0x9b8","0x96f","0x9ab","0xb7","0xb8","0xb9","0xba","0xbb","0xbc","0x99e","0x994","0xbd","0x9a3","0xa60","0x9d4","0x9d9","0xa4f","0xa4b","0x9f0","0xa3d","0xa06","0xbe","0xa35","0xa2c","0xbf","0xc0","0xa24","0xc1","0xa53","0xac5","0xa83","0xab8","0xaac","0xc2","0xaa6","0xab2","0xb6d","0xae1","0xae6","0xb5c","0xb58","0xafd","0xb4a","0xb13","0xb42","0xb39","0xb31","0xb60","0xbd2","0xb90","0xbc5","0xbb9","0xbb3","0xbbf","0xd4c","0xc3","0xc4","0xc5","0xd42","0xc6","0xc7","0xd30","0xd26","0xd14","0xc00","0xc05","0xc3a","0xc35","0xc13","0xc18","0xc2b","0xc25","0xc42","0xc2f","0xc3d","0xd00","0xc4c","0xc51","0xcea","0xce3","0xc5e","0xc63","0xccc","0xcc4","0xc80","0xcaf","0xc8","0xc9","0xca","0xcb","0xca6","0xcc","0xcd4","0xcd","0xcf1","0xce","0xdc0","0xdb6","0xdac","0xd8e","0xcf","0xd0","0xd2","0xd9e","0xd3","0xd4","0xd5","0xdc5","0xd6","0xd7","0xdde","0xd9","0xda","0xdb","0xdc","0xe07","0xdd","0xde","0xdf","0xe0","0xe1","0xe2","0xe3","0xe4","0xdfe","0xe6","0xe7","0xe8","0xe9","0xea","0xeb","0xec","0xed","0xee","0xe63","0xe4e","0xef","0xf0","0xe47","0xe3a","0xf1","0xf2","0xf3","0xf4","0xe5b","0xe6a","0xf5","0xf6","0xf7","0xf8","0xf9","0xeca","0xeb4","0xead","0xea0","0xec1","0xed1","0xfa","0xfb","0xf36","0xf20","0xf19","0xf0c","0xf2d","0xf3d","0xfe2","0xfc","0xfd","0xfe","0xff","0x100","0xfd5","0xf66","0x102","0x103","0x104","0xf6c","0x105","0xf73","0xf85","0xf7d","0x107","0xfbf","0x108","0x109","0xfaa","0x10a","0xfa0","0x1071","0xfb6","0x10b","0x10c","0x10d","0x10e","0x10f","0x110","0x111","0x112","0x113","0x114","0x115","0x12b5","0x129e","0x1292","0x1280","0x116","0x117","0x1267","0x118","0x101d","0x1023","0x125c","0x102f","0x1035","0x103c","0x104e","0x1046","0x1245","0x1230","0x1226","0x1107","0x10fb","0x108f","0x1095","0x109c","0x10ae","0x10a6","0x10e6","0x10d2","0x119","0x10c9","0x11a","0x11b","0x11c","0x11d","0x11f","0x120","0x1182","0x121","0x122","0x123","0x10dd","0x124","0x125","0x126","0x127","0x128","0x129","0x12a","0x12b","0x12c","0x12d","0x12e","0x12f","0x130","0x131","0x132","0x133","0x134","0x135","0x136","0x137","0x138","0x139","0x13a","0x13b","0x13c","0x13d","0x13e","0x13f","0x140","0x141","0x142","0x143","0x144","0x145","0x120e","0x146","0x147","0x148","0x149","0x14a","0x11f8","0x14b","0x14c","0x14d","0x14e","0x14f","0x151","0x152","0x11ed","0x153","0x154","0x155","0x156","0x157","0x11dc","0x159","0x15a","0x15b","0x15c","0x15d","0x15e","0x15f","0x160","0x161","0x1140","0x162","0x163","0x164","0x165","0x166","0x168","0x1146","0x169","0x16a","0x16c","0x114d","0x16d","0x16e","0x170","0x171","0x172","0x115f","0x173","0x174","0x175","0x1157","0x176","0x177","0x178","0x179","0x17a","0x11c6","0x17b","0x17c","0x17e","0x17f","0x180","0x181","0x182","0x183","0x184","0x185","0x186","0x187","0x188","0x189","0x18a","0x18b","0x18c","0x11b2","0x18d","0x18e","0x18f","0x190","0x191","0x192","0x193","0x194","0x11a9","0x195","0x196","0x197","0x198","0x199","0x19b","0x19c","0x19d","0x19e","0x1a0","0x1a1","0x1a2","0x1a3","0x1a4","0x1a5","0x1a6","0x1a7","0x1a8","0x119e","0x1a9","0x1aa","0x1ab","0x1ad","0x1ae","0x1af","0x1b0","0x1b2","0x1b3","0x1b4","0x11bd","0x1b5","0x1b6","0x1b7","0x1b8","0x1b9","0x1ba","0x1bb","0x1bc","0x1bd","0x1be","0x1c0","0x1c1","0x1c2","0x1c3","0x1c4","0x1209","0x1c5","0x1c6","0x1c7","0x1c8","0x1219","0x1c9","0x1cb","0x1cc","0x1cd","0x1ce","0x1cf","0x121d","0x1d0","0x1d1","0x1d2","0x1d3","0x1d4","0x1d5","0x123c","0x1d6","0x1d7","0x1d8","0x1d9","0x1da","0x1db","0x1dc","0x1dd","0x1de","0x1df","0x1273","0x1e0","0x1e1","0x1e2","0x1e3","0x1e4","0x1e5","0x1e6","0x1e7","0x1e8","0x1e9","0x1ea","0x1eb","0x1ec","0x12b0","0x1ed","0x1ee","0x1ef","0x1f0","0x12c1","0x1f1","0x1f2","0x1f3","0x1f4","0x1f5","0x1f6","0x1f7","0x12c5","0x1f8","0x1f9","0x1fa","0x133f","0x1334","0x12f5","0x132b","0x1309","0x1323","0x1362","0x1379","0x13d0","0x13c7","0x13bc","0x13db","0x1472","0x1461","0x1457","0x1448","0x1432","0x1425","0x143d","0x14aa","0x148b","0x1490","0x149f","0x1511","0x1505","0x14f9","0x14ef","0x1518","0x1528","0x152d","0x1548","0x1542","0x1550","0x159b","0x155b","0x1560","0x1590","0x1568","0x156d","0x1583","0x157e","0x1588","0x1648","0x163e","0x162d","0x1624","0x1616","0x15e4","0x160b","0x1601","0x1637","0x1659","0x1653","0x166a","0x1690","0x167e","0x16ef","0x16da","0x16d3","0x16c6","0x16e7","0x16f6","0x180c","0x17f6","0x17eb","0x17da","0x1742","0x174b","0x17cc","0x17b3","0x175b","0x1760","0x17aa","0x176a","0x1770","0x1777","0x1789","0x1781","0x1796","0x17bf","0x1807","0x1817","0x181b","0x18ab","0x189e","0x1892","0x1882","0x186d","0x1849","0x185f","0x1903","0x18cf","0x18d9","0x18de","0x18f6","0x18f1","0x18fb","0x19ab","0x199f","0x1992","0x1987","0x1978","0x1966","0x195b","0x196d","0x19b6","0x19e3","0x1a70","0x1a12","0x1a17","0x1a61","0x1a54","0x1a31","0x1a47","0x253","0x388","0x4a7","0x5ac","0x654","0x6fc","0x741","0x7a2","0x83b","0x95a","0x9c6","0xa6e","0xad3","0xb7b","0xbe0","0xd5d","0xdcd","0xe11","0xe72","0xeda","0xf46","0x12ce","0x134d","0x13e4","0x147f","0x14b8","0x1520","0x15a4","0x1663","0x169d","0x16fe","0x1824","0x18c0","0x1912","0x19bf","0x1a06","0xde68","0x180a00e018028040060240380600a0100180800e0180280400600800800","0xc81802e0580281502804c0901100a0400780e00a0340600b00e01802804","0xa0220240840282000a07c0a01e03a0180280d0180700a01b0240600d018","0x282800a0700a01e02409c0a01b0240980282500a0900280600a08c0281c","0x380600a0100182e00e0b4028040060601602b00a0a8028290280780e821","0x28320060c40380600a0100180500e0b4028040060c00380600a0100182f","0x380600a0100183700e0d8028040060d40380600a0100183400a0d002833","0x380600a0100183d00a0f40283c0280ec090180740e40380600a01001838","0x281100a1080a01e03a0ac0284100a1000a01e03a0980281c0280fc0903e","0xa01e03a1180284500a0700a01e0241100284302804c0902100a04007820","0x904c00a12c0284a0280ec0e83d00a0f4028490280ec0902b00a12002847","0x380600a0100182000a1400284f0280ec0e80e00a0402702400a1340a013","0xa01e03a0980282500a0900280600a0b40281100a0700a05302406029051","0x285700a0100185600e018028040060500382500a0100182b00a15402854","0xa05e0240d80283600a1740a03b0240602e02d00a16c2d02d00a0402c858","0x28040061840380600a0100180600a1800a0130240cc0283d00a0f40285f","0xa03b03a0cc0283d00a0f4028640281780906300e0180280400618803806","0x286a02804c0902400a1a40a0130241a00380600a0100186700a19802865","0x28040060180286c02804c0900500e0d8028040061ac0380600a01001806","0x287002804c090180de0900286e02804c0900500e094028040061b403806","0x380600a0100187700a1d80287500a1d00a05e03a1cc0287202804c0e871","0x28040061ec0380600a0100187a00e018028040061e40380600a01001878","0x288200a2040a0800241fc0a01b0241f80a01b0241f40a01b0241f003806","0xa0890240ac0288800a21c0a01e03a0800288600a0700a08502421002883","0x284500a0700a01e0240800288c00a22c0a01e03a0b40280600a0440288a","0x28900280780e82000a20c0281c0282140902b00a23c0288e0280780e88d","0x182400a2500a01302424c0380600a0100189200e018028040060ac02891","0x4c02b00a25c028960280780e82000a0840281c0280780909500e09402804","0xa01e03a2680281c0280fc0902100a230028990280780e88c00a04007818","0x285b0b40900289e02804c0901813a0500382d00a0100182b00a2700289b","0x280400628c0380600a010018a200a16c2d0021422800285b0b40084f88c","0xa01e03a2940288200a0700a03b0240800282000a2900a03b03a05003806","0xa01e03a0800288200a0700a0850240140380600a0100182b00a29c028a6","0x2700600a0402c8ab00e018028040062a80380600a0100182b00a2a4028a8","0x90b100a2c00a0130242bc0281001e2b80280d0182b40281009c2b002810","0x283600a2d00280600a0180280600a1140283600a0f40280600a2cc0a0b2","0x28b60281780903d00a2540289500a2d40a05e0241140282d00a0b402845","0x281009c0180283d00a0f4028ba00a2e4028b80282dc0903600a25402806","0x182000a2f8028bd0280ec0e80600a0402702000a0cc028bc0280ec0e8bb","0xa013024018028c002804c0903d00a0f40281c0280ec090bf00e01802804","0x90c200a3140a0130243100380600a0100180600a30c0a013024308028c1","0xa01e03a0cc0281c02804c0900219031c0380600a0100180600a3180a013","0x380600a010018cc00e01802804006018028cb02804c0902b00a328028c9","0xe82000a2100281c0282140904500a0700a0130243380380600a010018cd","0x6a02b00a34c028d20280780e82000a0700a0d10240ac028d000a33c0a01e","0x280600a3600a03b03a35c0380600a0100182b00a358028d50280780e818","0x28e1028014028e002837c2280500a3780a0dd0283700a0db1b40086c820","0x28e0088014028e002801c7280500e3900300500a38c0300500a38803005","0xa0ea0283a47280500a3a0028071ca014038e4040014028e702839872805","0x28e01dc014028ed00c014028ec0e2014028eb17c014028eb088014028eb","0x28e000a01c7800500e3901580500a39c1400500a39c0300500a3bc03005","0x4180500a39c0a0f41e6014028e00283c87800500a3805000500a38078805","0x28e71a6014028eb1f0014028e80b03dc028f6106014028eb106014028f5","0x1080500a3d46800500a3ac7d00500a3a07c8f700a3d83880500a38042005","0x1580500a3800a0071e0014038e41ac014028e708a014028e7042014028eb","0x28e71fa014028ed08a014028eb1f8014028ed040014028eb1f6014028ed","0x8000500a3a07f8f700a3d87f00500a3807f00500a3ac7f00500a3d47f005","0x28eb066014028de06601402901066014028eb066014028f5194014028de","0x8280500a3b48200500a3801e80500a3ac0a1030284081b00500a38c1b005","0x28e7184014028e720c014028de20c014028eb20c014028f520c014028e7","0x8500500a39c8480500a3b4840f700a3d81e80500a3808380500a38083805","0x28e0218014028e7216014028e7214014028de214014028eb214014028f5","0x28e002801c8780500e3908700500a3b4868f700a3d88600500a38085805","0x8880500e3901980500a39c0a11021e014028e800a01c8780500e39087805","0xa112222014028e8028014028e300a01c8880500e3908880500a3800a007","0x28eb174014028eb172014028eb176014028de176014028e2226014028e0","0x8b80500a3ac1080500a3808b00500a3b40a1150284501e80500a40403005","0x28eb234014028e82323dc028f6066014028e0104014028e7230014028ed","0x7880500a38c8200500a38c1400500a3ac1580500a3788d80500a3b454805","0x28eb14e014028de23a014028e82383dc028f6042014028e3140014028e3","0x5100500a4801a0f700a3d88f80500a3b48f00500a3b45280500a3a041005","0x9200500a3ac9180500a3ac9100500a3ac0a1211180140292014001402920","0x28de24e014028eb24e014028f524e014028e724c01c02925144014028e0","0x28f6254014028e005a014028e0252014028ed0284a01200500a38c93805","0x4d00500a3a04e00500a3789680500a3a05000500a4b05100500a4b0958f7","0x28eb1180140292f25c01402901118014028eb118014028f51180140292c","0x28f6046014028e0046014028e70284c40700500a4c00b00500a40416805","0x9700500a3ac1680500a38c0b00500a3ac4b80500a3789980500a3a0990f7","0x9c00500a3d49c00500a39c9b80700a4940a13626a014028ed26801c02925","0x1e8f700a3d89d80500a3b49d00500a3b40a139270014028de270014028eb","0x28e80983dc028f608a014028e002801c0293d122014028eb278014028e8","0x170f700a3d84600500a3804300500a39c4680500a3a04780500a3789f005","0x38e4284014028ed282014028ed280014028ed110014028eb27e014028e8","0x28ed02801c7c00500e3906980500a39c0a1431f0014028e000a01c7c005","0x28071f4014038e428c014028ed108014028eb0285143880500a404a2005","0x3807290014038e402801c3b80500e3903980500a39c0a1471f4014028e0","0x6800500a39c0a1490823dc028f6290014028e0290014028eb290014028f5","0x28eb296014028f5296014028e70285287f00500a3780a0071f4014038e4","0x28e7028534a600500a3b41680500a4041200500a404a580500a378a5805","0x38e4048014028eb29c014028ed200014028e002801c8000500e39065005","0x8580500a3788600500a3780a14f184014028de20e014028de00a01c80005","0xa1522a23dc028f62a0014028e02a0014028eb2a0014028f52a0014028e7","0x28ed00a01c5280500e3905280500a3801b00500a3800a00714a014038e4","0x2807234014038e4048014028e00285506600700a4945280500a3aca9805","0x28de2ac014028eb2ac014028f52ac014028e72aa014028ed234014028e0","0x1b00500a404ab80500a378ab80500a3acab80500a3d4ab80500a39cab005","0xa400500e3900a0070ea014038e40cc014028e72b4014028ed0285640a158","0x28de08c3dc028f62b6014028ed02801c8d00500e3905480500a39c0a007","0x280723a014038e423a014028e002801c8e80500e3905380500a39c54805","0x28de2bc014028eb2bc014028f52bc014028e72ba014028ed2b8014028ed","0xa15f2540140290105a0140292000a01c3a80500e3903380500a39caf005","0xa16400c014029012c6014028ed0285880a1610ae014028e02c0014028ed","0x28f605a0140292c022014028e004a014028e02ca014028ed01c014028ec","0x38e4022014028eb02859c1300500a3a02a80500a378b300500a3a0220f7","0x1280500a3ac9680500a3800a00725a014038e4138014028e700a01c4d005","0x28eb254014028eb00a01c9680500e3900a007134014038e4118014028e7","0x28e002801cb500500e3900700500a3841180500a378b480500a3b4b4005","0x28e301c014028e22d4014028e800a01cb500500e390b500500a3800b005","0x1180500a3ac9980500a3800a007266014038e412e014028e70285ac07005","0xb600500a378b600500a3acb600500a3d4b600500a39c02807266014038e4","0x38e4122014028e700a01ca400500e3900a0070ec014038e4096014028e7","0xb680500a3a0228f700a3d802807278014038e4278014028e002801c9e005","0x2300500e3909f00500a3800280727c014038e408c014028e0090014028de","0xa00727c014038e411e014028e702801c4680500e3902300500a3a002807","0x2080500a378a880500a3a0240f700a3d84300500a3780280711a014038e4","0x9f80500a3800a00727e014038e4110014028e7122014028de05c014028ed","0x3b00500a3a0b68f700a3d83a80500a380a400500a3a00280727e014038e4","0x2901256014028ed07a014028e3096014028de09601402901264014028ed","0x3880500a38c3980500a3788e00500a3b43b80500a3a02600500a37826005","0x700500a3bc0a16e04a0140290121a014028ed232014028ed2a0014028de","0x28e000a01cb300500e3907f80500a3b40a1710285c00a16f210014028ed","0xa0072cc014038e40aa014028e700a01c1300500e3907c80500a3b4b3005","0xa0072da014038e4090014028e702801c2300500e3900a00704c014038e4","0x397312a014028e00285c82c00500a3b4028072da014038e42da014028e0","0xba80500a3a0258f700a3d80880500a3d44600500a3780a17405a0144a805","0xa880500e390a880500a3800a0072a2014038e4082014028e7054014028de","0x3300500a4040380500a3b43a80500a3a07b80500a3b4bb00500a3b402807","0x38e4054014028e70ce014028de0ce0140290100a014028ed0cc014028de","0xa0142f00140a0140285dc028072ea014038e42ea014028e002801cba805","0x28f7028050bc00502801c0a02302c01c888112ec01cbc00700a05003805","0x28160285d80297800a5d802811028050bc0050285d80a00600a5e0028f7","0x297800a09402823028050bc00502801c0a02000a0a81282400e5e003806","0x282400a0940a02a00a5e00282600a0900a02600a5e00282100a0180a021","0xbc00502801c0a0140b00140a0210280ac0297800a0a8028200280a002978","0xbc0050400141281412a014bc0052ea014150142ea014bc0050280980a014","0xa0f900a4742c0052f001c15805050050158052f00144a80504005014005","0x281400e0508680523e4207f8072f001c2c17600e0ac0a0142f00140a007","0x1a0050a04708c8072f001c1400502c0507f8052f00147f8050220500a178","0x2858028050bc0052320144a8140285e0028142ea0500a17800a05003814","0x2814210050958052f00140a0ff028050bc0052100147c8140285e00291c","0x8e01407a014bc0052644ac039190284c80297800a4c80290d0284c802978","0x208052f001417005256050170052f00141e84c00e0d00a04c00a5e002814","0xbc00500e0141e814022014bc005022014990141fe014bc0051fe01408814","0xa17800a0500381408201c088ff2ec014208052f00142080509805003805","0x208142a2014bc0050280b80a0142f00141a00512a0500a17800a050ba814","0xa04808a01c9984408c01cbc0072a20447f8f72a2050a88052f0014a8805","0xa07609601cbc0052da014220142da014bc0050281180a0142f00140a007","0x220052f001422005264050230052f0014230050220500a17800a12c02845","0xb496a0a05b0bb17800a1d80384408c5d82401400e014bc00500e0141e814","0xbc00502801c0a05500a4fc168052f001cb48052da0500a17800a050bb014","0x297800a140029320285980297800a0503b0140285e00282d00a12c0a014","0xb50502ec1400a10800a5e00290800a5b00a16a00a5e00296a00a0f40a050","0xa0070285a0028820ae014bc0072c0014b50142c058cb28f72f001484166","0x297800a0507f8140285e00285700a5a40a0142f00140a175028050bc005","0x286700a5980a0142f0014198050aa0503383300e5e00283600a0b40a036","0x28110285700297800a574029630285740297800a5780296502857802978","0xa16300a5e00296300a0f40a16500a5e00296500a4c80a16c00a5e00296c","0x2932028050bc00502801c0a15c2c6594b617600a5700297800a5700284c","0xa07500a5e00296800a5800a06600a5e00296300a0f40a15b00a5e002965","0x280052640500a17800a420028f9028050bc00502801c0a0141220140a021","0xba8140ea014bc0050aa014b00140cc014bc0052d40141e8142b6014bc005","0x990142d8014bc0052d8014088142b4014bc0050ea014958140285e002814","0xad0052f0014ad005098050330052f00143300507a050ad8052f0014ad805","0xa0ff028050bc0052100147c8140285e00281400e050ad0662b65b0bb005","0x39190285580297800a5580290d0285580297800a0502b8142ae014bc005","0xa80052f0014aa95300e0d00a15300a5e002814238050aa8052f0014ab157","0xbc0050900149901408a014bc00508a0140881429c014bc0052a001495814","0x240452ec014a70052f0014a7005098050038052f00140380507a05024005","0x297800a43402811028050bc0050500144a8140285e00281400e050a7007","0x4a8140285e0028f900a5a00a0142f00140a0070280508c0050280840a14c","0xa0ff028050bc0050285d40a14c00a5e00297600a0440a0142f001414005","0x39190281c40297800a1c40290d0281c40297800a0501b014296014bc005","0xa40052f00143987700e0d00a07700a5e002814238050398052f00143894b","0xbc00502201499014298014bc0052980140881428c014bc00529001495814","0x894c2ec014a30052f0014a3005098050038052f00140380507a05008805","0xa20052f00140a0ff028050bc0051ee014198140285e00281400e050a3007","0xbc005284510039190285080297800a5080290d0285080297800a0502b814","0x41005256050410052f0014a094000e0d00a14000a5e002814238050a0805","0x1e814046014bc0050460149901402c014bc00502c01408814106014bc005","0xa01410601c118162ec014418052f001441805098050038052f001403805","0x281400e0501181600e5e40897600e5e00380502801c028140285e002814","0x300502c050bb0052f0014bb005022050030052f00147b8051ee0500a178","0xa0142f00141200512a0500a17800a05003814040014bd02504801cbc007","0x8681404c014bc0050284200a02100a5e0028141fe0500a17800a09402858","0x140052f00140a11c0280a80297800a09810807232050130052f001413005","0x297600a0440a17500a5e00282b00a4ac0a02b00a5e00282a05001c1a014","0x284c02801c0297800a01c0283d0280440297800a044029320285d802978","0x282000a2540a0142f00140a0070285d4038112ec5d80297500a5e002975","0x89761ee5440a09500a5e00289500a1040a09500a5e00281405c0500a178","0x297800a050338140285e00281400e050840ff00e5ec7c85800e5e003895","0x8e0052b80501a11c00e5e00291900a5740a11900a5e00290d00a5780a10d","0x283d0283e40297800a3e4029320281600297800a16002811028050bc005","0xbc00506801c7c8582ec1980a03400a5e00283400a56c0a00700a5e002807","0xa17800a05003814082014be02e00a5e00384c00a1d40a04c07a4c895976","0x397800a118029570281180297800a0b80295a0285440297800a0507f814","0x240052a60502404500e5e00284500a5540a0142f0014220052ac05022844","0xa60140ec014bc0052da014a70140285e00284b00a5400a04b2da01cbc005","0x397800a114029530281400297800a5b0a8807232050b60052f00143b005","0x282d00a5300a02d00a5e00296900a5380a0142f0014b50052a0050b496a","0xa1632ca01cbc0052cc014168142cc014bc0050aa1400391902815402978","0x2b8052f0014b00052ca050b00052f0014b18052cc0500a17800a59402855","0xbc00526401499014256014bc005256014088142d0014bc0050ae014b1814","0x9912b2ec014b40052f0014b40050980501e8052f00141e80507a05099005","0xbc0052560140881406c014bc005082014958140285e00281400e050b403d","0x1b0050980501e8052f00141e80507a050990052f00149900526405095805","0x297800a0507f8140285e00281400e0501b03d2644acbb00506c014bc005","0x286706601c8c8140ce014bc0050ce014868140ce014bc00502815c0a033","0x292b0285700297800a578ae807068050ae8052f00140a11c02857802978","0xa10800a5e00290800a4c80a0ff00a5e0028ff00a0440a15b00a5e00295c","0xa15b00e4207f97600a56c0297800a56c0284c02801c0297800a01c0283d","0xa0570281980297800a0507f8140285e0028f700a0cc0a0142f00140a007","0xa15a00a5e0028750cc01c8c8140ea014bc0050ea014868140ea014bc005","0x297800a5580292b0285580297800a568ab807068050ab8052f00140a11c","0x280700a0f40a02300a5e00282300a4c80a01600a5e00281600a0440a155","0xbc0050280500a15500e08c0b17600a5540297800a5540284c02801c02978","0xa0142f00140a007028018118072fa058088072f001c0380500e0140a014","0xa01100a5e00281100a0440a0142f00140a1760280900297800a5d8028f7","0x282000a08c0a0142f00140a0070280840297e0400940397800e09002816","0x28250280a00297800a0a8028240280a80297800a0980280602809802978","0xa007028050bf8050280840a17500a5e00282800a0800a02b00a5e002825","0x1080504a0502c0052f00144a8050540504a8052f00140a026028050bc005","0x29801f2014bc0072ea014140142ea014bc0050b001410014056014bc005","0x3814232014c090d21001cbc0071f20440394b028050bc00502801c0a0ff","0xc103423801cbc0070560140b014210014bc005210014088140285e002814","0xa0142f00148e00512a0500a17800a050ba8140285e00281400e05095805","0x84014264014bc0050283fc0a0142f0014868050e20500a17800a0d002858","0x260052f00141e93200e4640a03d00a5e00283d00a4340a03d00a5e002814","0xbc00508201495814082014bc0050980b8038340280b80297800a0508e014","0xb005264050840052f0014840050220500a0052f00140a0050e6050a8805","0x88052a2014bc0052a2014260141ee014bc0051ee0141e81402c014bc005","0x292b00a2540a0142f00140a175028050bc00502801c0a1511ee05884014","0xb1081ee5440a04600a5e00284600a1040a04600a5e00281405c0500a178","0x297800a0503b8140285e00281400e050b684800e60c2284400e5e003846","0xb60052880502816c00e5e00287600a5180a07600a5e00284b00a5200a04b","0x29410285a40297800a5a8028060285a80297800a14002942028050bc005","0xa04400a5e00284400a0440a05500a5e00282d00a5000a02d00a5e002969","0x297800a3dc0283d0280500297800a050028730281140297800a11402932","0x2284402c2100a10d00a5e00290d00a20c0a05500a5e00285500a2080a0f7","0x29842d0014bc0070ae0143a8140ae580b19652cc044bc00521a1547b814","0x338052f0014b40052b4050198052f00140a0ff028050bc00502801c0a036","0xbc0052ba014aa8140285e00295e00a5580a15d2bc01cbc0050ce014ab814","0x294e028050bc0050cc014a80140cc56c0397800a57002953028570ae807","0xab8052f0014ad03300e4640a15a00a5e00287500a5300a07500a5e00295b","0xbc0052aa014a70140285e00295600a5400a1552ac01cbc0052ba014a9814","0x282d0285380297800a540ab807232050a80052f0014a9805298050a9805","0xa07100a5e00294b00a5980a0142f0014a60050aa050a594c00e5e00294e","0x297800a58c028730281dc0297800a1cc029630281cc0297800a1c402965","0x296000a0f40a16500a5e00296500a4c80a16600a5e00296600a0440a163","0x281400e0503b9602ca598b181100a1dc0297800a1dc0284c02858002978","0xb3005022050b18052f0014b18050e6050a40052f00141b0052560500a178","0x260142c0014bc0052c00141e8142ca014bc0052ca014990142cc014bc005","0x2871028050bc00502801c0a1482c0594b3163022014a40052f0014a4005","0xa200521a050a20052f00140a0570285180297800a0507f8140285e00290d","0x1a014282014bc0050284700a14200a5e00294428c01c8c814288014bc005","0x297800a050028730282080297800a5000292b0285000297800a508a0807","0x28f700a0f40a16d00a5e00296d00a4c80a04800a5e00284800a0440a014","0x281400e050410f72da1200a01100a2080297800a2080284c0283dc02978","0xc28050280840a08300a5e00291900a0440a0142f00141580512a0500a178","0xa0142f00141580512a0500a17800a3fc02968028050bc00502801c0a014","0x1b014108014bc0050283fc0a0142f00140a17502820c0297800a04402811","0x440052f00144308400e4640a08600a5e00288600a4340a08600a5e002814","0xbc00511801495814118014bc0051104fc038340284fc0297800a0508e014","0xb005264050418052f0014418050220500a0052f00140a0050e605046805","0x880511a014bc00511a014260141ee014bc0051ee0141e81402c014bc005","0x28141fe0500a17800a5d802833028050bc00502801c0a08d1ee05841814","0x478072320509f0052f00149f00521a0509f0052f00140a05702823c02978","0xa13b00a5e00289127801c1a014278014bc0050284700a09100a5e00293e","0x297800a08c028110280500297800a050028730284e80297800a4ec0292b","0x293a00a1300a0f700a5e0028f700a0f40a00600a5e00280600a4c80a023","0x380700a01c028140285e0028140280509d0f700c08c0a01100a4e802978","0x120052f0014bb0051ee0500a17800a0500381400c08c0398602c04403978","0x128072f001c1200502c050088052f0014088050220500a17800a050bb014","0x1300500c050130052f0014100050460500a17800a05003814042014c3820","0x10014056014bc00504a01412814050014bc00505401412014054014bc005","0x281404c0500a17800a0500381402862002814042050ba8052f001414005","0x28200280ac0297800a084028250281600297800a2540282a02825402978","0xa17800a050038141fe014c48f900a5e00397500a0a00a17500a5e002858","0x2811028050bc00502801c0a11900a6288690800e5e0038f902201ca5814","0xbc00502801c0a12b00a62c1a11c00e5e00382b00a0580a10800a5e002908","0x283d00a0900a03d00a5e00293200a0180a13200a5e00283400a08c0a014","0xa0210281040297800a130028200280b80297800a4700282502813002978","0xbc0052a2014150142a2014bc0050280980a0142f00140a007028050c6005","0x20805050050208052f001423005040050170052f00149580504a05023005","0x240072f001c2210800e52c0a0142f00140a0070281140298d088014bc007","0x1700502c050240052f0014240050220500a17800a05003814096014c716d","0x4a8140285e0028142ea0500a17800a050038140a0014c796c0ec01cbc007","0x2871028050bc0052da014388140285e00296c00a1600a0142f00143b005","0xb480521a050b48052f00140a1080285a80297800a0507f8140285e00290d","0x1a0140aa014bc0050284700a02d00a5e0029692d401c8c8142d2014bc005","0x297800a050028730285940297800a5980292b0285980297800a0b42a807","0x28f700a0f40a01600a5e00281600a4c80a04800a5e00284800a0440a014","0x281400e050b28f702c1200a01100a5940297800a5940284c0283dc02978","0xbc0052c6014208142c6014bc0050280b80a0142f00142800512a0500a178","0xbc00502801c0a0362d001cc80572c001cbc0072c6058240f72a2050b1805","0x338052f001419805110050198052f00140a086028050bc0050285d40a014","0xbc0052ba014468140285e00295e00a2300a15d2bc01cbc0050ce0149f814","0x3300511e050330052f0014ad805282050ad8052f0014ae00500c050ae005","0xa16000a5e00296000a0440a15a00a5e00296d21a01c9f0140ea014bc005","0x297800a3dc0283d0280500297800a0500287302815c0297800a15c02932","0x2b96002c4ec0a15a00a5e00295a00a4f00a07500a5e00287500a2440a0f7","0x299129c014bc0072a00143a8142a054caa9562ae044bc0052b41d47b814","0x388052f0014a70052b4050a58052f00140a0ff028050bc00502801c0a14c","0xbc0050ee014aa8140285e00287300a5580a0770e601cbc0050e2014ab814","0x294e028050bc005288014a80142885180397800a520029530285203b807","0xa00052f0014a094b00e4640a14100a5e00294200a5300a14200a5e002946","0xbc005106014a70140285e00288200a5400a08310401cbc0050ee014a9814","0x282d0282200297800a218a0007232050430052f00144200529805042005","0xa08d00a5e00288c00a5980a0142f00149f8050aa0504613f00e5e002888","0x297800a554028730284f80297800a23c0296302823c0297800a23402965","0x295300a0f40a15600a5e00295600a4c80a15700a5e00295700a0440a155","0x281400e0509f1532ac55caa81100a4f80297800a4f80284c02854c02978","0xab805022050aa8052f0014aa8050e6050488052f0014a60052560500a178","0x260142a6014bc0052a60141e8142ac014bc0052ac014990142ae014bc005","0xa175028050bc00502801c0a0912a6558ab955022014488052f001448805","0xbc0050283fc0a0142f0014868050e20500a17800a5b402871028050bc005","0x9d93c00e4640a13b00a5e00293b00a4340a13b00a5e0028140ae0509e005","0x9581426a014bc0052744e0038340284e00297800a0508e014274014bc005","0xb40052f0014b40050220500a0052f00140a0050e60504b8052f00149a805","0xbc00512e014260141ee014bc0051ee0141e81406c014bc00506c01499014","0xa17800a0b802895028050bc00502801c0a0971ee0d8b40140220144b805","0xa0143240140a0210284cc0297800a12c02811028050bc00521a01438814","0x2871028050bc00505c0144a8140285e00284500a5a00a0142f00140a007","0x28141fe0500a17800a050ba814266014bc005210014088140285e00290d","0x7007232050970052f00149700521a050970052f00140a13a02803802978","0xa12d00a5e00289a13801c1a014138014bc0050284700a09a00a5e00292e","0x297800a4cc028110280500297800a050028730284a40297800a4b40292b","0x292900a1300a0f700a5e0028f700a0f40a01600a5e00281600a4c80a133","0xbc0050560144a8140285e00281400e050948f702c4cc0a01100a4a402978","0xa0142f00140a007028050c98050280840a12a00a5e00291900a0440a014","0xa12a00a5e00281100a0440a0142f00141580512a0500a17800a3fc02968","0x290d0284880297800a0501b01424e014bc0050283fc0a0142f00140a175","0xa12400a5e002814238050500052f00149112700e4640a12200a5e002922","0xbc00502801439814246014bc00514401495814144014bc00514049003834","0x7b80507a0500b0052f00140b005264050950052f0014950050220500a005","0xa00702848c7b81625405008805246014bc005246014260141ee014bc005","0xbc00502815c0a11f00a5e0028141fe0500a17800a5d802833028050bc005","0xa11c0282940297800a4788f8072320508f0052f00148f00521a0508f005","0xa11b00a5e00291d00a4ac0a11d00a5e0028a514e01c1a01414e014bc005","0x297800a0180293202808c0297800a08c028110280500297800a05002873","0x30230280440291b00a5e00291b00a1300a0f700a5e0028f700a0f40a006","0x302300e6500b01100e5e00380700a01c028140285e0028140280508d8f7","0x88140285e0028142ec050120052f0014bb0051ee0500a17800a05003814","0x281400e0501080532a080128072f001c1200502c050088052f001408805","0x15005048050150052f00141300500c050130052f0014100050460500a178","0x108142ea014bc00505001410014056014bc00504a01412814050014bc005","0x289500a0a80a09500a5e00281404c0500a17800a0500381402865802814","0x28280285d40297800a160028200280ac0297800a0840282502816002978","0x397800e3e4088072960500a17800a050038141fe014cb8f900a5e003975","0x28160284200297800a42002811028050bc00502801c0a11900a66086908","0x297800a0d002938028050bc00502801c0a12b00a6641a11c00e5e00382b","0xcd0050280840a04c00a5e00293200a4d40a03d00a5e00291c00a0940a132","0x208052f00141700512e050170052f00140a026028050bc00502801c0a014","0xbc00709801499814098014bc0050820149a81407a014bc00525601412814","0x28060281100297800a54402823028050bc00502801c0a04600a66ca8805","0x240072f001c2290800e0380a04500a5e00284500a4340a04500a5e002844","0xb014090014bc005090014088140285e00281400e050b60760963dcce16d","0xbc0052d40149c0140285e00281400e050b480533a5a8280072f001c1e805","0x2814042050b30052f00141680526a0502a8052f00142800504a05016805","0x297800a594028970285940297800a050130140285e00281400e0500a19e","0x396600a4cc0a16600a5e00296300a4d40a05500a5e00296900a0940a163","0x30142d0014bc0052c0014118140285e00281400e0502b80533e58002978","0x397800e0d82400701c0501b0052f00141b00521a0501b0052f0014b4005","0xad8052f00143396d00e4b80a0142f00140a007028570ae95e1ee68033833","0xbc0050aa014128140ea014bc005066014088140cc014bc0052b60144d014","0xa17800a0500381402868402814042050ab8052f001433005138050ad005","0xa0142f0014b68052a00500a17800a57002950028050bc0052ba014a8014","0x2968028050bc00502801c0a0143440140a0210285580297800a57802811","0xa0260285580297800a12002811028050bc0052da014a80140285e002857","0x128140ea014bc0052ac014948142a6014bc0052aa014968142aa014bc005","0x381402868402814042050ab8052f0014a9805138050ad0052f00142a805","0x258050220500a17800a5b002950028050bc0050ec014a80140285e002814","0xbc00508c014b40140285e00281400e0500a1a300a050108142a0014bc005","0xbc00529c0149681429c014bc0050280980a15000a5e00290800a0440a014","0xa6005138050ad0052f00141e80504a0503a8052f0014a8005252050a6005","0xa0142f00140a0070281c4029a4296014bc0072ae014950142ae014bc005","0xbc0050285d40a0142f00140a007028520029a50ee1cc0397800e56802816","0xa17800a52c02956028050bc0050ee0142c0140285e00287300a2540a014","0xa14400a5e002814210050a30052f00140a0ff028050bc00521a01438814","0x297800a0508e014284014bc005288518039190285100297800a5100290d","0xa0050e6050410052f0014a0005256050a00052f0014a114100e0d00a141","0x1e81402c014bc00502c014990140ea014bc0050ea01408814028014bc005","0xa0821ee0583a814022014410052f0014410050980507b8052f00147b805","0x284102820c0297800a050170140285e00294800a2540a0142f00140a007","0x381427e220039a610c2100397800e20c0b0751ee5440a08300a5e002883","0x4688c1ee5e0038f710c01c93814108014bc005108014088140285e002814","0x5001411e014bc00511e014910140285e00281400e0509e09127c3dcd388f","0x9d0051440509989726a4e09d0112f00149d8052480509d8052f001447805","0x293300a47c0a0142f00144b8050e20500a17800a4e002923028050bc005","0x28a50280389a8072f00149a80523c0509a8052f00149a8051060500a178","0xa08d00a5e00288d00a0f40a08c00a5e00288c00a4c80a12e00a5e00280e","0xa0142f00140a175028050bc00502801c0a09a00a6a00a17800e4b8028a7","0x7f8140285e00293500a1c40a0142f0014868050e20500a17800a52c02956","0x8c81425a014bc00525a0148681425a014bc0050284740a09c00a5e002814","0x297800a210028110284a80297800a050028730284a40297800a4b44e007","0x292900a46c0a0a000a5e00288d00a0f40a12200a5e00288c00a4c80a127","0xa17800a268028a9028050bc00502801c0a0143520140a02102849002978","0x392300a29c0a12300a5e0028a200a2940a0a221a01cbc00521a0148f014","0x294b00a5580a0142f00140a175028050bc00502801c0a11f00a6a80a178","0x297800a0507f8140285e00293500a1c40a0142f0014868050e20500a178","0x28a523c01c8c81414a014bc00514a0148681414a014bc0050284680a11e","0x293202849c0297800a210028110284a80297800a0500287302829c02978","0xa12400a5e0028a700a46c0a0a000a5e00288d00a0f40a12200a5e00288c","0x291f00a2a40a0142f00140a175028050bc00502801c0a0143520140a021","0x288c00a4c80a08400a5e00288400a0440a11d00a5e0028142300500a178","0x28830282340297800a2340283d0280500297800a0500287302823002978","0xa14b00a5e00294b00a4580a10d00a5e00290d00a20c0a13500a5e002935","0x8b0051740508b1182342a48d8112f0014a590d26a4744681411821003117","0x7f8140285e00291700a2e40a0142f00140a0070282e8029ab22e014bc007","0x8c81415e014bc00515e0148681415e014bc0050282bc0a0b900a5e002814","0xbc0051680142a8141582d00397800a2c40282d0282c40297800a2bc5c807","0x28ae00a58c0a0ae00a5e0028ad00a5940a0ad00a5e0028ac00a5980a014","0x293202846c0297800a46c028110284680297800a468028730282ec02978","0x28bb00a5e0028bb00a1300a11800a5e00291800a0f40a0a900a5e0028a9","0xa11122601cbc005174014588140285e00281400e0505d91815246c8d011","0x938052f00148d805022050950052f00148d0050e60500a17800a44c028b4","0xbc0052220148d814140014bc0052300141e814244014bc00515201499014","0x9100515a050878052f0014938052520505f0052f00149500515805092005","0x10814184014bc0052480145d814218014bc0051400145701421c014bc005","0xbc005296014ab0140285e0028142ea0500a17800a050038140286b002814","0xbc0051080140881417c014bc005028014398140285e00290d00a1c40a014","0x9e005236050860052f00144880507a050870052f00149f00526405087805","0x95814214014bc00518442c0383402842c0297800a0508e014184014bc005","0x878052f0014878050220505f0052f00145f0050e6050848052f001485005","0xbc00521201426014218014bc0052180141e81421c014bc00521c01499014","0xa0142f00140a175028050bc00502801c0a109218438878be02201484805","0x2b81420e014bc0050283fc0a0142f0014868050e20500a17800a52c02956","0x828052f00148310700e4640a10600a5e00290600a4340a10600a5e002814","0xbc00519401495814194014bc00520a410038340284100297800a0508e014","0x9f805264050440052f0014440050220500a0052f00140a0050e605080005","0x8805200014bc005200014260141ee014bc0051ee0141e81427e014bc005","0x287100a5a00a0142f00140a175028050bc00502801c0a1001ee4fc44014","0x297800a0507f8140285e00290d00a1c40a0142f0014ad00512a0500a178","0x28fd1fc01c8c8141fa014bc0051fa014868141fa014bc0050284e80a0fe","0x292b0283580297800a3f07d8070680507d8052f00140a11c0283f002978","0xa07500a5e00287500a0440a01400a5e00281400a1cc0a0d000a5e0028d6","0x297800a3400284c0283dc0297800a3dc0283d0280580297800a05802932","0xa0142f00141580512a0500a17800a050038141a03dc0b075028044028d0","0x2968028050bc00502801c0a01435a0140a0210283e80297800a46402811","0xa1750283e80297800a04402811028050bc0050560144a8140285e0028ff","0x28f800a4340a0f800a5e00281406c050698052f00140a0ff028050bc005","0x38340283c00297800a0508e0141e6014bc0051f034c039190283e002978","0xa0052f00140a0050e6050728052f001477005256050770052f0014798f0","0xbc0051ee0141e81402c014bc00502c014990141f4014bc0051f401408814","0xbc00502801c0a0e51ee0587d014022014728052f0014728050980507b805","0x52f00140a0570283c40297800a0507f8140285e00297600a0cc0a014","0xbc0050284700a1ae00a5e0028001e201c8c814000014bc00500001486814","0x28730286c40297800a6c00292b0286c00297800a6b8d7807068050d7805","0xa00600a5e00280600a4c80a02300a5e00282300a0440a01400a5e002814","0xd88f700c08c0a01100a6c40297800a6c40284c0283dc0297800a3dc0283d","0x381400c08c039b202c0440397800e01c0280700a0500a17800a0500a014","0x88050220500a17800a050bb014048014bc0052ec0147b8140285e002814","0xa17800a05003814042014d982004a01cbc0070480140b014022014bc005","0xbc00505401412014054014bc00504c0140301404c014bc00504001411814","0x2814042050ba8052f001414005040050158052f00141280504a05014005","0x297800a2540282a0282540297800a050130140285e00281400e0500a1b4","0x397500a0a00a17500a5e00285800a0800a02b00a5e00282100a0940a058","0x8690800e5e0038f902201ca58140285e00281400e0507f80536a3e402978","0x382b00a0580a10800a5e00290800a0440a0142f00140a007028464029b6","0xa13200a5e00283400a08c0a0142f00140a0070284ac029b706847003978","0x297800a470028250281300297800a0f4028240280f40297800a4c802806","0xa0142f00140a007028050dc0050280840a04100a5e00284c00a0800a02e","0x170052f00149580504a050230052f0014a8805054050a88052f00140a026","0xa007028114029b9088014bc00708201414014082014bc00508c01410014","0xa17800a05003814096014dd16d09001cbc0070884200394b028050bc005","0x38140a0014dd96c0ec01cbc00705c0140b014090014bc00509001408814","0x9a8142d2014bc0050ec014128142d4014bc0052d80149c0140285e002814","0x281404c0500a17800a050038140286f002814042050168052f0014b5005","0x29350285a40297800a140028250285980297800a1540289702815402978","0xa17800a050038142c6014de96500a5e00382d00a4cc0a02d00a5e002966","0xbc0050ae014868140ae014bc0052c0014030142c0014bc0052ca01411814","0xbc00502801c0a15e0ce0cc7b9be06c5a00397800e15c2400701c0502b805","0xa15b00a6fcae15d00e5e00396900a0580a16800a5e00296800a0440a014","0xa07500a5e00295d00a0940a06600a5e00295c00a4e00a0142f00140a007","0xa026028050bc00502801c0a0143800140a0210285680297800a19802935","0x9a8140ea014bc0052b6014128142ac014bc0052ae0144b8142ae014bc005","0xbc00502801c0a15300a704aa8052f001cad005266050ad0052f0014ab005","0x294e00a4340a14e00a5e00295000a0180a15000a5e00295500a08c0a014","0x281400e0503b8730e23dce114b29801cbc00729c5a00380e02853802978","0x28110285180297800a5200289a0285200297800a52c1b00725c0500a178","0xa14100a5e00294600a2700a14200a5e00287500a0940a14400a5e00294c","0x3b8052a00500a17800a1cc02950028050bc00502801c0a0143860140a021","0x2814042050a00052f0014388050220500a17800a0d802950028050bc005","0xa17800a0d802950028050bc0052a6014b40140285e00281400e0500a1c4","0x297800a2080292d0282080297800a05013014280014bc0052d001408814","0x288300a2700a14200a5e00287500a0940a14400a5e00294000a4a40a083","0xa17800a19c02950028050bc00502801c0a0143860140a02102850402978","0xa01438a0140a0210282100297800a0cc02811028050bc0052bc014a8014","0x13014108014bc005090014088140285e00296300a5a00a0142f00140a007","0xa14400a5e00288400a4a40a08800a5e00288600a4b40a08600a5e002814","0x297800e5040292a0285040297800a2200289c0285080297800a5a402825","0x9f00538e23c468072f001ca100502c0500a17800a05003814118014e313f","0x2858028050bc00511a0144a8140285e0028142ea0500a17800a05003814","0x868050e20500a17800a5b402871028050bc00527e014ab0140285e00288f","0x293c00a4340a13c00a5e002814210050488052f00140a0ff028050bc005","0x38340284e80297800a0508e014276014bc005278244039190284f002978","0xa0052f00140a0050e60509a8052f00149c0052560509c0052f00149d93a","0xbc0051ee0141e81402c014bc00502c01499014288014bc00528801408814","0xbc00502801c0a1351ee058a20140220149a8052f00149a8050980507b805","0x297800a25c0284102825c0297800a050170140285e00293e00a2540a014","0xa17800a050038141344b8039c801c4cc0397800e25c0b1441ee5440a097","0x297800a038029320284cc0297800a4cc028110282700297800a0508c014","0x290d00a20c0a0f700a5e0028f700a0f40a01400a5e00281400a1cc0a00e","0x31130284fc0297800a4fc029160285b40297800a5b40288302843402978","0xbc0072440148881424449c9512925a044bc00527e5b48689c1ee05007133","0x5000517c050510052f00140a0ff028050bc00502801c0a12400a72450005","0x29ca23c014bc00723e014870140285e00292300a43c0a11f24601cbc005","0xa0a700a5e0028142180500a17800a47802968028050bc00502801c0a0a5","0x2968028050bc00502801c0a0143960140a0210284740297800a29c0290d","0xa1750284740297800a46c0290d02846c0297800a050578140285e0028a5","0xa11823401cbc00515201416814152014bc00523a28803919028050bc005","0x8b8052f00148b0052ca0508b0052f00148c0052cc0500a17800a46802855","0xbc00525a01408814254014bc00525401439814174014bc00522e014b1814","0x5d005098050938052f00149380507a050948052f00149480526405096805","0xbc0050285d40a0142f00140a0070282e89392925a4a808805174014bc005","0x292d00a0440a12a00a5e00292a00a1cc0a0b900a5e00292400a4ac0a014","0x284c02849c0297800a49c0283d0284a40297800a4a4029320284b402978","0x28142ea0500a17800a0500381417249c9492d254044028b900a5e0028b9","0xbc00521a014388140285e00296d00a1c40a0142f00149f8052ac0500a178","0x297800a2c40290d0282c40297800a0502b81415e014bc0050283fc0a014","0x5a0ac00e0d00a0ac00a5e0028142380505a0052f0014588af00e4640a0b1","0x8814028014bc0050280143981415c014bc00515a0149581415a014bc005","0x7b8052f00147b80507a0504d0052f00144d005264050970052f001497005","0xa0142f00140a0070282b87b89a25c0500880515c014bc00515c01426014","0x2871028050bc0052840144a8140285e00288c00a5a00a0142f00140a175","0x28141840505d8052f00140a0ff028050bc00521a014388140285e00296d","0x8e014222014bc0052262ec0391902844c0297800a44c0290d02844c02978","0x870052f001487805256050878052f0014888be00e0d00a0be00a5e002814","0xbc00502c01499014288014bc00528801408814028014bc00502801439814","0xa2014022014870052f0014870050980507b8052f00147b80507a0500b005","0xbc00521a014388140285e00282e00a2540a0142f00140a0070284387b816","0xa0142f00140a007028050e60050280840a10c00a5e00284b00a0440a014","0x88140285e00290d00a1c40a0142f00141700512a0500a17800a11402968","0xa13a0283080297800a0507f8140285e0028142ea050860052f001484005","0xa10a00a5e00290b18401c8c814216014bc00521601486814216014bc005","0x297800a41c0292b02841c0297800a42884807068050848052f00140a11c","0x281600a4c80a10c00a5e00290c00a0440a01400a5e00281400a1cc0a106","0xa01100a4180297800a4180284c0283dc0297800a3dc0283d02805802978","0x291900a0440a0142f00141580512a0500a17800a0500381420c3dc0b10c","0xa17800a3fc02968028050bc00502801c0a01439a0140a02102841402978","0xa0142f00140a1750284140297800a04402811028050bc0050560144a814","0xa0ca00a5e0028ca00a4340a0ca00a5e00281406c050820052f00140a0ff","0xbc0052003f8038340283f80297800a0508e014200014bc00519441003919","0x828050220500a0052f00140a0050e60507e0052f00147e8052560507e805","0x260141ee014bc0051ee0141e81402c014bc00502c0149901420a014bc005","0x2833028050bc00502801c0a0fc1ee058828140220147e0052f00147e005","0x6b00521a0506b0052f00140a0570283ec0297800a0507f8140285e002976","0x1a0141f4014bc0050284700a0d000a5e0028d61f601c8c8141ac014bc005","0x297800a050028730283e00297800a34c0292b02834c0297800a3407d007","0x28f700a0f40a00600a5e00280600a4c80a02300a5e00282300a0440a014","0x28140280507c0f700c08c0a01100a3e00297800a3e00284c0283dc02978","0xa17800a0500381400c08c039ce02c0440397800e01c0280700a0500a178","0x88052f0014088050220500a17800a050bb014048014bc0052ec0147b814","0x100050460500a17800a05003814042014e782004a01cbc0070480140b014","0x12814050014bc00505401412014054014bc00504c0140301404c014bc005","0x381402874002814042050ba8052f001414005040050158052f001412805","0x28250281600297800a2540282a0282540297800a050130140285e002814","0xe88f900a5e00397500a0a00a17500a5e00285800a0800a02b00a5e002821","0xa11900a7488690800e5e0038f902201ca58140285e00281400e0507f805","0x1a11c00e5e00382b00a0580a10800a5e00290800a0440a0142f00140a007","0x291c00a0940a13200a5e00283400a4e00a0142f00140a0070284ac029d3","0xbc00502801c0a0143a80140a0210281300297800a4c8029350280f402978","0xbc00525601412814082014bc00505c0144b81405c014bc0050280980a014","0xa04600a754a88052f001c26005266050260052f00142080526a0501e805","0xa04500a5e00284400a0180a04400a5e00295100a08c0a0142f00140a007","0xb60760963dceb16d09001cbc00708a4200380e0281140297800a1140290d","0x280072f001c1e80502c050240052f0014240050220500a17800a05003814","0x2800504a050168052f0014b50052700500a17800a050038142d2014eb96a","0x281400e0500a1d800a050108142cc014bc00505a0149a8140aa014bc005","0x296900a0940a16300a5e00296500a25c0a16500a5e00281404c0500a178","0x2b8053b25800297800e598029330285980297800a58c0293502815402978","0x1b0052f0014b400500c050b40052f0014b00050460500a17800a05003814","0xae95e1ee7683383300e5e00383609001c0701406c014bc00506c01486814","0xbc0052b60144d0142b6014bc0050ce5b40392e028050bc00502801c0a15c","0x33005138050ad0052f00142a80504a0503a8052f00141980502205033005","0xbc0052ba014a80140285e00281400e0500a1db00a050108142ae014bc005","0x297800a57802811028050bc0052da014a80140285e00295c00a5400a014","0xa80140285e00285700a5a00a0142f00140a007028050ee0050280840a156","0x968142aa014bc0050280980a15600a5e00284800a0440a0142f0014b6805","0xad0052f00142a80504a0503a8052f0014ab005252050a98052f0014aa805","0xa80140285e00281400e0500a1db00a050108142ae014bc0052a60144e014","0x108142a0014bc005096014088140285e00296c00a5400a0142f00143b005","0x290800a0440a0142f0014230052d00500a17800a0500381402877402814","0xa8005252050a60052f0014a700525a050a70052f00140a02602854002978","0x950142ae014bc0052980144e0142b4014bc00507a014128140ea014bc005","0x397800e56802816028050bc00502801c0a07100a778a58052f001cab805","0x287300a2540a0142f00140a175028050bc00502801c0a14800a77c3b873","0xbc00521a014388140285e00294b00a5580a0142f00143b8050b00500a178","0x297800a5100290d0285100297800a0508401428c014bc0050283fc0a014","0xa114100e0d00a14100a5e002814238050a10052f0014a214600e4640a144","0x8814028014bc00502801439814104014bc00528001495814280014bc005","0x7b8052f00147b80507a0500b0052f00140b0052640503a8052f00143a805","0xa0142f00140a0070282087b8160ea05008805104014bc00510401426014","0xa08300a5e00288300a1040a08300a5e00281405c0500a17800a52002895","0x88140285e00281400e0509f88800e7804308400e5e00388302c1d47b951","0x9e09127c3dcf088f11a2307b97800e3dc4300724e050420052f001442005","0x5001411e014bc00511e014910140285e0028142ea0500a17800a05003814","0x9d0051440509989726a4e09d0112f00149d8052480509d8052f001447805","0x293300a47c0a0142f00144b8050e20500a17800a4e002923028050bc005","0x288c00a4c80a08400a5e00288400a0440a00e00a5e0028142300500a178","0x28830282340297800a2340283d0280500297800a0500287302823002978","0xa14b00a5e00294b00a4580a10d00a5e00290d00a20c0a13500a5e002935","0x948051740509492d138268970112f0014a590d26a038468141182100310b","0x7f8140285e00292a00a2e40a0142f00140a00702849c029e2254014bc007","0x8c814140014bc00514001486814140014bc0050282bc0a12200a5e002814","0xbc0051440142a8142462880397800a4900282d0284900297800a28091007","0x291e00a58c0a11e00a5e00291f00a5940a11f00a5e00292300a5980a014","0x29320284b80297800a4b8028110282700297800a2700287302829402978","0x28a500a5e0028a500a1300a12d00a5e00292d00a0f40a09a00a5e00289a","0xa11d14e01cbc00524e014588140285e00281400e0505292d1344b84e011","0x548052f0014970050220508d8052f00144e0050e60500a17800a29c028b4","0xbc00523a0148d814230014bc00525a0141e814234014bc00513401499014","0xab0140285e0028142ea0500a17800a0500381402878c028140420508b005","0x8814236014bc005028014398140285e00290d00a1c40a0142f0014a5805","0x8c0052f00144880507a0508d0052f00149f005264050548052f001442005","0xbc00522c45c0383402845c0297800a0508e01422c014bc0052780148d814","0x548050220508d8052f00148d8050e60505c8052f00145d0052560505d005","0x26014230014bc0052300141e814234014bc00523401499014152014bc005","0xa175028050bc00502801c0a0b92304685491b0220145c8052f00145c805","0xbc0050283fc0a0142f0014868050e20500a17800a52c02956028050bc005","0x588af00e4640a0b100a5e0028b100a4340a0b100a5e0028140ae05057805","0x9581415a014bc0051682b0038340282b00297800a0508e014168014bc005","0x440052f0014440050220500a0052f00140a0050e6050570052f001456805","0xbc00515c014260141ee014bc0051ee0141e81427e014bc00527e01499014","0xa0142f00140a175028050bc00502801c0a0ae1ee4fc4401402201457005","0x7f8140285e00290d00a1c40a0142f0014ad00512a0500a17800a1c402968","0x8c814226014bc00522601486814226014bc0050284e80a0bb00a5e002814","0x297800a4445f0070680505f0052f00140a11c0284440297800a44c5d807","0x287500a0440a01400a5e00281400a1cc0a10e00a5e00290f00a4ac0a10f","0x284c0283dc0297800a3dc0283d0280580297800a058029320281d402978","0x1580512a0500a17800a0500381421c3dc0b0750280440290e00a5e00290e","0xbc00502801c0a0143c80140a0210284300297800a46402811028050bc005","0x297800a04402811028050bc0050560144a8140285e0028ff00a5a00a014","0xa10b00a5e00281406c050610052f00140a0ff028050bc0050285d40a10c","0x297800a0508e014214014bc0052163080391902842c0297800a42c0290d","0xa0050e6050830052f001483805256050838052f00148510900e0d00a109","0x1e81402c014bc00502c01499014218014bc00521801408814028014bc005","0xa1061ee05886014022014830052f0014830050980507b8052f00147b805","0xa0570284140297800a0507f8140285e00297600a0cc0a0142f00140a007","0xa0ca00a5e00290420a01c8c814208014bc00520801486814208014bc005","0x297800a3f80292b0283f80297800a32880007068050800052f00140a11c","0x280600a4c80a02300a5e00282300a0440a01400a5e00281400a1cc0a0fd","0xa01100a3f40297800a3f40284c0283dc0297800a3dc0283d02801802978","0x281420e050030052f00140a1090280580297800a050850141fa3dc03023","0xbc00700e05003805028050bc0050280500a0142f00140a10602809402978","0xa02800a5e00297600a3dc0a0142f00140a0070280a8130073ca08410007","0xa007028254029e62ea0ac0397800e0a0028160280800297800a08002811","0x282500a4140a0142f0014ba8050b00500a17800a0ac02895028050bc005","0x297800a0507f8140285e00280600a3280a0142f00140b0052080500a178","0x28f90b001c8c8141f2014bc0051f2014868141f2014bc0050284200a058","0x292b0284340297800a3fc84007068050840052f00140a11c0283fc02978","0xa00500a5e00280500a4000a02000a5e00282000a0440a11900a5e00290d","0x297800a4640284c0283dc0297800a3dc0283d0280840297800a08402932","0xa0142f00144a80512a0500a17800a050038142323dc1080504004402919","0xbc007238084100f72a20508e0052f00148e0050820508e0052f00140a02e","0x7e814098014bc0050283f80a0142f00140a0070280f4990073ce4ac1a007","0xa17800a104028fb028544208072f0014170051f8050170052f001426005","0xbc0050880147d014088014bc00508c0146801408c014bc0052a20146b014","0x292b00a4c80a03400a5e00283400a0440a04800a5e0028141a605022805","0x28f80283dc0297800a3dc0283d0280140297800a014029000284ac02978","0x228481ee0149583402c3c00a04500a5e00284500a3cc0a04800a5e002848","0x297800a0440b0071dc0500a17800a050bb0140ec08c0884b2da044bc005","0xa05000a7a0b60052f001c3b0051e2050118052f00141180600e3940a011","0xf482400a5e00396a00a6b80a16a00a5e00296c00a0000a0142f00140a007","0xa02d00a5e0028141fe0500a17800a050ba8140285e00281400e050b4805","0x285500a6c40a1660aa01cbc005048014d8014048014bc005048094039af","0xa0572c058c7b97800a5940297a028594b30072f0014b30053d40500a178","0xb416300e5e00296300a7b00a0142f00142b8053d60500a17800a5800291f","0xbc00506601486814066014bc00506c014f701406c014bc0052d0014f6814","0x28110285780297800a58c029ef02819c0297800a0cc1680723205019805","0xa15e00a5e00295e00a7c00a04b00a5e00284b00a4c80a16d00a5e00296d","0xf90142b6570ae8f72f00143395e0965b4bb1f102819c0297800a19c0291b","0x397800a198029f4028050bc00502801c0a07500a7cc330052f001cad805","0xab0052f4050ab16600e5e00296600a7a80a0142f0014ab8052d0050ab95a","0x30140285e00295000a7ac0a0142f0014aa8053ea050a81532aa3dcbc005","0x7b97800a5980297a0285300297800a538ad007232050a70052f0014a9805","0x287300a7d80a0142f00143880523e0500a17800a52c029f50281cc3894b","0x1681428c014bc005290530039190285200297800a1dc029ee0281dc02978","0xa08052f0014a10052cc0500a17800a51002855028508a20072f0014a3005","0xbc0052ba01408814104014bc005280014b1814280014bc005282014b2814","0x1180507a050ae0052f0014ae005264050088052f001408805200050ae805","0xa0070282081195c02257408805104014bc00510401426014046014bc005","0xae805022050418052f00143a8052560500a17800a598029f7028050bc005","0x1e8142b8014bc0052b801499014022014bc005022014800142ba014bc005","0xa0830465700895d022014418052f001441805098050118052f001411805","0x10814108014bc0052d20148d8140285e00282500a4140a0142f00140a007","0x285000a2c40a0142f00141280520a0500a17800a050038140287e002814","0xa1750282100297800a2200291b028050bc00510c0145a01411021803978","0x292b0282300297800a2109f8070680509f8052f00140a11c028050bc005","0xa01100a5e00281100a4000a16d00a5e00296d00a0440a08d00a5e00288c","0x297800a2340284c02808c0297800a08c0283d02812c0297800a12c02932","0xa0142f00141280520a0500a17800a0500381411a08c258112da0440288d","0x2b81411e014bc0050283fc0a0142f0014030051940500a17800a05802904","0x488052f00149f08f00e4640a13e00a5e00293e00a4340a13e00a5e002814","0xbc00527601495814276014bc0051224f0038340284f00297800a0508e014","0x1e805264050028052f001402805200050990052f0014990050220509d005","0x8805274014bc005274014260141ee014bc0051ee0141e81407a014bc005","0x30051940500a17800a5d802833028050bc00502801c0a13a1ee0f402932","0xbc0050283fc0a0142f00140b0052080500a17800a09402905028050bc005","0x9a93800e4640a13500a5e00293500a4340a13500a5e0028140ae0509c005","0x9581401c014bc00512e4cc038340284cc0297800a0508e01412e014bc005","0x28052f001402805200050130052f001413005022050970052f001407005","0xbc00525c014260141ee014bc0051ee0141e814054014bc00505401499014","0x297800a0508481402c014bc0050284280a12e1ee0a80282602201497005","0x28140285e0028140280500a17800a0508301404a014bc00502841c0a006","0xbb0051ee0500a17800a05003814054098039f90420800397800e01c0a007","0xfd17505601cbc0070500140b014040014bc00504001408814050014bc005","0xa17800a5d402858028050bc0050560144a8140285e00281400e0504a805","0xa0142f0014030051940500a17800a05802904028050bc00504a01482814","0xa0f900a5e0028f900a4340a0f900a5e0028142100502c0052f00140a0ff","0xbc0051fe420038340284200297800a0508e0141fe014bc0051f216003919","0x2805200050100052f0014100050220508c8052f00148680525605086805","0x260141ee014bc0051ee0141e814042014bc0050420149901400a014bc005","0x2895028050bc00502801c0a1191ee084028200220148c8052f00148c805","0x7b9510284700297800a470028410284700297800a050170140285e002895","0x28143f80500a17800a0500381407a4c8039fb2560d00397800e47010820","0x7d8142a21040397800a0b8028fc0280b80297800a130028fd02813002978","0xa04400a5e00284600a3400a04600a5e00295100a3580a0142f001420805","0x1a0052f00141a005022050240052f00140a0d30281140297800a110028fa","0xbc0051ee0141e81400a014bc00500a01480014256014bc00525601499014","0x1a0161e0050228052f0014228051e6050240052f0014240051f00507b805","0x38ee028050bc0050285d80a0760460442596d0225e0028450903dc0292b","0x297800e1d8028f102808c0297800a08c030071ca050088052f001408816","0xb500535c050b50052f0014b60050000500a17800a050038140a0014fe96c","0xa0ff028050bc0050285d40a0142f00140a0070285a4029fe048014bc007","0xb305500e5e00282400a6c00a02400a5e00282404a01cd781405a014bc005","0xbc0052ca014bd0142ca5980397800a598029ea028050bc0050aa014d8814","0xb18053d80500a17800a15c029eb028050bc0052c00148f8140ae580b18f7","0xa03300a5e00283600a7b80a03600a5e00296800a7b40a1682c601cbc005","0xbc0052c6014f78140ce014bc0050660b4039190280cc0297800a0cc0290d","0xaf0053e0050258052f001425805264050b68052f0014b6805022050af005","0x7b97800a19caf04b2da5d8f88140ce014bc0050ce0148d8142bc014bc005","0xfa0140285e00281400e0503a8053fe1980297800e56c029f202856cae15d","0xb30072f0014b30053d40500a17800a55c0296802855cad0072f001433005","0xa80053d60500a17800a554029f5028540a99551ee5e00295600a5e80a156","0xbd014298014bc00529c568039190285380297800a54c02806028050bc005","0xa17800a1c40291f028050bc005296014fa8140e61c4a58f72f0014b3005","0x294829801c8c814290014bc0050ee014f70140ee014bc0050e6014fb014","0x2966028050bc0052880142a8142845100397800a5180282d02851802978","0xa08200a5e00294000a58c0a14000a5e00294100a5940a14100a5e002942","0x297800a570029320280440297800a044029000285740297800a57402811","0xae0112ba0440288200a5e00288200a1300a02300a5e00282300a0f40a15c","0x297800a1d40292b028050bc0052cc014fb8140285e00281400e05041023","0x295c00a4c80a01100a5e00281100a4000a15d00a5e00295d00a0440a083","0xae81100a20c0297800a20c0284c02808c0297800a08c0283d02857002978","0x296900a46c0a0142f00141280520a0500a17800a0500381410608cae011","0xa17800a09402905028050bc00502801c0a0144000140a02102821002978","0xbc0051100148d8140285e00288600a2d00a08810c01cbc0050a001458814","0xbc0051084fc038340284fc0297800a0508e0140285e0028142ea05042005","0x8805200050b68052f0014b6805022050468052f00144600525605046005","0x26014046014bc0050460141e814096014bc00509601499014022014bc005","0x2905028050bc00502801c0a08d04612c0896d022014468052f001446805","0x28141fe0500a17800a018028ca028050bc00502c014820140285e002825","0x478072320509f0052f00149f00521a0509f0052f00140a05702823c02978","0xa13b00a5e00289127801c1a014278014bc0050284700a09100a5e00293e","0x297800a014029000284c80297800a4c8028110284e80297800a4ec0292b","0x293a00a1300a0f700a5e0028f700a0f40a03d00a5e00283d00a4c80a005","0xbc0052ec014198140285e00281400e0509d0f707a0149901100a4e802978","0xa17800a05802904028050bc00504a014828140285e00280600a3280a014","0x9a8052f00149a80521a0509a8052f00140a0570284e00297800a0507f814","0x289726601c1a014266014bc0050284700a09700a5e00293527001c8c814","0x29000280980297800a098028110284b80297800a0380292b02803802978","0xa0f700a5e0028f700a0f40a02a00a5e00282a00a4c80a00500a5e002805","0x28140285e002814028050970f70540141301100a4b80297800a4b80284c","0x7b8051ee0500a17800a0500381404605803a010225d80397800e0140a007","0x10102504801cbc00700c0140b0142ec014bc0052ec0140881400c014bc005","0xa17800a09402858028050bc0050480144a8140285e00281400e05010005","0x130052f00141300521a050130052f00140a1080280840297800a0507f814","0x282a05001c1a014050014bc0050284700a02a00a5e00282604201c8c814","0x29320285d80297800a5d8028110285d40297800a0ac0292b0280ac02978","0x297500a5e00297500a1300a00700a5e00280700a0f40a01100a5e002811","0x281405c0500a17800a08002895028050bc00502801c0a17500e044bb176","0x7c85800e5e0038950225d87b9510282540297800a2540284102825402978","0xbc0050288100a10d00a5e0028141fe0500a17800a050038142103fc03a03","0x868072320508e0052f00148e00521a0508e0052f00148c80540a0508c805","0xa0142f0014958050aa0509912b00e5e00283400a0b40a03400a5e00291c","0x297800a130029630281300297800a0f4029650280f40297800a4c802966","0x280700a0f40a0f900a5e0028f900a4c80a05800a5e00285800a0440a02e","0xbc00502801c0a02e00e3e42c17600a0b80297800a0b80284c02801c02978","0x297800a5440290d0285440297800a0502b814082014bc0050283fc0a014","0x2304400e0d00a04400a5e002814238050230052f0014a884100e4640a151","0x990141fe014bc0051fe01408814090014bc00508a0149581408a014bc005","0x240052f001424005098050038052f00140380507a050840052f001484005","0xa0ff028050bc0051ee014198140285e00281400e050240072103fcbb005","0x391902812c0297800a12c0290d02812c0297800a0502b8142da014bc005","0x280052f00143b16c00e0d00a16c00a5e0028142380503b0052f00142596d","0xbc0050460149901402c014bc00502c014088142d4014bc0050a001495814","0x118162ec014b50052f0014b5005098050038052f00140380507a05011805","0x1181600e8180897600e5e00380502801c028140285e002814028050b5007","0xbb0052f0014bb005022050030052f00147b8051ee0500a17800a05003814","0x1200512a0500a17800a050038140400150382504801cbc00700c0140b014","0xbc0050284200a02100a5e0028141fe0500a17800a09402858028050bc005","0xa11c0280a80297800a09810807232050130052f00141300521a05013005","0xa17500a5e00282b00a4ac0a02b00a5e00282a05001c1a014050014bc005","0x297800a01c0283d0280440297800a044029320285d80297800a5d802811","0xa0142f00140a0070285d4038112ec5d80297500a5e00297500a1300a007","0xa09500a5e00289500a1040a09500a5e00281405c0500a17800a08002895","0x338140285e00281400e050840ff00e8207c85800e5e0038950225d87b951","0x1a11c00e5e00291900a5740a11900a5e00290d00a5780a10d00a5e002814","0x297800a3e4029320281600297800a16002811028050bc005238014ae014","0x7c8582ec1980a03400a5e00283400a56c0a00700a5e00280700a0f40a0f9","0x38140820150482e00a5e00384c00a1d40a04c07a4c8959762f00141a007","0x29570281180297800a0b80295a0285440297800a0507f8140285e002814","0x2404500e5e00284500a5540a0142f0014220052ac0502284400e5e002846","0xbc0052da014a70140285e00284b00a5400a04b2da01cbc005090014a9814","0x29530281400297800a5b0a8807232050b60052f00143b0052980503b005","0xa02d00a5e00296900a5380a0142f0014b50052a0050b496a00e5e002845","0xbc0052cc014168142cc014bc0050aa140039190281540297800a0b40294c","0xb00052ca050b00052f0014b18052cc0500a17800a5940285502858cb2807","0x99014256014bc005256014088142d0014bc0050ae014b18140ae014bc005","0xb40052f0014b40050980501e8052f00141e80507a050990052f001499005","0x881406c014bc005082014958140285e00281400e050b403d2644acbb005","0x1e8052f00141e80507a050990052f001499005264050958052f001495805","0x7f8140285e00281400e0501b03d2644acbb00506c014bc00506c01426014","0x8c8140ce014bc0050ce014868140ce014bc00502815c0a03300a5e002814","0x297800a578ae807068050ae8052f00140a11c0285780297800a19c19807","0x290800a4c80a0ff00a5e0028ff00a0440a15b00a5e00295c00a4ac0a15c","0x7f97600a56c0297800a56c0284c02801c0297800a01c0283d02842002978","0x297800a0507f8140285e0028f700a0cc0a0142f00140a00702856c03908","0x28750cc01c8c8140ea014bc0050ea014868140ea014bc00502815c0a066","0x292b0285580297800a568ab807068050ab8052f00140a11c02856802978","0xa02300a5e00282300a4c80a01600a5e00281600a0440a15500a5e002956","0xa15500e08c0b17600a5540297800a5540284c02801c0297800a01c0283d","0xa00702801811807414058088072f001c0380500e0140a0142f00140a014","0x281100a0440a0142f00140a1760280900297800a5d8028f7028050bc005","0xa0142f00140a00702808402a0b0400940397800e0900281602804402978","0x297800a0a8028240280a80297800a098028060280980297800a08002823","0x1060050280840a17500a5e00282800a0800a02b00a5e00282500a0940a028","0x2c0052f00144a8050540504a8052f00140a026028050bc00502801c0a014","0xbc0072ea014140142ea014bc0050b001410014056014bc00504201412814","0x10710d21001cbc0071f20440394b028050bc00502801c0a0ff00a8347c805","0xbc0070560140b014210014bc005210014088140285e00281400e0508c805","0x8e00512a0500a17800a050ba8140285e00281400e0509580541e0d08e007","0xbc0050283fc0a0142f0014868050e20500a17800a0d002858028050bc005","0x1e93200e4640a03d00a5e00283d00a4340a03d00a5e00281421005099005","0x95814082014bc0050980b8038340280b80297800a0508e014098014bc005","0x840052f0014840050220500a0052f00140a0050e6050a88052f001420805","0xbc0052a2014260141ee014bc0051ee0141e81402c014bc00502c01499014","0xa0142f00140a175028050bc00502801c0a1511ee05884014022014a8805","0xa04600a5e00284600a1040a04600a5e00281405c0500a17800a4ac02895","0x3b8140285e00281400e050b684800e8402284400e5e00384602c4207b951","0x2816c00e5e00287600a5180a07600a5e00284b00a5200a04b00a5e002814","0x297800a5a8028060285a80297800a14002942028050bc0052d8014a2014","0x284400a0440a05500a5e00282d00a5000a02d00a5e00296900a5040a169","0x283d0280500297800a050028730281140297800a1140293202811002978","0xa10d00a5e00290d00a20c0a05500a5e00285500a2080a0f700a5e0028f7","0xbc0070ae0143a8140ae580b19652cc044bc00521a1547b81408a1100b084","0xb40052b4050198052f00140a0ff028050bc00502801c0a03600a844b4005","0xaa8140285e00295e00a5580a15d2bc01cbc0050ce014ab8140ce014bc005","0xbc0050cc014a80140cc56c0397800a57002953028570ae8072f0014ae805","0xad03300e4640a15a00a5e00287500a5300a07500a5e00295b00a5380a014","0xa70140285e00295600a5400a1552ac01cbc0052ba014a98142ae014bc005","0x297800a540ab807232050a80052f0014a9805298050a98052f0014aa805","0x294b00a5980a0142f0014a60050aa050a594c00e5e00294e00a0b40a14e","0x28730281dc0297800a1cc029630281cc0297800a1c4029650281c402978","0xa16500a5e00296500a4c80a16600a5e00296600a0440a16300a5e002963","0x3b9602ca598b181100a1dc0297800a1dc0284c0285800297800a5800283d","0xb18052f0014b18050e6050a40052f00141b0052560500a17800a05003814","0xbc0052c00141e8142ca014bc0052ca014990142cc014bc0052cc01408814","0xbc00502801c0a1482c0594b3163022014a40052f0014a4005098050b0005","0xa20052f00140a0570285180297800a0507f8140285e00290d00a1c40a014","0xbc0050284700a14200a5e00294428c01c8c814288014bc00528801486814","0x28730282080297800a5000292b0285000297800a508a0807068050a0805","0xa16d00a5e00296d00a4c80a04800a5e00284800a0440a01400a5e002814","0x410f72da1200a01100a2080297800a2080284c0283dc0297800a3dc0283d","0xa08300a5e00291900a0440a0142f00141580512a0500a17800a05003814","0x1580512a0500a17800a3fc02968028050bc00502801c0a0144240140a021","0xbc0050283fc0a0142f00140a17502820c0297800a04402811028050bc005","0x4308400e4640a08600a5e00288600a4340a08600a5e00281406c05042005","0x95814118014bc0051104fc038340284fc0297800a0508e014110014bc005","0x418052f0014418050220500a0052f00140a0050e6050468052f001446005","0xbc00511a014260141ee014bc0051ee0141e81402c014bc00502c01499014","0xa17800a5d802833028050bc00502801c0a08d1ee0584181402201446805","0x9f0052f00149f00521a0509f0052f00140a05702823c0297800a0507f814","0x289127801c1a014278014bc0050284700a09100a5e00293e11e01c8c814","0x28110280500297800a050028730284e80297800a4ec0292b0284ec02978","0xa0f700a5e0028f700a0f40a00600a5e00280600a4c80a02300a5e002823","0x28140285e0028140280509d0f700c08c0a01100a4e80297800a4e80284c","0xbb0051ee0500a17800a0500381400c08c03a1302c0440397800e01c02807","0x1200502c050088052f0014088050220500a17800a050bb014048014bc005","0x130052f0014100050460500a17800a050038140420150a02004a01cbc007","0xbc00504a01412814050014bc00505401412014054014bc00504c01403014","0xa17800a0500381402885402814042050ba8052f00141400504005015805","0x297800a084028250281600297800a2540282a0282540297800a05013014","0x38141fe0150b0f900a5e00397500a0a00a17500a5e00285800a0800a02b","0xbc00502801c0a11900a85c8690800e5e0038f902201ca58140285e002814","0xa12b00a8601a11c00e5e00382b00a0580a10800a5e00290800a0440a014","0xa03d00a5e00293200a0180a13200a5e00283400a08c0a0142f00140a007","0x297800a130028200280b80297800a470028250281300297800a0f402824","0x150142a2014bc0050280980a0142f00140a0070280510c8050280840a041","0x208052f001423005040050170052f00149580504a050230052f0014a8805","0x2210800e52c0a0142f00140a00702811402a1a088014bc00708201414014","0x240052f0014240050220500a17800a050038140960150d96d09001cbc007","0xb60052700500a17800a050038140a00150e16c0ec01cbc00705c0140b014","0x1081405a014bc0052d40149a8142d2014bc0050ec014128142d4014bc005","0x285500a25c0a05500a5e00281404c0500a17800a0500381402887402814","0x29330280b40297800a598029350285a40297800a1400282502859802978","0xb00052f0014b28050460500a17800a050038142c60150f16500a5e00382d","0x385709001c070140ae014bc0050ae014868140ae014bc0052c001403014","0x297800a5a002811028050bc00502801c0a15e0ce0cc7ba1f06c5a003978","0x2938028050bc00502801c0a15b00a880ae15d00e5e00396900a0580a168","0xa15a00a5e00286600a4d40a07500a5e00295d00a0940a06600a5e00295c","0xab80512e050ab8052f00140a026028050bc00502801c0a0144420140a021","0x998142b4014bc0052ac0149a8140ea014bc0052b6014128142ac014bc005","0x297800a55402823028050bc00502801c0a15300a888aa8052f001cad005","0xa716800e0380a14e00a5e00294e00a4340a14e00a5e00295000a0180a150","0x294b06c01c970140285e00281400e0503b8730e23dd1194b29801cbc007","0x28250285100297800a530028110285180297800a5200289a02852002978","0xa007028051120050280840a14100a5e00294600a2700a14200a5e002875","0x283600a5400a0142f00143b8052a00500a17800a1cc02950028050bc005","0xa17800a0500381402889402814042050a00052f0014388050220500a178","0xa00052f0014b40050220500a17800a0d802950028050bc0052a6014b4014","0x297800a5000292902820c0297800a2080292d0282080297800a05013014","0x1120050280840a14100a5e00288300a2700a14200a5e00287500a0940a144","0xa0142f0014af0052a00500a17800a19c02950028050bc00502801c0a014","0x2968028050bc00502801c0a01444c0140a0210282100297800a0cc02811","0x292d0282180297800a05013014108014bc005090014088140285e002963","0xa14200a5e00296900a0940a14400a5e00288400a4a40a08800a5e002886","0x281400e0504600544e4fc0297800e5040292a0285040297800a2200289c","0xba8140285e00281400e0509f00545023c468072f001ca100502c0500a178","0x9f8052ac0500a17800a23c02858028050bc00511a0144a8140285e002814","0xbc0050283fc0a0142f0014868050e20500a17800a5b402871028050bc005","0x9e09100e4640a13c00a5e00293c00a4340a13c00a5e00281421005048805","0x95814270014bc0052764e8038340284e80297800a0508e014276014bc005","0xa20052f0014a20050220500a0052f00140a0050e60509a8052f00149c005","0xbc00526a014260141ee014bc0051ee0141e81402c014bc00502c01499014","0xa17800a4f802895028050bc00502801c0a1351ee058a20140220149a805","0x389702c5107b95102825c0297800a25c0284102825c0297800a05017014","0xa09c00a5e0028142300500a17800a050038141344b803a2901c4cc03978","0x297800a050028730280380297800a038029320284cc0297800a4cc02811","0x296d00a20c0a10d00a5e00290d00a20c0a0f700a5e0028f700a0f40a014","0x9f96d21a2707b81401c4cc031130284fc0297800a4fc029160285b402978","0xa00702849002a2a140014bc0072440148881424449c9512925a044bc005","0x290f02847c918072f00145000517c050510052f00140a0ff028050bc005","0xa0142f00140a00702829402a2b23c014bc00723e014870140285e002923","0xa11d00a5e0028a700a4340a0a700a5e0028142180500a17800a47802968","0x281415e0500a17800a29402968028050bc00502801c0a0144580140a021","0x8e8a200e4640a0142f00140a1750284740297800a46c0290d02846c02978","0xb30140285e00291a00a1540a11823401cbc00515201416814152014bc005","0x5d0052f00148b8052c60508b8052f00148b0052ca0508b0052f00148c005","0xbc0052520149901425a014bc00525a01408814254014bc00525401439814","0x9692a0220145d0052f00145d005098050938052f00149380507a05094805","0x297800a4900292b028050bc0050285d40a0142f00140a0070282e893929","0x292900a4c80a12d00a5e00292d00a0440a12a00a5e00292a00a1cc0a0b9","0x9501100a2e40297800a2e40284c02849c0297800a49c0283d0284a402978","0xbc00527e014ab0140285e0028142ea0500a17800a0500381417249c9492d","0x578052f00140a0ff028050bc00521a014388140285e00296d00a1c40a014","0xbc0051622bc039190282c40297800a2c40290d0282c40297800a0502b814","0x56805256050568052f00145a0ac00e0d00a0ac00a5e0028142380505a005","0x9901425c014bc00525c01408814028014bc0050280143981415c014bc005","0x570052f0014570050980507b8052f00147b80507a0504d0052f00144d005","0x2968028050bc0050285d40a0142f00140a0070282b87b89a25c05008805","0x868050e20500a17800a5b402871028050bc0052840144a8140285e00288c","0x291300a4340a11300a5e0028141840505d8052f00140a0ff028050bc005","0x38340282f80297800a0508e014222014bc0052262ec0391902844c02978","0xa0052f00140a0050e6050870052f001487805256050878052f0014888be","0xbc0051ee0141e81402c014bc00502c01499014288014bc00528801408814","0xbc00502801c0a10e1ee058a2014022014870052f0014870050980507b805","0x297800a12c02811028050bc00521a014388140285e00282e00a2540a014","0x4a8140285e00284500a5a00a0142f00140a007028051168050280840a10c","0xba814218014bc005210014088140285e00290d00a1c40a0142f001417005","0x8580521a050858052f00140a13a0283080297800a0507f8140285e002814","0x1a014212014bc0050284700a10a00a5e00290b18401c8c814216014bc005","0x297800a050028730284180297800a41c0292b02841c0297800a42884807","0x28f700a0f40a01600a5e00281600a4c80a10c00a5e00290c00a0440a014","0x281400e050830f702c4300a01100a4180297800a4180284c0283dc02978","0x1170050280840a10500a5e00291900a0440a0142f00141580512a0500a178","0xa0142f00141580512a0500a17800a3fc02968028050bc00502801c0a014","0x1b014208014bc0050283fc0a0142f00140a1750284140297800a04402811","0x800052f00146510400e4640a0ca00a5e0028ca00a4340a0ca00a5e002814","0xbc0051fa014958141fa014bc0052003f8038340283f80297800a0508e014","0xb005264050828052f0014828050220500a0052f00140a0050e60507e005","0x88051f8014bc0051f8014260141ee014bc0051ee0141e81402c014bc005","0x28141fe0500a17800a5d802833028050bc00502801c0a0fc1ee05882814","0x7d8072320506b0052f00146b00521a0506b0052f00140a0570283ec02978","0xa0d300a5e0028d01f401c1a0141f4014bc0050284700a0d000a5e0028d6","0x297800a08c028110280500297800a050028730283e00297800a34c0292b","0x28f800a1300a0f700a5e0028f700a0f40a00600a5e00280600a4c80a023","0x380502801c028140285e0028140280507c0f700c08c0a01100a3e002978","0x30052f00147b8051ee0500a17800a0500381404605803a2f0225d803978","0x38140400151802504801cbc00700c0140b0142ec014bc0052ec01408814","0x28141fe0500a17800a09402858028050bc0050480144a8140285e002814","0x10807232050130052f00141300521a050130052f00140a10802808402978","0xa02b00a5e00282a05001c1a014050014bc0050284700a02a00a5e002826","0x297800a044029320285d80297800a5d8028110285d40297800a0ac0292b","0x38112ec5d80297500a5e00297500a1300a00700a5e00280700a0f40a011","0xa09500a5e00281405c0500a17800a08002895028050bc00502801c0a175","0x840ff00e8c47c85800e5e0038950225d87b9510282540297800a25402841","0xa11900a5e00290d00a8cc0a10d00a5e0028144640500a17800a05003814","0x297800a0d002a36028050bc0052380151a8140684700397800a46402a34","0xbc00502834c0a03d00a5e00293200a3e80a13200a5e00292b00a3400a12b","0x2c0050220501e8052f00141e8051e6050260052f0014260051f005026005","0x2284408c3dd1c1510820b87b97800e0f4260071f25d91b8140b0014bc005","0x170052f001417005264050a88052f0014a880521a0500a17800a05003814","0xa04b00a8e4b684800e5e0039510b001ca5814082014bc0050820141e814","0x8c8142d8014bc0052da014528140ec014bc0050283fc0a0142f00140a007","0xbc0052d40142a8142d25a80397800a1400282d0281400297800a5b03b007","0x285500a58c0a05500a5e00282d00a5940a02d00a5e00296900a5980a014","0x283d0280b80297800a0b8029320281200297800a1200281102859802978","0xa0070285982082e0905d80296600a5e00296600a1300a04100a5e002841","0x296300a4340a16300a5e002814474050b28052f00140a0ff028050bc005","0x990140ae014bc005096014088142c0014bc0052c65940391902858c02978","0x198052f0014b00052360501b0052f00142080507a050b40052f001417005","0x990140ae014bc0050b0014088140285e00281400e0500a23b00a05010814","0x198052f0014228052360501b0052f00142200507a050b40052f001423005","0xbc0052bc014958142bc014bc00506619c0383402819c0297800a0508e014","0x1b00507a050b40052f0014b40052640502b8052f00142b805022050ae805","0x281400e050ae8362d015cbb0052ba014bc0052ba0142601406c014bc005","0xbc0052b6014868142b6014bc00502815c0a15c00a5e0028141fe0500a178","0x3a8070680503a8052f00140a11c0281980297800a56cae007232050ad805","0xa0ff00a5e0028ff00a0440a15700a5e00295a00a4ac0a15a00a5e002866","0x297800a55c0284c02801c0297800a01c0283d0284200297800a42002932","0x7f8140285e0028f700a0cc0a0142f00140a00702855c039081fe5d802957","0x8c8142aa014bc0052aa014868142aa014bc00502815c0a15600a5e002814","0x297800a54ca8007068050a80052f00140a11c02854c0297800a554ab007","0x282300a4c80a01600a5e00281600a0440a14c00a5e00294e00a4ac0a14e","0xb17600a5300297800a5300284c02801c0297800a01c0283d02808c02978","0xb007478044bb0072f001c0281400e0140a0142f00140a01402853003823","0xa0142f00140a1760280180297800a3dc028f7028050bc00502801c0a023","0xa00702808002a3d04a0900397800e018028160285d80297800a5d802811","0x28240280980297800a084028060280840297800a09402823028050bc005","0xa02b00a5e00282a00a0800a02800a5e00282400a0940a02a00a5e002826","0xba805054050ba8052f00140a026028050bc00502801c0a01447c0140a021","0x14014056014bc00512a01410014050014bc0050400141281412a014bc005","0xbc0070b05d80394b028050bc00502801c0a0f900a8fc2c0052f001c15805","0xb0141fe014bc0051fe014088140285e00281400e050868054804207f807","0xa17800a050ba8140285e00281400e0501a0054824708c8072f001c14005","0xa0142f0014840050e20500a17800a47002858028050bc0052320144a814","0xa13200a5e00293200a4340a13200a5e002814210050958052f00140a0ff","0xbc00507a130038340281300297800a0508e01407a014bc0052644ac03919","0x88052640507f8052f00147f805022050208052f00141700525605017005","0xbb005082014bc0050820142601400e014bc00500e0141e814022014bc005","0xbc0050680144a8140285e0028142ea0500a17800a0500381408201c088ff","0xa88111fe3dca88142a2014bc0052a2014208142a2014bc0050280b80a014","0x397800a4200291e028050bc00502801c0a04808a01d2104408c01cbc007","0x2580514e050230052f001423005022050258052f0014b680514a050b6908","0xa0ff028050bc005210014388140285e00281400e0503b005486050bc007","0x39190281400297800a1400290d0281400297800a051220142d8014bc005","0x168052f001422005264050b48052f001423005022050b50052f00142816c","0xa24500a050108142cc014bc0052d40148d8140aa014bc00500e0141e814","0x220142ca014bc0050281180a0142f00143b0051520500a17800a05003814","0x297800a110029320281180297800a11802811028580b18072f0014b2805","0x1b1680ae5d8bc0052c001c220462ec1200a00700a5e00280700a0f40a044","0x338050960500a17800a050038142bc0152306700a5e00383300a5b40a033","0x283d0285a00297800a5a00293202815c0297800a15c02811028050bc005","0x29082c60d8b405702291c0a10800a5e00290800a20c0a03600a5e002836","0xbc00502801c0a15a00a9243a8052f001c330054900503315b2b8574bb178","0x397800a55c0282d02855c0297800a0507f8140285e00287500a9280a014","0x295300a5940a15300a5e00295500a5980a0142f0014ab0050aa050aa956","0x29320285740297800a574028110285380297800a5400296302854002978","0x294e00a5e00294e00a1300a15b00a5e00295b00a0f40a15c00a5e00295c","0x5a0142965300397800a568028b1028050bc00502801c0a14e2b6570ae976","0xa02d00a5e00295c00a4c80a16900a5e00295d00a0440a0142f0014a6005","0xa01448a0140a0210285980297800a52c0291b0281540297800a56c0283d","0x28b1028050bc0052c6014228140285e00290800a1c40a0142f00140a007","0xa16900a5e00285700a0440a0142f0014388051680503987100e5e00295e","0x297800a1cc0291b0281540297800a0d80283d0280b40297800a5a002932","0x294800a4ac0a14800a5e0029660ee01c1a0140ee014bc0050284700a166","0x283d0280b40297800a0b4029320285a40297800a5a40281102851802978","0xa0070285182a82d2d25d80294600a5e00294600a1300a05500a5e002855","0xbc00502815c0a14400a5e0028141fe0500a17800a42002871028050bc005","0xa11c0285040297800a508a2007232050a10052f0014a100521a050a1005","0xa08300a5e00288200a4ac0a08200a5e00294128001c1a014280014bc005","0x297800a01c0283d0281200297800a120029320281140297800a11402811","0xa0142f00140a00702820c0384808a5d80288300a5e00288300a1300a007","0x381402892c02814042050420052f0014868050220500a17800a0a002895","0xbb0050220500a17800a0a002895028050bc0051f2014b40140285e002814","0xbc0050280d80a08600a5e0028141fe0500a17800a050ba814108014bc005","0xa11c0284fc0297800a22043007232050440052f00144400521a05044005","0xa08f00a5e00288d00a4ac0a08d00a5e00293f11801c1a014118014bc005","0x297800a01c0283d0280440297800a044029320282100297800a21002811","0xa0142f00140a00702823c038111085d80288f00a5e00288f00a1300a007","0x86814122014bc00502815c0a13e00a5e0028141fe0500a17800a3dc02833","0x9d8052f00140a11c0284f00297800a2449f007232050488052f001448805","0x281600a0440a13800a5e00293a00a4ac0a13a00a5e00293c27601c1a014","0x284c02801c0297800a01c0283d02808c0297800a08c0293202805802978","0x281400e0140a0142f00140a0140284e00382302c5d80293800a5e002938","0x297800a3dc028f7028050bc00502801c0a02302c01d260112ec01cbc007","0xa02000a9341282400e5e00380600a0580a17600a5e00297600a0440a006","0xa0ff028050bc00504a0142c0140285e00282400a2540a0142f00140a007","0x39190280980297800a0980290d0280980297800a05084014042014bc005","0x158052f00141502800e0d00a02800a5e002814238050150052f001413021","0xbc005022014990142ec014bc0052ec014088142ea014bc00505601495814","0x89762ec014ba8052f0014ba805098050038052f00140380507a05008805","0x4a8052f00140a02e028050bc0050400144a8140285e00281400e050ba807","0x7f80749c3e42c0072f001c4a8112ec3dca881412a014bc00512a01420814","0x8c8072f001486805088050868052f00140a046028050bc00502801c0a108","0x280700a0f40a0f900a5e0028f900a4c80a05800a5e00285800a0440a11c","0x383d00a5b40a03d2644ac1a1762f00148e0071f2160bb04802801c02978","0xa250028050bc005098014258140285e00281400e0501700549e13002978","0x1e814256014bc00525601499014068014bc00506801408814082014bc005","0x209192644ac1a01148e050208052f001420805106050990052f001499005","0x281400e050b68054a21200297800e11402a48028114220462a25d8bc005","0xbc00509601416814096014bc0050283fc0a0142f0014240054940500a178","0x280052ca050280052f0014b60052cc0500a17800a1d8028550285b03b007","0x990142a2014bc0052a2014088142d2014bc0052d4014b18142d4014bc005","0xb48052f0014b4805098050220052f00142200507a050230052f001423005","0x9901405a014bc0052a2014088140285e00281400e050b484408c544bb005","0xb28052f0014b68052c0050b30052f00142200507a0502a8052f001423005","0x2811028050bc005232014228140285e00281400e0500a25200a05010814","0xa16600a5e00293200a0f40a05500a5e00292b00a4c80a02d00a5e002834","0x297800a0b40281102858c0297800a5940292b0285940297800a0b802960","0x296300a1300a16600a5e00296600a0f40a05500a5e00285500a4c80a02d","0xb00052f00140a0ff028050bc00502801c0a1632cc1541697600a58c02978","0xbc0050ae5800391902815c0297800a15c0290d02815c0297800a0502b814","0x19805256050198052f0014b403600e0d00a03600a5e002814238050b4005","0x1e814210014bc005210014990141fe014bc0051fe014088140ce014bc005","0x38140ce01c840ff2ec014338052f001433805098050038052f001403805","0x28140ae050af0052f00140a0ff028050bc0051ee014198140285e002814","0x8e0142b8014bc0052ba578039190285740297800a5740290d02857402978","0x3a8052f001433005256050330052f0014ae15b00e0d00a15b00a5e002814","0xbc00500e0141e814046014bc0050460149901402c014bc00502c01408814","0xa17800a0500a0140ea01c118162ec0143a8052f00143a80509805003805","0x7b8140285e00281400e0501181600e94c0897600e5e00380502801c02814","0xb0142ec014bc0052ec014088140285e0028142ec050030052f00147b805","0xbc00504a014118140285e00281400e050100054a8094120072f001c03005","0x1200504a050150052f001413005048050130052f00141080500c05010805","0x281400e0500a25500a05010814056014bc00505401410014050014bc005","0x282000a0940a09500a5e00297500a0a80a17500a5e00281404c0500a178","0x7c8054ac1600297800e0ac028280280ac0297800a254028200280a002978","0xa00702843402a572103fc0397800e160bb0072960500a17800a05003814","0x2a582384640397800e0a0028160283fc0297800a3fc02811028050bc005","0x2c0140285e00291900a2540a0142f00140a175028050bc00502801c0a034","0xa1080284ac0297800a0507f8140285e00290800a1c40a0142f00148e005","0xa03d00a5e00293225601c8c814264014bc00526401486814264014bc005","0x297800a0b80292b0280b80297800a0f426007068050260052f00140a11c","0x280700a0f40a01100a5e00281100a4c80a0ff00a5e0028ff00a0440a041","0xbc00502801c0a04100e0447f97600a1040297800a1040284c02801c02978","0xa15100a5e00281405c0500a17800a0d002895028050bc0050285d40a014","0x2404500e9642204600e5e0039510223fc7b9510285440297800a54402841","0x297800a5b4028a50285b4840072f00148400523c0500a17800a05003814","0xa0070281d802a5a0285e00384b00a29c0a04600a5e00284600a0440a04b","0xbc0050289100a16c00a5e0028141fe0500a17800a42002871028050bc005","0x28110285a80297800a140b6007232050280052f00142800521a05028005","0xa05500a5e00280700a0f40a02d00a5e00284400a4c80a16900a5e002846","0x28a9028050bc00502801c0a0144b60140a0210285980297800a5a80291b","0x88142c058c0397800a594028440285940297800a050230140285e002876","0x38052f00140380507a050220052f001422005264050230052f001423005","0x338052f001c198052da050198362d015cbb17800a5800384408c5d824014","0xbc0050ae014088140285e00286700a12c0a0142f00140a00702857802a5c","0x840051060501b0052f00141b00507a050b40052f0014b40052640502b805","0x2a48028198ad95c2ba5d8bc00521058c1b1680ae04523814210014bc005","0xa0142f00143a8054940500a17800a050038142b40152e87500a5e003866","0xa17800a55802855028554ab0072f0014ab80505a050ab8052f00140a0ff","0xbc0052a0014b18142a0014bc0052a6014b28142a6014bc0052aa014b3014","0xad80507a050ae0052f0014ae005264050ae8052f0014ae805022050a7005","0x281400e050a715b2b8574bb00529c014bc00529c014260142b6014bc005","0xae8050220500a17800a530028b402852ca60072f0014ad0051620500a178","0x8d8140aa014bc0052b60141e81405a014bc0052b8014990142d2014bc005","0x840050e20500a17800a0500381402896c02814042050b30052f0014a5805","0x28b40281cc388072f0014af0051620500a17800a58c02845028050bc005","0x1e81405a014bc0052d0014990142d2014bc0050ae014088140285e002871","0xa07700a5e002814238050b30052f0014398052360502a8052f00141b005","0xbc0052d20140881428c014bc00529001495814290014bc0052cc1dc03834","0xa30050980502a8052f00142a80507a050168052f001416805264050b4805","0xbc005210014388140285e00281400e050a305505a5a4bb00528c014bc005","0x297800a5080290d0285080297800a0502b814288014bc0050283fc0a014","0xa094000e0d00a14000a5e002814238050a08052f0014a114400e4640a142","0x9901408a014bc00508a01408814106014bc00510401495814104014bc005","0x418052f001441805098050038052f00140380507a050240052f001424005","0x2811028050bc0050500144a8140285e00281400e05041807090114bb005","0x28f900a5a00a0142f00140a0070280512f0050280840a08400a5e00290d","0xbc0050285d40a08400a5e00297600a0440a0142f00141400512a0500a178","0x297800a2200290d0282200297800a0501b01410c014bc0050283fc0a014","0x9f88c00e0d00a08c00a5e0028142380509f8052f00144408600e4640a088","0x99014108014bc0051080140881411e014bc00511a0149581411a014bc005","0x478052f001447805098050038052f00140380507a050088052f001408805","0xa0ff028050bc0051ee014198140285e00281400e05047807022210bb005","0x39190282440297800a2440290d0282440297800a0502b81427c014bc005","0x9d0052f00149e13b00e0d00a13b00a5e0028142380509e0052f00144893e","0xbc0050460149901402c014bc00502c01408814270014bc00527401495814","0x118162ec0149c0052f00149c005098050038052f00140380507a05011805","0x1181600e97c0897600e5e00380502801c028140285e0028140280509c007","0xbb0052f0014bb005022050030052f00147b8051ee0500a17800a05003814","0x1200512a0500a17800a050038140400153002504801cbc00700c0140b014","0xbc0050284200a02100a5e0028141fe0500a17800a09402858028050bc005","0xa11c0280a80297800a09810807232050130052f00141300521a05013005","0xa17500a5e00282b00a4ac0a02b00a5e00282a05001c1a014050014bc005","0x297800a01c0283d0280440297800a044029320285d80297800a5d802811","0xa0142f00140a0070285d4038112ec5d80297500a5e00297500a1300a007","0xa09500a5e00289500a1040a09500a5e00281405c0500a17800a08002895","0x230140285e00281400e050840ff00e9847c85800e5e0038950225d87b951","0x2c0052f00142c0050220508e11900e5e00290d00a1100a10d00a5e002814","0x38f90b05d82401400e014bc00500e0141e8141f2014bc0051f201499014","0xa0070280b802a62098014bc00707a014b681407a4c8958342ec5e00291c","0x283400a0440a04100a5e0028144a00500a17800a1300284b028050bc005","0x28830284c80297800a4c80283d0284ac0297800a4ac029320280d002978","0x12401408a110231512ec5e0028412324c89583402291c0a04100a5e002841","0xa17800a12002a4a028050bc00502801c0a16d00a98c240052f001c22805","0xbc0050ec0142a8142d81d80397800a12c0282d02812c0297800a0507f814","0x296a00a58c0a16a00a5e00285000a5940a05000a5e00296c00a5980a014","0x283d0281180297800a118029320285440297800a544028110285a402978","0xa0070285a4220462a25d80296900a5e00296900a1300a04400a5e002844","0x283d0281540297800a118029320280b40297800a54402811028050bc005","0xa007028051320050280840a16500a5e00296d00a5800a16600a5e002844","0x95805264050168052f00141a0050220500a17800a46402845028050bc005","0x958142ca014bc00505c014b00142cc014bc0052640141e8140aa014bc005","0x2a8052f00142a805264050168052f001416805022050b18052f0014b2805","0xb19660aa0b4bb0052c6014bc0052c6014260142cc014bc0052cc0141e814","0x868140ae014bc00502815c0a16000a5e0028141fe0500a17800a05003814","0x1b0052f00140a11c0285a00297800a15cb00072320502b8052f00142b805","0x28ff00a0440a06700a5e00283300a4ac0a03300a5e00296806c01c1a014","0x284c02801c0297800a01c0283d0284200297800a420029320283fc02978","0x28f700a0cc0a0142f00140a00702819c039081fe5d80286700a5e002867","0xbc0052ba014868142ba014bc00502815c0a15e00a5e0028141fe0500a178","0xad807068050ad8052f00140a11c0285700297800a574af007232050ae805","0xa01600a5e00281600a0440a07500a5e00286600a4ac0a06600a5e00295c","0x297800a1d40284c02801c0297800a01c0283d02808c0297800a08c02932","0xa0140285e00281420c050118052f00140a1070281d40382302c5d802875","0x281400e0501002500e9941200600e5e0038f700a01c028140285e002814","0x88054cc050120052f001412005264050030052f0014030050220500a178","0xbc00705401534014054098108f72f00140882400c3dd33814022014bc005","0x13581412a5d40397800a0a002a6a028050bc00502801c0a02b00a9a414005","0x297800a08402811028050bc00502801c0a05800a9b00b0052f001c4a805","0xb02300e6bc0a17500a5e00297500a9980a02600a5e00282600a4c80a021","0xbc007210015340142103fc7c8f72f0014ba8260423dd3381402c014bc005","0x1358140684700397800a43402a6a028050bc00502801c0a11900a9b486805","0x297800a470028f7028050bc00502801c0a13200a9b8958052f001c1a005","0xa00702810402a6f05c1300397800e0f402816028050bc0050285d80a03d","0x29350281180297800a130028250285440297800a0b802938028050bc005","0xbc0050280980a0142f00140a007028051380050280840a04400a5e002951","0x2400526a050230052f00142080504a050240052f00142280512e05022805","0xa0142f00140a00702812c02a712da014bc00708801499814088014bc005","0x297800a5b00290d0285b00297800a1d8028060281d80297800a5b402823","0xa17800a050038140aa0b4b48f74e45a8280072f001cb60f900e0380a16c","0x38142c6015399652cc01cbc00708c0140b0140a0014bc0050a001408814","0x9a8140ae014bc0052cc014128142c0014bc0052ca0149c0140285e002814","0x281404c0500a17800a050038140289d002814042050b40052f0014b0005","0x293502815c0297800a58c028250280cc0297800a0d8028970280d802978","0xa17800a050038142bc0153a86700a5e00396800a4cc0a16800a5e002833","0xbc0052b8014868142b8014bc0052ba014030142ba014bc0050ce01411814","0xbc00502801c0a1572b41d47ba760cc56c0397800e5702800701c050ae005","0xad805022050aa8052f0014ab005134050ab0052f00143316a00e4b80a014","0x1081429c014bc0052aa0144e0142a0014bc0050ae014128142a6014bc005","0x295700a5400a0142f0014ad0052a00500a17800a050038140289dc02814","0x13c0050280840a14c00a5e00287500a0440a0142f0014b50052a00500a178","0xa0142f0014b50052a00500a17800a57802968028050bc00502801c0a014","0x388052f0014a580525a050a58052f00140a0260285300297800a14002811","0xbc0050e20144e0142a0014bc0050ae014128142a6014bc00529801494814","0xa0142f0014168052a00500a17800a050038140289dc02814042050a7005","0x38140289e402814042050398052f0014b48050220500a17800a15402950","0xa0260281cc0297800a3e402811028050bc005096014b40140285e002814","0x128142a6014bc0050e601494814290014bc0050ee014968140ee014bc005","0xa30052f001ca7005254050a70052f0014a4005138050a80052f001423005","0xa14000a9eca094200e5e00395000a0580a0142f00140a00702851002a7a","0xa08300a5e00288200a0180a08200a5e00294100a08c0a0142f00140a007","0x297800a210028200282180297800a508028250282100297800a20c02824","0x1501427e014bc0050280980a0142f00140a0070280513e0050280840a088","0x440052f001446005040050430052f0014a000504a050460052f00149f805","0x4695300e52c0a0142f00140a00702823c02a7d11a014bc00711001414014","0x9f0052f00149f0050220500a17800a050038142780153f09127c01cbc007","0x9d0050460500a17800a050038142700153f93a27601cbc00710c0140b014","0x12814266014bc00512e0141201412e014bc00526a0140301426a014bc005","0x3814028a0002814042050970052f001499805040050070052f00149d805","0x28250282700297800a2680282a0282680297800a050130140285e002814","0x14092d00a5e00392e00a0a00a12e00a5e00289c00a0800a00e00a5e002938","0xa12200aa089392a00e5e00392d27c01ca58140285e00281400e05094805","0x920a000e5e00380e00a0580a12a00a5e00292a00a0440a0142f00140a007","0xa17800a28002895028050bc0050285d40a0142f00140a00702828802a83","0xa0142f0014488050e20500a17800a49c02871028050bc0052480142c014","0x7f8140285e00281600a6c40a0142f0014958053620500a17800a51802956","0x8c81423e014bc00523e0148681423e014bc0050284200a12300a5e002814","0x297800a47852807068050528052f00140a11c0284780297800a47c91807","0x292a00a0440a01400a5e00281400a1cc0a11d00a5e0028a700a4ac0a0a7","0x283d0283fc0297800a3fc0293202801c0297800a01c029000284a802978","0xa11d2ec3fc0392a0280580291d00a5e00291d00a1300a17600a5e002976","0x284102846c0297800a050170140285e0028a200a2540a0142f00140a007","0x381422c46003a842342a40397800e46c7f92a1ee5440a11b00a5e00291b","0xbc0050281180a11700a5e0028142300500a17800a050ba8140285e002814","0x28110282bc0297800a2e45d1171eea140a0b900a5e0028140ec0505d005","0xa01400a5e00281400a1cc0a11a00a5e00291a00a4c80a0a900a5e0028a9","0x297800a05802a860285d80297800a5d80283d02801c0297800a01c02900","0x289100a20c0a14600a5e00294600a4580a12b00a5e00292b00aa180a016","0x9581615e5d8038142342a41028702849c0297800a49c0288302824402978","0x2a89226014bc007176015440141762b8568ac1682c40b17800a49c48946","0xa0be00a5e0028141fe0500a17800a44c02a8a028050bc00502801c0a111","0x297800a43802966028050bc00521e0142a81421c43c0397800a2f80282d","0x28ac00a1cc0a10b00a5e0028c200a58c0a0c200a5e00290c00a5940a10c","0x29320282b40297800a2b4029000282c40297800a2c4028110282b002978","0x290b00a5e00290b00a1300a0ae00a5e0028ae00a0f40a0b400a5e0028b4","0xa10a00a5e00291100a4ac0a0142f00140a00702842c570b415a2c456016","0x297800a2b4029000282c40297800a2c4028110282b00297800a2b002873","0x290a00a1300a0ae00a5e0028ae00a0f40a0b400a5e0028b400a4c80a0ad","0xbc0050285d40a0142f00140a007028428570b415a2c45601600a42802978","0xa17800a51802956028050bc005122014388140285e00292700a1c40a014","0xa10900a5e0028141fe0500a17800a058029b1028050bc005256014d8814","0x297800a41c84807232050838052f00148380521a050838052f00140a057","0x290400a4ac0a10400a5e00290620a01c1a01420a014bc0050284700a106","0x29000284600297800a460028110280500297800a0500287302832802978","0xa17600a5e00297600a0f40a11600a5e00291600a4c80a00700a5e002807","0xa0142f00140a007028328bb11600e4600a01600a3280297800a3280284c","0xab0140285e00289100a1c40a0142f00140b0053620500a17800a03802895","0x10814200014bc005244014088140285e00292b00a6c40a0142f0014a3005","0x280e00a2540a0142f0014948052d00500a17800a05003814028a2c02814","0xbc00528c014ab0140285e00289100a1c40a0142f00140b0053620500a178","0xa17800a050ba814200014bc00527c014088140285e00292b00a6c40a014","0x7e8052f00147e80521a0507e8052f00140a28c0283f80297800a0507f814","0x28fc1f601c1a0141f6014bc0050284700a0fc00a5e0028fd1fc01c8c814","0x28110280500297800a050028730283400297800a3580292b02835802978","0xa0ff00a5e0028ff00a4c80a00700a5e00280700a4000a10000a5e002900","0xbb0ff00e4000a01600a3400297800a3400284c0285d80297800a5d80283d","0xa0142f00140b0053620500a17800a21802895028050bc00502801c0a0d0","0xa0fa00a5e00293c00a0440a0142f0014a30052ac0500a17800a4ac029b1","0x4300512a0500a17800a23c02968028050bc00502801c0a01451a0140a021","0x294600a5580a0142f0014958053620500a17800a058029b1028050bc005","0x297800a0507f8140285e0028142ea0507d0052f0014a98050220500a178","0x28f81a601c8c8141f0014bc0051f0014868141f0014bc005028a380a0d3","0x292b0283b80297800a3cc78007068050780052f00140a11c0283cc02978","0xa0fa00a5e0028fa00a0440a01400a5e00281400a1cc0a0e500a5e0028ee","0x297800a5d80283d0283fc0297800a3fc0293202801c0297800a01c02900","0xbc00502801c0a0e52ec3fc038fa028058028e500a5e0028e500a1300a176","0xa0142f00140b0053620500a17800a51002968028050bc0050285d40a014","0x610141e2014bc0050283fc0a0142f0014a800512a0500a17800a4ac029b1","0xd70052f0014000f100e4640a00000a5e00280000a4340a00000a5e002814","0xbc00536001495814360014bc00535c6bc038340286bc0297800a0508e014","0x3805200050a98052f0014a98050220500a0052f00140a0050e6050d8805","0x260142ec014bc0052ec0141e8141fe014bc0051fe0149901400e014bc005","0xb40140285e00281400e050d89761fe01ca981402c014d88052f0014d8805","0xa0ff028050bc005238014198140285e00281600a6c40a0142f001499005","0x39190285e80297800a5e80290d0285e80297800a0509d0143d4014bc005","0xf68052f0014f59ec00e0d00a1ec00a5e002814238050f58052f0014bd1ea","0xbc0051f201408814028014bc005028014398143dc014bc0053da01495814","0xbb00507a0507f8052f00147f805264050038052f0014038052000507c805","0x38143dc5d87f8071f20500b0053dc014bc0053dc014260142ec014bc005","0x28730287bc0297800a4640292b028050bc00502c014d88140285e002814","0xa00700a5e00280700a4000a0f900a5e0028f900a0440a01400a5e002814","0x297800a7bc0284c0285d80297800a5d80283d0283fc0297800a3fc02932","0xa17800a16002968028050bc00502801c0a1ef2ec3fc038f9028058029ef","0xa1f000a5e0028141fe0500a17800a08c02905028050bc0052ea01419814","0x297800a7c4f8007232050f88052f0014f880521a050f88052f00140a036","0x29f500a4ac0a1f500a5e0029f23e801c1a0143e8014bc0050284700a1f2","0x29000280840297800a084028110280500297800a050028730287d802978","0xa17600a5e00297600a0f40a02600a5e00282600a4c80a00700a5e002807","0xa0142f00140a0070287d8bb02600e0840a01600a7d80297800a7d80284c","0xa0052f00140a0050e6050fb8052f0014158052560500a17800a08c02905","0xbc00504c0149901400e014bc00500e01480014042014bc00504201408814","0x1081402c014fb8052f0014fb805098050bb0052f0014bb00507a05013005","0x281100a0cc0a0142f00141180520a0500a17800a050038143ee5d813007","0xbc00540801486814408014bc00502815c0a1fc00a5e0028141fe0500a178","0x119007068051190052f00140a11c0288140297800a810fe00723205102005","0xa01400a5e00281400a1cc0a23400a5e002a3300a4ac0a23300a5e002a05","0x297800a0800293202801c0297800a01c029000280940297800a09402811","0x382502805802a3400a5e002a3400a1300a17600a5e00297600a0f40a020","0x297600a8cc0a17600a5e0028144640500a17800a3dc028450288d0bb020","0x2a36028050bc00502c0151a8140460580397800a04402a3402804402978","0xa02500a5e00282400a3e80a02400a5e00280600a3400a00600a5e002823","0x128052f0014128051e6050100052f0014100051f0050100052f00140a0d3","0x281400e050ba82b0503dd4782a04c0847b97800e0941000700a5d91b814","0x1300507a050108052f001410805264050150052f00141500521a0500a178","0xbc00502801c0a0f900aa402c09500e5e00382a02801ca581404c014bc005","0x7ba9121a4207f8f72f001c1302100e49c0a09500a5e00289500a0440a014","0x290d00a2800a10d00a5e00290d00a4880a0142f00140a0070280d08e119","0xa17800a4c8028a20281041704c07a4c80897800a4ac029240284ac02978","0xa0142f00142080523e0500a17800a0b802871028050bc00507a01491814","0xbc0052a2014528142a21300397800a1300291e0281300297800a13002883","0x2300514e050840052f00148400507a0507f8052f00147f80526405023005","0x2871028050bc0050b0014388140285e00281400e05022005524050bc007","0x2400521a050240052f00140a2930281140297800a0507f8140285e00284c","0x1a014096014bc0050284700a16d00a5e00284808a01c8c814090014bc005","0x297800a254028110285b00297800a1d802a940281d80297800a5b425807","0x296c00a5f00a10800a5e00290800a0f40a0ff00a5e0028ff00a4c80a095","0xa17800a110028a9028050bc00502801c0a16c2103fc4a97600a5b002978","0x296a0a001d4a8142d4014bc0050b0014528140a0014bc00509801452814","0xa02d00aa580a17800e5a4028a70285a40297800a5a40290d0285a402978","0x14c0142cc014bc0050aa0154b8140aa014bc0050280980a0142f00140a007","0x7f8052f00147f8052640504a8052f00144a805022050b28052f0014b3005","0xb29081fe254bb0052ca014bc0052ca014be014210014bc0052100141e814","0x14c8142c6014bc0050283fc0a0142f0014168051520500a17800a05003814","0x2b8052f0014b016300e4640a16000a5e00296000a4340a16000a5e002814","0xbc00506c0154a01406c014bc0050ae5a0038340285a00297800a0508e014","0x8400507a0507f8052f00147f8052640504a8052f00144a80502205019805","0x281400e050199081fe254bb005066014bc005066014be014210014bc005","0x28340ce01c1a0140ce014bc0050284700a0142f00142c0050e20500a178","0x29320282540297800a254028110285740297800a57802a9402857802978","0x295d00a5e00295d00a5f00a11c00a5e00291c00a0f40a11900a5e002919","0x2814474050ae0052f00140a0ff028050bc00502801c0a15d2384644a976","0x88140cc014bc0052b65700391902856c0297800a56c0290d02856c02978","0xab8052f00141300507a050ad0052f0014108052640503a8052f00147c805","0x88140285e00281400e0500a29a00a050108142ac014bc0050cc0148d814","0xab8052f00141580507a050ad0052f0014140052640503a8052f00140a005","0xbc0052ac554038340285540297800a0508e0142ac014bc0052ea0148d814","0xad0052640503a8052f00143a805022050a80052f0014a9805528050a9805","0xbb0052a0014bc0052a0014be0142ae014bc0052ae0141e8142b4014bc005","0xa01100a5e00297600aa700a1761ee01cbc0051ee0154d8142a055cad075","0xa17800a01c0297b028050bc00502801c0a01600aa740a17800e044028a7","0xa00600a5e00281453c050118052f00140a0ff028050bc0051ee0147c814","0x297800a0508e014048014bc00500c08c039190280180297800a0180290d","0xa005264050108052f00141000553e050100052f00141202500e0d00a025","0x7b805042014bc0050420155001400a014bc00500a0141e814028014bc005","0xbc0051ee0154d8140285e00281600a2a40a0142f00140a00702808402814","0xa007028254ba82b1eea881402a00e5e00382600a0507baa10280987b807","0x28f700aa8c0a0f900a5e0028141fe0502c0052f00140a0ff028050bc005","0x2aa60284340297800a42002aa50284200297800a3fc02aa40283fc02978","0xa11c00a5e00291c00aaa00a0142f00148c80554e0508e11900e5e00290d","0x28f90b04707baa90283e40297800a3e40291b0281600297800a1600291b","0x168140285e00293200a1540a03d26401cbc005068014168142560d003978","0x208052f00141e8052cc0500a17800a130028550280b8260072f001495805","0x208280545d955014054014bc005054014990142a2014bc00505c014b3014","0xbc0050280980a0142f00140a0070285b4240451eeaac2204600e5e003951","0x29320285b00297800a1d802aac0281d80297800a12c038072f205025805","0x296c00a5e00296c00aa800a04400a5e00284400a0f40a04600a5e002846","0xbc0050284700a0142f0014038052f60500a17800a050038142d8110230f7","0x29320285a40297800a5a802a9f0285a80297800a5b42800706805028005","0x296900a5e00296900aa800a04800a5e00284800a0f40a04500a5e002845","0x28f700a3e40a0142f0014038052f60500a17800a050038142d2120228f7","0x2a80553e0502a8052f00144a82d00e0d00a02d00a5e0028142380500a178","0x1500142ea014bc0052ea0141e814056014bc005056014990142cc014bc005","0x28060285d80297800a3dc02aad028598ba82b1ee014b30052f0014b3005","0x297800a08c02aaf02808c0b0072f00140881400eab80a01100a5e002976","0x282500aac80a0142f0014120055620501282400e5e00280600aac00a006","0x7d01404c0840397800a08402ab30280840297800a080028d002808002978","0x1582800e5e00282800aad00a02800a5e0028141a6050150052f001413005","0x1580700a5d91b81402c014bc00502c01408814056014bc0050560147c014","0x2c00521a0500a17800a050038142103fc7c8f756a1604a9751ee5e00382a","0x701412a014bc00512a0141e8142ea014bc0052ea014990140b0014bc005","0xa2b7028050bc00502801c0a12b0684707bab62324340397800e1600b007","0xa02800a5e00282800a3e00a03d00a5e00293204201d5c014264014bc005","0x1e82812a5d4bb2370284340297800a434028110280f40297800a0f4028f3","0x284100a4340a0142f00140a007028110231511eeae42082e0983dcbc007","0x380e0280b80297800a0b80283d0281300297800a1300293202810402978","0x8c80725c0500a17800a050038140ec12cb68f7574120228072f001c2090d","0xa16a00a5e00285000aaf00a05000a5e00296c00aaec0a16c00a5e002848","0x297800a0b80283d0281300297800a130029320281140297800a11402811","0xa0142f00140a0070285a81704c08a5d80296a00a5e00296a00aaf40a02e","0x7f8140285e00291900a5400a0142f00143b0052a00500a17800a12c02950","0x8c81405a014bc00505a0148681405a014bc005028af80a16900a5e002814","0x297800a130029320285980297800a5b4028110281540297800a0b4b4807","0x15f8050280840a16000a5e00285500a46c0a16300a5e00282e00a0f40a165","0x2b8052f0014868050220500a17800a46402950028050bc00502801c0a014","0xbc0050880148d81406c014bc00508c0141e8142d0014bc0052a201499014","0xa0142f00141a0052a00500a17800a05003814028b000281404205019805","0x7f8140285e00282800a7ac0a0142f0014108055820500a17800a4ac02950","0x8c8142bc014bc0052bc014868142bc014bc005028af80a06700a5e002814","0x297800a5d4029320285980297800a470028110285740297800a57833807","0xbc0050284700a16000a5e00295d00a46c0a16300a5e00289500a0f40a165","0x28110281980297800a56c02ac202856c0297800a580ae007068050ae005","0xa16300a5e00296300a0f40a16500a5e00296500a4c80a16600a5e002966","0x29eb028050bc00502801c0a0662c6594b317600a1980297800a19802abd","0x293202815c0297800a05802811028050bc005042015608140285e002828","0xa03300a5e00290800a46c0a03600a5e0028ff00a0f40a16800a5e0028f9","0x297800a56802ac20285680297800a0cc3a8070680503a8052f00140a11c","0x283600a0f40a16800a5e00296800a4c80a05700a5e00285700a0440a157","0x281100a2940a15706c5a02b97600a55c0297800a55c02abd0280d802978","0x7bac50280180297800a08c02ac402808c0297800a5d802ac302805802978","0x282502801d5701404a014bc00504a0148681404a0900397800a05803007","0xa02805401cbc00504c0155801404c014bc0050420155781404208003978","0xba8052f0014158051a0050158052f0014140055640500a17800a0a802ab1","0xbc00502834c0a05800a5e00289500a3e80a0952ea01cbc0052ea01559814","0x28730283fc0297800a3fc028f80283fc7c8072f00147c8055680507c805","0xbc0070b03fc7b8052ec8dc0a02000a5e00282000a0440a02400a5e002824","0x297800a4640290d028050bc00502801c0a12b0684707bac6232434840f7","0x8c82000e0380a10d00a5e00290d00a0f40a10800a5e00290800a4c80a119","0x297800a0515b8140285e00281400e0502082e0983dd6383d26401cbc007","0x230051e60507c8052f00147c8051f0050230052f0014a897500eae00a151","0x7b97800e1187c90d2105d91b814264014bc0052640140881408c014bc005","0x240052f00142400521a0500a17800a050038140ec12cb68f759012022844","0x384826401c0701408a014bc00508a0141e814088014bc00508801499014","0xbc0050a00f40392e028050bc00502801c0a02d2d25a87bac90a05b003978","0xb6005022050b28052f0014b3005578050b30052f00142a8055760502a805","0x1e814048014bc00504801439814088014bc005088014990142d8014bc005","0xa16508a0902216c022014b28052f0014b280557a050228052f001422805","0x2950028050bc00505a014a80140285e00296900a5400a0142f00140a007","0xb000521a050b00052f00140a2be02858c0297800a0507f8140285e00283d","0xa16800a5e00296a00a0440a05700a5e0029602c601c8c8142c0014bc005","0x297800a15c0291b0280cc0297800a1140283d0280d80297800a11002932","0x88140285e00283d00a5400a0142f00140a007028051650050280840a067","0xae0052f00142580507a050ae8052f0014b6805264050af0052f001499005","0xa80140285e00281400e0500a2cb00a050108142b6014bc0050ec0148d814","0x29eb028050bc0052ea015608140285e00284100a5400a0142f001417005","0x3a80521a0503a8052f00140a2be0281980297800a0507f8140285e0028f9","0xa16800a5e00284c00a0440a15a00a5e0028750cc01c8c8140ea014bc005","0x297800a5680291b0280cc0297800a4340283d0280d80297800a42002932","0x295600ab080a15600a5e0028672ae01c1a0142ae014bc0050284700a067","0x28730280d80297800a0d8029320285a00297800a5a00281102855402978","0x295500a5e00295500aaf40a03300a5e00283300a0f40a02400a5e002824","0x2ac1028050bc0051f2014f58140285e00281400e050aa8330480d8b4011","0x1e8142ba014bc005238014990142bc014bc005040014088140285e002975","0xa15300a5e002814238050ad8052f001495805236050ae0052f00141a005","0xbc0052bc0140881429c014bc0052a0015610142a0014bc0052b654c03834","0xae00507a050120052f0014120050e6050ae8052f0014ae805264050af005","0x2acc028538ae0242ba5780880529c014bc00529c0155e8142b8014bc005","0x120052f0014bb00559a050030052f00140b00514a0501181600e5e002811","0x28a5028084100072f00140302500e3dd6281404a014bc00504801562014","0x397800a098108201eeb140a02100a5e00282100a4340a02600a5e002823","0x1578142ea0ac0397800a0a00a00755c050140052f00141400521a0501402a","0xa17800a16002ab10283e42c0072f00144a8055600504a8052f0014ba805","0xbc00521001559814210014bc0051fe014680141fe014bc0051f201559014","0x8e0055680508e0052f00140a0d30284640297800a434028fa02843484007","0xa02a00a5e00282a00a1cc0a03400a5e00283400a3e00a03423801cbc005","0x7bace07a4c8958f72f001c8c8341ee014bb2370280ac0297800a0ac02811","0x292b00a4c80a03d00a5e00283d00a4340a0142f00140a0070281041704c","0x1678462a201cbc00707a0ac0380e0284c80297800a4c80283d0284ac02978","0xb690800eae00a16d00a5e00281456e0500a17800a05003814090114220f7","0x8814096014bc00509601479814238014bc0052380147c014096014bc005","0xb50f75a0140b60761ee5e00384b2384c89597646e050a88052f0014a8805","0xbc0050ec014990140a0014bc0050a0014868140285e00281400e05016969","0x7bad12cc1540397800e140a880701c050b60052f0014b600507a0503b005","0x2b8055760502b8052f0014b304600e4b80a0142f00140a007028580b1965","0x990140aa014bc0050aa0140881406c014bc0052d00155e0142d0014bc005","0xb60052f0014b600507a050150052f0014150050e60503b0052f00143b005","0xa0142f00140a0070280d8b602a0ec1540880506c014bc00506c0155e814","0x7f8140285e00284600a5400a0142f0014b00052a00500a17800a58c02950","0x8c8140ce014bc0050ce014868140ce014bc005028af80a03300a5e002814","0x297800a1d8029320285740297800a594028110285780297800a19c19807","0x1690050280840a06600a5e00295e00a46c0a15b00a5e00296c00a0f40a15c","0x3a8052f0014a88050220500a17800a11802950028050bc00502801c0a014","0xbc00505a0148d8142ae014bc0052d20141e8142b4014bc0052d401499014","0xa0142f0014228052a00500a17800a05003814028b4c02814042050ab005","0x7f8140285e00291c00a7ac0a0142f0014840055820500a17800a12002950","0x8c8142a6014bc0052a6014868142a6014bc005028af80a15500a5e002814","0x297800a4ac029320285740297800a110028110285400297800a54caa807","0xbc0050284700a06600a5e00295000a46c0a15b00a5e00293200a0f40a15c","0x281102852c0297800a53002ac20285300297800a198a7007068050a7005","0xa02a00a5e00282a00a1cc0a15c00a5e00295c00a4c80a15d00a5e00295d","0xa595b054570ae81100a52c0297800a52c02abd02856c0297800a56c0283d","0x88140285e00290800ab040a0142f00148e0053d60500a17800a05003814","0xab8052f00141700507a050ad0052f0014260052640503a8052f001415805","0xbc0052ac1c4038340281c40297800a0508e0142ac014bc0050820148d814","0xad0052640503a8052f00143a8050220503b8052f00143980558405039805","0x15e8142ae014bc0052ae0141e814054014bc005054014398142b4014bc005","0x8f01400c014bc0050289400a0772ae0a8ad0750220143b8052f00143b805","0x397800a0180291e0280940297800a090028a5028090088072f001408805","0x290d0280980297800a0841280752a050108052f00141000514a05010006","0xa0142f00140a0070280a802ad40285e00382600a29c0a02600a5e002826","0xba8072f0014158055ac050158052f0014140055aa050140052f00140a067","0xbc00500a01499014028014bc005028014088140285e00297500ab5c0a095","0xa1765b20504a8052f00144a8055b00507b8052f00147b80507a05002805","0xa11900ab68868052f001c840050ea050840ff1f2160bb17800a2547b805","0x9583400e5e00291c00a54c0a11c00a5e00290d00a5680a0142f00140a007","0x2c0f72fc0502603d00e5e00293200a54c0a13204601cbc005046014aa814","0xbc0050280980a0142f00140a007028118a88075b6104170072f001c2612b","0x208055ba050240052f001417005022050228052f0014220055b805022005","0x281400e0500a2df00a05010814096014bc00508a0156f0142da014bc005","0x295100a0440a16c00a5e00287600ab800a07600a5e00281404c0500a178","0x7b97e02812c0297800a5b002ade0285b40297800a11802add02812002978","0x280050220500a17800a0500381405a5a403ae12d41400397800e0f41a048","0x16f0142ca014bc0052da0156e8142cc014bc0052d40156e8140aa014bc005","0x28142fe0500a17800a05003814028b8802814042050b18052f001425805","0xb405700e5e0039602da5a47b97e0285800297800a58002add02858002978","0x168055ba0502a8052f00142b8050220500a17800a050038140660d803ae3","0x108142c6014bc0050960156f0142ca014bc0052d00156e8142cc014bc005","0xbc0050280980a0142f0014258055c80500a17800a05003814028b8802814","0x168055ba0502a8052f00141b005022050af0052f0014338055c005033805","0x870142c6014bc0052bc0156f0142ca014bc0050660156e8142cc014bc005","0xa17800a57402968028050bc00502801c0a15c00ab94ae8052f001cb1805","0x397800a56c02ab30281980297800a5980294c02856c0297800a05173014","0x295700aad00a15700a5e0028141a6050ad0052f00143a8051f40503a95b","0x1738142b4014bc0052b4014798142ac014bc0052ac0147c0142ac55c03978","0xa17800a05003814298538a80f75d054caa8072f001c3315a2ac3fc7c811","0x297800a56c02ae90281c40297800a0515b814296014bc0052ca014a6014","0xab8051f0050aa8052f0014aa805264050398052f00143895b00eae00a15b","0xbc0072961ccab9532aa045738140e6014bc0050e6014798142ae014bc005","0xa08052f00142a8050220500a17800a05003814284510a30f75d45203b807","0xbc0052900141e814104014bc00500e01439814280014bc0050ee01499014","0xa0142f0014088050e20500a17800a05003814028bac0281404205041805","0x388140285e00282300a5580a0142f00140b0050e20500a17800a5d80290f","0xa08600a5e00294400a0f40a08400a5e00294600a4c80a0142f001403005","0x2871028050bc00502801c0a0145d80140a0210282200297800a5080291b","0x118052ac0500a17800a05802871028050bc0052ec014878140285e002811","0x296500a5400a0142f0014ad8055820500a17800a01802871028050bc005","0x294e00a0f40a08400a5e00295000a4c80a0142f0014ab8053d60500a178","0x9f8070680509f8052f00140a11c0282200297800a5300291b02821802978","0xa05500a5e00285500a0440a08d00a5e00288c00abb40a08c00a5e002888","0x297800a2180283d02801c0297800a01c028730282100297800a21002932","0xa17800a0500381411a218038840aa0440288d00a5e00288d00abb80a086","0xa0142f0014bb00521e0500a17800a04402871028050bc0052b8014b4014","0xa80140285e00280600a1c40a0142f0014118052ac0500a17800a05802871","0xa2ef02823c0297800a0507f8140285e00296500a5400a0142f0014b3005","0xa09100a5e00293e11e01c8c81427c014bc00527c0148681427c014bc005","0x297800a4ec02aed0284ec0297800a2449e0070680509e0052f00140a11c","0x280700a1cc0a0f900a5e0028f900a4c80a05500a5e00285500a0440a13a","0x2a81100a4e80297800a4e802aee0283fc0297800a3fc0283d02801c02978","0x297600a43c0a0142f0014088050e20500a17800a050038142743fc038f9","0xbc00500c014388140285e00282300a5580a0142f00140b0050e20500a178","0x28f900a4c80a05800a5e00285800a0440a13800a5e00291900abb40a014","0x2aee0283fc0297800a3fc0283d02801c0297800a01c028730283e402978","0x150051520500a17800a050038142703fc038f90b00440293800a5e002938","0x3b81412e014bc00526a0145281426a0440397800a0440291e028050bc005","0x4d12e00e5e00280e00abc40a00e00a5e00293300abc00a13300a5e002814","0x297800a270028060282700297800a26802af3028050bc00525c01579014","0x868142544a40397800a25c968071eeb140a12d00a5e00292d00a4340a12d","0xbc0052440157a01424449c0397800a4a80a00755c050950052f001495005","0x510055ee0500a17800a49002af6028288920072f0014500055ea05050005","0xa11e23e01cbc00523e0155981423e014bc00524601468014246014bc005","0x538072f001453805568050538052f00140a0d30282940297800a478028fa","0x292700a0440a12900a5e00292900a1cc0a11d00a5e00291d00a3e00a11d","0xa11722c4607baf82342a48d8f72f001c5291d1ee014bb23702849c02978","0xa11b00a5e00291b00a4c80a11a00a5e00291a00a4340a0142f00140a007","0x5a0b115e3dd7c8b917401cbc00723449c0380e0282a40297800a2a40283d","0x568052f00145611f00eae00a0ac00a5e00281456e0500a17800a05003814","0xbc0051740140881415a014bc00515a0147981414e014bc00514e0147c014","0x381421e2f8888f75f444c5d8ae1ee5e0038ad14e2a48d97646e0505d005","0x1e81415c014bc00515c01499014226014bc005226014868140285e002814","0xa10a2163087bafb2184380397800e44c5d00701c0505d8052f00145d805","0x838072f0014848052a60508482300e5e00282300a5540a0142f00140a007","0x7bafd028410830072f0014830055f80508290c00e5e00290c00abf00a106","0x800052a00500a17800a050038141fa3f803afe2003280397800e4108290e","0x17f814194014bc005194014088141f84300397800a43002afc028050bc005","0xa0142f0014838052a00500a17800a05003814028c000a17800e4187e007","0x2afc028050bc00502801c0a0146020140a0210283ec0297800a32802811","0xa0f81a601d810fa1a001cbc00720e358650f75fa0506b0b900e5e0028b9","0x3b8141f6014bc0051a0014088140285e0028fa00a5400a0142f00140a007","0x770072f0014780052a60507802300e5e00282300a5540a0f300a5e002814","0x3b0335c0000397800e394860fb1eebf40a0f100a5e0028f300abc00a0e5","0x297800a6c402adc0286c40297800a050130140285e00281400e050d81af","0x29ea00ab780a1eb00a5e0029ae00ab740a17a00a5e00280000a0440a1ea","0xf68052f00140a026028050bc00502801c0a0146080140a0210287b002978","0xbc0053600156e8142f4014bc00535e014088143dc014bc0053da01570014","0x1829f03de01cbc0071dc2e4bd0f75fa050f60052f0014f70055bc050f5805","0x29f000ab740a1f400a5e0029ef00a0440a0142f00140a0070287c8f8807","0xa0210287dc0297800a7b002ade0287d80297800a7ac02add0287d402978","0xbc0053f80156e8143f8014bc0050285fc0a0142f00140a00702805183005","0xbc00502801c0a23346401d83a0540801cbc0073f87acf88f75fa050fe005","0x2a0500ab740a1f500a5e0029f200ab740a1f400a5e002a0400a0440a014","0xbc00502801c0a01460c0140a0210287dc0297800a7b002ade0287d802978","0x297800a8d002ae00288d00297800a050130140285e0029ec00ab900a014","0x2a3300ab740a1f500a5e0029f200ab740a1f400a5e002a3200a0440a235","0x11b8056108d80297800e7dc0290e0287dc0297800a8d402ade0287d802978","0x11d01100e5e00281100a4780a0142f00151b0052d00500a17800a05003814","0x2a4700abc80a24848e01cbc0051e201578814488014bc00547401452814","0x12800521a051280052f00152500500c051250052f0015240055e60500a178","0x297800a99c0290d02899d330072f0015222502523dd628144a0014bc005","0x2ab30289ac0297800a7d40294c0289a9340072f0015339f400eab80a267","0xa28700a5e0028141a6051430052f0015428051f405142a6a00e5e002a6a","0xbc0054cc01439814510014bc0055100147c014510a1c0397800aa1c02ab4","0x1450072f001d35a865102ec570115ce051340052f00153400502205133005","0x15b8142f8014bc0053ec014a60140285e00281400e0514a29351c3dd84a8c","0x1450052f0015450052640514b8052f00154aa6a00eae00a29500a5e002814","0x143a8c5140457381452e014bc00552e0147981450e014bc00550e0147c014","0x1340050220500a17800a050038142f6a714d8f7614a654c0072f001cbe297","0x1e814104014bc0054cc01439814280014bc00553001499014282014bc005","0x297800aa78028a5028a780b0072f00140b00523c050418052f00154c805","0x15080521a051508052f00155029f00ea540a2a000a5e00280600a2940a29f","0x338140285e00281400e05151805616050bc00754201453814542014bc005","0x153aa600e5e002aa500ab580a2a500a5e002aa400ab540a2a400a5e002814","0x297800a500029320285040297800a50402811028050bc00554c0156b814","0xa01412ecb640a2a700a5e002aa700ab600a08300a5e00288300a0f40a140","0x381455a015862ac00a5e00397900a1d40a179554aa5541762f001553883","0xa2b055e01cbc00555c014a981455c014bc005558014ad0140285e002814","0x1582a81eebf40a2b356401cbc005562014a981456208c0397800a08c02955","0x297800a050130140285e00281400e0515dab800ec355bab400e5e003ab3","0x2ab700ab740a2be00a5e002ab400a0440a2bd00a5e002abc00ab700a2bc","0xbc00502801c0a01461c0140a021028b080297800aaf402ade028b0402978","0xbc00557001408814588014bc00558601570014586014bc0050280980a014","0x15f0f75fa051610052f0015620055bc051608052f00155d8055ba0515f005","0x2ac500a0440a0142f00140a007028b556680761eb31628072f001d592af","0x2ade028b600297800ab0402add028b5c0297800ab3002add028b5802978","0xbc0050285fc0a0142f00140a007028051880050280840a2d900a5e002ac2","0x188add5b801cbc0072fcb05668f75fa050bf0052f0014bf0055ba050bf005","0x2ad500ab740a2d600a5e002adc00a0440a0142f00140a007028b816f007","0xa021028b640297800ab0802ade028b600297800ab7402add028b5c02978","0x297800a050130140285e002ac200ab900a0142f00140a00702805188005","0x2ad500ab740a2d600a5e002ade00a0440a2e400a5e00297f00ab800a17f","0x290e028b640297800ab9002ade028b600297800ab8002add028b5c02978","0xa0142f0015730052d00500a17800a050038145ce015892e600a5e003ad9","0x1748072f001574805566051768052f00156b805298051748052f00140a2e6","0xbc0055e00155a0145e0014bc00502834c0a2ef00a5e002aee00a3e80a2ee","0x8ae7028bbc0297800abbc028f3028bc40297800abc4028f8028bc578007","0xa0142f00140a007028bd97aaf41eec4d79af200e5e003aed5debc5552a9","0x1748052f0015748055d20517e0052f00140a2b7028bdc0297800ab600294c","0x2af000a3e00a2f200a5e002af200a4c80a2fd00a5e002afc5d201d5c014","0x397800ebdd7eaf05e6bc808ae7028bf40297800abf4028f3028bc002978","0xa31900a5e002ad600a0440a0142f00140a007028c618bb161eec558a2ff","0x297800ac500283d028c680297800a208028730286080297800abfc02932","0x388140285e00297600a43c0a0142f00140a0070280518e0050280840a31b","0x2932028050bc005022014388140285e00282300a5580a0142f00140b005","0xa31f00a5e002b1800a46c0a31e00a5e002b1700a0f40a31d00a5e002b16","0xb0050e20500a17800a5d80290f028050bc00502801c0a0146400140a021","0x2ae900ab040a0142f0014088050e20500a17800a08c02956028050bc005","0xbc0055e8014990140285e002af000a7ac0a0142f00156c0052a00500a178","0x28142380518f8052f00157b0052360518f0052f00157a80507a0518e805","0x8814646014bc00564401576814644014bc00563ec8403834028c8402978","0x410052f0014410050e60518e8052f00158e8052640516b0052f00156b005","0x18f08263ab5808805646014bc0056460157701463c014bc00563c0141e814","0xa0142f0014bb00521e0500a17800ab9c02968028050bc00502801c0a323","0xa80140285e00281100a1c40a0142f0014118052ac0500a17800a05802871","0xa314028c900297800a0507f8140285e002ad800a5400a0142f00156b805","0xa32600a5e002b2564801c8c81464a014bc00564a0148681464a014bc005","0x297800aca002aed028ca00297800ac9993807068051938052f00140a11c","0x288200a1cc0a2a900a5e002aa900a4c80a2d600a5e002ad600a0440a329","0x16b01100aca40297800aca402aee028aa80297800aaa80283d02820802978","0x281600a1c40a0142f0014bb00521e0500a17800a05003814652aa8412a9","0xbc00555a015768140285e00281100a1c40a0142f0014118052ac0500a178","0x410050e6051548052f001554805264051540052f00155400502205195005","0x8805654014bc00565401577014554014bc0055540141e814104014bc005","0xb00523c0500a17800aa8c028a9028050bc00502801c0a32a55420954aa8","0x17801465a014bc0050281dc0a32c00a5e002b2b00a2940a32b02c01cbc005","0xa17800acbc02af2028cc1978072f0015970055e2051970052f001596805","0xbc00566401486814664014bc00566201403014662014bc00566001579814","0xa33400a5e002b3400a4340a33466601cbc005658cc8410f758a05199005","0x2b3700abd40a33700a5e002b3600abd00a33666a01cbc00566850403aae","0x28d0028ce80297800ace402af7028050bc0056700157b014672ce003978","0x19e8052f00159e0051f40519e33b00e5e002b3b00aacc0a33b00a5e002b3a","0xbc00567e0147c01467ecf80397800acf802ab4028cf80297800a05069814","0xa017646e0519a8052f00159a805022051998052f0015998050e60519f805","0x868140285e00281400e051a33456883dda1b42682d007b97800ecf59f883","0x1a08052f0015a080507a051a00052f0015a0005264051a10052f0015a1005","0xa0142f00140a007028d31a5b4a1eed25a434700e5e003b4266a01c07014","0x297800acf8028f8028d380297800ad359d807570051a68052f00140a2b7","0x1a0b402ec8dc0a34700a5e002b4700a0440a34e00a5e002b4e00a3cc0a33e","0x290d028050bc00502801c0a3546a6d487bb516a0d3cc20f72f001da733e","0xa34f00a5e002b4f00a0f40a18400a5e00298400a4c80a35000a5e002b50","0x3b8140285e00281400e051acb583063ddabb566aa01cbc0076a0d1c0380e","0x1ae0072f0015ad8052a6051ad82300e5e00282300a5540a35a00a5e002814","0x3b616c0d7c0397800ed75ab3551ee5f80a35e00a5e002b5a00abc00a35d","0x297800ad9002adc028d900297800a050130140285e00281400e051b1b62","0x2b6500ab780a18100a5e002b6000ab740a36600a5e002b5f00a0440a365","0x1b48052f00140a026028050bc00502801c0a0146d00140a021028d9c02978","0xbc0056c60156e8146cc014bc0056c4014088146d4014bc0056d201570014","0x1b636b30001cbc0076b8d21b30f72fc051b38052f0015b50055bc050c0805","0x2b6b00ab740a18500a5e00298000a0440a0142f00140a007028db9b6807","0xa021028dc40297800ad9c02ade028dc00297800a60402add028dbc02978","0xbc0056e60156e8146e6014bc0050285fc0a0142f00140a007028051b9005","0xbc00502801c0a3786ee01dbb3756e801cbc0076e6605b68f72fc051b9805","0x2b7500ab740a36f00a5e002b6e00ab740a18500a5e002b7400a0440a014","0xbc00502801c0a0146e40140a021028dc40297800ad9c02ade028dc002978","0x297800ade402ae0028de40297800a050130140285e002b6700ab900a014","0x2b7800ab740a36f00a5e002b6e00ab740a18500a5e002b7700a0440a37a","0x1be8056f8dec0297800edc40290e028dc40297800ade802ade028dc002978","0x1bf01600e5e00281600a4780a0142f0015bd8052d00500a17800a05003814","0x2b7f00abc80a3806fe01cbc0056bc015788142fa014bc0056fc01452814","0x1c100521a051c10052f0015c080500c051c08052f0015c00055e60500a178","0x297800ae100290d028e11c18072f0014beb826663dd62814704014bc005","0x2ab3028e1c0297800adbc0294c028e19c28072f0015c218500eab80a384","0xa38a00a5e0028141a6051c48052f0015c40051f4051c438600e5e002b86","0xbc00570601439814716014bc0057160147c014716e280397800ae2802ab4","0x1c60072f001dc3b89716d3cc20115ce051c28052f0015c2805022051c1805","0x15b814724014bc0056e0014a60140285e00281400e051c8b9071e3ddc738d","0x1c60052f0015c6005264051ca0052f0015c9b8600eae00a39300a5e002814","0x1c538d71804573814728014bc00572801479814714014bc0057140147c014","0x1c28050220500a17800a05003814734e65cc0f772ee59ca8072f001dc9394","0x1e814634014bc00570601439814304014bc00572a01499014632014bc005","0x18b014738014bc0050283fc0a39b00a5e0028141fe0518d8052f0015cb005","0xbc00573a0158c01473a014bc00530e0158b81430e014bc005046058088f7","0x1d00055500500a17800ae7c02aa7028e81cf8072f0015cf00554c051cf005","0x154814738014bc0057380148d814736014bc0057360148d814740014bc005","0x1d10050aa051d1ba200e5e00298800a0b40a3a131001cbc005738e6dd00f7","0x2966028050bc0057480142a81474ae900397800ae840282d028050bc005","0xbc00774ee998d9822ecaa80a3a700a5e002ba500a5980a3a600a5e002ba3","0xa18b00a5e00281404c0500a17800a0500381475aeb1d58f7754ea5d4007","0xbc0056320140881475e014bc00575c014c101475c014bc0053165d803b19","0x1d480507a0518d0052f00158d0050e6051d40052f0015d40052640518c805","0xa007028ebdd4b1a750c640880575e014bc00575e01577014752014bc005","0x1d6bb000e0d00a3b000a5e0028142380500a17800a5d80290f028050bc005","0x99014632014bc00563201408814318014bc00576201576814762014bc005","0x1d60052f0015d600507a0518d0052f00158d0050e6051d58052f0015d5805","0xa0142f00140a007028631d631a756c6408805318014bc00531801577014","0x388140285e00282300a5580a0142f00140b0050e20500a17800a5d80290f","0xa3b300a5e002b9900a0f40a3b200a5e002b9800a4c80a0142f001408805","0x290f028050bc00502801c0a01476a0140a021028ed00297800ae680291b","0x88050e20500a17800a08c02956028050bc00502c014388140285e002976","0x2b8a00a7ac0a0142f0015b80052a00500a17800ae1802ac1028050bc005","0x1c8805236051d98052f0015c800507a051d90052f0015c78052640500a178","0x17681476e014bc005768ed803834028ed80297800a0508e014768014bc005","0x1d90052f0015d9005264051c28052f0015c2805022051dc0052f0015db805","0xbc00577001577014766014bc0057660141e814706014bc00570601439814","0xa17800adf402968028050bc00502801c0a3b8766e0dd9385022015dc005","0xa0142f00140b0050e20500a17800a5d80290f028050bc0056de014a8014","0x1790140285e002b7000a5400a0142f0014088050e20500a17800a08c02956","0x290d028ee80297800a05177814772014bc0050283fc0a0142f0015af005","0xa3bc00a5e002814238051dd8052f0015dd3b900e4640a3ba00a5e002bba","0xbc00530a0140881477c014bc00577a0157681477a014bc005776ef003834","0x1a780507a051998052f0015998050e6050c20052f0014c2005264050c2805","0xa007028ef9a7b333086140880577c014bc00577c0157701469e014bc005","0x2b4800a5400a0142f0015ac8052a00500a17800ad6002950028050bc005","0xbc005046014ab0140285e00281600a1c40a0142f0014bb00521e0500a178","0x6d0052f00140a2be028efc0297800a0507f8140285e00281100a1c40a014","0x298300a0440a3c000a5e0028da77e01c8c8141b4014bc0051b401486814","0x291b028f0c0297800ad3c0283d028f080297800a61002932028f0402978","0x2b4800a5400a0142f00140a007028051e28050280840a3c400a5e002bc0","0xbc005046014ab0140285e00281600a1c40a0142f0014bb00521e0500a178","0xbc0056a40149901478c014bc00568e014088140285e00281100a1c40a014","0x2814042051e48052f0015aa005236051e40052f0015a980507a051e3805","0xa17800ad3002950028050bc005696014a80140285e00281400e0500a3ca","0xa0142f0014118052ac0500a17800a05802871028050bc0052ec01487814","0x7f8140285e002b3e00a7ac0a0142f00159d8055820500a17800a04402871","0x8c81431e014bc00531e0148681431e014bc005028af80a3cb00a5e002814","0x297800ad0002932028f040297800ad2802811028f300297800a63de5807","0x2bc100a4a40a3c400a5e002bcc00a46c0a3c300a5e002b4100a0f40a3c2","0x28bb028f3c0297800af0c028ae028f380297800af08028ad028f3402978","0x2b3e00a7ac0a0142f00140a007028051e88050280840a3d000a5e002bc4","0xbc005046014ab0140285e00281600a1c40a0142f0014bb00521e0500a178","0x297800acd402811028050bc005676015608140285e00281100a1c40a014","0x2b4600a46c0a3c800a5e002b4500a0f40a3c700a5e002b4400a4c80a3c6","0x28ae028f380297800af1c028ad028f340297800af1802929028f2402978","0x1a0147a4014bc0050284700a3d000a5e002bc900a2ec0a3cf00a5e002bc8","0x297800af3402811028f500297800af4c02aed028f4c0297800af41e9007","0x2bcf00a0f40a33300a5e002b3300a1cc0a3ce00a5e002bce00a4c80a3cd","0x281400e051ea3cf666f39e681100af500297800af5002aee028f3c02978","0xbc00502c014388140285e00297600a43c0a0142f0014088050e20500a178","0x297800aa6c02932028050bc00500c014388140285e00282300a5580a014","0x1ec0050280840a3d700a5e00297b00a46c0a3d600a5e002a9c00a0f40a3d5","0xa0142f0014bb00521e0500a17800a04402871028050bc00502801c0a014","0x1608140285e00280600a1c40a0142f0014118052ac0500a17800a05802871","0x2932028050bc00550e014f58140285e0029f600a5400a0142f001535005","0xa3d700a5e002a9400a46c0a3d600a5e002a9300a0f40a3d500a5e002a8e","0x297800af6802aed028f680297800af5dec807068051ec8052f00140a11c","0x2a6600a1cc0a3d500a5e002bd500a4c80a26800a5e002a6800a0440a3db","0x13401100af6c0297800af6c02aee028f580297800af580283d02899802978","0x281100a1c40a0142f00151b8052d00500a17800a050038147b6f59333d5","0xbc005046014ab0140285e00281600a1c40a0142f0014bb00521e0500a178","0xa17800a7d802950028050bc00500c014388140285e0029f500a5400a014","0xa3dd00a5e002814628051ee0052f00140a0ff028050bc0051e201579014","0x297800a0508e0147bc014bc0057baf7003919028f740297800af740290d","0xfa005022051f08052f0015f00055da051f00052f0015ef3df00e0d00a3df","0x1e814252014bc0052520143981415c014bc00515c014990143e8014bc005","0xa3e11764a4571f4022015f08052f0015f08055dc0505d8052f00145d805","0x290f028050bc005022014388140285e0028f800a5400a0142f00140a007","0x5c8052a00500a17800a08c02956028050bc00502c014388140285e002976","0x28d300a0440a0142f0014860052a00500a17800a01802871028050bc005","0xa17800a3f402950028050bc00502801c0a0147c60140a021028f8802978","0xa0142f00140b0050e20500a17800a5d80290f028050bc00502201438814","0xa80140285e00280600a1c40a0142f00145c8052a00500a17800a08c02956","0x2811028050bc00520e014a80140285e00290600a5400a0142f001486005","0x290d028f940297800a0518d0147c8014bc0050283fc0a3e200a5e0028fe","0xa3e700a5e002814238051f30052f0015f2be400e4640a3e500a5e002be5","0xbc0057c4014088147d2014bc0057d0015768147d0014bc0057ccf9c03834","0x5d80507a050948052f0014948050e6050570052f001457005264051f1005","0xa007028fa45d92915cf88088057d2014bc0057d201577014176014bc005","0x281100a1c40a0142f0014850052a00500a17800a42c02950028050bc005","0xbc005046014ab0140285e00281600a1c40a0142f0014bb00521e0500a178","0x1f50052f00140a0ff028050bc00500c014388140285e0028b900a5400a014","0xbc0057d6fa803919028fac0297800afac0290d028fac0297800a0515f014","0x5d80507a051f70052f001457005264051f68052f001461005022051f6005","0x281400e0500a3f100a050108147e0014bc0057d80148d8147de014bc005","0xbc00502c014388140285e00297600a43c0a0142f0014088050e20500a178","0xa17800a01802871028050bc005172014a80140285e00282300a5580a014","0xbc00517c0141e8147e6014bc005222014990147e4014bc00517401408814","0xa17800a05003814028fd802814042051fa8052f001487805236051fa005","0xa0142f0014088050e20500a17800a2d002950028050bc005162014a8014","0x388140285e00282300a5580a0142f00140b0050e20500a17800a5d80290f","0xa0ff028050bc00514e014f58140285e00291f00ab040a0142f001403005","0x3919028fe00297800afe00290d028fe00297800a0515f0147ee014bc005","0x1f70052f00148d805264051f68052f001457805022051fc8052f0015fc3f7","0xbc0057da014948147e0014bc0057f20148d8147de014bc0051520141e814","0x1f8005176051fe0052f0015f780515c051fd8052f0015f700515a051fd005","0xbc005022014388140285e00281400e0500a3fe00a050108147fa014bc005","0xa17800a08c02956028050bc00502c014388140285e00297600a43c0a014","0xa0142f00148f8055820500a17800a01802871028050bc00514e014f5814","0x297800a4580283d028fcc0297800a46002932028fc80297800a49c02811","0x2bf300a2b40a3fa00a5e002bf200a4a40a3f500a5e00291700a46c0a3f4","0xa11c028ff40297800afd4028bb028ff00297800afd0028ae028fec02978","0xa40100a5e002c0000abb40a40000a5e002bfd7fe01c1a0147fe014bc005","0x297800a4a402873028fec0297800afec02932028fe80297800afe802811","0x94bfb7f404402c0100a5e002c0100abb80a3fc00a5e002bfc00a0f40a129","0x281400e050130210403de010250480187b97800e3dc0280724e05200bfc","0x15005248050150052f001412805140050128052f0014128052440500a178","0xa17800a0ac02923028050bc005050014510140b0254ba82b050044bc005","0xa0052f00140a0050220500a17800a1600291f028050bc00512a01438814","0xbc0050480141e81400e014bc00500e0143981400c014bc00500c01499014","0x28830283e40297800a3e4028830283e4088072f00140880523c05012005","0x7f8052f00147f80522c0507f82300e5e00282300a5540a17500a5e002975","0x28ba0280d08e11921a4200897800a3fcba8f92ec090038060280198d814","0x88072f00140880523c0500a17800a050038142640160192b00a5e003834","0xa0070280b802c040285e00384c00a29c0a04c00a5e00283d00a2940a03d","0x281100a1c40a0142f00140b0050e20500a17800a08c02956028050bc005","0x297800a0508e814082014bc0050283fc0a0142f0014958051720500a178","0x84005022050230052f0014a884100e4640a15100a5e00295100a4340a151","0x1e814090014bc0052320143981408a014bc00521a01499014088014bc005","0x381402901402814042050258052f001423005236050b68052f00148e005","0x528140ec0580397800a0580291e028050bc00505c014548140285e002814","0xa17800a050038140a0016030142f001cb600514e050b60052f00143b005","0xa0142f0014088050e20500a17800a05802871028050bc005046014ab014","0x868142d2014bc0050284680a16a00a5e0028141fe0500a17800a4ac028b9","0x297800a420028110280b40297800a5a4b5007232050b48052f0014b4805","0x291c00a0f40a04800a5e00291900a1cc0a04500a5e00290d00a4c80a044","0xbc00502801c0a01480a0140a02102812c0297800a0b40291b0285b402978","0x296600a5a00a1660aa01cbc0052560158e8140285e00285000a2a40a014","0x8c8050e6050868052f001486805264050840052f0014840050220500a178","0x41814022014bc00502201441814238014bc0052380141e814232014bc005","0x2a91c2324348400622e050118052f00141180522c0500b0052f00140b005","0x1980580e0d80297800e5a0028ba0285a02b9602c65940897800a08c0b011","0xa17800a57802968028578338072f00141b00563a0500a17800a05003814","0xbc0052b819c03b1e0285700297800a57402ae00285740297800a05013014","0xb1805264050b28052f0014b2805022050330052f0014ad80563e050ad805","0x1908140ae014bc0050ae0141e8142c0014bc0052c0014398142c6014bc005","0x28b1028050bc00502801c0a0660ae580b1965022014330052f001433005","0xa04400a5e00296500a0440a0142f00143a805168050ad07500e5e002833","0x297800a15c0283d0281200297800a580028730281140297800a58c02932","0x284b2ae01c1a0142ae014bc0050284700a04b00a5e00295a00a46c0a16d","0x29320281100297800a110028110285540297800a55802b2202855802978","0xa16d00a5e00296d00a0f40a04800a5e00284800a1cc0a04500a5e002845","0xab0140285e00281400e050aa96d0901142201100a5540297800a55402b21","0x2b22028050bc005022014388140285e00281600a1c40a0142f001411805","0xa10d00a5e00290d00a4c80a10800a5e00290800a0440a15300a5e002932","0x297800a54c02b210284700297800a4700283d0284640297800a46402873","0xa0142f0014088050e20500a17800a050038142a64708c90d21004402953","0x8e0140285e00297600a43c0a0142f0014118052ac0500a17800a05802871","0xa60052f0014a7005644050a70052f00141315000e0d00a15000a5e002814","0xbc00500e01439814040014bc00504001499014028014bc00502801408814","0x10014022014a60052f0014a6005642050108052f00141080507a05003805","0x53814048014bc00500c0145281400c0440397800a0440291e02853010807","0xa0142f0014bb00521e0500a17800a0500381404a016040142f001c12005","0x7f8140285e00281100a1c40a0142f00140b0050e20500a17800a08c02956","0x8c814042014bc00504201486814042014bc005028c8c0a02000a5e002814","0x297800a09815007068050150052f00140a11c0280980297800a08410007","0x280500a4c80a01400a5e00281400a0440a02b00a5e00282800abb40a028","0x2aee0283dc0297800a3dc0283d02801c0297800a01c0287302801402978","0x128051520500a17800a050038140563dc038050280440282b00a5e00282b","0x5381412a014bc0052ea014528142ea0580397800a0580291e028050bc005","0xa0142f0014bb00521e0500a17800a050038140b0016048142f001c4a805","0x7f8140285e00281100a1c40a0142f00140b0050e20500a17800a08c02956","0x8c8141fe014bc0051fe014868141fe014bc005028c900a0f900a5e002814","0x297800a42086807068050868052f00140a11c0284200297800a3fc7c807","0x280500a4c80a01400a5e00281400a0440a11c00a5e00291900abb40a119","0x2aee0283dc0297800a3dc0283d02801c0297800a01c0287302801402978","0x2c0051520500a17800a050038142383dc038050280440291c00a5e00291c","0x43014256014bc005068014528140680440397800a0440291e028050bc005","0x1704c00e5e00283d00ac980a03d00a5e00293200ac940a13200a5e002814","0x297800a104028060281040297800a0b802b28028050bc00509801593814","0x8f0140881180397800a4aca88071eeb140a15100a5e00295100a4340a151","0x297800a1100290d0281200297800a114028a50281140b0072f00140b005","0x157014096014bc005096014868140965b40397800a120220461eeb140a044","0x285000a54c0a05004601cbc005046014aa8142d81d80397800a12c0a007","0xa0552d801cbc0052d80155981405a014bc0052d4014a60142d25a803978","0xb28072f0014b2805568050b28052f00140a0d30285980297800a154028fa","0x287600a0440a16d00a5e00296d00a1cc0a16300a5e00296300a3e00a163","0xa03306c5a07bc0a0ae5800397800e0b4b31631ee01408ae70281d802978","0x15c0142bc014bc005028adc0a06700a5e00296900a5300a0142f00140a007","0x297800a594028f80285800297800a580029320285740297800a578b6007","0xad95c00e5e0038672ba5942b960022b9c0a15d00a5e00295d00a3cc0a165","0x28141fe050ab8052f00140a0ff028050bc00502801c0a15a0ea1987bc0b","0xa15300a5e00295500aca80a15500a5e00282302c0447bb2902855802978","0xbc00529c015538142985380397800a54002aa60285400297800a54c02b18","0x295600a46c0a15700a5e00295700a46c0a14c00a5e00294c00aaa00a014","0x398072f0014a580505a0503894b00e5e0029562ae5307baa902855802978","0x294800a1540a14629001cbc0050e2014168140285e00287300a1540a077","0xae005264050a10052f0014a30052cc050a20052f00143b8052cc0500a178","0xa0841062087bc0c2805040397800e508a215b2b85d9550142b8014bc005","0xa08800a5e0028862ec01d8c81410c014bc0050280980a0142f00140a007","0x297800a504029320281d80297800a1d8028110284fc0297800a22002982","0x293f00abb80a14000a5e00294000a0f40a16d00a5e00296d00a1cc0a141","0xbc0052ec014878140285e00281400e0509f9402da5043b01100a4fc02978","0x288d00abb40a08d00a5e00288411801c1a014118014bc0050284700a014","0x28730282080297800a208029320281d80297800a1d80281102823c02978","0x288f00a5e00288f00abb80a08300a5e00288300a0f40a16d00a5e00296d","0x2956028050bc0052ec014878140285e00281400e050478832da2083b011","0x330052640500a17800a04402871028050bc00502c014388140285e002823","0x10814278014bc0052b40148d814122014bc0050ea0141e81427c014bc005","0x282300a5580a0142f0014bb00521e0500a17800a0500381402903402814","0xbc0052d8015608140285e00281100a1c40a0142f00140b0050e20500a178","0x297800a5a002932028050bc0052ca014f58140285e00296900a5400a014","0xbc0050284700a13c00a5e00283300a46c0a09100a5e00283600a0f40a13e","0x28110284e00297800a4e802aed0284e80297800a4f09d8070680509d805","0xa16d00a5e00296d00a1cc0a13e00a5e00293e00a4c80a07600a5e002876","0x9c0912da4f83b01100a4e00297800a4e002aee0282440297800a2440283d","0x2ab4028050bc0050285d40a0142f00140a10602808c0297800a05195814","0x120061ee014bb237028090088072f0014088056580500317600e5e002976","0x282100a4340a0142f00140a0070280a0150261ef0381082004a3dcbc007","0x3b2d0280800297800a0800283d0280940297800a0940293202808402978","0x297800a051970140285e00281400e0504a80581e5d4158072f001c10814","0xa0161fe3e47b97800a160ba82b1eecc00a05800a5e00285800acbc0a058","0x297800a0508601421a014bc005210015988142100440397800a04402b2c","0x283400a4340a03423201cbc00523201599814238014bc005028cc80a119","0x959762f00148e03421a01cbb3340284700297800a4700290d0280d002978","0x293200a4340a0142f00142600523e0500a17800a0f40291f0281301e932","0x19b0142a2014bc005028cd40a04105c01cbc0052643e403aae0284c802978","0xa02500a5e00282500a4c80a02e00a5e00282e00a0440a04600a5e002814","0x397800a5d802ab40280800297800a0800283d0284ac0297800a4ac02900","0x2300566e050208052f0014208055d2050220052f0014220051f005022176","0x19c014232014bc00523201486814022014bc0050220147981408c014bc005","0x297800a058118076720507f8052f00147f8051f0050a88052f0014a8805","0x2596d0901140897800a3fca8919022118208440404ac1282e040ce80a016","0xb60056780500a17800a050038140a00160816c00a5e00387600acec0a076","0xbc00505a0148f8140285e00296900a7ac0a1652cc154169692d4058bc005","0xb18052d00500a17800a050038142c00160896300a5e00396500acf40a014","0xbc00502c0155a0140285e0028142ec0502b8052f00140a0d3028050bc005","0x3ab8028050bc00502801c0a014824050bc0070ae5a003b3e0285a00b007","0x38362ec12c2417646e0501b0052f00141b0051e60501b0052f0014b3055","0xbc005066014990140285e00281400e050ad95c2ba3de0995e0ce0cc7b978","0xaf00521a050ad0052f00140b0051f00503a8052f00143380507a05033005","0xa17800a050ba8140285e00281400e0500a41400a050108142ae014bc005","0xab0052f0014ad8056800500a17800a5a802b3f028050bc00502c014f5814","0xbc00508a014088142a6014bc0052aa015a10142aa014bc0052ac015a0814","0xae00507a050b68052f0014b6805200050ae8052f0014ae80526405022805","0xa00702854cae16d2ba114088052a6014bc0052a6015a20142b8014bc005","0x296600ad140a0142f0014bb0053d60500a17800a058029eb028050bc005","0x297800a050698142a0014bc0050284300a0142f00142a8055820500a178","0x294e00a3e00a07500a5e00284b00a0f40a06600a5e00284800a4c80a14e","0xab96a1eed180a0142f00140a17502855c0297800a5400290d02856802978","0xa07100a5e00294b00ad040a14b00a5e00294c00ad1c0a14c00a5e00295a","0x297800a198029320281140297800a114028110281cc0297800a1c402b42","0x287300ad100a07500a5e00287500a0f40a16d00a5e00296d00a4000a066","0xbc00502c014f58140285e00281400e050398752da1982281100a1cc02978","0xa17800a59802b45028050bc0052ec014f58140285e00296a00acfc0a014","0x297800a1dc02b410281dc0297800a58002b40028050bc0050aa01560814","0x284800a4c80a04500a5e00284500a0440a14600a5e00294800ad080a148","0x2b4402812c0297800a12c0283d0285b40297800a5b40290002812002978","0xb0053d60500a17800a0500381428c12cb684808a0440294600a5e002946","0x22805022050a20052f0014280056900500a17800a5d8029eb028050bc005","0x1e8142da014bc0052da01480014090014bc0050900149901408a014bc005","0xa1440965b424045022014a20052f0014a2005688050258052f001425805","0x2b4b028050bc005022015a50140285e00297600a7ac0a0142f00140a007","0xa080521a050a08052f00140a34c0285080297800a0507f8140285e002823","0xa08200a5e00294000ad000a14000a5e00294128401c8c814282014bc005","0x297800a254028110282100297800a20c02b4202820c0297800a20802b41","0x282000a0f40a00700a5e00280700a4000a02500a5e00282500a4c80a095","0x281400e0504202000e0944a81100a2100297800a21002b4402808002978","0xbc005046015a58140285e00281100ad280a0142f0014bb0053d60500a178","0x288800ad080a08800a5e00288600ad040a08600a5e00282800ad000a014","0x29000280980297800a098029320280500297800a050028110284fc02978","0x293f00a5e00293f00ad100a02a00a5e00282a00a0f40a00700a5e002807","0x897600e5e00380502801c028140285e0028142ea0509f82a00e0980a011","0x28142ec050030052f00140380569a0500a17800a0500381404605803c15","0x1000582c094120072f001c0300569c050bb0052f0014bb0050220500a178","0x130052f00141200569e050108052f0014128053080500a17800a05003814","0x130140285e00281400e0500a41700a05010814054014bc005042015a8014","0xa02600a5e00282000ad3c0a02b00a5e00282800ad480a02800a5e002814","0x281400e0504a8058305d40297800e0a802b530280a80297800a0ac02b50","0xbc0050b0015aa8140b0014bc0052ea015aa0140285e0028142ea0500a178","0x7b8072320507f8052f00147f80521a0507f8052f00147c8056ac0507c805","0xa17600a5e00297600a0440a10d00a5e00282600a7bc0a10800a5e0028ff","0x297800a4200291b0284340297800a434029f00280440297800a04402932","0xa0070280d08e1191ee0141a11c2323dcbc005210434089762ec7c40a108","0xbc00504c014fa8140285e00289500a5a00a0142f00140a175028050bc005","0x293200ad600a13200a5e00292b1ee01cc1814256014bc0050280980a014","0x2b590280440297800a044029320285d80297800a5d8028110280f402978","0xbc0051ee0142a8140285e00281400e0501e8112ec3dc0283d00a5e00283d","0x170052f00140a0570281300297800a0507f8140285e00280700ad680a014","0xbc0050284700a04100a5e00282e09801c8c81405c014bc00505c01486814","0x28110281100297800a11802b5b0281180297800a104a8807068050a8805","0x284400a5e00284400ad640a02300a5e00282300a4c80a01600a5e002816","0x2b5d0280580297800a04402b5c0280440297800a0511901408808c0b0f7","0xa02400a5e00280600ad7c0a0142f0014118056bc0500302300e5e002816","0x108052f00140a0d30280800297800a094028fa0280940297800a090028d0","0x1080700a5d91b814040014bc00504001479814042014bc0050420147c014","0x1400521a0500a17800a0500381412a5d4158f78320a0150261ee5e003820","0xa5814054014bc0050540141e81404c014bc00504c01499014050014bc005","0xbc0050288c80a0142f00140a0070283fc02c1a1f21600397800e0a00a007","0x28fa0284640297800a434028a5028434bb0072f0014bb00523c05084005","0x79814068014bc0050680147c014068014bc00502834c0a11c00a5e002908","0x8c91c0680a8130115ce0502c0052f00142c0050220508e0052f00148e005","0x297800a0507f8140285e00281400e0501704c07a3de0d93225601cbc007","0x284600ad880a04600a5e0029761f201db00142a2014bc0050283fc0a041","0x1538142da1200397800a11402aa60281140297800a11002b6302811002978","0xa04100a5e00284100a46c0a16d00a5e00296d00aaa00a0142f001424005","0x2580505a0503b04b00e5e0029510825b47baa90285440297800a5440291b","0xa1692d401cbc0050ec014168140285e00296c00a1540a0502d801cbc005","0x2a8052f0014b48052cc050168052f0014280052cc0500a17800a5a802855","0x7bc1c2ca5980397800e154169322565d955014256014bc00525601499014","0x29681ee01db20142d0014bc0050280980a0142f00140a00702815cb0163","0x29320281600297800a160028110280cc0297800a0d802b650280d802978","0x283300a5e00283300ad980a16500a5e00296500a0f40a16600a5e002966","0x28142380500a17800a3dc02845028050bc00502801c0a0332ca5982c176","0x88142ba014bc0052bc014c08142bc014bc0050ae19c0383402819c02978","0xb00052f0014b000507a050b18052f0014b18052640502c0052f00142c005","0x228140285e00281400e050ae9602c6160bb0052ba014bc0052ba015b3014","0xa11c028050bc0051f2014388140285e00297600a1c40a0142f00147b805","0xa06600a5e00295b00a6040a15b00a5e00282e2b801c1a0142b8014bc005","0x297800a1300283d0280f40297800a0f4029320281600297800a16002811","0xa0142f00140a0070281982603d0b05d80286600a5e00286600ad980a04c","0x11d0140ea014bc0050283fc0a0142f0014bb0050e20500a17800a3dc02845","0xab8052f0014ad07500e4640a15a00a5e00295a00a4340a15a00a5e002814","0xbc0050540141e8142aa014bc00504c014990142ac014bc0051fe01408814","0xa17800a0500381402907402814042050a80052f0014ab805236050a9805","0xab0052f00140a0050220500a17800a5d802871028050bc0051ee01422814","0xbc00512a0148d8142a6014bc0052ea0141e8142aa014bc00505601499014","0xa6005302050a60052f0014a814e00e0d00a14e00a5e002814238050a8005","0x1e8142aa014bc0052aa014990142ac014bc0052ac01408814296014bc005","0xba81429654caa9562ec014a58052f0014a58056cc050a98052f0014a9805","0x20f0112ec01cbc0071ee0140b0141ee014bc00500e0147b8140285e002814","0xbc0052ec01412814046014bc0050220149c0140285e00281400e0500b005","0xa17800a0500381402907c02814042050120052f00141180526a05003005","0x297800a058028250280800297800a094028970280940297800a05013014","0x381404c0161002100a5e00382400a4cc0a02400a5e00282000a4d40a006","0x29660280a00297800a0519a814054014bc005042014118140285e002814","0xa01400a5e00281400a0440a17500a5e00282a00a0180a02b00a5e002806","0x297800a0a002b380280ac0297800a0ac02a660280140297800a01402932","0x2c0951ee5e0029750500ac02814022d9c0a17500a5e00297500a4340a028","0x7f8056d40500a17800a05003814210016108ff00a5e0038f900ada40a0f9","0xa03400a5e00289500a0440a11c00a5e00290d00a3dc0a11921a01cbc005","0x297800a464029800284c80297800a470028250284ac0297800a16002932","0xa04c00a5e00290800adac0a0142f00140a007028052110050280840a03d","0x297800a13002b6d0281600297800a160029320282540297800a25402811","0xa026028050bc00504c014b40140285e00281400e0502605812a3dc0284c","0x99014068014bc00502801408814082014bc00505c015b701405c014bc005","0x1e8052f001420805300050990052f00140300504a050958052f001402805","0xbc0050285d80a0142f00140a00702811802c232a2014bc00707a014c2814","0x2823028050bc00502801c0a04800b0902284400e5e00393200a0580a014","0xa07600a5e00284b00a0900a04b00a5e00296d00a0180a16d00a5e002845","0xa01484a0140a0210281400297800a1d8028200285b00297800a11002825","0x128142d2014bc0052d4014150142d4014bc0050280980a0142f00140a007","0x168052f001c28005050050280052f0014b4805040050b60052f001424005","0xa16300b09cb296600e5e00396c00a0580a0142f00140a00702815402c26","0xa05700a5e00296600a0940a16000a5e00296500a4e00a0142f00140a007","0xa026028050bc00502801c0a0148500140a0210285a00297800a58002935","0x9a8140ae014bc0052c601412814066014bc00506c0144b81406c014bc005","0xaf0052f001cb4005266050338052f00142b8052cc050b40052f001419805","0x295c00a0180a15c00a5e00295e00a08c0a0142f00140a00702857402c29","0x2150750cc01cbc0072b60d003b2d02856c0297800a56c0290d02856c02978","0xbc0050ea0b4a88f768c0500a17800a050ba8140285e00281400e050ad005","0x2b710285540297800a558338076e0050ab0052f0014ab8056de050ab805","0xa12b00a5e00292b00a4c80a06600a5e00286600a0440a15300a5e002955","0xa880567e0500a17800a050038142a64ac330f700a54c0297800a54c02b6d","0x2814042050a80052f0014ad0050220500a17800a0b40291f028050bc005","0xa17800a54402b3f028050bc0052ba014b40140285e00281400e0500a42b","0xa0142f00140a1750285400297800a0d002811028050bc00505a0148f814","0x297800a530338076e0050a60052f0014a70056e6050a70052f00140a026","0x287100adb40a12b00a5e00292b00a4c80a07100a5e00294b00adc40a14b","0x19f8140285e0028142ea0500a17800a050038140e24aca80f700a1c402978","0xa07700a5e00285500adcc0a07300a5e00296c00a5980a0142f0014a8805","0xbc0050680140881428c014bc005290015b8814290014bc0050ee1cc03b70","0x958341ee014a30052f0014a30056da050958052f0014958052640501a005","0x297800a11802b730285100297800a4c802966028050bc00502801c0a146","0x1a005022050a00052f0014a08056e2050a08052f0014a114400edc00a142","0x7b805280014bc005280015b6814256014bc00525601499014068014bc005","0xa0fe028098108201ee5e00281100add00a0142f00140a17502850095834","0x28110280ac0297800a05069814050014bc0050540147d014054014bc005","0xa0f700a5e0028f700a4000a00500a5e00280500a4c80a01400a5e002814","0x297800a0a0028f30280ac0297800a0ac028f80285d80297800a5d80283d","0x897800a0581402b2ec3dc02814046dd40a01600a5e00281600aa180a028","0x868058584200297800e3fc02b77028050bc0050285d80a0ff1f21604a975","0x8e0052f001c8c80567a0508c8052f0014840056f00500a17800a05003814","0x297800a050fe0140285e00291c00a5a00a0142f00140a0070280d002c2d","0xbc0052ea0140881407a014bc00502834c0a13200a5e00292b00a3e80a12b","0x7c80507a0502c0052f00142c0052000504a8052f00144a805264050ba805","0x143014264014bc0052640147981407a014bc00507a0147c0141f2014bc005","0x2082e098044bc0050464c81e8f90b0254ba8236ea050118052f001411805","0xa00702811402c2e088014bc00708c015bb8140285e0028142ec05023151","0x2580585e5b40297800e12002b3d0281200297800a11002b78028050bc005","0xa04c00a5e00284c00a0440a0142f0014b68052d00500a17800a05003814","0x297800a094028830285440297800a5440283d0280b80297800a0b802932","0xbc0072d4015240142d4140b60762ec5e0028250425441704c02291c0a025","0x528140aa0900397800a0900291e028050bc00502801c0a02d00b0c0b4805","0xa17800a050038142ca016188142f001cb300514e050b30052f00142a805","0xa0142f0014030052ac0500a17800a5a402a4a028050bc00504c014bd814","0x1bc8142c6014bc0050283fc0a0142f00141000521e0500a17800a09002871","0x2b8052f0014b016300e4640a16000a5e00296000a4340a16000a5e002814","0xbc00500e0143981406c014bc0052d8014990142d0014bc0050ec01408814","0x2814042050af0052f00142b805236050338052f00142800507a05019805","0xae8052f00140a250028050bc0052ca014548140285e00281400e0500a432","0xbc00500e014398142d8014bc0052d8014990140ec014bc0050ec01408814","0x12005106050ae8052f0014ae805106050280052f00142800507a05003805","0x1215d0401400396c0ec0188b81400c014bc00500c0148b014048014bc005","0x38142ac0161995700a5e00395a00a2e80a15a0ea198ad95c0225e002806","0x296802854caa8072f0014b48056f40500a17800a050ba8140285e002814","0x1428140285e00294e00a5a00a14e2a001cbc0052ae0158e8140285e002953","0xbc00529653003b7b02852c0297800a05013014298014bc00504c554a80f7","0xad805264050ae0052f0014ae005022050398052f0014388056fa05038805","0x1e814082014bc005082014800140cc014bc0050cc014398142b6014bc005","0x39875082198ad95c02c014398052f0014398056fc0503a8052f00143a805","0x588140285e00296900a9280a0142f0014130052f60500a17800a05003814","0xb40052f0014ae0050220500a17800a1dc028b40285203b8072f0014ab005","0xbc0050ea0141e814066014bc0050cc0143981406c014bc0052b601499014","0x297800a0508e0140285e0028142ea050af0052f0014a400523605033805","0xb4005022050a10052f0014a20052fa050a20052f0014af14600e0d00a146","0x80014066014bc0050660143981406c014bc00506c014990142d0014bc005","0xa10052f0014a10056fc050338052f00143380507a050208052f001420805","0xbd8140285e0028142ea0500a17800a0500381428419c2083306c5a00b005","0x2871028050bc00500c014ab0140285e00282000a43c0a0142f001413005","0x990140ec014bc0050ec01408814282014bc00505a014be8140285e002824","0x208052f001420805200050038052f0014038050e6050b60052f0014b6005","0x208072d81d80b005282014bc005282015bf0140a0014bc0050a00141e814","0xa17800a0800290f028050bc005048014388140285e00281400e050a0850","0xa0142f0014128050e20500a17800a0980297b028050bc00500c014ab014","0x38140290d002814042050a00052f0014258052360500a17800a08402845","0x30052ac0500a17800a0800290f028050bc005048014388140285e002814","0x282100a1140a0142f0014128050e20500a17800a0980297b028050bc005","0x418052360500a17800a208028b402820c410072f0014228051620500a178","0x17005264050420052f0014260050220500a17800a050ba814280014bc005","0x8d81427e014bc0052a20141e814110014bc0050820148001410c014bc005","0x120050e20500a17800a050038140290d402814042050460052f0014a0005","0x280600a5580a0142f00141080508a0500a17800a0800290f028050bc005","0xbc005046014d88140285e00282500a1c40a0142f0014130052f60500a178","0xa0142f00140a0070280521b0050280840a08d00a5e00283400a46c0a014","0xab0140285e00282100a1140a0142f00141000521e0500a17800a09002871","0x29b1028050bc00504a014388140285e00282600a5ec0a0142f001403005","0x8d8140285e00288f00a2d00a13e11e01cbc00521a014588140285e002823","0x99014108014bc0052ea014088140285e0028142ea050468052f00149f005","0x9f8052f00147c80507a050440052f00142c005200050430052f00144a805","0xbc005118244038340282440297800a0508e014118014bc00511a0148d814","0x43005264050420052f0014420050220509d8052f00149e0052fa0509e005","0x1e814110014bc0051100148001400e014bc00500e0143981410c014bc005","0x9d93f11001c4308402c0149d8052f00149d8056fc0509f8052f00149f805","0x1c00140285e00281400e050088058705d802c371ee014bc0f7028015bf814","0x38052f001403805236050028052f0014028052360507b8052f00147b805","0xa0142f00140a00702808c0b00700a08c0b0072f0014038051ee3ddc0814","0x297800a051c18140285e00281400e050120058720180297800e5d802b82","0x3005708050100052f00141280500e4640a02500a5e00282500a4340a025","0xa0142f0014150050e20501502600e5e00282100ae140a02100c01cbc005","0xbc005056080039190280ac0297800a0a0028a50280a00297800a09802b86","0x2c00570c0500a17800a254028710281604a8072f00140300570a050ba805","0xa10800a5e0028ff2ea01c8c8141fe014bc0051f2014528141f2014bc005","0xa00702801c8400700a01c0297800a01c0291b0284200297800a4200291b","0x2807232050868052f00148680521a050868052f00140a387028050bc005","0x1a0072f00148e0057120508e02400e5e00282400ae200a11900a5e00290d","0xbc00526401452814264014bc005068015c30140285e00292b00a1c40a12b","0x388140820b80397800a09002b890281300297800a0f48c8072320501e805","0xa04600a5e00295100a2940a15100a5e00284100ae180a0142f001417005","0xbc00500e0148d814088014bc0050880148d814088014bc00508c13003919","0x381408a014bc005022015c50140285e00281400e0500384400e01403805","0x39190281200297800a1200290d0281200297800a051c58140285e002814","0x3b0052f00142580571a050258052f001422805718050b68052f001424005","0x296d00a46c0a05000a5e00296c00e01c8c8142d8014bc0050ec0154e014","0x297800a3dc02b8f028140b680700a1400297800a1400291b0285b402978","0x2af402808c0b0072f00140881400eab80a01100a5e00297600a0180a176","0xa0142f0014120055ec0501282400e5e00280600abd40a00600a5e002823","0x397800a08402ab30280840297800a080028d00280800297800a09402af7","0x282800aad00a02800a5e0028141a6050150052f0014130051f405013021","0x11b81402c014bc00502c01408814056014bc0050560147c0140560a003978","0xa17800a050038142103fc7c8f78741604a9751ee5e00382a05601c02976","0xbc00512a0141e8142ea014bc0052ea014990140b0014bc0050b001486814","0xbc00502801c0a12b0684707bc3b2324340397800e1600b00701c0504a805","0x282800a3e00a03d00a5e00293204201d5c014264014bc005028adc0a014","0xbb2370284340297800a434028110280f40297800a0f4028f30280a002978","0xa0142f00140a007028110231511ef0f02082e0983dcbc00707a0a04a975","0x297800a0b80283d0281300297800a130029320281040297800a1040290d","0xa17800a050038140ec12cb68f787a120228072f001c2090d00e0380a02e","0x285000aaf00a05000a5e00296c00aaec0a16c00a5e00284823201c97014","0x283d0281300297800a130029320281140297800a114028110285a802978","0xa0070285a81704c08a5d80296a00a5e00296a00aaf40a02e00a5e00282e","0x291900a5400a0142f00143b0052a00500a17800a12c02950028050bc005","0xbc00505a0148681405a014bc005028af80a16900a5e0028141fe0500a178","0x29320285980297800a5b4028110281540297800a0b4b480723205016805","0xa16000a5e00285500a46c0a16300a5e00282e00a0f40a16500a5e00284c","0x868050220500a17800a46402950028050bc00502801c0a01487c0140a021","0x8d81406c014bc00508c0141e8142d0014bc0052a2014990140ae014bc005","0x1a0052a00500a17800a050038140290fc02814042050198052f001422005","0x282800a7ac0a0142f0014108055820500a17800a4ac02950028050bc005","0xbc0052bc014868142bc014bc005028af80a06700a5e0028141fe0500a178","0x29320285980297800a470028110285740297800a57833807232050af005","0xa16000a5e00295d00a46c0a16300a5e00289500a0f40a16500a5e002975","0x297800a56c02ac202856c0297800a580ae007068050ae0052f00140a11c","0x296300a0f40a16500a5e00296500a4c80a16600a5e00296600a0440a066","0xbc00502801c0a0662c6594b317600a1980297800a19802abd02858c02978","0x297800a05802811028050bc005042015608140285e00282800a7ac0a014","0x290800a46c0a03600a5e0028ff00a0f40a16800a5e0028f900a4c80a057","0x2ac20285680297800a0cc3a8070680503a8052f00140a11c0280cc02978","0xa16800a5e00296800a4c80a05700a5e00285700a0440a15700a5e00295a","0xa15706c5a02b97600a55c0297800a55c02abd0280d80297800a0d80283d","0x297800a05043014048014bc00500c0145281400c0440397800a0440291e","0x1080564e0501302100e5e00282000ac980a02000a5e00282500ac940a025","0x290d0280a00297800a0a8028060280a80297800a09802b28028050bc005","0xbc00502c0148f0142ea0ac0397800a090140071eeb140a02800a5e002828","0x7bac50285d40297800a5d40290d0281600297800a254028a50282540b007","0x28ff02801d570141fe014bc0051fe014868141fe3e40397800a160ba82b","0xa03423801cbc0052320157a814232014bc00521a0157a01421a42003978","0x990052f0014958051a0050958052f00141a0055ee0500a17800a47002af6","0xbc00502834c0a04c00a5e00283d00a3e80a03d26401cbc00526401559814","0x28730281040297800a104028f8028104170072f00141700556805017005","0xbc0070981047b8052ec8dc0a10800a5e00290800a0440a0f900a5e0028f9","0x297800a1100290d028050bc00502801c0a16d0901147bc40088118a88f7","0x2210800e0380a04600a5e00284600a0f40a15100a5e00295100a4c80a044","0x297800a0515b8140285e00281400e050b50502d83de2087609601cbc007","0x168051e6050170052f0014170051f0050168052f0014b493200eae00a169","0x7b97800e0b4170462a25d91b814096014bc0050960140881405a014bc005","0xb28052f0014b280521a0500a17800a050038140ae580b18f7884594b3055","0x396509601c070142cc014bc0052cc0141e8140aa014bc0050aa01499014","0xbc00506c1d80392e028050bc00502801c0a15e0ce0cc7bc4306c5a003978","0x330052ae050330052f00140a39002856cae0072f0014ae8052ae050ae805","0xaa8142b6014bc0052b60148b0140285e00287500a5580a15a0ea01cbc005","0xbc0052aa014a80142aa5580397800a55c0295302855cad8072f0014ad805","0x2950028538a80072f0014a98052a6050a995a00e5e00295a00a5540a014","0x8814296014bc0052a0014a7014298014bc0052ac014a70140285e00294e","0xa17800e52ca60075fe050ae0052f0014ae00522c050b40052f0014b4005","0xa17800a56c02956028050bc0052b4014ab0140285e00281400e0500a444","0xa0730e201cbc0052b6014a98140285e00281400e0500a44500a05010814","0xa17800a1dc029500285203b8072f0014ad0052a60500a17800a1c402950","0x394428c01d7f814288014bc005290014a701428c014bc0050e6014a7014","0x2953028508ae0072f0014ae0052aa0500a17800a050038140291180a178","0x397800a20802953028208118072f0014118052aa050a014100e5e002942","0x17e8141102100397800a21002afc028218a00072f0014a00055f805042083","0x2950028050bc00502801c0a08f11a01e2388c27e01cbc007110218b40f7","0xa4480285e00388428001d7f81427e014bc00527e014088140285e00288c","0x88140285e00294100a5400a0142f0014418052a00500a17800a05003814","0x9f8f75fa0500a17800a05003814029124028140420509f0052f00149f805","0x293c00a5400a0142f00140a0070284e89d8078944f0488072f001c41941","0x29530284d49c0072f0014ae0052a60509f0052f0014488050220500a178","0xa09c13401e2592e01c01cbc0072664d49f0f75fa0509989700e5e002823","0x8814252014bc00525a0156e01425a014bc0050280980a0142f00140a007","0x910052f0014948055bc050938052f0014970055ba050950052f001407005","0x2ae00282800297800a050130140285e00281400e0500a44c00a05010814","0xa12700a5e00289c00ab740a12a00a5e00289a00a0440a12400a5e0028a0","0x8f11f00f134918a200e5e0038972704a87bafd0284880297800a49002ade","0x538052f0014918055ba050528052f0014510050220500a17800a05003814","0xa44e00a05010814236014bc0052440156f01423a014bc00524e0156e814","0xa0a900a5e0028a900ab740a0a900a5e0028142fe0500a17800a05003814","0x88140285e00281400e0508b91600f13c8c11a00e5e0038a924e47c7bafd","0x8e8052f00148c0055ba050538052f00148f0055ba050528052f00148d005","0x1720140285e00281400e0500a44e00a05010814236014bc0052440156f014","0x8814172014bc00517401570014174014bc0050280980a0142f001491005","0x8e8052f00148b8055ba050538052f00148f0055ba050528052f00148b005","0xa0070282c402c5015e014bc00723601487014236014bc0051720156f014","0x28110282d00297800a4745380725c0500a17800a2bc02968028050bc005","0xa0f900a5e0028f900a1cc0a05500a5e00285500a4c80a0a500a5e0028a5","0x297800a058028830280440297800a044028830285980297800a5980283d","0xbc005168058089762cc3e42a8a500c42c0a0b400a5e0028b400a4580a016","0x2968028050bc00502801c0a1131762b8568ac022014898bb15c2b456011","0xbb00521e0500a17800a04402871028050bc00502c014388140285e0028b1","0xbc0050283fc0a0142f0014538052a00500a17800a47402950028050bc005","0x5f11100e4640a0be00a5e0028be00a4340a0be00a5e00281462805088805","0x176814218014bc00521e438038340284380297800a0508e01421e014bc005","0x2a8052f00142a805264050528052f001452805022050610052f001486005","0xbc005184015770142cc014bc0052cc0141e8141f2014bc0051f201439814","0xa17800a4e802950028050bc00502801c0a0c22cc3e42a8a502201461005","0xa0142f0014088050e20500a17800a05802871028050bc005046014ab014","0xa10b00a5e00293b00a0440a0142f0014ae0052ac0500a17800a5d80290f","0x118052ac0500a17800a23c02950028050bc00502801c0a0148a20140a021","0x297600a43c0a0142f0014088050e20500a17800a05802871028050bc005","0xbc005106014a80140285e00294000a5400a0142f0014ae0052ac0500a178","0x297800a23402811028050bc005108014a80140285e00294100a5400a014","0x297800a4240290d0284240297800a051c8814214014bc0050283fc0a10b","0x8390600e0d00a10600a5e002814238050838052f00148490a00e4640a109","0x99014216014bc00521601408814208014bc00520a0157681420a014bc005","0xb30052f0014b300507a0507c8052f00147c8050e60502a8052f00142a805","0xa0142f00140a007028410b30f90aa42c08805208014bc00520801577014","0xab0140285e00281100a1c40a0142f00140b0050e20500a17800a08c02956","0xa10000a5e0028ca2ec01d8c814194014bc0050280980a0142f0014ae005","0x297800a154029320285a00297800a5a0028110283f80297800a40002982","0x28fe00abb80a16600a5e00296600a0f40a0f900a5e0028f900a1cc0a055","0xbc0050ce014a80140285e00281400e0507f1661f2154b401100a3f802978","0xa17800a05802871028050bc005046014ab0140285e00295e00a5400a014","0xa0142f00143b0052a00500a17800a5d80290f028050bc00502201438814","0xa0fc00a5e0028fc00a4340a0fc00a5e00281457c0507e8052f00140a0ff","0xbc0050aa014990141ac014bc005066014088141f6014bc0051f83f403919","0x2814042050698052f00147d8052360507d0052f0014b300507a05068005","0xa17800a05802871028050bc005046014ab0140285e00281400e0500a452","0xa0142f00143b0052a00500a17800a5d80290f028050bc00502201438814","0x297800a5800283d0283cc0297800a58c029320283e00297800a12c02811","0xa0142f00140a007028052298050280840a0ee00a5e00285700a46c0a0f0","0x388140285e00282300a5580a0142f0014b50052a00500a17800a14002950","0x2ac1028050bc0052ec014878140285e00281100a1c40a0142f00140b005","0x281457c050728052f00140a0ff028050bc00505c014f58140285e002932","0x8814000014bc0051e2394039190283c40297800a3c40290d0283c402978","0x7d0052f00142300507a050680052f0014a88052640506b0052f0014b6005","0xbc0051a00145681435c014bc0051ac014948141a6014bc0050000148d814","0x2814042050d88052f001469805176050d80052f00147d00515c050d7805","0xa17800a05802871028050bc005046014ab0140285e00281400e0500a454","0xa0142f0014170053d60500a17800a5d80290f028050bc00502201438814","0x798052f0014228052640507c0052f0014840050220500a17800a4c802ac1","0xbc0051f0014948141dc014bc0052da0148d8141e0014bc0050900141e814","0x77005176050d80052f00147800515c050d78052f00147980515a050d7005","0x1768142f4014bc0053627a8038340287a80297800a0508e014362014bc005","0xd78052f0014d7805264050d70052f0014d7005022050f58052f0014bd005","0xbc0053d601577014360014bc0053600141e8141f2014bc0051f201439814","0xbc00700a05003805028050bc0050285d40a1eb3603e4d79ae022014f5805","0x15a014050014bc00502834c0a0142f00140a0070280a8130078aa08410007","0xbc0070500ac03b3e0280800297800a080028110280ac128072f001412805","0xb005724050ba81100e5e00281100aacc0a0142f00140a0070280522b014","0xbb0072f0014bb0055680502c0052f00144a97500eae00a09502c01cbc005","0x869081fe3dcbc0070b03e47b8212ec8dc0a05800a5e00285800a3cc0a0f9","0x29320284340297800a4340290d028050bc00502801c0a0342384647bc57","0x958072f001c8682000ee4c0a10800a5e00290800a0f40a0ff00a5e0028ff","0xa3950281300297800a4c8120077280500a17800a0500381407a0162c132","0x1cb014098014bc0050980159c01405c014bc00505c0147c01405c014bc005","0xa2b7028050bc00502801c0a04408c01e2c95108201cbc00705c094958f7","0x208f7730050228052f00142280566e0500a17800a050bb01408a014bc005","0x284800a0440a0142f00140a0070281d8258078b45b4240072f001c22816","0x2ae90285a80297800a0180290d0281400297800a01c029000285b002978","0xa0070280522d8050280840a02d00a5e00296d00acdc0a16900a5e002811","0x282300acb00a0142f0014088055820500a17800a1d802b45028050bc005","0x3b990285940297800a050578142cc014bc0050aa015988140aa08c03978","0xa16300a5e00296300a4340a16000a5e002814664050b18052f0014b2806","0x2b96600e5d99a0142c0014bc0052c0014868140ae58c0397800a58c02b33","0xa17800a19c0291f028050bc0050660148f8140ce0cc1b1682ec5e002960","0x281466c050ae95e00e5e00283609601d5701406c014bc00506c01486814","0x290d0281400297800a5a0029000285b00297800a5780281102857002978","0xa02d00a5e00295c00acdc0a16900a5e00295d00aba40a16a00a5e002963","0xa0ff00a5e0028ff00a4c80a16c00a5e00296c00a0440a0142f00140a175","0x297800a5d8028f80284200297800a4200283d0281400297800a14002900","0x282300a3cc0a02d00a5e00282d00acdc0a16900a5e00296900aba40a176","0x28f80281300297800a13002b380285a80297800a5a80290d02808c02978","0x897800a5442616a0460b4b49762101407f96c040ce80a15100a5e002951","0x220053d60500a17800a050038142ae5683a8662b6044029572b41d43315b","0x281100ab040a0142f00142600567e0500a17800a05802b45028050bc005","0xbc00500c0148f8140285e00297600a7ac0a0142f0014118056940500a178","0x297800a5540290d0285540297800a051cd0142ac014bc0050283fc0a014","0xa995000e0d00a15000a5e002814238050a98052f0014aa95600e4640a155","0x9901408c014bc00508c01408814298014bc00529c015cd81429c014bc005","0x840052f00148400507a050038052f0014038052000507f8052f00147f805","0xa0142f00140a007028530840071fe11808805298014bc005298015ce014","0xc3814296014bc0050283fc0a0142f0014bb0053d60500a17800a08c02b4a","0x398052f00143894b00e4640a07100a5e00287100a4340a07100a5e002814","0xa14800a5e00287702c04403025048059cf0140ee014bc0050e6015ce814","0x297800a3fc029320280f40297800a0f4028110285180297800a52002b9f","0x294600ae700a10800a5e00290800a0f40a00700a5e00280700a4000a0ff","0xbc005046015a50140285e00281400e050a310800e3fc1e81100a51802978","0x3025048059cf014288014bc005068015ce8140285e00297600a7ac0a014","0x297800a080028110285040297800a50802b9f0285080297800a5100b011","0x291c00a0f40a00700a5e00280700a4000a11900a5e00291900a4c80a020","0x281400e050a091c00e4641001100a5040297800a50402b9c02847002978","0x297800a050130140285e00297600a7ac0a0142f0014118056940500a178","0x418052f0014410160220181282402ce780a08200a5e00294000ae800a140","0xbc00504201499014040014bc00504001408814108014bc005106015cf814","0x420057380507b8052f00147b80507a050038052f00140380520005010805","0x281600ad140a0142f00140a0070282107b80704208008805108014bc005","0xbc005046015a50140285e00281100ab040a0142f0014128053d60500a178","0xa17800a0180291f028050bc0050480159f8140285e00297600a7ac0a014","0x440052f00144400521a050440052f00140a0570282180297800a0507f814","0x293f11801c1a014118014bc0050284700a13f00a5e00288810c01c8c814","0x29320280980297800a0980281102823c0297800a23402b9b02823402978","0xa0f700a5e0028f700a0f40a00700a5e00280700a4000a02a00a5e00282a","0x28140285e0028142ea050478f700e0a81301100a23c0297800a23c02b9c","0xbb0056660500a17800a0500381400c08c03c5c02c0440397800e0140a007","0x2c5d0285e00382400a29c0a01100a5e00281100a0440a0242ec01cbc005","0x100052f00147b8053100500a17800a5d80291f028050bc00502801c0a025","0x281100a0440a02600a5e00282100ae880a02100a5e00282000e01dd0814","0x88f700a0980297800a09802ba30280580297800a0580293202804402978","0x297800a01c028f7028050bc00504a014548140285e00281400e05013016","0xa0070285d402c5e0560a00397800e0a802816028050bc0050285d80a02a","0x29350281600297800a0a0028250282540297800a0ac02938028050bc005","0xbc0050280980a0142f00140a0070280522f8050280840a0f900a5e002895","0x8400526a0502c0052f0014ba80504a050840052f00147f80512e0507f805","0x2c60232014bc0071f20149981421a014bc0050b0014b30141f2014bc005","0x297800a0d0028060280d00297800a46402823028050bc00502801c0a11c","0x260058c20f4990072f001c9581100ee4c0a12b00a5e00292b00a4340a12b","0xa02e00a5e00283d1ee01dca0140285e0028142ea0500a17800a05003814","0x297800a4c8028110285440297800a104bb00752a050208052f00140a0af","0x282e00ace00a10d00a5e00290d00a9980a01600a5e00281600a4c80a132","0x7b97800a5441710d02c4c808b670285440297800a5440290d0280b802978","0xa0142f00147b80567e0500a17800a0500381408a110230f700a11422046","0x381402918802814042050240052f0014260050220500a17800a5d80291f","0xbb00523e0500a17800a3dc02b3f028050bc005238014b40140285e002814","0xbc0050280980a0142f00140a1750281200297800a04402811028050bc005","0x2ba20281d80297800a12c86807742050258052f0014b68056dc050b6805","0x296c00a5e00296c00ae8c0a01600a5e00281600a4c80a16c00a5e002876","0x28f700acfc0a0142f0014bb00523e0500a17800a050038142d8058240f7","0x297800a0502b8140a0014bc0050283fc0a0142f0014038050660500a178","0x2814238050b48052f0014b505000e4640a16a00a5e00296a00a4340a16a","0x88142cc014bc0050aa015d20140aa014bc0052d20b4038340280b402978","0xb30052f0014b3005746050030052f001403005264050118052f001411805","0xf501400c08c0397800a058029b0028050bc0050285d40a16600c08c7b805","0x282000a47c0a0210400947b97800a0900297a028090030072f001403005","0xbc005028e940a02600a5e00282500a7b40a0142f0014108053d60500a178","0x2ba70280a00297800a0a81300774c050130052f0014130051f005015005","0x281400e0504a8058c65d4158072f001c1401400eea00a02800a5e002828","0x291f028050bc0050b0014fa8141fe3e42c0f72f0014030052f40500a178","0x868072f001c841750563ddd4814210014bc0051fe014fb0140285e0028f9","0x2ab40284ac0297800a464029ee028050bc00502801c0a03423801e32119","0x297800a434028110280f4088072f0014088056580509917600e5e002976","0xa007028118a88411ef1941704c00e5e00392b07a4c87b805022b9c0a10d","0xb681100e5e00281100acb00a04808a1107b97800a08c02bab028050bc005","0xb60052f00140a3320281d80297800a05086014096014bc0052da01598814","0x296c00a4340a05000a5e00285000a4340a0500ec01cbc0050ec01599814","0x282d00a47c0a05505a5a4b51762f0014b605009601cbb3340285b002978","0xb490d00eab80a16900a5e00296900a4340a0142f00142a80523e0500a178","0xa0142f0014b180567e050b016300e5e00284400aeb00a1652cc01cbc005","0xb30052f0014b3005022050b40052f0014b00053de0502b8052f00140a336","0xbc00505c0141e8142d4014bc0052d401480014098014bc00509801499014","0xbb005568050088052f0014088051e6050b40052f0014b40053e005017005","0xa16500a5e00296500aba40a03600a5e00283600a3e00a0362ec01cbc005","0x1716a09859812bad0281d80297800a1d80290d02815c0297800a15c02b37","0xad8052f001cae005316050ae15d2bc19c198112f00143b0572ca0d808968","0xa1552ac55cad0750225e00295b00aeb80a0142f00140a00702819802c66","0x23395300a5e00395500acf40a0142f0014ad00523e0500a17800a1d402b5a","0xa70052f00140a0d3028050bc0052a6014b40140285e00281400e050a8005","0xa17800a050038140291a00a17800e5382400767c0500a17800a050bb014","0xae867022b9c0a14c00a5e00294c00a3cc0a14c00a5e0029562ae01d5c014","0x2932028050bc00502801c0a1480ee1cc7bc690e252c0397800e114a6176","0xa007028052350050280840a14400a5e00287100a0f40a14600a5e00294b","0x294200aebc0a14200a5e00294800ae740a0142f00140a175028050bc005","0x29320280cc0297800a0cc028110285000297800a50402bb002850402978","0xa07700a5e00287700a0f40a15e00a5e00295e00a4000a07300a5e002873","0x8f8140285e00281400e050a00772bc1cc1981100a5000297800a50002bb1","0x2ac1028050bc0052ac015a28140285e00297600a7ac0a0142f001422805","0xba814288014bc0052ba0141e81428c014bc0050ce014990140285e002957","0x2baf02820c0297800a20802ba00282080297800a050130140285e002814","0xa03300a5e00283300a0440a08600a5e00288400aec00a08400a5e002883","0x297800a5100283d0285780297800a578029000285180297800a51802932","0xa17800a0500381410c510af1460660440288600a5e00288600aec40a144","0xa0142f0014ab00568a0500a17800a5d8029eb028050bc00508a0148f814","0xa08800a5e00295000ae740a0142f0014240053d60500a17800a55c02ac1","0x297800a0cc028110282300297800a4fc02bb00284fc0297800a22002baf","0x295d00a0f40a15e00a5e00295e00a4000a06700a5e00286700a4c80a033","0x281400e0504615d2bc19c1981100a2300297800a23002bb102857402978","0xbc005090014f58140285e00297600a7ac0a0142f00142280523e0500a178","0x286700a4c80a03300a5e00283300a0440a08d00a5e00286600a6300a014","0x2bb10285740297800a5740283d0285780297800a5780290002819c02978","0x88056940500a17800a0500381411a574af0670660440288d00a5e00288d","0x284600ae740a0142f0014118053620500a17800a5d8029eb028050bc005","0x28110282440297800a4f802bb00284f80297800a23c02baf02823c02978","0xa00700a5e00280700a4000a04100a5e00284100a4c80a10d00a5e00290d","0x4895100e1048681100a2440297800a24402bb10285440297800a5440283d","0xf58140285e00281100ad280a0142f00141a0053d60500a17800a05003814","0xa3b20284f00297800a0507f8140285e00282300a6c40a0142f0014bb005","0xa13a00a5e00293b27801c8c814276014bc00527601486814276014bc005","0xa0148d60140a0210284d40297800a4e80291b0284e00297800a47002811","0x29b1028050bc0052ec014f58140285e00281100ad280a0142f00140a007","0x28147660504b8052f00140a0ff028050bc00500c014fb8140285e002823","0x881401c014bc00526625c039190284cc0297800a4cc0290d0284cc02978","0xa12e00a5e0028142380509a8052f0014070052360509c0052f00144a805","0xbc00527001408814138014bc005134014c6014134014bc00526a4b803834","0x7b80507a050038052f001403805200050028052f0014028052640509c005","0x2bb40282707b80700a4e008805138014bc005138015d88141ee014bc005","0xa01100a5e00281476c0500a17800a050038142ec016360f700a5e003814","0xbc0051ee015db81402c014bc005022014039190280440297800a0440290d","0xab0140285e00282400a1c40a0250480187b97800a08c02bb802808c7b807","0xa02100a5e00282000a2940a02000a5e00280600ae180a0142f001412805","0x282a00aee00a02a1ee01cbc0051ee015db81404c014bc00504205803919","0x2b86028050bc0052ea014ab0140285e00282800a1c40a1750560a07b978","0x7c8052f00142c02600e4640a05800a5e00289500a2940a09500a5e00282b","0x290800a1c40a0142f00147f8050e2050869081fe3dcbc0051ee015dc014","0xa80140684700397800a46402953028464868072f0014868052aa0500a178","0xa13200a5e00292b00a5300a12b00a5e00291c00a5380a0142f00141a005","0x284c00a5400a02e09801cbc00521a014a981407a014bc00526401c03919","0x1e807232050a88052f001420805298050208052f00141700529c0500a178","0x284600a5e00284600a46c0a0f900a5e0028f900a46c0a04600a5e002951","0xbc00508801486814088014bc005028ee40a0142f00140a0070281187c807","0x1dd8140905d80397800a5d802bba0281140297800a1100280723205022005","0xa17800a1d802956028050bc005096014388140ec12cb68f72f001424005","0x285008a01c8c8140a0014bc0052d8014528142d8014bc0052da015c3014","0xb305505a3dcbc0052d2015dd8142d25d80397800a5d802bba0285a802978","0xb28052f00142a80570c0500a17800a59802956028050bc00505a01438814","0x297600aeec0a16000a5e0029632d401c8c8142c6014bc0052ca01452814","0x2955028050bc0052d0014388140285e00285700a1c40a0362d015c7b978","0xa17800a57802950028578338072f0014198052a60501983600e5e002836","0x295c00e01c8c8142b8014bc0052ba014a60142ba014bc0050ce014a7014","0x294e028050bc0050cc014a80140ea1980397800a0d80295302856c02978","0xab0052f0014ab95b00e4640a15700a5e00295a00a5300a15a00a5e002875","0xba8142ac580038052ac014bc0052ac0148d8142c0014bc0052c00148d814","0x281400e0501302100f1b41002500e5e00380502801c028140285e002814","0xbc00504a014088140285e0028142ec050150052f0014bb00569a0500a178","0xc20140285e00281400e050ba8058dc0ac140072f001c1500569c05012805","0x7c8052f00144a8056a00502c0052f00141400569e0504a8052f001415805","0x2b520283fc0297800a050130140285e00281400e0500a46f00a05010814","0xa0f900a5e00290800ad400a05800a5e00297500ad3c0a10800a5e0028ff","0x281400e0508e0058e04640297800e3e402b530284340297800a160029ef","0x2b920284ac118072f0014118055660501a0052f00148c8056a80500a178","0x297800a0d002b550280f40297800a4c8958075700509900600e5e002806","0x1e8051e60502081600e5e00281600aad00a02e00a5e00284c00ad580a04c","0xbc00705c0f4208f70400457381405c014bc00505c0148681407a014bc005","0xa16d00a5e00281456e0500a17800a05003814090114220f78e2118a8807","0x297800a1180283d0285440297800a544029320285b40297800a5b402b37","0xa17800a050038140a05b003c720ec12c0397800e5b4030251eee600a046","0xbc005048014868142d2014bc00500e014800142d4014bc00509601408814","0x2814042050b30052f00143b00566e0502a8052f0014118055d205016805","0xa17800a08c02ac1028050bc0050a0015a28140285e00281400e0500a473","0xbc0050282bc0a16300a5e00296500acc40a16502201cbc00502201596014","0x2b80521a050b40052f00140a33202815c0297800a58012007732050b0005","0xa16800a5e00296800a4340a0360ae01cbc0050ae015998140ae014bc005","0x8f8140285e00295e00a47c0a15d2bc19c199762f0014b40362c601cbb334","0xae0072f00143396c00eab80a06700a5e00286700a4340a0142f0014ae805","0xbc005066014800142d4014bc0052b8014088140cc014bc005028cd80a15b","0x3300566e0502a8052f0014ad8055d2050168052f00142b80521a050b4805","0xa8805264050b50052f0014b50050220500a17800a050ba8142cc014bc005","0xf801408c014bc00508c0141e8142d2014bc0052d2014800142a2014bc005","0xb0052f00140b0051f0050088052f0014088051e6050868052f001486805","0xbc00505a014868142cc014bc0052cc0159b8140aa014bc0050aa01574814","0xab1572b41d40897800a0b4b305502c044868462d2544b502575a05016805","0xf58140285e0028142ea0500a17800a050038142aa558ab95a0ea04402955","0x1de0142a6014bc005090015ce8140285e00281100ad280a0142f00140b005","0x12805022050a70052f0014a800577a050a80052f0014a980604609086811","0x1e81400e014bc00500e01480014088014bc0050880149901404a014bc005","0xa14e08a01c22025022014a70052f0014a700577c050228052f001422805","0xb0053d60500a17800a47002968028050bc0050285d40a0142f00140a007","0x294c00ae800a14c00a5e00281404c0500a17800a04402b4a028050bc005","0x297800a1c402bbd0281c40297800a52c0302304843408bbc02852c02978","0x280700a4000a02000a5e00282000a4c80a02500a5e00282500a0440a073","0x1281100a1cc0297800a1cc02bbe0283dc0297800a3dc0283d02801c02978","0x280600ad140a0142f0014118055820500a17800a050038140e63dc03820","0xbc0052ec015ad0140285e00281100ad280a0142f00140b0053d60500a178","0xa40052f00140a0570281dc0297800a0507f8140285e00282400a47c0a014","0xbc0050284700a14600a5e0029480ee01c8c814290014bc00529001486814","0x28110285040297800a50802bbf0285080297800a518a2007068050a2005","0xa00700a5e00280700a4000a02600a5e00282600a4c80a02100a5e002821","0xa08f700e0981081100a5040297800a50402bbe0283dc0297800a3dc0283d","0xbb0451403c40a1760283dc038050283c0500f10285d8228a01e2050bb076","0xa0f01403c40a104022114500f1028410089001ee01c028141e028078814","0xbb0f700e0140a0f01403c40a104022114500f102841008abd2ec3dc03805","0xa1040231d0bb0f700e0140a0f01403c40a104022114500f102841008b8d","0x88451403c40a1040231d4bb0f700e0140a0f01403c40a104022114500f1","0x500f1144050088451403c4510140231d8bb0f700e0140a0f01403c40a104","0x38050283c0500f1144050088451403c4510140231dcbb0f700e0140a0f0","0x500f10285da3c8f700e0140a0f01403c40a17608a280788142ed1e0bb0f7","0x500f1028410088451403c40a1040231e87b80700a050780a01e2050bb045","0x38050283c0500f1028410088451403c40a1040231ecbb0f700e0140a0f0","0x500f10285da3e8f700e0140a0f01403c40a17608a280788142ed1f0bb0f7","0xa0f01403c40a17608a280788142ed1f87b80700a050780a01e2050bb045","0x788142ed2007b80700a050780a01e2050bb0451403c40a1768fe3dc03805","0xa10402c114500f1144050820169023dc038050283c0500f10285d8228a0","0xa0f81403c40a176106280788142ed208089761ee01c028141e0280788a2","0x500f10285da420f700e0140a0fa1403c47b871108280789769063dc03805","0x820f10280441e9071404107881402d2147b80700a050800a01e2050bb0fe","0x800a02083c40a01121842c501041e20500b4860225d87b80700a050800a0","0x8d0a02083c40a0110660f41e8821404107881400d21c089761ee01c02814","0x820f10280441983d07a208501041e205003488046058089761ee01c02814","0xa0110660f41e8821404107881400d224118160225d87b80700a0508e8a0","0xa0112540b4500a21e20500b48a046058089761ee01c02814234280820f1","0x28142663c40a0f704208c788142ed22c089761ee01c0281425a280510f1","0xa0f791a5d87b80700a0509e0a01e2050bb03d106280788140232307b807","0x1e83d06623046086140288820f10280824700700a0509f0f10283dc228f1","0x109481ef23c1282400c08c0b0112ec3dc038050284fc500a22083c40a016","0x7b80700a050800a01e2050bb1501403c40a17692001c0281404208403821","0x89761ee01c02814234280820f10280441983d07a208501041e205003491","0xa166140288788140220b4088062540941202d1402887881404124811816","0xa16d1e20507b8060221147881402324c1282400c08c0b0112ec3dc03805","0x3805028544500a21e20500888c2540b4500a21e205011c942ec3dc03805","0x118a01443c40a02592c01c02814042084038210421d47bc9502c044bb0f7","0x24b82400c08c0b0112ec3dc038050285d4500a21e20500880604a0901692a"],"sierra_program_debug_info":{"type_names":[[0,"RangeCheck"],[1,"Const"],[2,"Const"],[3,"Const"],[4,"Const"],[5,"Array"],[6,"Snapshot>"],[7,"core::array::Span::"],[8,"felt252"],[9,"StorageBaseAddress"],[10,"u8"],[11,"Unit"],[12,"Array"],[13,"core::result::Result::<(), core::array::Array::>"],[14,"Tuple, felt252, StorageBaseAddress, u8, core::result::Result::<(), core::array::Array::>>"],[15,"core::panics::Panic"],[16,"Tuple>"],[17,"core::panics::PanicResult::<(core::array::Span::, core::felt252, core::starknet::storage_access::StorageBaseAddress, core::integer::u8, core::result::Result::<(), core::array::Array::>)>"],[18,"u64"],[19,"Const"],[20,"Const"],[21,"Const"],[22,"Const"],[23,"Const"],[24,"Const, Const>"],[25,"Const"],[26,"Const"],[27,"Const"],[28,"Const"],[29,"ContractAddress"],[30,"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted"],[31,"Const"],[32,"Tuple>>"],[33,"core::panics::PanicResult::<(core::result::Result::<(), core::array::Array::>,)>"],[34,"core::option::Option::>"],[35,"Snapshot>"],[36,"core::array::Span::"],[37,"Tuple, core::option::Option::>>"],[38,"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"],[39,"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred"],[40,"openzeppelin_access::ownable::ownable::OwnableComponent::Event"],[41,"core::starknet::storage::StoragePointer0Offset::>"],[42,"Box"],[43,"core::option::Option::>"],[44,"Const"],[45,"u32"],[46,"Tuple, u32, felt252, StorageBaseAddress, u8, core::result::Result::<(), core::array::Array::>>"],[47,"core::panics::PanicResult::<(core::array::Array::, core::integer::u32, core::felt252, core::starknet::storage_access::StorageBaseAddress, core::integer::u8, core::result::Result::<(), core::array::Array::>)>"],[48,"Const"],[49,"Const"],[50,"Const, Const>"],[51,"NonZero"],[52,"Uninitialized"],[53,"u128"],[54,"core::integer::u256"],[55,"openzeppelin_token::erc20::erc20::ERC20Component::Approval"],[56,"core::starknet::storage::storage_base::StorageBase::>>"],[57,"Const"],[58,"Const"],[59,"Const"],[60,"openzeppelin_token::erc20::erc20::ERC20Component::Transfer"],[61,"openzeppelin_token::erc20::erc20::ERC20Component::Event"],[62,"Const"],[63,"core::starknet::storage::StoragePointer0Offset::>"],[64,"core::starknet::storage::storage_base::StorageBase::>>"],[65,"Const"],[66,"Const"],[67,"core::starknet::storage::storage_base::StorageBase::>"],[68,"Const"],[69,"Const"],[70,"core::starknet::storage::StoragePointer0Offset::"],[71,"ClassHash"],[72,"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded"],[73,"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event"],[74,"madara_contracts::erc20::ERC20::Event"],[75,"Const"],[76,"Const"],[77,"Const"],[78,"Const"],[79,"Const"],[80,"openzeppelin_token::erc20::erc20::ERC20Component::ComponentState::"],[81,"openzeppelin_access::ownable::ownable::OwnableComponent::ComponentState::"],[82,"openzeppelin_upgrades::upgradeable::UpgradeableComponent::ComponentState::"],[83,"madara_contracts::erc20::ERC20::ContractState"],[84,"Tuple"],[85,"core::panics::PanicResult::<(madara_contracts::erc20::ERC20::ContractState, ())>"],[86,"core::byte_array::ByteArray"],[87,"core::option::Option::"],[88,"Tuple, core::option::Option::>"],[89,"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"],[90,"Tuple, Unit>"],[91,"core::panics::PanicResult::<(openzeppelin_access::ownable::ownable::OwnableComponent::ComponentState::, ())>"],[92,"Const"],[93,"Const"],[94,"core::starknet::storage::StoragePointer0Offset::"],[95,"Const"],[96,"Tuple, Unit>"],[97,"core::panics::PanicResult::<(core::array::Array::, ())>"],[98,"bytes31"],[99,"Snapshot"],[100,"core::result::Result::>"],[101,"Tuple>>"],[102,"core::panics::PanicResult::<(core::result::Result::>,)>"],[103,"Const"],[104,"StorageAddress"],[105,"core::starknet::storage::StoragePointer0Offset::"],[106,"Uninitialized"],[107,"System"],[108,"Uninitialized"],[109,"Poseidon"],[110,"Uninitialized"],[111,"Const"],[112,"Const"],[113,"core::bool"],[114,"Tuple, core::bool>"],[115,"core::panics::PanicResult::<(openzeppelin_token::erc20::erc20::ERC20Component::ComponentState::, core::bool)>"],[116,"Const"],[117,"Tuple, Unit>"],[118,"core::panics::PanicResult::<(openzeppelin_token::erc20::erc20::ERC20Component::ComponentState::, ())>"],[119,"Const"],[120,"Const"],[121,"NonZero"],[122,"Box"],[123,"Box"],[124,"Array"],[125,"Snapshot>"],[126,"core::array::Span::"],[127,"core::starknet::info::v2::TxInfo"],[128,"core::starknet::info::BlockInfo"],[129,"core::starknet::info::v2::ResourceBounds"],[130,"core::starknet::info::v2::ExecutionInfo"],[131,"Box"],[132,"core::option::Option::"],[133,"Box"],[134,"core::option::Option::>"],[135,"Const"],[136,"Tuple"],[137,"core::pedersen::HashState"],[138,"core::starknet::storage::StoragePath::>"],[139,"core::starknet::storage::storage_base::StorageBase::>"],[140,"Const"],[141,"core::starknet::storage::StoragePath::>"],[142,"core::starknet::storage::storage_base::StorageBase::>"],[143,"Const"],[144,"Pedersen"],[145,"Tuple"],[146,"core::panics::PanicResult::<(core::integer::u256,)>"],[147,"core::starknet::storage::storage_base::StorageBase::"],[148,"Const"],[149,"Const"],[150,"Const"],[151,"Tuple>"],[152,"Tuple, Unit>"],[153,"core::panics::PanicResult::<(openzeppelin_upgrades::upgradeable::UpgradeableComponent::ComponentState::, ())>"],[154,"Tuple"],[155,"core::panics::PanicResult::<((),)>"],[156,"BuiltinCosts"],[157,"core::panics::PanicResult::<(core::array::Span::,)>"],[158,"Const"],[159,"core::option::Option::"],[160,"GasBuiltin"]],"libfunc_names":[[0,"revoke_ap_tracking"],[1,"withdraw_gas"],[2,"branch_align"],[3,"struct_deconstruct>"],[4,"enable_ap_tracking"],[5,"store_temp"],[6,"array_snapshot_pop_front"],[7,"unbox"],[8,"rename"],[9,"enum_init, 0>"],[10,"store_temp>>"],[11,"store_temp>"],[12,"jump"],[13,"struct_construct"],[14,"enum_init, 1>"],[15,"enum_match>"],[16,"class_hash_try_from_felt252"],[17,"disable_ap_tracking"],[18,"drop>>"],[19,"drop>"],[20,"drop"],[21,"array_new"],[22,"const_as_immediate>"],[23,"store_temp"],[24,"array_append"],[25,"struct_construct"],[26,"struct_construct>>"],[27,"enum_init,)>, 1>"],[28,"store_temp"],[29,"store_temp"],[30,"store_temp,)>>"],[31,"get_builtin_costs"],[32,"store_temp"],[33,"withdraw_gas_all"],[34,"struct_construct>"],[35,"snapshot_take>"],[36,"drop>"],[37,"function_call::assert_only_owner>"],[38,"enum_match>"],[39,"drop>"],[40,"struct_construct>"],[41,"store_temp"],[42,"function_call::upgrade>"],[43,"enum_match, ())>>"],[44,"drop, Unit>>"],[45,"snapshot_take>"],[46,"drop>"],[47,"struct_construct>"],[48,"struct_construct>>"],[49,"enum_init,)>, 0>"],[50,"store_temp>>"],[51,"const_as_immediate>"],[52,"drop"],[53,"const_as_immediate>"],[54,"drop>"],[55,"const_as_immediate>"],[56,"struct_construct>"],[57,"snapshot_take>"],[58,"drop>"],[59,"store_temp>"],[60,"function_call, core::starknet::storage::StorablePathableStorageAsPointer::, core::starknet::storage::storage_base::StorageBaseAsPath::, core::starknet::storage::StorableStoragePathAsPointer::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>, core::starknet::storage::StorableStoragePointer0OffsetReadAccess::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>::read>"],[61,"enum_match>"],[62,"struct_deconstruct>"],[63,"snapshot_take"],[64,"drop"],[65,"dup"],[66,"struct_deconstruct"],[67,"drop"],[68,"rename"],[69,"u128_to_felt252"],[70,"contract_address_try_from_felt252"],[71,"drop"],[72,"store_temp"],[73,"const_as_immediate>"],[74,"struct_construct>>"],[75,"snapshot_take>>"],[76,"drop>>"],[77,"struct_deconstruct>>"],[78,"struct_construct"],[79,"struct_construct>>"],[80,"store_temp>>"],[81,"store_temp"],[82,"function_call, core::starknet::storage::map::EntryInfoImpl::, core::hash::into_felt252_based::HashImpl::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>::read>"],[83,"const_as_immediate>"],[84,"struct_construct>>"],[85,"snapshot_take>>"],[86,"drop>>"],[87,"struct_deconstruct>>"],[88,"struct_construct>>"],[89,"struct_construct>"],[90,"store_temp>>"],[91,"store_temp>"],[92,"function_call, core::starknet::storage::map::EntryInfoImpl::<(core::starknet::contract_address::ContractAddress, core::starknet::contract_address::ContractAddress), core::integer::u256>, core::hash::TupleNextHash::<(core::starknet::contract_address::ContractAddress, core::starknet::contract_address::ContractAddress), core::pedersen::HashState, core::pedersen::HashStateImpl, core::metaprogramming::TupleSplitTupleSize2::, core::hash::into_felt252_based::HashImpl::, core::hash::TupleNextHash::<(core::starknet::contract_address::ContractAddress,), core::pedersen::HashState, core::pedersen::HashStateImpl, core::metaprogramming::TupleSplitTupleSize1::, core::hash::into_felt252_based::HashImpl::, core::hash::TupleSize0Hash::, core::traits::TupleSize0Drop>, core::traits::TupleNextDrop::<(core::starknet::contract_address::ContractAddress,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::starknet::contract_address::ContractAddressDrop, core::traits::TupleSize0Drop>>, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>::read>"],[93,"const_as_immediate>"],[94,"enum_init>, 0>"],[95,"store_temp>>"],[96,"enum_init>, 1>"],[97,"enum_match>>"],[98,"u128s_from_felt252"],[99,"struct_construct"],[100,"enum_init, 0>"],[101,"store_temp>"],[102,"enum_init, 1>"],[103,"rename"],[104,"enum_match>"],[105,"get_execution_info_v2_syscall"],[106,"store_temp>"],[107,"unbox"],[108,"struct_deconstruct"],[109,"drop>"],[110,"drop>"],[111,"drop"],[112,"dup"],[113,"contract_address_to_felt252"],[114,"felt252_is_zero"],[115,"const_as_immediate>"],[116,"store_temp>"],[117,"drop>"],[118,"const_as_immediate>"],[119,"struct_construct>"],[120,"store_temp"],[121,"function_call>::update>"],[122,"enum_match, ())>>"],[123,"drop, Unit>>"],[124,"const_as_immediate>"],[125,"struct_deconstruct>>"],[126,"drop"],[127,"rename"],[128,"rename"],[129,"rename"],[130,"rename>"],[131,"function_call>::transfer_from>"],[132,"enum_match, core::bool)>>"],[133,"struct_deconstruct, core::bool>>"],[134,"drop>"],[135,"enum_match"],[136,"const_as_immediate>"],[137,"const_as_immediate>"],[138,"function_call>::_approve>"],[139,"alloc_local"],[140,"alloc_local"],[141,"alloc_local"],[142,"finalize_locals"],[143,"drop>"],[144,"drop>"],[145,"drop>"],[146,"store_temp"],[147,"storage_base_address_const<1473120764136009396440970107973971969419251478021578277222806501183556393953>"],[148,"struct_construct>"],[149,"snapshot_take>"],[150,"drop>"],[151,"struct_deconstruct>"],[152,"rename"],[153,"storage_address_from_base"],[154,"const_as_immediate>"],[155,"store_temp"],[156,"store_temp"],[157,"function_call"],[158,"store_local"],[159,"store_local"],[160,"enum_match>,)>>"],[161,"struct_deconstruct>>>"],[162,"enum_match>>"],[163,"store_local"],[164,"snapshot_take"],[165,"drop"],[166,"dup>"],[167,"struct_snapshot_deconstruct"],[168,"drop"],[169,"dup>>"],[170,"array_len"],[171,"u32_to_felt252"],[172,"struct_construct>"],[173,"store_temp>"],[174,"function_call, core::bytes_31::bytes31Drop>>"],[175,"enum_match, ())>>"],[176,"struct_deconstruct, Unit>>"],[177,"drop>>"],[178,"rename"],[179,"drop>"],[180,"storage_base_address_const<322990191961554429053868449035526014412279677330895387449703561219527453810>"],[181,"const_as_immediate>"],[182,"u8_to_felt252"],[183,"storage_base_address_const<1239149872729906871793169171313897310809028090219849129902089947133222824240>"],[184,"struct_construct>"],[185,"snapshot_take>"],[186,"drop>"],[187,"struct_deconstruct>"],[188,"storage_read_syscall"],[189,"const_as_immediate>"],[190,"const_as_immediate>"],[191,"function_call::_transfer_ownership>"],[192,"enum_match, ())>>"],[193,"drop, Unit>>"],[194,"contract_address_const<0>"],[195,"store_temp>"],[196,"function_call"],[197,"enum_match, core::option::Option::)>>"],[198,"struct_deconstruct, core::option::Option::>>"],[199,"enum_match>"],[200,"struct_construct"],[201,"store_temp"],[202,"function_call"],[203,"enum_match>"],[204,"drop>"],[205,"const_as_immediate>"],[206,"const_as_immediate>"],[207,"const_as_immediate>"],[208,"enum_init, 1>"],[209,"store_temp>"],[210,"felt252_sub"],[211,"struct_construct>"],[212,"enum_init, 0>"],[213,"const_as_immediate>"],[214,"dup"],[215,"class_hash_to_felt252"],[216,"drop>"],[217,"const_as_immediate>"],[218,"enum_init, ())>, 1>"],[219,"store_temp, ())>>"],[220,"replace_class_syscall"],[221,"struct_construct"],[222,"enum_init"],[223,"enum_init"],[224,"snapshot_take"],[225,"drop"],[226,"store_temp"],[227,"function_call"],[228,"emit_event_syscall"],[229,"struct_construct, Unit>>"],[230,"enum_init, ())>, 0>"],[231,"struct_deconstruct>"],[232,"storage_base_address_from_felt252"],[233,"struct_construct>"],[234,"snapshot_take>"],[235,"drop>"],[236,"struct_deconstruct>"],[237,"dup"],[238,"dup"],[239,"const_as_immediate>"],[240,"storage_address_from_base_and_offset"],[241,"struct_construct>"],[242,"enum_init, 0>"],[243,"store_temp>"],[244,"const_as_immediate>"],[245,"drop"],[246,"enum_init, 1>"],[247,"struct_deconstruct>>"],[248,"struct_deconstruct"],[249,"pedersen"],[250,"struct_deconstruct>"],[251,"struct_deconstruct>>"],[252,"struct_construct>>"],[253,"snapshot_take>>"],[254,"drop>>"],[255,"store_temp>>"],[256,"function_call>, core::starknet::storage::StorablePathableStorageAsPointer::>, core::starknet::storage::storage_base::StorageBaseAsPath::>, core::starknet::storage::MutableStorableStoragePathAsPointer::, core::starknet::storage::MutableImpl::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>, core::starknet::storage::MutableStorableStoragePointer0OffsetReadAccess::, core::starknet::storage::MutableImpl::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>::read>"],[257,"u128_overflowing_add"],[258,"enum_init"],[259,"store_temp"],[260,"store_temp"],[261,"enum_init"],[262,"const_as_immediate>"],[263,"drop"],[264,"storage_base_address_const<482148859801725464274198147480840119334382080162606228723774290742111978842>"],[265,"storage_write_syscall"],[266,"store_temp"],[267,"enum_init, ())>, 1>"],[268,"store_temp, ())>>"],[269,"const_as_immediate>"],[270,"struct_construct>>>"],[271,"snapshot_take>>>"],[272,"drop>>>"],[273,"struct_deconstruct>>>"],[274,"struct_construct>>"],[275,"snapshot_take>>"],[276,"drop>>"],[277,"struct_deconstruct>>"],[278,"dup"],[279,"u128_overflowing_sub"],[280,"u128_eq"],[281,"const_as_immediate>"],[282,"struct_construct"],[283,"enum_init"],[284,"enum_init"],[285,"struct_construct, Unit>>"],[286,"enum_init, ())>, 0>"],[287,"const_as_immediate>"],[288,"function_call>::_spend_allowance>"],[289,"struct_deconstruct, Unit>>"],[290,"struct_construct, core::bool>>"],[291,"enum_init, core::bool)>, 0>"],[292,"store_temp, core::bool)>>"],[293,"enum_init, core::bool)>, 1>"],[294,"const_as_immediate>"],[295,"const_as_immediate>"],[296,"struct_construct>>>"],[297,"snapshot_take>>>"],[298,"drop>>>"],[299,"struct_deconstruct>>>"],[300,"struct_construct"],[301,"enum_init"],[302,"alloc_local"],[303,"dup"],[304,"u32_try_from_felt252"],[305,"const_as_immediate, Const>>"],[306,"store_temp>"],[307,"u32_safe_divmod"],[308,"storage_address_to_felt252"],[309,"const_as_immediate>"],[310,"dup"],[311,"hades_permutation"],[312,"array_new"],[313,"const_as_immediate>"],[314,"store_temp"],[315,"store_temp>"],[316,"store_local"],[317,"function_call"],[318,"enum_match, core::integer::u32, core::felt252, core::starknet::storage_access::StorageBaseAddress, core::integer::u8, core::result::Result::<(), core::array::Array::>)>>"],[319,"struct_deconstruct, u32, felt252, StorageBaseAddress, u8, core::result::Result::<(), core::array::Array::>>>"],[320,"enum_match>>"],[321,"u32_eq"],[322,"drop>"],[323,"enum_init>, 1>"],[324,"struct_construct>>>"],[325,"enum_init>,)>, 0>"],[326,"store_temp>,)>>"],[327,"drop"],[328,"struct_construct"],[329,"enum_init>, 0>"],[330,"enum_init>,)>, 1>"],[331,"drop"],[332,"drop>"],[333,"const_as_immediate>"],[334,"struct_deconstruct>"],[335,"array_snapshot_pop_front"],[336,"enum_init>, 0>"],[337,"store_temp>>"],[338,"store_temp>>"],[339,"enum_init>, 1>"],[340,"enum_match>>"],[341,"unbox"],[342,"rename"],[343,"bytes31_to_felt252"],[344,"struct_construct, Unit>>"],[345,"enum_init, ())>, 0>"],[346,"store_temp, ())>>"],[347,"drop>"],[348,"enum_init, ())>, 1>"],[349,"struct_construct>>"],[350,"snapshot_take>>"],[351,"drop>>"],[352,"struct_deconstruct>>"],[353,"struct_construct"],[354,"enum_init"],[355,"enum_init"],[356,"struct_construct, Unit>>"],[357,"enum_init, ())>, 0>"],[358,"store_temp, ())>>"],[359,"enum_init, ())>, 1>"],[360,"function_call, core::bytes_31::bytes31Drop>>"],[361,"enum_match, core::option::Option::>)>>"],[362,"struct_deconstruct, core::option::Option::>>>"],[363,"store_temp>>"],[364,"enum_init, core::option::Option::)>, 1>"],[365,"store_temp, core::option::Option::)>>"],[366,"enum_init>, 1>"],[367,"enum_match>>"],[368,"enum_init, 0>"],[369,"struct_construct, core::option::Option::>>"],[370,"enum_init, core::option::Option::)>, 0>"],[371,"enum_init, 1>"],[372,"struct_deconstruct"],[373,"function_call"],[374,"enum_match>,)>>"],[375,"struct_deconstruct>>>"],[376,"const_as_immediate>"],[377,"struct_deconstruct, Unit>>"],[378,"struct_construct>"],[379,"enum_init, 0>"],[380,"store_temp>"],[381,"enum_init, 1>"],[382,"enum_match"],[383,"store_temp"],[384,"function_call"],[385,"enum_match"],[386,"const_as_immediate>"],[387,"dup"],[388,"struct_deconstruct"],[389,"rename"],[390,"const_as_immediate>"],[391,"dup"],[392,"struct_deconstruct"],[393,"enum_match"],[394,"const_as_immediate>"],[395,"struct_deconstruct"],[396,"rename"],[397,"struct_deconstruct>>"],[398,"const_as_immediate, Const>>"],[399,"const_as_immediate>"],[400,"dup"],[401,"bytes31_try_from_felt252"],[402,"array_append"],[403,"const_as_immediate>"],[404,"u32_overflowing_sub"],[405,"u8_overflowing_add"],[406,"felt252_add"],[407,"const_as_immediate>"],[408,"enum_init, core::integer::u32, core::felt252, core::starknet::storage_access::StorageBaseAddress, core::integer::u8, core::result::Result::<(), core::array::Array::>)>, 1>"],[409,"store_temp, core::integer::u32, core::felt252, core::starknet::storage_access::StorageBaseAddress, core::integer::u8, core::result::Result::<(), core::array::Array::>)>>"],[410,"const_as_immediate>"],[411,"enum_init>, 1>"],[412,"struct_construct, u32, felt252, StorageBaseAddress, u8, core::result::Result::<(), core::array::Array::>>>"],[413,"enum_init, core::integer::u32, core::felt252, core::starknet::storage_access::StorageBaseAddress, core::integer::u8, core::result::Result::<(), core::array::Array::>)>, 0>"],[414,"enum_init>, 0>"],[415,"enum_init>, 0>"],[416,"struct_construct, core::option::Option::>>>"],[417,"enum_init, core::option::Option::>)>, 0>"],[418,"store_temp, core::option::Option::>)>>"],[419,"enum_init, core::option::Option::>)>, 1>"],[420,"const_as_immediate>"],[421,"u32_wide_mul"],[422,"store_temp"],[423,"downcast"],[424,"u32_overflowing_add"],[425,"struct_deconstruct"],[426,"snapshot_take>"],[427,"function_call"],[428,"enum_match, core::felt252, core::starknet::storage_access::StorageBaseAddress, core::integer::u8, core::result::Result::<(), core::array::Array::>)>>"],[429,"struct_deconstruct, felt252, StorageBaseAddress, u8, core::result::Result::<(), core::array::Array::>>>"],[430,"struct_construct>>>"],[431,"enum_init>,)>, 0>"],[432,"store_temp>,)>>"],[433,"enum_init>,)>, 1>"],[434,"const_as_immediate>"],[435,"const_as_immediate>"],[436,"enum_match"],[437,"const_as_immediate>"],[438,"dup"],[439,"struct_deconstruct"],[440,"const_as_immediate>"],[441,"dup"],[442,"struct_deconstruct"],[443,"struct_construct, felt252, StorageBaseAddress, u8, core::result::Result::<(), core::array::Array::>>>"],[444,"enum_init, core::felt252, core::starknet::storage_access::StorageBaseAddress, core::integer::u8, core::result::Result::<(), core::array::Array::>)>, 0>"],[445,"store_temp, core::felt252, core::starknet::storage_access::StorageBaseAddress, core::integer::u8, core::result::Result::<(), core::array::Array::>)>>"],[446,"enum_init, core::felt252, core::starknet::storage_access::StorageBaseAddress, core::integer::u8, core::result::Result::<(), core::array::Array::>)>, 1>"]],"user_func_names":[[0,"madara_contracts::erc20::ERC20::__wrapper__UpgradeableImpl__upgrade"],[1,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__total_supply::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[2,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__balance_of::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[3,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__allowance::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[4,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__transfer::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[5,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__transfer_from::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[6,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__approve::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[7,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__name::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[8,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__symbol::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[9,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__decimals::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[10,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__totalSupply::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[11,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__balanceOf::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[12,"openzeppelin_token::erc20::erc20::ERC20Component::__wrapper__ERC20MixinImpl__transferFrom::, madara_contracts::erc20::ERC20::ContractStateDrop, madara_contracts::erc20::ERC20::ContractStateERC20MixinImpl>"],[13,"openzeppelin_access::ownable::ownable::OwnableComponent::__wrapper__OwnableMixinImpl__owner::"],[14,"openzeppelin_access::ownable::ownable::OwnableComponent::__wrapper__OwnableMixinImpl__transfer_ownership::"],[15,"openzeppelin_access::ownable::ownable::OwnableComponent::__wrapper__OwnableMixinImpl__renounce_ownership::"],[16,"openzeppelin_access::ownable::ownable::OwnableComponent::__wrapper__OwnableMixinImpl__transferOwnership::"],[17,"openzeppelin_access::ownable::ownable::OwnableComponent::__wrapper__OwnableMixinImpl__renounceOwnership::"],[18,"madara_contracts::erc20::ERC20::__wrapper__constructor"],[19,"openzeppelin_access::ownable::ownable::OwnableComponent::InternalImpl::::assert_only_owner"],[20,"openzeppelin_upgrades::upgradeable::UpgradeableComponent::InternalImpl::::upgrade"],[21,"core::starknet::storage::StorablePointerReadAccessImpl::, core::starknet::storage::StorablePathableStorageAsPointer::, core::starknet::storage::storage_base::StorageBaseAsPath::, core::starknet::storage::StorableStoragePathAsPointer::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>, core::starknet::storage::StorableStoragePointer0OffsetReadAccess::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>::read"],[22,"core::starknet::storage::map::StorableEntryReadAccess::, core::starknet::storage::map::EntryInfoImpl::, core::hash::into_felt252_based::HashImpl::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>::read"],[23,"core::starknet::storage::map::StorableEntryReadAccess::, core::starknet::storage::map::EntryInfoImpl::<(core::starknet::contract_address::ContractAddress, core::starknet::contract_address::ContractAddress), core::integer::u256>, core::hash::TupleNextHash::<(core::starknet::contract_address::ContractAddress, core::starknet::contract_address::ContractAddress), core::pedersen::HashState, core::pedersen::HashStateImpl, core::metaprogramming::TupleSplitTupleSize2::, core::hash::into_felt252_based::HashImpl::, core::hash::TupleNextHash::<(core::starknet::contract_address::ContractAddress,), core::pedersen::HashState, core::pedersen::HashStateImpl, core::metaprogramming::TupleSplitTupleSize1::, core::hash::into_felt252_based::HashImpl::, core::hash::TupleSize0Hash::, core::traits::TupleSize0Drop>, core::traits::TupleNextDrop::<(core::starknet::contract_address::ContractAddress,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::starknet::contract_address::ContractAddressDrop, core::traits::TupleSize0Drop>>, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>::read"],[24,"openzeppelin_token::erc20::erc20::ERC20Component::InternalImpl::>::update"],[25,"openzeppelin_token::erc20::erc20::ERC20Component::ERC20::>::transfer_from"],[26,"openzeppelin_token::erc20::erc20::ERC20Component::InternalImpl::>::_approve"],[27,"core::starknet::storage_access::inner_read_byte_array"],[28,"core::array::serialize_array_helper::, core::bytes_31::bytes31Drop>"],[29,"openzeppelin_access::ownable::ownable::OwnableComponent::InternalImpl::::_transfer_ownership"],[30,"core::byte_array::ByteArraySerde::deserialize"],[31,"madara_contracts::erc20::ERC20::constructor"],[32,"madara_contracts::erc20::ERC20::EventIsEvent::append_keys_and_data"],[33,"core::starknet::storage::StorablePointerReadAccessImpl::>, core::starknet::storage::StorablePathableStorageAsPointer::>, core::starknet::storage::storage_base::StorageBaseAsPath::>, core::starknet::storage::MutableStorableStoragePathAsPointer::, core::starknet::storage::MutableImpl::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>, core::starknet::storage::MutableStorableStoragePointer0OffsetReadAccess::, core::starknet::storage::MutableImpl::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>::read"],[34,"openzeppelin_token::erc20::erc20::ERC20Component::InternalImpl::>::_spend_allowance"],[35,"core::starknet::storage_access::inner_read_byte_array[expr84]"],[36,"core::array::deserialize_array_helper::, core::bytes_31::bytes31Drop>"],[37,"core::starknet::storage_access::inner_write_byte_array"],[38,"openzeppelin_token::erc20::erc20::ERC20Component::EventIsEvent::append_keys_and_data"],[39,"core::starknet::storage_access::inner_write_byte_array[expr56]"]]},"contract_class_version":"0.1.0","entry_points_by_type":{"EXTERNAL":[{"selector":"0x52580a92c73f4428f1a260c5d768ef462b25955307de00f99957df119865d","function_idx":15},{"selector":"0x41b033f4a31df8067c24d1e9b550a2ce75fd4a29e1147af9752174f0e6cb20","function_idx":12},{"selector":"0x4c4fb1ab068f6039d5780c68dd0fa2f8742cceb3426d19667778ca7f3518a9","function_idx":9},{"selector":"0x80aa9fdbfaf9615e4afc7f5f722e265daca5ccc655360fa5ccacf9c267936d","function_idx":10},{"selector":"0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e","function_idx":4},{"selector":"0xd5d33d590e6660853069b37a2aea67c6fdaa0268626bc760350b590490feb5","function_idx":17},{"selector":"0xf2f7c15cbe06c8d94597cd91fd7f3369eae842359235712def5584f8d270cd","function_idx":0},{"selector":"0x14a390f291e2e1f29874769efdef47ddad94d76f77ff516fad206a385e8995f","function_idx":16},{"selector":"0x1557182e4359a1f0c6301278e8f5b35a776ab58d39892581e357578fb287836","function_idx":1},{"selector":"0x1e888a1026b19c8c0b57c72d63ed1737106aa10034105b980ba117bd0c29fe1","function_idx":3},{"selector":"0x2016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c0","function_idx":13},{"selector":"0x216b05c387bab9ac31918a3e61672f4618601f3c598a2f3f2710f37053e1ea4","function_idx":8},{"selector":"0x219209e083275171774dab1df80982e9df2096516f06319c5c6d71ae0a8480c","function_idx":6},{"selector":"0x2a3bb1eaa05b77c4b0eeee0116a3177c6d62319dd7149ae148185d9e09de74a","function_idx":14},{"selector":"0x2e4263afad30923c891518314c3c95dbe830a16874e8abc5777a9a20b54c76e","function_idx":11},{"selector":"0x35a73cd311a05d46deda634c5ee045db92f811b4e74bca4437fcb5302b7af33","function_idx":2},{"selector":"0x361458367e696363fbcc70777d07ebbd2394e89fd0adcaf147faccd1d294d60","function_idx":7},{"selector":"0x3704ffe8fba161be0e994951751a5033b1462b918ff785c0a636be718dfdb68","function_idx":5}],"L1_HANDLER":[],"CONSTRUCTOR":[{"selector":"0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194","function_idx":18}]},"abi":[{"type":"impl","name":"UpgradeableImpl","interface_name":"openzeppelin_upgrades::interface::IUpgradeable"},{"type":"interface","name":"openzeppelin_upgrades::interface::IUpgradeable","items":[{"type":"function","name":"upgrade","inputs":[{"name":"new_class_hash","type":"core::starknet::class_hash::ClassHash"}],"outputs":[],"state_mutability":"external"}]},{"type":"impl","name":"ERC20MixinImpl","interface_name":"openzeppelin_token::erc20::interface::ERC20ABI"},{"type":"struct","name":"core::integer::u256","members":[{"name":"low","type":"core::integer::u128"},{"name":"high","type":"core::integer::u128"}]},{"type":"enum","name":"core::bool","variants":[{"name":"False","type":"()"},{"name":"True","type":"()"}]},{"type":"struct","name":"core::byte_array::ByteArray","members":[{"name":"data","type":"core::array::Array::"},{"name":"pending_word","type":"core::felt252"},{"name":"pending_word_len","type":"core::integer::u32"}]},{"type":"interface","name":"openzeppelin_token::erc20::interface::ERC20ABI","items":[{"type":"function","name":"total_supply","inputs":[],"outputs":[{"type":"core::integer::u256"}],"state_mutability":"view"},{"type":"function","name":"balance_of","inputs":[{"name":"account","type":"core::starknet::contract_address::ContractAddress"}],"outputs":[{"type":"core::integer::u256"}],"state_mutability":"view"},{"type":"function","name":"allowance","inputs":[{"name":"owner","type":"core::starknet::contract_address::ContractAddress"},{"name":"spender","type":"core::starknet::contract_address::ContractAddress"}],"outputs":[{"type":"core::integer::u256"}],"state_mutability":"view"},{"type":"function","name":"transfer","inputs":[{"name":"recipient","type":"core::starknet::contract_address::ContractAddress"},{"name":"amount","type":"core::integer::u256"}],"outputs":[{"type":"core::bool"}],"state_mutability":"external"},{"type":"function","name":"transfer_from","inputs":[{"name":"sender","type":"core::starknet::contract_address::ContractAddress"},{"name":"recipient","type":"core::starknet::contract_address::ContractAddress"},{"name":"amount","type":"core::integer::u256"}],"outputs":[{"type":"core::bool"}],"state_mutability":"external"},{"type":"function","name":"approve","inputs":[{"name":"spender","type":"core::starknet::contract_address::ContractAddress"},{"name":"amount","type":"core::integer::u256"}],"outputs":[{"type":"core::bool"}],"state_mutability":"external"},{"type":"function","name":"name","inputs":[],"outputs":[{"type":"core::byte_array::ByteArray"}],"state_mutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"type":"core::byte_array::ByteArray"}],"state_mutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"type":"core::integer::u8"}],"state_mutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"type":"core::integer::u256"}],"state_mutability":"view"},{"type":"function","name":"balanceOf","inputs":[{"name":"account","type":"core::starknet::contract_address::ContractAddress"}],"outputs":[{"type":"core::integer::u256"}],"state_mutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"sender","type":"core::starknet::contract_address::ContractAddress"},{"name":"recipient","type":"core::starknet::contract_address::ContractAddress"},{"name":"amount","type":"core::integer::u256"}],"outputs":[{"type":"core::bool"}],"state_mutability":"external"}]},{"type":"impl","name":"OwnableMixinImpl","interface_name":"openzeppelin_access::ownable::interface::OwnableABI"},{"type":"interface","name":"openzeppelin_access::ownable::interface::OwnableABI","items":[{"type":"function","name":"owner","inputs":[],"outputs":[{"type":"core::starknet::contract_address::ContractAddress"}],"state_mutability":"view"},{"type":"function","name":"transfer_ownership","inputs":[{"name":"new_owner","type":"core::starknet::contract_address::ContractAddress"}],"outputs":[],"state_mutability":"external"},{"type":"function","name":"renounce_ownership","inputs":[],"outputs":[],"state_mutability":"external"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"core::starknet::contract_address::ContractAddress"}],"outputs":[],"state_mutability":"external"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"state_mutability":"external"}]},{"type":"constructor","name":"constructor","inputs":[{"name":"name","type":"core::byte_array::ByteArray"},{"name":"symbol","type":"core::byte_array::ByteArray"},{"name":"fixed_supply","type":"core::integer::u256"},{"name":"recipient","type":"core::starknet::contract_address::ContractAddress"},{"name":"owner","type":"core::starknet::contract_address::ContractAddress"}]},{"type":"event","name":"openzeppelin_token::erc20::erc20::ERC20Component::Transfer","kind":"struct","members":[{"name":"from","type":"core::starknet::contract_address::ContractAddress","kind":"key"},{"name":"to","type":"core::starknet::contract_address::ContractAddress","kind":"key"},{"name":"value","type":"core::integer::u256","kind":"data"}]},{"type":"event","name":"openzeppelin_token::erc20::erc20::ERC20Component::Approval","kind":"struct","members":[{"name":"owner","type":"core::starknet::contract_address::ContractAddress","kind":"key"},{"name":"spender","type":"core::starknet::contract_address::ContractAddress","kind":"key"},{"name":"value","type":"core::integer::u256","kind":"data"}]},{"type":"event","name":"openzeppelin_token::erc20::erc20::ERC20Component::Event","kind":"enum","variants":[{"name":"Transfer","type":"openzeppelin_token::erc20::erc20::ERC20Component::Transfer","kind":"nested"},{"name":"Approval","type":"openzeppelin_token::erc20::erc20::ERC20Component::Approval","kind":"nested"}]},{"type":"event","name":"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred","kind":"struct","members":[{"name":"previous_owner","type":"core::starknet::contract_address::ContractAddress","kind":"key"},{"name":"new_owner","type":"core::starknet::contract_address::ContractAddress","kind":"key"}]},{"type":"event","name":"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted","kind":"struct","members":[{"name":"previous_owner","type":"core::starknet::contract_address::ContractAddress","kind":"key"},{"name":"new_owner","type":"core::starknet::contract_address::ContractAddress","kind":"key"}]},{"type":"event","name":"openzeppelin_access::ownable::ownable::OwnableComponent::Event","kind":"enum","variants":[{"name":"OwnershipTransferred","type":"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred","kind":"nested"},{"name":"OwnershipTransferStarted","type":"openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted","kind":"nested"}]},{"type":"event","name":"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded","kind":"struct","members":[{"name":"class_hash","type":"core::starknet::class_hash::ClassHash","kind":"data"}]},{"type":"event","name":"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event","kind":"enum","variants":[{"name":"Upgraded","type":"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Upgraded","kind":"nested"}]},{"type":"event","name":"madara_contracts::erc20::ERC20::Event","kind":"enum","variants":[{"name":"ERC20Event","type":"openzeppelin_token::erc20::erc20::ERC20Component::Event","kind":"flat"},{"name":"OwnableEvent","type":"openzeppelin_access::ownable::ownable::OwnableComponent::Event","kind":"flat"},{"name":"UpgradeableEvent","type":"openzeppelin_upgrades::upgradeable::UpgradeableComponent::Event","kind":"flat"}]}]} \ No newline at end of file diff --git a/cairo/target/dev/madara_contracts_UniversalDeployer.contract_class.json b/cairo/target/dev/madara_contracts_UniversalDeployer.contract_class.json new file mode 100644 index 000000000..195ac9505 --- /dev/null +++ b/cairo/target/dev/madara_contracts_UniversalDeployer.contract_class.json @@ -0,0 +1 @@ +{"sierra_program":["0x1","0x6","0x0","0x2","0x7","0x0","0x12b","0xd5","0x3d","0x52616e6765436865636b","0x800000000000000100000000000000000000000000000000","0x4172726179","0x800000000000000300000000000000000000000000000001","0x1","0xf","0x537472756374","0x800000000000000f00000000000000000000000000000001","0x0","0x2ee1e2b1b89f8c495f200e4956278a4d47395fe262f27b52e5865c9524c08c3","0x800000000000000300000000000000000000000000000003","0x2","0x16a4c8d7c05909052238a862d8cc3e7975bf05a07b3a69c6b28951083a6d672","0x4","0x456e756d","0x74584e9f10ffb1a40aa5a3582e203f6758defc4a497d1a2d5a89f274a320e9","0x3","0x5","0x800000000000000300000000000000000000000000000004","0x104eb68e98232f2362ae8fd62c9465a5910d805fa88b305d1f7721b8727f04","0x7","0x436f6e7374","0x800000000000000000000000000000000000000000000002","0x26b160f10156dea0639bec90696772c640b9706a47f5b8c52ea1abe5858b34d","0x436f6e747261637441646472657373","0x800000000000000700000000000000000000000000000000","0x800000000000000700000000000000000000000000000003","0x3288d594b9a45d15bb2fcb7903f06cdb06b27f0ba88186ec4cfaa98307cb972","0x436c61737348617368","0x536e617073686f74","0x800000000000000700000000000000000000000000000001","0x800000000000000700000000000000000000000000000002","0x1baeba72e79e9db2587cf44fedb2f3700b2075a5e8e39a562584862c4b71f62","0xd","0x66656c74323532","0x800000000000000700000000000000000000000000000007","0x240c93a02c47b6b6709db77c3de1c8124b97212c3178c6882122b28c11c48f0","0xa","0xb","0xc","0xe","0x3be1d2eded4d125db4e936cd72b4c7e7aab5aff9f7587d9355a832bd34d9827","0x10","0x426f78","0x1b","0x1d","0x75313238","0x1e","0x17","0x1597b831feeb60c71f259624b79cf66995ea4f7e383403583674ab9c33b9cec","0x18","0x753332","0x80000000000000070000000000000000000000000000000e","0x348a62b7a38c0673e61e888d83a3ac1bf334ee7361a8514593d3d9532ed8b39","0x16","0x19","0x1a","0x753634","0x800000000000000700000000000000000000000000000004","0x3808c701a5d13e100ab11b6c02f91f752ecae7e420d21b56c90ec0a475cc7e5","0x1c","0x3342418ef16b3e2799b906b1e4e89dbb9b111332dd44f72458ce44f9895b508","0x800000000000000700000000000000000000000000000006","0x7d4d99e9ed8d285b5c61b493cedb63976bc3d9da867933d829f49ce838b5e7","0x15","0x14","0x1f","0x506f736569646f6e","0x556e696e697469616c697a6564","0x800000000000000200000000000000000000000000000001","0x21","0x53797374656d","0x24","0x7533325f737562204f766572666c6f77","0x496e646578206f7574206f6620626f756e6473","0x4661696c656420746f20646573657269616c697a6520706172616d202331","0x4661696c656420746f20646573657269616c697a6520706172616d202332","0x4661696c656420746f20646573657269616c697a6520706172616d202333","0x4661696c656420746f20646573657269616c697a6520706172616d202334","0x4f7574206f6620676173","0x2b8030c07fe812caf0f8511007728226708bb2991b4feca5060dca39f42aac2","0x2f","0x3599cae2752a20eee8be19724d14dc5a65e6be9a62be121e50a056e414ab890","0x30","0x4275696c74696e436f737473","0x9931c641b913035ae674b400b61a51476d506bbe8bba2ff8a6272790aba9e6","0x2e","0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473","0x1d49f7a4b277bf7b55a2664ce8cef5d6922b5ffb806b89644b9e0cdbbcac378","0x35","0x13fdd7105045794a99550ae1c4ac13faa62610dfab62c16422bfcf5803baa6e","0x36","0x4e6f6e5a65726f","0x29d7d57c04a880978e7b3689f6218e507f3be17588744b58dc17762447ad0e7","0x39","0x11c6d8087e00642489f92d2821ad6ebd6532ad1a3b6d12833da6d6810391511","0x4761734275696c74696e","0x9d","0x7265766f6b655f61705f747261636b696e67","0x77697468647261775f676173","0x6272616e63685f616c69676e","0x7374727563745f6465636f6e737472756374","0x656e61626c655f61705f747261636b696e67","0x73746f72655f74656d70","0x61727261795f736e617073686f745f706f705f66726f6e74","0x756e626f78","0x72656e616d65","0x656e756d5f696e6974","0x3b","0x6a756d70","0x7374727563745f636f6e737472756374","0x656e756d5f6d61746368","0x636c6173735f686173685f7472795f66726f6d5f66656c74323532","0x3a","0x66656c743235325f69735f7a65726f","0x64726f70","0x38","0x66756e6374696f6e5f63616c6c","0x37","0x64697361626c655f61705f747261636b696e67","0x61727261795f6e6577","0x636f6e73745f61735f696d6d656469617465","0x34","0x61727261795f617070656e64","0x33","0x3c","0x6765745f6275696c74696e5f636f737473","0x32","0x77697468647261775f6761735f616c6c","0x626f6f6c5f6e6f745f696d706c","0x31","0x636f6e74726163745f616464726573735f746f5f66656c74323532","0x736e617073686f745f74616b65","0x2d","0x2c","0x2b","0x2a","0x29","0x647570","0x7533325f7472795f66726f6d5f66656c74323532","0x28","0x61727261795f736c696365","0x61727261795f6c656e","0x7533325f6f766572666c6f77696e675f737562","0x27","0x26","0x616c6c6f635f6c6f63616c","0x66696e616c697a655f6c6f63616c73","0x6765745f657865637574696f6e5f696e666f5f76325f73797363616c6c","0x20","0x13","0x66656c743235325f616464","0x68616465735f7065726d75746174696f6e","0x12","0x73746f72655f6c6f63616c","0x6465706c6f795f73797363616c6c","0x11","0x9","0x8","0x656d69745f6576656e745f73797363616c6c","0x25","0x23","0x22","0x636c6173735f686173685f746f5f66656c74323532","0x7533325f746f5f66656c74323532","0x6","0x2c9","0xffffffffffffffff","0xfc","0xea","0xe6","0xd4","0xc1","0x3e","0x43","0xb5","0xa1","0x3f","0x40","0x41","0x42","0x62","0x44","0x45","0x46","0x47","0x48","0x49","0x4a","0x4b","0x4c","0x8e","0x4d","0x4e","0x4f","0x50","0x51","0x52","0x53","0x54","0x55","0x56","0x86","0x57","0x58","0x59","0x5a","0x5b","0x5c","0x5d","0x5e","0x5f","0x60","0x61","0x63","0x64","0x65","0x66","0x67","0x68","0x69","0x6a","0x6b","0x6c","0x6d","0x6e","0x6f","0x70","0x71","0x72","0x73","0x74","0x75","0x76","0x77","0x78","0x79","0x7a","0x7b","0x7c","0xee","0x7d","0x7e","0x7f","0x80","0x81","0x82","0x83","0x84","0x85","0x87","0x88","0x112","0x117","0x169","0x160","0x153","0x144","0x138","0x21b","0x1b7","0x1aa","0x1b4","0x1bc","0x208","0x1f6","0x1ef","0x1fe","0x89","0x8a","0x8b","0x8c","0x252","0x256","0x8d","0x8f","0x90","0x91","0x92","0x289","0x93","0x94","0x95","0x96","0x97","0x98","0x2bb","0x29d","0x2a2","0x2b0","0x99","0x9a","0x9b","0x9c","0x10b","0x173","0x22d","0x291","0x1a01","0x28120b038341208038300a0502828120b038281208038180a04018080200","0x1428090583c1805028140a0505024260709014220508024160f028141c05","0x800e050287c3c1a0e8300a0c02870121b078683218060180a170b0480a15","0x1454091003c0c05148145005138144c05130144a091201c3423110144209","0xc00a04018685e2e0287c582d0287c5809060180a170b01418060285c2c2b","0x140c05148146e05130140c051b0246a070d0d06605190244007188143e1e","0x980a3d028f40a3c048ec0e1a1d0a40a39028e40a29028dc0a38028180a06","0x143e2c030144c051301484052081480091f81c6e051e8140c051f0247607","0x180a170b12818060285c2c49029188a02240980a462291c0a46228088843","0x589c0c030142e16268300c050b858980c030142e160483072050b858960c","0x1480a0a0486c0e51048200e290282812200394018060285c2c4f060180a17","0x3cb00c030142e1609014ae052b024160f0d15424052a014a6090583c4c05","0x180a1f2e8480a5c0296c120b079680a2902828121b038300a2902964121b","0x24c809319880461060140c0530024360f06014be052f024360f030143e2c","0x14186c030140a6b030140a6a030140a69048140a680499c5205029981265","0x1b40a0538014186d02830d80c02814de09371b40a05340880a0534024186d","0x1a05205029bce405029c00a0c39014186c390140a6804830e405061b01271","0x14d0090609c0a0c361d40a053a09c0a0534014182702830d809398180a05","0x140a74110140a74049e0b405029c0b80502998ee05029c00a11029d85205","0x14f87b02814f40602814f22702814e82802814e80602814e82902814e85f","0x140a683f0140a68238140a6802830fa05061b02405029bc1c05029bc0c05","0x3022053b0a00a05341480a0537825040940a000a0534024fe7d02814d049","0x1b0ae05029bc0a05029d00a0502a141284290140a742a0140a66418140a70","0x14f48902814f48802814f48702814f40c02814e88602814f409061f40a0c","0x140a8f030140a8e1c8140a681c8140a8b468140a7a04a30440502a2d1405","0x2440a053d1dc0a0534024187702830d85c02814de09061680a0c360252006","0x140a93248140a9302830b405061b12405029e87205029d00a0c3b814186c","0x14e84102814e84302814cc4302814d49602814d0094a8252847028152626","0x2612e05029e84c0502a2c4e05029c04c05029a04e0502a2c4c05029d08405","0x11c0a054d8a40a05458a00a054591c0a0535a680a053d0253206028151609","0x140a684e8140a744e8140a85048313a05061b05605029bc4c0502a6c129c","0x14e01108814ec4902815360502814d02b02814d09e02814f49d02814e09d","0x1d02405029990605029a0120c41814186c2a0140a6f04a802a05029993e05","0x14cc2b0281516a302814e8a202814e8a102814e8050620c0a0c360380a05","0x1c01c11029d812a5148140a6b04a905005029ac4e05029ac4c05029ac5605","0x30d82b02814e89f02814d0090627c0a0c360540a05378440a05332980a05","0x2412a7028314c05061b14c05029a0120c53014186c088140a6f028313e05","0x14220904aa00a09060253e15062a54c12062a0180c048300a0904aa00a09","0x9818a8062780aa6048480aa8028480a1204825500504838129e02aa00a0e","0x2452055401444054f8244405540144e050a82412a8028241809140145227","0x14122804a740aa8028180a27048ac0aa8028980a26048180aa8028a40a9e","0xa00a2604a5c0aa802a680a2904a680aa802824440904aa00a09060241297","0x14120c049040aaa21015500c4e8140c094e81550054b8144e09158155005","0x2a00a3702848120954014120c048cc0aab188dc18a806108240c1582412a8","0x1550051c8142a0904aa00a09060245a054b0e4700c540305605530246e05","0x9c124302aa00a3802898123002aa00a2e02a78122e02aa00a3d02a7c123d","0xa4124702aa00a091102412a802824180904a840a09140252c05540146005","0x312c05030252c05540154605138248605540145a05130254605540148e05","0x241809488150c9250831500c218154c0904aa00a09060249205562880aa8","0x2240aa802a340a9a04a280aa802a840a2604a340aa802a480a9d048255005","0x21c0aa802a200a9704a200aa802824440904aa00a09060241280028245009","0x15c0aad43015500c448148409448155005438153409450155005488144c09","0x14a4054f824a80554015140520824a405540150c050a82412a8028241809","0x25500504830128002ab812a80620c0a3104a0c0aa802a0c0a3704a0c0aa8","0x141228049680aa8029ec0a38049ec0aa8029f40a33049f40aa8028244409","0x14b80516824b80554014122204825500540014720904aa00a090602412af","0x1500aa8029500a3d048dc0aa8028dc0a12049680aa8029dc0a38049dc0aa8","0x25500504830126d02ac0e40554030be0518024be75062a00a541b8305c09","0x2412a80282418095901562ae02aa0180002a5812003f0315005390148609","0x11c120954014120c04abc0ab65aad018a8062cc0aa604acc0aa8029f80a11","0x2841209540155c052482412a802ad40aa20482550055a015460904aa00a09","0x256e0554014128d0482550052d015220904aa00a3102a481209540154405","0x14128804ae40aa802ae16e0c4482570055401570051b825700554014128a","0x1550053a81424095e01550055d8150c095d81550055cae8188704ae80aa8","0x20c121102aa00a110295012a602aa00aa602948120502aa00a050295c1275","0x2412a802abc0aa30482550050483012bc08a980a75090157805540157805","0x3180bf5f031500c5ea98ea113d8257a05540157a053e8257a05540141280","0x2a00a092e025860554014b4052d02412a8028248e0904aa00a090602584c1","0x240a05540140a052b8257e05540157e05290257c05540157c05090258805","0x30c0a3804a880aa802a880a37048c40aa8028c40a77048440aa8028440a54","0x4950055730d4431620440abf5f278ea09570155005570147a09618155005","0x2a00a094682412a80282418096601596ca02aa018c90297c12c96431d8cc5","0x25a005540159e053f02412a802b380a6d04b3d9c0c540159405390259a05","0x14820904aa00ad202ab812d3690315005688140009688155005683341889","0x2a00ac50284812d602aa00ad502acc12d502aa00ad402ac812d402aa00ad3","0x2590055401590052a0258c05540158c05290258e05540158e052b8258a05","0x155005660150c0904aa00a0906025acc86331d8a1202b580aa802b580a83","0x15012c602aa00ac60294812c702aa00ac70295c12c502aa00ac50284812b6","0x2550050483012b6643198ec5090156c05540156c05418259005540159005","0x25500518815240904aa00aa202a841209540155c052482412a8028248e09","0x2a00ad8028dc12d802aa00a095a025ae0554014128d0482550052d0152209","0x36c0aa802b65b40c43825b40554014128804b640aa802b61ae0c44825b005","0x14a40902815500502814ae096081550056081424096e01550056d8150c09","0x458405608480adc02aa00adc02a0c121102aa00a110295012c202aa00ac2","0x2550053f014920904aa00ab202ad412095401412470482550050483012dc","0x15500504a34120954014b4054882412a8028c40a92048255005510154209","0x22012df02aa00ade6e83112096f01550056f0146e096f015500504abc12dd","0x14ea0509025c40554015c20543025c20554015bee00621c12e002aa00a09","0x440aa8028440a5404a980aa802a980a52048140aa8028140a57049d40aa8","0x2550050491c120954014120c04b8822a6029d42405710155005710150609","0x2a00a6d02a1812095401462054902412a802a880aa10482550052d0152209","0x254c05540154c05290240a05540140a052b824ea0554014ea0509025c605","0x2a00a0906025c61153014ea1202b8c0aa802b8c0a83048440aa8028440a54","0x2a00aa202a8412095401462054902412a80295c0ab50482550050491c1209","0x15ca051b825ca055401412b704b900aa8028251a0904aa00a8a02a8c1209","0x1550057339c188704b9c0aa802825100973015500572b90188904b940aa8","0x148120502aa00a050295c123702aa00a370284812e902aa00ae802a1812e8","0x2980a3709015d20554015d2054182422055401422052a0254c05540154c05","0x2a00a3102a4812095401492055a82412a8028248e0904aa00a0906025d211","0x15d6051b825d6055401412b804ba80aa8028251a0904aa00a4302a8c1209","0x155005763b4188704bb40aa802825100976015500575ba8188904bac0aa8","0x148120502aa00a050295c123702aa00a370284812ef02aa00aee02a1812ee","0x2980a3709015de0554015de054182422055401422052a0254c05540154c05","0x14122804bc00aa8028cc0a1204825500515815460904aa00a0906025de11","0x1424050902412a8028ac0aa3048255005208156a0904aa00a090602412f1","0x3cc0a3704bcc0aa802825720979015500504a34120954014124704bc00aa8","0x2a00af47a8310e097a815500504a2012f402aa00af3790311209798155005","0x240a05540140a052b825e00554015e00509025ee0554015ec0543025ec05","0x15e01202bdc0aa802bdc0a83048440aa8028440a5404a980aa802a980a52","0x1412b404be00aa8028251a0904aa00a0e02924120954014120c04bdc22a6","0x32c0aa80282510097d01550057cbe0188904be40aa802be40a3704be40aa8","0x15c121502aa00a150284812fc02aa00afb02a1812fb02aa00afa658310e09","0x15f8054182422055401422052a0253e05540153e05290240a05540140a05","0x38220c540301805530241805540140a0508825f8114f8142a1202bf00aa8","0x268121502aa00a110289812a602aa00a0e02a74120954014120c048480afd","0x25c129e02aa00a091102412a802824180904bf80a09140253e05540154c05","0x142a055d0253e05540144c054d0242a05540142405130244c05540153c05","0x14120c048a40aff11015500c4f81484091401550051381482091385418a8","0x2456055401456051b8245605540140c054f8240c055401444050a82412a8","0x2f012095401450052482412a80282418094b816009a4e831500c1582418bb","0x1080abe048dd340c5401534055e8248215062a00a1502ae8124202aa00a09","0x2e8120954014120c048e00b01198c418a8060dc84414e8397e09210155005","0x157c091ea6818a802a680abd048b40aa8028e40ac1048e42a0c540142a05","0x10c1902180b818a8060f45a3108b08123302aa00a3302898122d02aa00a2d","0x2a00a0906025440581a8c8e0c54030609a0a8b81cbf048255005048301296","0x310129202aa00aa30290412a102aa00a4902b0c124902aa00a33029041209","0x2340ac60491c0aa80291c0a1204a340aa802a440ac504a440aa802a85240c","0x15500504a3412095401466055182412a80282418094691c1805468155005","0x220128802aa00a89450311209448155005448146e0944815500504b1c128a","0x15440509024ae05540150c05640250c055401510870621c128702aa00a09","0x2a00a9602b24120954014120c0495d440c0295c0aa80295c0ac604a880aa8","0x2a00a094682412a802a680ac90482550050a815460904aa00a3302a8c1209","0x25060554014a85206224125402aa00a54028dc125402aa00a0965024a405","0x10c0a12049ec0aa8029f40ac8049f40aa802a0d000c438250005540141288","0x1534056482412a80282418093d90c18053d81550053d8158c09218155005","0x1700a37049700aa8028258e092d015500504a341209540142a055182412a8","0x2a00a773a8310e093a815500504a20127702aa00a5c2d03112092e0155005","0x14e40554014e40563024700554014700509024e40554014be0564024be05","0x1b40acc049b40aa802824440904aa00a1502a8c120954014120c049c8700c","0x2a00a970284812ae02aa00a0002b14120002aa00a7e1403188093f0155005","0x255005148156a0904aa00a09060255c97060155c05540155c05630252e05","0x2cc500c6202566055401564056602564055401412220482550050a8154609","0x1550055a8158c090481550050481424095a81550055a0158a095a0155005","0x2452055401412cf048a00aa8028259c0913015500504b3412b5048300ab5","0x1092e9a08c113a2b03045500c0881418d10482550050491c12095401412d0","0x1482056a0248205540153a05698253a05540153a056902412a8028241809","0x2a00a3802ad812095401462056b02412a8028dc0ad5048e47033188dc24a8","0x180a52048b42a0c540142a056b82412a8028241c0904aa00a3902a841209","0x15500c16815b20919815500519815b00915815500515814a809030155005","0x246033062a00a3302b681209540147a055a82412a8028241809170160a3d","0x15500504b6c124702aa00a096d8252c055401412db0490c0aa8028c00a7e","0x1254c0c540154c056e825440554014869606370129602aa00a96028dc12a3","0xdc12a202aa00aa2028dc12a102aa00a4923831b809238155005238146e09","0x2352292072a00aa350a88180e6f02546055401546051b8254205540154205","0x14ae09440155005440147009440155005448145a0944815500504888128a","0x2a00a8a028dc128d02aa00a8d028dc129102aa00a91028dc129202aa00a92","0x2412a802a1c0ab504825500504830128602c190e055403110056c8251405","0x2481cde049480aa8029480a37049480aa80295d220c6e024ae055401412df","0x14ae0904aa00a7d02a84120954015000550824fa80419501ca802a291a52","0x2d4120954014120c048260e05048a0125a02aa00a83028dc127b02aa00a54","0x2a00a77028dc127702aa00a5c46831b8092e015500504b7c1209540150c05","0x1b40aa1048255005390154209369c8be75072a00a8a3ba45240e6f024ee05","0x880aa8029ec0ae0049680aa80297c0a37049ec0aa8029d40a57048255005","0x255005170156a0904aa00a090602413080282450093f01550052d0153e09","0x384127e02aa00a7e028dc127e53031500553015ba0911015500506014ae09","0x38c12b20a83150050a815ae095727c18a802a7c0ae204800240c540142405","0x2bd6a1184ad04e9e59839500c592b8fc00158194ce4048880aa802888520c","0x2e00aa8028251a0904aa00ab40292412095401412470482550050483012b7","0x39812ba13831500513815b409138155005138a018e504ae40aa8028251a09","0x2f418a802af00ae804af00aa802aec0ae704aec0aa802a993e120a8cd74a6","0x2418095f81550055f015d6095f01550055f015d40904aa00abd02ba412be","0x3080aa802b05700c4482582055401582051b82582055401412ec048255005","0x15dc095f81550055f815da0959815500559814a409048155005048142409","0x2cc1212780253c05540153c26063bc12b902aa00ab902bb812c202aa00ac2","0x258e05853180aa8063140af20482550050483812c56230c22a802ae584bf","0x1590050002412a802b280ab504b2992c808aa00ac602bcc120954014120c","0x255005670155c0967b3818a802b240a00048255005660155c0966b3018a8","0x34818a806345a09e62039e809688155005678148209680155005668148209","0x2d80aa80289c1c0c7a82412a8028248e0904aa00a0906025acd56a04616d3","0x14ae0969015500569014a4096181550056181424096b81550055b015ec09","0x34c44d2618480ad702aa00ad702bdc12d302aa00ad302950122202aa00a22","0x2a00ad4029481209540141c053682412a80289c0ab60482550050483012d7","0x24180904c300a0914025b40554015ac0577025b20554015aa052a025b005","0x25b8db062a00ac702be01209540141c053682412a80289c0ab6048255005","0x15b80577025b205540153c052a025b0055401588052902412a802b6c0af9","0x3e812de02aa00ada6e8310e096e815500504a20120954014124704b680aa8","0x1444052b825b00554015b00529025860554015860509025be0554015bc05","0x25bed911361861202b7c0aa802b7c0af704b640aa802b640a54048880aa8","0x1b41209540154c055082412a802a7c0a490482550050491c120954014120c","0x2412a8028480a920482550050a815220904aa00a3302ad81209540141c05","0x2a00ab7700310e0970015500504a2012095401450057d82412a8028980acb","0x256a05540156a0529024120554014120509025c40554015c2057d025c205","0x2d4121202b880aa802b880af704abc0aa802abc0a54048880aa8028880a57","0xa40afc04825500553015420904aa00a9f02924120954014120c04b895e22","0x15960904aa00a1202a481209540142a054882412a8028380a6d048255005","0x3900aa802909c60c43825c60554014128804825500514015f60904aa00a26","0x14ae094d01550054d014a40904815500504814240972815500572015f409","0x25c189a048480ae502aa00ae502bdc129702aa00a9702950120c02aa00a0c","0x2793e15532995005090161c090903018a8028300b0d0482550050491c12e5","0x980a490482550054f015240904aa00a9f02a441209540142a055b0244e26","0x2444055401450053f0245005540154c058782412a80289c0aa1048255005","0x2693a2b532a00a0602c381206060315005060161a09148155005110381889","0x14920904aa00a9702a4812095401534054882412a8028ac0ab6049048497","0xc40aa8028dc0a7e048dc0aa802a740b0f04825500520815420904aa00a42","0xb472a654014700587024700c062a00a0c02c34123302aa00a31148311209","0x1241209540145c054902412a8028b40ab60482550051c8156c09218c05c3d","0x2412a8028241c094b01550051e816200904aa00a4302a841209540146005","0x156a0904aa00a090602546058891c0aa8062580ad9048cc0aa8028cc0aee","0x301209890141228049240aa802a880a3704a880aa802825b60904aa00a47","0x2492055401542051b82542055401412df048255005518156a0904aa00a09","0x2440b0e04a44180c540141805868252405540149233062241209540141247","0x2240a91048255005450156c0904aa00a8d02ad8128643a21128a46a995005","0x300125702aa00a8802c4c1209540150c055082412a802a1c0a49048255005","0x161c094183018a8028300b0d049500aa802949240c44824a40554014ae05","0x15220904aa00a7d02ad812095401500055b024ee5c2d1ecfa80532a00a83","0x1d4b80c54014b8057102412a8029dc0aa10482550052d015240904aa00a7b","0x162a093681550053901582093901550052f81422092f81550053a8162809","0x14b8058a024000554014fc5406224127e02aa00a7e028dc127e02aa00a6d","0x2b80aa802ab80a3d048140aa8028140a52048240aa8028240a1204ab80aa8","0x2a018b402c5c12b459ac822a8028015c050483a2c0900015500500015dc09","0x2550055c0156a095c2dc18a802ad40b190482550050483012af02c616a05","0x2550055d0156c0904aa00ab902ad812be5eaf176ba5ca995005060161c09","0x2a00abe02a7c1209540157a052482412a802af00a920482550055d8152209","0x1550056130422118d025840554014122204b040aa802afd6e0c448257e05","0x47012b302aa00ab30294812b202aa00ab20284812c402aa00ac302c6c12c3","0x163a0904aa00a1102ab8120954014120c04b1166b2088158805540158805","0x15500559814a409590155005590142409628155005578163c0904aa00a0c","0x2a01805048300a0904aa00a09238258ab3590440ac502aa00ac502c7012b3","0x25500504838129f02aa00a0c02844120954014120c048554c0c8f8481c0c","0x2412a80282418091381640264f031500c4f8154c09070155005070142409","0x141228048a40aa8028a00a9a048880aa802a780a26048a00aa8028980a9d","0x9c0a26048ac0aa8028180a97048180aa802824440904aa00a09060241321","0x14120c04a680b224e815500c148148409148155005158153409110155005","0x146e092101550054b8153e094b81550054e8142a0904aa00a092382412a8","0x141c05090246e0554014440520824820554014841106224124202aa00a42","0x1040aa8029040aee048dc0aa8028dc0a3d048480aa8028480a52048380aa8","0x248e0904aa00a09060247033188440a38198c422a8029046e120703a2c09","0x3246091c81550050488812095401444055182412a802a680ab5048255005","0x142405290241c05540141c05090247a05540145a05920245a05540147211","0x1422055702412a80282418091e8481c11028f40aa8028f40b25048480aa8","0xc00a37048c00aa802825680917015500504a3412095401418052482412a8","0x2a00a434b0310e094b015500504a20124302aa00a30170311209180155005","0x242a05540142a05290254c05540154c05090254605540148e05930248e05","0x14127d249f88e09090a4927e238242412518554c1102a8c0aa802a8c0b25","0x11cfc09090a44e061414892473f0253d2702824ee09060a4120c04838220c","0x38220c028253e7e048440a05159f812129427c2aa609038220c028250649","0x4a8220c028254c7e048440a293f0241d29"],"sierra_program_debug_info":{"type_names":[[0,"RangeCheck"],[1,"Array"],[2,"Unit"],[3,"Tuple, Unit>"],[4,"core::panics::Panic"],[5,"Tuple>"],[6,"core::panics::PanicResult::<(core::array::Array::, ())>"],[7,"Tuple, Array, Unit>"],[8,"core::panics::PanicResult::<(core::array::Array::, core::array::Array::, ())>"],[9,"Const"],[10,"ContractAddress"],[11,"core::bool"],[12,"ClassHash"],[13,"Snapshot>"],[14,"core::array::Span::"],[15,"felt252"],[16,"madara_contracts::udc::UniversalDeployer::ContractDeployed"],[17,"madara_contracts::udc::UniversalDeployer::Event"],[18,"Const"],[19,"Const"],[20,"Box"],[21,"Box"],[22,"u128"],[23,"Array"],[24,"Snapshot>"],[25,"core::array::Span::"],[26,"u32"],[27,"core::starknet::info::v2::TxInfo"],[28,"u64"],[29,"core::starknet::info::BlockInfo"],[30,"core::starknet::info::v2::ResourceBounds"],[31,"core::starknet::info::v2::ExecutionInfo"],[32,"Box"],[33,"Poseidon"],[34,"Uninitialized"],[35,"Uninitialized"],[36,"System"],[37,"Uninitialized"],[38,"Const"],[39,"Const"],[40,"Const"],[41,"Const"],[42,"Const"],[43,"Const"],[44,"Const"],[45,"Const"],[46,"Tuple>"],[47,"madara_contracts::udc::UniversalDeployer::ContractState"],[48,"Tuple"],[49,"core::panics::PanicResult::<(madara_contracts::udc::UniversalDeployer::ContractState, core::starknet::contract_address::ContractAddress)>"],[50,"BuiltinCosts"],[51,"core::panics::PanicResult::<(core::array::Span::,)>"],[52,"Const"],[53,"core::option::Option::>"],[54,"Tuple, core::option::Option::>>"],[55,"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"],[56,"NonZero"],[57,"Box"],[58,"core::option::Option::>"],[59,"core::option::Option::"],[60,"GasBuiltin"]],"libfunc_names":[[0,"revoke_ap_tracking"],[1,"withdraw_gas"],[2,"branch_align"],[3,"struct_deconstruct>"],[4,"enable_ap_tracking"],[5,"store_temp"],[6,"array_snapshot_pop_front"],[7,"unbox"],[8,"rename"],[9,"enum_init, 0>"],[10,"store_temp>>"],[11,"store_temp>"],[12,"jump"],[13,"struct_construct"],[14,"enum_init, 1>"],[15,"enum_match>"],[16,"class_hash_try_from_felt252"],[17,"enum_init>, 0>"],[18,"store_temp>>"],[19,"enum_init>, 1>"],[20,"enum_match>>"],[21,"struct_construct>"],[22,"store_temp"],[23,"felt252_is_zero"],[24,"enum_init"],[25,"store_temp"],[26,"drop>"],[27,"enum_init"],[28,"store_temp>"],[29,"function_call"],[30,"enum_match, core::option::Option::>)>>"],[31,"struct_deconstruct, core::option::Option::>>>"],[32,"enum_match>>"],[33,"disable_ap_tracking"],[34,"drop>>"],[35,"drop>"],[36,"drop>"],[37,"drop"],[38,"drop"],[39,"drop"],[40,"array_new"],[41,"const_as_immediate>"],[42,"array_append"],[43,"struct_construct"],[44,"struct_construct>>"],[45,"enum_init,)>, 1>"],[46,"store_temp"],[47,"store_temp"],[48,"store_temp"],[49,"store_temp,)>>"],[50,"get_builtin_costs"],[51,"store_temp"],[52,"withdraw_gas_all"],[53,"bool_not_impl"],[54,"struct_construct"],[55,"store_temp"],[56,"function_call"],[57,"enum_match>"],[58,"struct_deconstruct>"],[59,"drop"],[60,"contract_address_to_felt252"],[61,"snapshot_take>"],[62,"drop>"],[63,"struct_construct>>"],[64,"enum_init,)>, 0>"],[65,"const_as_immediate>"],[66,"drop"],[67,"const_as_immediate>"],[68,"const_as_immediate>"],[69,"const_as_immediate>"],[70,"const_as_immediate>"],[71,"dup>>"],[72,"u32_try_from_felt252"],[73,"const_as_immediate>"],[74,"dup"],[75,"store_temp"],[76,"array_slice"],[77,"array_len"],[78,"u32_overflowing_sub"],[79,"enum_init>, 0>"],[80,"struct_construct, core::option::Option::>>>"],[81,"enum_init, core::option::Option::>)>, 0>"],[82,"store_temp, core::option::Option::>)>>"],[83,"const_as_immediate>"],[84,"enum_init, core::option::Option::>)>, 1>"],[85,"drop"],[86,"const_as_immediate>"],[87,"enum_init>, 1>"],[88,"alloc_local"],[89,"alloc_local"],[90,"alloc_local"],[91,"finalize_locals"],[92,"get_execution_info_v2_syscall"],[93,"store_temp>"],[94,"unbox"],[95,"struct_deconstruct"],[96,"drop>"],[97,"drop>"],[98,"drop"],[99,"dup"],[100,"store_temp"],[101,"enum_match"],[102,"dup"],[103,"const_as_immediate>"],[104,"felt252_add"],[105,"dup"],[106,"hades_permutation"],[107,"const_as_immediate>"],[108,"rename"],[109,"dup"],[110,"dup>"],[111,"store_local"],[112,"deploy_syscall"],[113,"store_local"],[114,"struct_construct"],[115,"enum_init"],[116,"snapshot_take"],[117,"drop"],[118,"store_temp"],[119,"enum_match"],[120,"const_as_immediate>"],[121,"store_temp"],[122,"store_temp>"],[123,"store_local"],[124,"function_call"],[125,"enum_match, core::array::Array::, ())>>"],[126,"struct_deconstruct, Array, Unit>>"],[127,"emit_event_syscall"],[128,"struct_construct>"],[129,"enum_init, 0>"],[130,"store_temp>"],[131,"struct_deconstruct>>"],[132,"drop"],[133,"enum_init, 1>"],[134,"drop>"],[135,"drop>"],[136,"drop>"],[137,"dup"],[138,"struct_deconstruct"],[139,"rename"],[140,"rename"],[141,"rename"],[142,"class_hash_to_felt252"],[143,"rename>"],[144,"u32_to_felt252"],[145,"function_call>"],[146,"enum_match, ())>>"],[147,"struct_deconstruct, Unit>>"],[148,"struct_construct, Array, Unit>>"],[149,"enum_init, core::array::Array::, ())>, 0>"],[150,"store_temp, core::array::Array::, ())>>"],[151,"drop"],[152,"enum_init, core::array::Array::, ())>, 1>"],[153,"struct_construct, Unit>>"],[154,"enum_init, ())>, 0>"],[155,"store_temp, ())>>"],[156,"enum_init, ())>, 1>"]],"user_func_names":[[0,"madara_contracts::udc::UniversalDeployer::__wrapper__UniversalDeployerImpl__deploy_contract"],[1,"core::array::SpanFelt252Serde::deserialize"],[2,"madara_contracts::udc::UniversalDeployer::UniversalDeployerImpl::deploy_contract"],[3,"madara_contracts::udc::UniversalDeployer::ContractDeployedIsEvent::append_keys_and_data"],[4,"core::array::serialize_array_helper::"]]},"contract_class_version":"0.1.0","entry_points_by_type":{"EXTERNAL":[{"selector":"0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8","function_idx":0}],"L1_HANDLER":[],"CONSTRUCTOR":[]},"abi":[{"type":"impl","name":"UniversalDeployerImpl","interface_name":"openzeppelin_utils::deployments::interface::IUniversalDeployer"},{"type":"enum","name":"core::bool","variants":[{"name":"False","type":"()"},{"name":"True","type":"()"}]},{"type":"struct","name":"core::array::Span::","members":[{"name":"snapshot","type":"@core::array::Array::"}]},{"type":"interface","name":"openzeppelin_utils::deployments::interface::IUniversalDeployer","items":[{"type":"function","name":"deploy_contract","inputs":[{"name":"class_hash","type":"core::starknet::class_hash::ClassHash"},{"name":"salt","type":"core::felt252"},{"name":"from_zero","type":"core::bool"},{"name":"calldata","type":"core::array::Span::"}],"outputs":[{"type":"core::starknet::contract_address::ContractAddress"}],"state_mutability":"external"}]},{"type":"event","name":"madara_contracts::udc::UniversalDeployer::ContractDeployed","kind":"struct","members":[{"name":"address","type":"core::starknet::contract_address::ContractAddress","kind":"data"},{"name":"deployer","type":"core::starknet::contract_address::ContractAddress","kind":"data"},{"name":"from_zero","type":"core::bool","kind":"data"},{"name":"class_hash","type":"core::starknet::class_hash::ClassHash","kind":"data"},{"name":"calldata","type":"core::array::Span::","kind":"data"},{"name":"salt","type":"core::felt252","kind":"data"}]},{"type":"event","name":"madara_contracts::udc::UniversalDeployer::Event","kind":"enum","variants":[{"name":"ContractDeployed","type":"madara_contracts::udc::UniversalDeployer::ContractDeployed","kind":"nested"}]}]} \ No newline at end of file diff --git a/cairo/tests/test_contract.cairo b/cairo/tests/test_contract.cairo new file mode 100644 index 000000000..61d9d4b7f --- /dev/null +++ b/cairo/tests/test_contract.cairo @@ -0,0 +1,4 @@ +#[test] +fn test_hello_world() { + assert(1 != 0, '1 should not equal to 0.'); +} diff --git a/crates/client/block_import/src/lib.rs b/crates/client/block_import/src/lib.rs index 3b6df97fe..8bcf27d31 100644 --- a/crates/client/block_import/src/lib.rs +++ b/crates/client/block_import/src/lib.rs @@ -111,7 +111,6 @@ impl BlockImportError { matches!(self, BlockImportError::InternalDb { .. } | BlockImportError::Internal(_)) } } - pub struct BlockImporter { pool: Arc, verify_apply: VerifyApply, @@ -123,10 +122,20 @@ impl BlockImporter { Self { verify_apply: VerifyApply::new(Arc::clone(&backend), Arc::clone(&pool)), pool } } + /// Perform [`BlockImporter::pre_validate`] followed by [`BlockImporter::verify_apply`] to import a block. + pub async fn add_block( + &self, + block: UnverifiedFullBlock, + validation: BlockValidationContext, + ) -> Result { + let block = self.pre_validate(block, validation.clone()).await?; + self.verify_apply(block, validation).await + } + pub async fn pre_validate( &self, block: UnverifiedFullBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { pre_validate(&self.pool, block, validation).await } @@ -134,7 +143,7 @@ impl BlockImporter { pub async fn verify_apply( &self, block: PreValidatedBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { self.verify_apply.verify_apply(block, validation).await } @@ -142,7 +151,7 @@ impl BlockImporter { pub async fn pre_validate_pending( &self, block: UnverifiedPendingFullBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { pre_validate_pending(&self.pool, block, validation).await } @@ -150,7 +159,7 @@ impl BlockImporter { pub async fn verify_apply_pending( &self, block: PreValidatedPendingBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { self.verify_apply.verify_apply_pending(block, validation).await } diff --git a/crates/client/block_import/src/pre_validate.rs b/crates/client/block_import/src/pre_validate.rs index 326961e8e..76401712b 100644 --- a/crates/client/block_import/src/pre_validate.rs +++ b/crates/client/block_import/src/pre_validate.rs @@ -1,6 +1,6 @@ use crate::{ - BlockImportError, DeclaredClass, PreValidatedBlock, PreValidatedPendingBlock, RayonPool, UnverifiedFullBlock, - UnverifiedPendingFullBlock, ValidatedCommitments, Validation, + BlockImportError, BlockValidationContext, DeclaredClass, PreValidatedBlock, PreValidatedPendingBlock, RayonPool, + UnverifiedFullBlock, UnverifiedPendingFullBlock, ValidatedCommitments, }; use bitvec::vec::BitVec; use mp_chain_config::StarknetVersion; @@ -20,7 +20,7 @@ use std::sync::Arc; pub async fn pre_validate( pool: &RayonPool, block: UnverifiedFullBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { pool.spawn_rayon_task(move || pre_validate_inner(block, validation)).await } @@ -29,7 +29,7 @@ pub async fn pre_validate( pub async fn pre_validate_pending( pool: &RayonPool, block: UnverifiedPendingFullBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { pool.spawn_rayon_task(move || pre_validate_pending_inner(block, validation)).await } @@ -37,7 +37,7 @@ pub async fn pre_validate_pending( /// This runs on the [`rayon`] threadpool. pub fn pre_validate_inner( mut block: UnverifiedFullBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { let classes = mem::take(&mut block.declared_classes); @@ -75,7 +75,7 @@ pub fn pre_validate_inner( /// See [`pre_validate_inner`]. pub fn pre_validate_pending_inner( mut block: UnverifiedPendingFullBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { let starknet_version = block.header.protocol_version; let classes = mem::take(&mut block.declared_classes); @@ -94,7 +94,7 @@ pub fn pre_validate_pending_inner( fn block_commitments( block: &UnverifiedFullBlock, - validation: &Validation, + validation: &BlockValidationContext, ) -> Result { let (mut receipt_c, mut state_diff_c, mut transaction_c, mut event_c) = Default::default(); [ @@ -132,20 +132,26 @@ fn block_commitments( fn convert_classes( declared_classes: Vec, - validation: &Validation, + validation: &BlockValidationContext, ) -> Result, BlockImportError> { declared_classes.into_par_iter().map(|class| class_conversion(class, validation)).collect() } -fn class_conversion(class: DeclaredClass, _validation: &Validation) -> Result { +fn class_conversion( + class: DeclaredClass, + validation: &BlockValidationContext, +) -> Result { match class { DeclaredClass::Sierra(sierra) => { - let class_hash = sierra - .contract_class - .compute_class_hash() - .map_err(|e| BlockImportError::ComputeClassHash { class_hash: sierra.class_hash, error: e })?; - if class_hash != sierra.class_hash { - return Err(BlockImportError::ClassHash { got: sierra.class_hash, expected: class_hash }); + log::trace!("Converting class with hash {:#x}", sierra.class_hash); + if !validation.trust_class_hashes { + let class_hash = sierra + .contract_class + .compute_class_hash() + .map_err(|e| BlockImportError::ComputeClassHash { class_hash: sierra.class_hash, error: e })?; + if class_hash != sierra.class_hash { + return Err(BlockImportError::ClassHash { got: sierra.class_hash, expected: class_hash }); + } } let (compiled_class_hash, compiled_class) = sierra .contract_class @@ -165,6 +171,7 @@ fn class_conversion(class: DeclaredClass, _validation: &Validation) -> Result { + log::trace!("Converting legacy class with hash {:#x}", legacy.class_hash); // TODO: verify that the class hash is correct Ok(ConvertedClass::Legacy(LegacyConvertedClass { class_hash: legacy.class_hash, @@ -178,7 +185,7 @@ fn transaction_hashes( receipts: &[TransactionReceipt], transactions: &[Transaction], starknet_version: StarknetVersion, - validation: &Validation, + validation: &BlockValidationContext, ) -> Result, BlockImportError> { if receipts.len() != transactions.len() { return Err(BlockImportError::TransactionEqualReceiptCount { @@ -212,7 +219,10 @@ fn transaction_hashes( } /// Compute the transaction commitment for a block. -fn transaction_commitment(block: &UnverifiedFullBlock, validation: &Validation) -> Result { +fn transaction_commitment( + block: &UnverifiedFullBlock, + validation: &BlockValidationContext, +) -> Result { let starknet_version = block.header.protocol_version; let transaction_hashes = transaction_hashes(&block.receipts, &block.transactions, starknet_version, validation)?; @@ -246,7 +256,10 @@ fn transaction_commitment(block: &UnverifiedFullBlock, validation: &Validation) } /// Compute the events commitment for a block. -fn event_commitment(block: &UnverifiedFullBlock, _validation: &Validation) -> Result { +fn event_commitment( + block: &UnverifiedFullBlock, + _validation: &BlockValidationContext, +) -> Result { let events_with_tx_hash: Vec<_> = block .receipts .iter() @@ -283,7 +296,10 @@ fn event_commitment(block: &UnverifiedFullBlock, _validation: &Validation) -> Re } /// Compute the receipt commitment for a block. -fn receipt_commitment(block: &UnverifiedFullBlock, _validation: &Validation) -> Result { +fn receipt_commitment( + block: &UnverifiedFullBlock, + _validation: &BlockValidationContext, +) -> Result { let hashes = block.receipts.par_iter().map(TransactionReceipt::compute_hash).collect::>(); let got = compute_merkle_root::(&hashes); @@ -296,7 +312,10 @@ fn receipt_commitment(block: &UnverifiedFullBlock, _validation: &Validation) -> } /// Compute the state diff commitment for a block. -fn state_diff_commitment(block: &UnverifiedFullBlock, _validation: &Validation) -> Result { +fn state_diff_commitment( + block: &UnverifiedFullBlock, + _validation: &BlockValidationContext, +) -> Result { let got = block.state_diff.len() as u64; if let Some(expected) = block.commitments.state_diff_length { if expected != got { diff --git a/crates/client/block_import/src/rayon.rs b/crates/client/block_import/src/rayon.rs index fcc061a36..002a8da26 100644 --- a/crates/client/block_import/src/rayon.rs +++ b/crates/client/block_import/src/rayon.rs @@ -1,4 +1,4 @@ -use std::thread; +use std::{panic::AssertUnwindSafe, thread}; use tokio::sync::Semaphore; /// Wraps the rayon pool in a tokio-friendly way. @@ -35,9 +35,10 @@ impl RayonPool { // Important: fifo mode. rayon::spawn_fifo(move || { - let _result = tx.send(func()); + // We bubble up the panics to the tokio pool. + let _result = tx.send(std::panic::catch_unwind(AssertUnwindSafe(func))); }); - rx.await.expect("tokio channel closed") + rx.await.expect("tokio channel closed").expect("rayon task panicked") } } diff --git a/crates/client/block_import/src/types.rs b/crates/client/block_import/src/types.rs index dd96cfc13..fecf6acd2 100644 --- a/crates/client/block_import/src/types.rs +++ b/crates/client/block_import/src/types.rs @@ -16,7 +16,7 @@ use mp_transactions::Transaction; use starknet_api::core::ChainId; use starknet_core::types::Felt; -#[derive(Clone, Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq, Default)] pub struct UnverifiedHeader { /// The hash of this block’s parent. When set to None, it will be deduced from the latest block in storage. pub parent_block_hash: Option, @@ -33,14 +33,34 @@ pub struct UnverifiedHeader { } #[derive(Clone, Debug, Eq, PartialEq)] -pub struct Validation { +pub struct BlockValidationContext { /// Use the transaction hashes from the transaction receipts instead of computing them. pub trust_transaction_hashes: bool, - pub chain_id: ChainId, + /// Trust class hashes. + pub trust_class_hashes: bool, /// Do not recomppute the trie commitments, trust them instead. /// If the global state root commitment is missing during import, this will error. /// This is only intended for full-node syncing without storing the global trie. pub trust_global_tries: bool, + pub chain_id: ChainId, +} + +impl BlockValidationContext { + pub fn new(chain_id: ChainId) -> Self { + Self { trust_transaction_hashes: false, trust_class_hashes: false, trust_global_tries: false, chain_id } + } + pub fn trust_transaction_hashes(mut self, v: bool) -> Self { + self.trust_transaction_hashes = v; + self + } + pub fn trust_class_hashes(mut self, v: bool) -> Self { + self.trust_class_hashes = v; + self + } + pub fn trust_global_tries(mut self, v: bool) -> Self { + self.trust_global_tries = v; + self + } } #[derive(Clone, Debug, Eq, PartialEq)] @@ -49,6 +69,15 @@ pub enum DeclaredClass { Sierra(SierraDeclaredClass), } +impl DeclaredClass { + pub fn class_hash(&self) -> Felt { + match self { + DeclaredClass::Legacy(c) => c.class_hash, + DeclaredClass::Sierra(c) => c.class_hash, + } + } +} + impl From for DeclaredClass { fn from(value: ClassUpdate) -> Self { match value { @@ -113,7 +142,7 @@ pub struct UnverifiedPendingFullBlock { } /// An unverified full block as input for the block import pipeline. -#[derive(Clone, Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq, Default)] pub struct UnverifiedFullBlock { /// When set to None, it will be deduced from the latest block in storage. pub unverified_block_number: Option, diff --git a/crates/client/block_import/src/verify_apply.rs b/crates/client/block_import/src/verify_apply.rs index 75a0f6ce3..8ea914211 100644 --- a/crates/client/block_import/src/verify_apply.rs +++ b/crates/client/block_import/src/verify_apply.rs @@ -11,8 +11,8 @@ use starknet_core::types::Felt; use starknet_types_core::hash::{Poseidon, StarkHash}; use crate::{ - BlockImportError, BlockImportResult, PendingBlockImportResult, PreValidatedBlock, PreValidatedPendingBlock, - RayonPool, UnverifiedHeader, ValidatedCommitments, Validation, + BlockImportError, BlockImportResult, BlockValidationContext, PendingBlockImportResult, PreValidatedBlock, + PreValidatedPendingBlock, RayonPool, UnverifiedHeader, ValidatedCommitments, }; mod classes; @@ -35,7 +35,7 @@ impl VerifyApply { pub async fn verify_apply( &self, block: PreValidatedBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { let _exclusive = self.mutex.lock().await; @@ -47,7 +47,7 @@ impl VerifyApply { pub async fn verify_apply_pending( &self, block: PreValidatedPendingBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { let _exclusive = self.mutex.lock().await; @@ -62,7 +62,7 @@ impl VerifyApply { pub fn verify_apply_inner( backend: &MadaraBackend, block: PreValidatedBlock, - validation: Validation, + validation: BlockValidationContext, ) -> Result { // Check block number and block hash against db let (block_number, parent_block_hash) = @@ -74,6 +74,8 @@ pub fn verify_apply_inner( // Block hash let (block_hash, header) = block_hash(&block, &validation, block_number, parent_block_hash, global_state_root)?; + log::debug!("verify_apply_inner store block {}", header.block_number); + // store block, also uses rayon heavily internally backend .store_block( @@ -98,7 +100,7 @@ pub fn verify_apply_inner( pub fn verify_apply_pending_inner( backend: &MadaraBackend, block: PreValidatedPendingBlock, - _validation: Validation, + _validation: BlockValidationContext, ) -> Result { let (_block_number, parent_block_hash) = check_parent_hash_and_num(backend, block.header.parent_block_hash, None)?; @@ -190,7 +192,7 @@ fn calculate_state_root(contracts_trie_root: Felt, classes_trie_root: Felt) -> F fn update_tries( backend: &MadaraBackend, block: &PreValidatedBlock, - validation: &Validation, + validation: &BlockValidationContext, block_number: u64, ) -> Result { if validation.trust_global_tries { @@ -230,7 +232,7 @@ fn update_tries( /// Returns the block hash and header. fn block_hash( block: &PreValidatedBlock, - validation: &Validation, + validation: &BlockValidationContext, block_number: u64, parent_block_hash: Felt, global_state_root: Felt, diff --git a/crates/client/db/src/class_db.rs b/crates/client/db/src/class_db.rs index 2748f5e95..5a8a54631 100644 --- a/crates/client/db/src/class_db.rs +++ b/crates/client/db/src/class_db.rs @@ -138,7 +138,7 @@ impl MadaraBackend { converted_classes .iter() .filter_map(|converted_class| match converted_class { - ConvertedClass::Sierra(sierra) => Some((sierra.class_hash, sierra.compiled.clone())), + ConvertedClass::Sierra(sierra) => Some((sierra.info.compiled_class_hash, sierra.compiled.clone())), _ => None, }) .collect::>() @@ -148,6 +148,7 @@ impl MadaraBackend { |col, chunk| { let mut batch = WriteBatchWithTransaction::default(); for (key, value) in chunk { + log::trace!("Class compiled store key={key:#x}"); let key_bin = bincode::serialize(key)?; // TODO: find a way to avoid this allocation batch.put_cf(col, &key_bin, bincode::serialize(&value)?); diff --git a/crates/client/db/src/devnet_db.rs b/crates/client/db/src/devnet_db.rs new file mode 100644 index 000000000..7f8e11730 --- /dev/null +++ b/crates/client/db/src/devnet_db.rs @@ -0,0 +1,40 @@ +use crate::DatabaseExt; +use crate::{Column, MadaraBackend, MadaraStorageError}; +use rocksdb::WriteOptions; +use serde::{Deserialize, Serialize}; +use starknet_core::types::Felt; + +pub const DEVNET_KEYS: &[u8] = b"DEVNET_KEYS"; + +type Result = std::result::Result; + +#[derive(Clone, Serialize, Deserialize)] +pub struct DevnetPredeployedContractKey { + pub address: Felt, + pub secret: Felt, + pub pubkey: Felt, +} + +#[derive(Clone, Serialize, Deserialize)] +pub struct DevnetPredeployedKeys(pub Vec); + +impl MadaraBackend { + /// Get the devnet predeployed contracts keys. + pub fn get_devnet_predeployed_keys(&self) -> Result> { + let col = self.db.get_column(Column::Devnet); + let Some(res) = self.db.get_cf(&col, DEVNET_KEYS)? else { + return Ok(None); + }; + let res = bincode::deserialize(&res)?; + Ok(Some(res)) + } + + /// Set the devnet predeployed contracts keys. + pub fn set_devnet_predeployed_keys(&self, devnet_keys: DevnetPredeployedKeys) -> Result<()> { + let nonce_column = self.db.get_column(Column::Devnet); + let mut writeopts = WriteOptions::default(); + writeopts.disable_wal(true); + self.db.put_cf_opt(&nonce_column, DEVNET_KEYS, bincode::serialize(&devnet_keys)?, &writeopts)?; + Ok(()) + } +} diff --git a/crates/client/db/src/lib.rs b/crates/client/db/src/lib.rs index 4504c9883..bce0d4abe 100644 --- a/crates/client/db/src/lib.rs +++ b/crates/client/db/src/lib.rs @@ -25,6 +25,7 @@ pub mod class_db; pub mod contract_db; pub mod db_block_id; pub mod db_metrics; +pub mod devnet_db; pub mod l1_db; pub mod storage_updates; @@ -166,6 +167,9 @@ pub enum Column { L1Messaging, L1MessagingNonce, + + /// Devnet: stores the private keys for the devnet predeployed contracts + Devnet, } impl fmt::Debug for Column { @@ -213,6 +217,7 @@ impl Column { PendingContractToClassHashes, PendingContractToNonces, PendingContractStorage, + Devnet, ] }; pub const NUM_COLUMNS: usize = Self::ALL.len(); @@ -249,6 +254,7 @@ impl Column { PendingContractToClassHashes => "pending_contract_to_class_hashes", PendingContractToNonces => "pending_contract_to_nonces", PendingContractStorage => "pending_contract_storage", + Devnet => "devnet", } } diff --git a/crates/client/devnet/Cargo.toml b/crates/client/devnet/Cargo.toml new file mode 100644 index 000000000..1fec14b1c --- /dev/null +++ b/crates/client/devnet/Cargo.toml @@ -0,0 +1,58 @@ +[package] +name = "mc-devnet" +description = "Madara client devnet creation" +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +version.workspace = true +homepage.workspace = true + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dev-dependencies] + +rstest = { workspace = true } +mc-db = { workspace = true, features = ["testing"] } +mc-mempool = { workspace = true, features = ["testing"] } +tokio = { workspace = true, features = ["rt-multi-thread"] } +proptest.workspace = true +proptest-derive.workspace = true +env_logger.workspace = true +blockifier = { workspace = true, features = ["testing"] } +mockall.workspace = true +assert_matches.workspace = true + +[dependencies] + +# Madara +mc-block-import.workspace = true +mc-db.workspace = true +mc-exec.workspace = true +mc-mempool.workspace = true +mp-block.workspace = true +mp-chain-config.workspace = true +mp-class.workspace = true +mp-convert.workspace = true +mp-receipt.workspace = true +mp-state-update.workspace = true +mp-transactions.workspace = true +mp-utils.workspace = true + +# Starknet +blockifier.workspace = true +starknet-core.workspace = true +starknet-signers.workspace = true +starknet-types-core.workspace = true +starknet_api.workspace = true + +# Other +anyhow.workspace = true +async-trait.workspace = true +hyper.workspace = true +log.workspace = true +rayon.workspace = true +serde_json.workspace = true +thiserror.workspace = true +tokio.workspace = true diff --git a/crates/client/devnet/build.rs b/crates/client/devnet/build.rs new file mode 100644 index 000000000..b70689363 --- /dev/null +++ b/crates/client/devnet/build.rs @@ -0,0 +1,11 @@ +fn main() { + println!("cargo::rerun-if-changed=../../../cairo/src"); + println!("cargo::rerun-if-changed=../../../cairo/Scarb.toml"); + println!("cargo::rerun-if-changed=../../../cairo/Scarb.lock"); + std::process::Command::new("scarb") + .args(["build"]) + .spawn() + .expect("Scarb needs to be installed in order to compile the devnet contracts.") + .wait() + .unwrap(); +} diff --git a/crates/client/devnet/src/balances.rs b/crates/client/devnet/src/balances.rs new file mode 100644 index 000000000..1ddce31b6 --- /dev/null +++ b/crates/client/devnet/src/balances.rs @@ -0,0 +1,66 @@ +use std::collections::HashMap; + +use anyhow::Context; +use mp_chain_config::ChainConfig; +use mp_convert::felt_to_u128; +use starknet_api::core::ContractAddress; +use starknet_types_core::felt::Felt; + +use super::StorageDiffs; + +#[derive(Clone, Debug, Default)] +pub struct ContractFeeTokensBalance { + pub fri: Felt, + pub wei: Felt, +} + +impl ContractFeeTokensBalance { + pub fn as_u128_fri_wei(&self) -> anyhow::Result<(u128, u128)> { + let fri = + felt_to_u128(&self.fri).with_context(|| format!("Converting STRK balance felt {:#x} to u128", self.fri))?; + let wei = + felt_to_u128(&self.wei).with_context(|| format!("Converting ETH balance felt {:#x} to u128", self.wei))?; + Ok((fri, wei)) + } +} + +#[derive(Clone, Debug, Default)] +pub struct InitialBalances(pub HashMap); + +impl InitialBalances { + pub fn with(mut self, contract_address: ContractAddress, bal: ContractFeeTokensBalance) -> Self { + self.insert(contract_address, bal); + self + } + + pub fn insert(&mut self, contract_address: ContractAddress, bal: ContractFeeTokensBalance) { + self.0.insert(contract_address, bal); + } + + pub fn to_storage_diffs(&self, chain_config: &ChainConfig, storage_diffs: &mut StorageDiffs) { + for (contract_address, bal) in &self.0 { + // Storage key where the balance of that contract is stored. For both STRK and ETH it ends up + // being the same key. + + // The balance is a U256, following the ethereum erc20 spec. This does not fit into a felt (252 bit), so the cairo compiler + // ends up splitting the balance in two. + // For now we never use high - blockifier does not entirely support it, as the total supply of STRK/ETH would not reach the high bits. + // TODO: check this is true ^ + + let low_key = blockifier::abi::abi_utils::get_fee_token_var_address(*contract_address); + // let high_key = blockifier::abi::sierra_types::next_storage_key(&low_key)?; + + // ETH erc20 + let erc20_contract = chain_config.parent_fee_token_address; + let kv = storage_diffs.contract_mut(erc20_contract); + kv.insert(low_key, bal.wei); + // kv.insert(high_key, Felt::ZERO); + + // STRK erc20 + let erc20_contract = chain_config.native_fee_token_address; + let kv = storage_diffs.contract_mut(erc20_contract); + kv.insert(low_key, bal.fri); + // kv.insert(high_key, Felt::ZERO); + } + } +} diff --git a/crates/client/devnet/src/classes.rs b/crates/client/devnet/src/classes.rs new file mode 100644 index 000000000..e93d240d9 --- /dev/null +++ b/crates/client/devnet/src/classes.rs @@ -0,0 +1,115 @@ +use anyhow::Context; +use mc_block_import::{DeclaredClass, LegacyDeclaredClass, SierraDeclaredClass}; +use mp_state_update::DeclaredClassItem; +use starknet_types_core::felt::Felt; +use std::collections::HashMap; + +#[derive(Clone, Debug)] +pub struct InitiallyDeclaredSierraClass { + pub class_hash: Felt, + pub compiled_class_hash: Felt, + pub definition: Vec, +} + +#[derive(Clone, Debug)] +pub struct InitiallyDeclaredLegacyClass { + pub class_hash: Felt, + pub definition: Vec, +} + +#[derive(Clone, Debug)] +pub enum InitiallyDeclaredClass { + Sierra(InitiallyDeclaredSierraClass), + Legacy(InitiallyDeclaredLegacyClass), +} + +impl InitiallyDeclaredClass { + pub fn new_sierra(class_hash: Felt, compiled_class_hash: Felt, definition: impl Into>) -> Self { + Self::Sierra(InitiallyDeclaredSierraClass { class_hash, compiled_class_hash, definition: definition.into() }) + } + pub fn new_legacy(class_hash: Felt, definition: impl Into>) -> Self { + Self::Legacy(InitiallyDeclaredLegacyClass { class_hash, definition: definition.into() }) + } + + pub fn class_hash(&self) -> Felt { + match self { + InitiallyDeclaredClass::Sierra(c) => c.class_hash, + InitiallyDeclaredClass::Legacy(c) => c.class_hash, + } + } + pub fn compiled_class_hash(&self) -> Felt { + match self { + InitiallyDeclaredClass::Sierra(c) => c.compiled_class_hash, + InitiallyDeclaredClass::Legacy(_) => Felt::ZERO, + } + } +} + +#[derive(Clone, Debug, Default)] +pub struct InitiallyDeclaredClasses(HashMap); + +impl InitiallyDeclaredClasses { + pub fn with(mut self, class: InitiallyDeclaredClass) -> Self { + self.insert(class); + self + } + + pub fn insert(&mut self, class: InitiallyDeclaredClass) { + self.0.insert(class.class_hash(), class); + } + + pub fn as_state_diff(&self) -> Vec { + self.0 + .iter() + .filter(|(_, class)| matches!(class, InitiallyDeclaredClass::Sierra(_))) + .map(|(&class_hash, class)| DeclaredClassItem { + class_hash, + compiled_class_hash: class.compiled_class_hash(), + }) + .collect() + } + + /// This is for the LegacyDeclaredClasses field in State diff. + pub fn as_legacy_state_diff(&self) -> Vec { + self.0 + .iter() + .filter(|(_, class)| matches!(class, InitiallyDeclaredClass::Legacy(_))) + .map(|(&class_hash, _class)| class_hash) + .collect() + } + + /// Load the classes into `DeclaredClass`es. + pub fn into_loaded_classes(self) -> anyhow::Result> { + use starknet_core::types::contract::{legacy::LegacyContractClass, SierraClass}; + + self.0 + .into_iter() + .enumerate() + .map(|(i, (class_hash, class))| { + let make_err_ctx = + |what: &'static str| move || format!("{what} class with hash {class_hash:#} (index {i})"); + match class { + InitiallyDeclaredClass::Sierra(c) => { + let compiled_class_hash = c.compiled_class_hash; + let class = serde_json::from_slice::(&c.definition) + .with_context(make_err_ctx("Deserializing sierra"))?; + let class = class.flatten().with_context(make_err_ctx("Flattening sierra"))?; + + Ok(DeclaredClass::Sierra(SierraDeclaredClass { + class_hash, + contract_class: class.into(), + compiled_class_hash, + })) + } + InitiallyDeclaredClass::Legacy(c) => { + let class = serde_json::from_slice::(&c.definition) + .with_context(make_err_ctx("Deserializing legacy"))?; + let class = class.compress().context("Compressing legacy")?; + + Ok(DeclaredClass::Legacy(LegacyDeclaredClass { class_hash, contract_class: class.into() })) + } + } + }) + .collect() + } +} diff --git a/crates/client/devnet/src/contracts.rs b/crates/client/devnet/src/contracts.rs new file mode 100644 index 000000000..82431e441 --- /dev/null +++ b/crates/client/devnet/src/contracts.rs @@ -0,0 +1,21 @@ +use mp_state_update::DeployedContractItem; +use starknet_types_core::felt::Felt; +use std::collections::HashMap; + +#[derive(Debug, Clone, Default)] +pub struct InitiallyDeployedContracts(HashMap); + +impl InitiallyDeployedContracts { + pub fn with(mut self, address: Felt, class_hash: Felt) -> Self { + self.insert(address, class_hash); + self + } + + pub fn insert(&mut self, address: Felt, class_hash: Felt) { + self.0.insert(address, class_hash); + } + + pub fn as_state_diff(&self) -> Vec { + self.0.iter().map(|(&address, &class_hash)| DeployedContractItem { address, class_hash }).collect() + } +} diff --git a/crates/client/devnet/src/entrypoint.rs b/crates/client/devnet/src/entrypoint.rs new file mode 100644 index 000000000..3a22ae2eb --- /dev/null +++ b/crates/client/devnet/src/entrypoint.rs @@ -0,0 +1,67 @@ +use std::ops::Deref; + +use starknet_core::{types::Felt, utils::starknet_keccak}; + +pub struct Call { + pub to: Felt, + pub selector: Selector, + pub calldata: Vec, +} +impl Call { + pub fn flatten(&self) -> impl Iterator + '_ { + [self.to, self.selector.0, self.calldata.len().into()].into_iter().chain(self.calldata.iter().copied()) + } +} + +#[derive(Default)] +pub struct Multicall(Vec); +impl Multicall { + pub fn with(mut self, call: Call) -> Self { + self.0.push(call); + self + } + + pub fn flatten(&self) -> impl Iterator + '_ { + [self.0.len().into()].into_iter().chain(self.0.iter().flat_map(|c| c.flatten())) + } +} + +pub struct Selector(Felt); +impl> From for Selector { + fn from(value: S) -> Self { + if value.deref() == "__default__" { + return Selector(Felt::ZERO); + } + Selector(starknet_keccak(value.as_bytes())) + } +} +impl From for Felt { + fn from(value: Selector) -> Self { + value.0 + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_selector() { + assert_eq!( + Felt::from(Selector::from("transfer")), + Felt::from_hex_unchecked("0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e") + ); + assert_eq!(Felt::from(Selector::from("__default__")), Felt::ZERO); + } + + #[test] + fn test_multicall_flatten() { + let to = Felt::from_hex_unchecked("0x879"); + let calldata: Vec = Multicall::default() + .with(Call { to, selector: Selector::from("transfer"), calldata: vec![Felt::THREE, Felt::TWO] }) + .flatten() + .collect(); + + assert_eq!(calldata, vec![Felt::ONE, to, Selector::from("transfer").into(), Felt::TWO, Felt::THREE, Felt::TWO]) + } +} diff --git a/crates/client/devnet/src/lib.rs b/crates/client/devnet/src/lib.rs new file mode 100644 index 000000000..600f77d80 --- /dev/null +++ b/crates/client/devnet/src/lib.rs @@ -0,0 +1,433 @@ +use blockifier::abi::abi_utils::get_storage_var_address; +use mc_block_import::{UnverifiedFullBlock, UnverifiedHeader}; +use mp_block::header::GasPrices; +use mp_chain_config::ChainConfig; +use mp_convert::ToFelt; +use mp_state_update::{ContractStorageDiffItem, StateDiff, StorageEntry}; +use starknet_api::{core::ContractAddress, state::StorageKey}; +use starknet_signers::SigningKey; +use starknet_types_core::felt::Felt; +use std::{collections::HashMap, time::SystemTime}; + +mod balances; +mod classes; +mod contracts; +mod entrypoint; +mod predeployed_contracts; + +pub use balances::*; +pub use classes::*; +pub use contracts::*; +pub use entrypoint::*; +pub use predeployed_contracts::*; + +// 1 ETH = 1e18 WEI +const ETH_WEI_DECIMALS: u128 = 1_000_000_000_000_000_000; +// 1 STRK = 1e18 FRI +const STRK_FRI_DECIMALS: u128 = 1_000_000_000_000_000_000; + +#[derive(Debug, Clone, Default)] +pub struct StorageDiffs(HashMap>); +impl StorageDiffs { + pub fn contract_mut(&mut self, contract_address: ContractAddress) -> &mut HashMap { + self.0.entry(contract_address).or_default() + } + + pub fn as_state_diff(&self) -> Vec { + self.0 + .iter() + .map(|(contract, map)| ContractStorageDiffItem { + address: contract.to_felt(), + storage_entries: map.iter().map(|(key, &value)| StorageEntry { key: key.to_felt(), value }).collect(), + }) + .collect() + } +} + +// We allow ourselves to lie about the contract_address. This is because we want the UDC and the two ERC20 contracts to have well known addresses on every chain. + +/// Universal Deployer Contract. +const UDC_CLASS_DEFINITION: &[u8] = + include_bytes!("../../../../cairo/target/dev/madara_contracts_UniversalDeployer.contract_class.json"); +const UDC_CLASS_HASH: Felt = + Felt::from_hex_unchecked("0x07b3e05f48f0c69e4a65ce5e076a66271a527aff2c34ce1083ec6e1526997a69"); +const UDC_CONTRACT_ADDRESS: Felt = + Felt::from_hex_unchecked("0x041a78e741e5af2fec34b695679bc6891742439f7afb8484ecd7766661ad02bf"); +const UDC_COMPILED_CLASS_HASH: Felt = + Felt::from_hex_unchecked("0x44d7658791f01f2936b045c09df6628997437a7321c4f682dddf4ff5380993d"); + +const ERC20_CLASS_DEFINITION: &[u8] = + include_bytes!("../../../../cairo/target/dev/madara_contracts_ERC20.contract_class.json"); +const ERC20_CLASS_HASH: Felt = + Felt::from_hex_unchecked("0x04ad3c1dc8413453db314497945b6903e1c766495a1e60492d44da9c2a986e4b"); +const ERC20_COMPILED_CLASS_HASH: Felt = + Felt::from_hex_unchecked("0x639b7f3c30a7136d13d63c16db7fa15399bd2624d60f2f3ab78d6eae3d6a4e5"); +const ERC20_STRK_CONTRACT_ADDRESS: Felt = + Felt::from_hex_unchecked("0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d"); +const ERC20_ETH_CONTRACT_ADDRESS: Felt = + Felt::from_hex_unchecked("0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"); + +const ACCOUNT_CLASS_DEFINITION: &[u8] = + include_bytes!("../../../../cairo/target/dev/madara_contracts_AccountUpgradeable.contract_class.json"); +const ACCOUNT_CLASS_HASH: Felt = Felt::from_hex_unchecked("0xFFFFFFAFAFAFAFAFAFA9b9b9b"); +const ACCOUNT_COMPILED_CLASS_HASH: Felt = + Felt::from_hex_unchecked("0x138105ded3d2e4ea1939a0bc106fb80fd8774c9eb89c1890d4aeac88e6a1b27"); + +/// High level description of the genesis block. +#[derive(Clone, Debug, Default)] +pub struct ChainGenesisDescription { + pub initial_balances: InitialBalances, + pub declared_classes: InitiallyDeclaredClasses, + pub deployed_contracts: InitiallyDeployedContracts, + /// This is filled in with the initial_balances too when building. + pub initial_storage: StorageDiffs, +} + +impl ChainGenesisDescription { + pub fn base_config() -> Self { + Self { + initial_balances: InitialBalances::default(), + declared_classes: InitiallyDeclaredClasses::default() + .with(InitiallyDeclaredClass::new_sierra(UDC_CLASS_HASH, UDC_COMPILED_CLASS_HASH, UDC_CLASS_DEFINITION)) + .with(InitiallyDeclaredClass::new_sierra( + ERC20_CLASS_HASH, + ERC20_COMPILED_CLASS_HASH, + ERC20_CLASS_DEFINITION, + )), + deployed_contracts: InitiallyDeployedContracts::default() + .with(UDC_CONTRACT_ADDRESS, UDC_CLASS_HASH) + .with(ERC20_ETH_CONTRACT_ADDRESS, ERC20_CLASS_HASH) + .with(ERC20_STRK_CONTRACT_ADDRESS, ERC20_CLASS_HASH), + initial_storage: StorageDiffs::default(), + } + } + + pub fn add_devnet_contracts(&mut self, n_addr: u64) -> DevnetKeys { + self.declared_classes.insert(InitiallyDeclaredClass::new_sierra( + ACCOUNT_CLASS_HASH, + ACCOUNT_COMPILED_CLASS_HASH, + ACCOUNT_CLASS_DEFINITION, + )); + + fn get_contract_pubkey_storage_address() -> StorageKey { + get_storage_var_address("Account_public_key", &[]) + } + + DevnetKeys( + (0..n_addr) + .map(|_| { + let key = SigningKey::from_random(); + let pubkey = key.verifying_key(); + + let address = pubkey.scalar().double(); // let's just lie and make it up here for now + + let balance = ContractFeeTokensBalance { + fri: (10_000 * ETH_WEI_DECIMALS).into(), + wei: (10_000 * STRK_FRI_DECIMALS).into(), + }; + + self.deployed_contracts.insert(address, ACCOUNT_CLASS_HASH); + self.initial_balances.insert(ContractAddress::try_from(address).unwrap(), balance.clone()); + self.initial_storage + .contract_mut(address.try_into().unwrap()) + .insert(get_contract_pubkey_storage_address(), pubkey.scalar()); + + DevnetPredeployedContract { secret: key, pubkey: pubkey.scalar(), balance, address } + }) + .collect(), + ) + } + + pub fn build(mut self, chain_config: &ChainConfig) -> anyhow::Result { + self.initial_balances.to_storage_diffs(chain_config, &mut self.initial_storage); + + Ok(UnverifiedFullBlock { + header: UnverifiedHeader { + parent_block_hash: Some(Felt::ZERO), + sequencer_address: chain_config.sequencer_address.to_felt(), + block_timestamp: SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .expect("Current time is before unix epoch!") + .as_secs(), + protocol_version: chain_config.latest_protocol_version, + l1_gas_price: GasPrices { + eth_l1_gas_price: 5, + strk_l1_gas_price: 5, + eth_l1_data_gas_price: 5, + strk_l1_data_gas_price: 5, + }, + l1_da_mode: mp_block::header::L1DataAvailabilityMode::Blob, + }, + state_diff: StateDiff { + storage_diffs: self.initial_storage.as_state_diff(), + deprecated_declared_classes: self.declared_classes.as_legacy_state_diff(), + declared_classes: self.declared_classes.as_state_diff(), + deployed_contracts: self.deployed_contracts.as_state_diff(), + replaced_classes: vec![], + nonces: vec![], + }, + declared_classes: self.declared_classes.into_loaded_classes()?, + unverified_block_number: Some(0), + ..Default::default() + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use mc_block_import::{BlockImporter, BlockValidationContext}; + use mc_db::MadaraBackend; + use mc_mempool::block_production::BlockProductionTask; + use mc_mempool::MempoolProvider; + use mc_mempool::{transaction_hash, L1DataProvider, Mempool, MockL1DataProvider}; + use mp_block::header::L1DataAvailabilityMode; + use mp_block::{BlockId, BlockTag}; + use mp_convert::felt_to_u128; + use mp_receipt::{Event, ExecutionResult, FeePayment, InvokeTransactionReceipt, PriceUnit, TransactionReceipt}; + use mp_transactions::broadcasted_to_blockifier; + use rstest::{fixture, rstest}; + use starknet_core::types::{ + BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, BroadcastedInvokeTransaction, + BroadcastedInvokeTransactionV3, BroadcastedTransaction, DeclareTransactionResult, + DeployAccountTransactionResult, InvokeTransactionResult, ResourceBounds, ResourceBoundsMapping, + }; + use std::sync::Arc; + + struct DevnetForTesting { + backend: Arc, + contracts: DevnetKeys, + block_production: BlockProductionTask, + mempool: Arc, + } + + impl DevnetForTesting { + pub fn sign_and_add_invoke_tx( + &self, + mut tx: BroadcastedInvokeTransaction, + contract: &DevnetPredeployedContract, + ) -> InvokeTransactionResult { + let (blockifier_tx, _classes) = broadcasted_to_blockifier( + BroadcastedTransaction::Invoke(tx.clone()), + self.backend.chain_config().chain_id.to_felt(), + self.backend.chain_config().latest_protocol_version, + ) + .unwrap(); + let signature = contract.secret.sign(&transaction_hash(&blockifier_tx)).unwrap(); + + let tx_signature = match &mut tx { + BroadcastedInvokeTransaction::V1(tx) => &mut tx.signature, + BroadcastedInvokeTransaction::V3(tx) => &mut tx.signature, + }; + *tx_signature = vec![signature.r, signature.s]; + + log::debug!("tx: {:?}", tx); + + self.mempool.accept_invoke_tx(tx).unwrap() + } + + #[allow(unused)] + pub fn sign_and_add_declare_tx( + &self, + mut tx: BroadcastedDeclareTransaction, + contract: &DevnetPredeployedContract, + ) -> DeclareTransactionResult { + let (blockifier_tx, _classes) = broadcasted_to_blockifier( + BroadcastedTransaction::Declare(tx.clone()), + self.backend.chain_config().chain_id.to_felt(), + self.backend.chain_config().latest_protocol_version, + ) + .unwrap(); + let signature = contract.secret.sign(&transaction_hash(&blockifier_tx)).unwrap(); + + let tx_signature = match &mut tx { + BroadcastedDeclareTransaction::V1(tx) => &mut tx.signature, + BroadcastedDeclareTransaction::V2(tx) => &mut tx.signature, + BroadcastedDeclareTransaction::V3(tx) => &mut tx.signature, + }; + *tx_signature = vec![signature.r, signature.s]; + + self.mempool.accept_declare_tx(tx).unwrap() + } + + #[allow(unused)] + pub fn sign_and_add_deploy_account_tx( + &self, + mut tx: BroadcastedDeployAccountTransaction, + contract: &DevnetPredeployedContract, + ) -> DeployAccountTransactionResult { + let (blockifier_tx, _classes) = broadcasted_to_blockifier( + BroadcastedTransaction::DeployAccount(tx.clone()), + self.backend.chain_config().chain_id.to_felt(), + self.backend.chain_config().latest_protocol_version, + ) + .unwrap(); + let signature = contract.secret.sign(&transaction_hash(&blockifier_tx)).unwrap(); + + let tx_signature = match &mut tx { + BroadcastedDeployAccountTransaction::V1(tx) => &mut tx.signature, + BroadcastedDeployAccountTransaction::V3(tx) => &mut tx.signature, + }; + *tx_signature = vec![signature.r, signature.s]; + + self.mempool.accept_deploy_account_tx(tx).unwrap() + } + + /// (STRK in FRI, ETH in WEI) + pub fn get_bal_strk_eth(&self, contract_address: Felt) -> (u128, u128) { + get_fee_tokens_balance(&self.backend, contract_address).unwrap().as_u128_fri_wei().unwrap() + } + } + + #[fixture] + fn chain() -> DevnetForTesting { + let _ = env_logger::builder().is_test(true).try_init(); + + let mut g = ChainGenesisDescription::base_config(); + let contracts = g.add_devnet_contracts(10); + + let chain_config = Arc::new(ChainConfig::test_config()); + let block = g.build(&chain_config).unwrap(); + let backend = MadaraBackend::open_for_testing(Arc::clone(&chain_config)); + let importer = Arc::new(BlockImporter::new(Arc::clone(&backend))); + + println!("{:?}", block.state_diff); + tokio::runtime::Runtime::new() + .unwrap() + .block_on( + importer.add_block( + block, + BlockValidationContext::new(chain_config.chain_id.clone()).trust_class_hashes(true), + ), + ) + .unwrap(); + + log::debug!("{:?}", backend.get_block_info(&BlockId::Tag(BlockTag::Latest))); + + let mut l1_data_provider = MockL1DataProvider::new(); + l1_data_provider.expect_get_da_mode().return_const(L1DataAvailabilityMode::Blob); + l1_data_provider.expect_get_gas_prices().return_const(GasPrices { + eth_l1_gas_price: 128, + strk_l1_gas_price: 128, + eth_l1_data_gas_price: 128, + strk_l1_data_gas_price: 128, + }); + let l1_data_provider = Arc::new(l1_data_provider) as Arc; + let mempool = Arc::new(Mempool::new(Arc::clone(&backend), Arc::clone(&l1_data_provider))); + let block_production = BlockProductionTask::new( + Arc::clone(&backend), + Arc::clone(&importer), + Arc::clone(&mempool), + Arc::clone(&l1_data_provider), + ) + .unwrap(); + + DevnetForTesting { backend, contracts, block_production, mempool } + } + + // TODO: add eth transfer + #[rstest] + #[case(24235u128, false)] + #[case(9_999u128 * STRK_FRI_DECIMALS, false)] + #[case(10_001u128 * STRK_FRI_DECIMALS, true)] + fn test_basic_transfer(mut chain: DevnetForTesting, #[case] transfer_amount: u128, #[case] expect_reverted: bool) { + println!("{}", chain.contracts); + + let sequencer_address = chain.backend.chain_config().sequencer_address.to_felt(); + let contract_0 = &chain.contracts.0[0]; + let contract_1 = &chain.contracts.0[1]; + + assert_eq!(chain.get_bal_strk_eth(sequencer_address), (0, 0)); + assert_eq!(chain.get_bal_strk_eth(contract_0.address), (10_000 * STRK_FRI_DECIMALS, 10_000 * ETH_WEI_DECIMALS)); + assert_eq!(chain.get_bal_strk_eth(contract_1.address), (10_000 * STRK_FRI_DECIMALS, 10_000 * ETH_WEI_DECIMALS)); + + let result = chain.sign_and_add_invoke_tx( + BroadcastedInvokeTransaction::V3(BroadcastedInvokeTransactionV3 { + sender_address: contract_0.address, + calldata: Multicall::default() + .with(Call { + to: ERC20_STRK_CONTRACT_ADDRESS, + selector: Selector::from("transfer"), + calldata: vec![contract_1.address, transfer_amount.into(), Felt::ZERO], + }) + .flatten() + .collect(), + signature: vec![], // Signature is filled in by `sign_and_add_invoke_tx`. + nonce: Felt::ZERO, + resource_bounds: ResourceBoundsMapping { + l1_gas: ResourceBounds { max_amount: 60000, max_price_per_unit: 10000 }, + l2_gas: ResourceBounds { max_amount: 60000, max_price_per_unit: 10000 }, + }, + tip: 0, + paymaster_data: vec![], + account_deployment_data: vec![], + nonce_data_availability_mode: starknet_core::types::DataAvailabilityMode::L1, + fee_data_availability_mode: starknet_core::types::DataAvailabilityMode::L1, + is_query: false, + }), + contract_0, + ); + + log::info!("tx hash: {:#x}", result.transaction_hash); + + chain.block_production.set_current_pending_tick(1); + chain.block_production.on_pending_time_tick().unwrap(); + + let block = chain.backend.get_block(&BlockId::Tag(BlockTag::Pending)).unwrap().unwrap(); + + assert_eq!(block.inner.transactions.len(), 1); + assert_eq!(block.inner.receipts.len(), 1); + log::info!("receipt: {:?}", block.inner.receipts[0]); + + let TransactionReceipt::Invoke(receipt) = block.inner.receipts[0].clone() else { unreachable!() }; + assert_eq!( + receipt, + InvokeTransactionReceipt { + transaction_hash: result.transaction_hash, + messages_sent: vec![], + events: vec![Event { + from_address: ERC20_STRK_CONTRACT_ADDRESS, + // TODO: do not match keys and data yet (unsure) + keys: receipt.events[0].keys.clone(), + data: receipt.events[0].data.clone(), + }], + // TODO: resources and fees are not tested because they consistent accross runs, we have to figure out why + execution_resources: receipt.execution_resources.clone(), + actual_fee: FeePayment { amount: receipt.actual_fee.amount, unit: PriceUnit::Fri }, + execution_result: receipt.execution_result.clone(), // matched below + } + ); + + match expect_reverted { + false => { + assert_eq!(&receipt.execution_result, &ExecutionResult::Succeeded); + + let fees_fri = felt_to_u128(&block.inner.receipts[0].actual_fee().amount).unwrap(); + assert_eq!(chain.get_bal_strk_eth(sequencer_address), (fees_fri, 0)); + assert_eq!( + chain.get_bal_strk_eth(contract_0.address), + (10_000 * STRK_FRI_DECIMALS - fees_fri - transfer_amount, 10_000 * ETH_WEI_DECIMALS) + ); + assert_eq!( + chain.get_bal_strk_eth(contract_1.address), + (10_000 * STRK_FRI_DECIMALS + transfer_amount, 10_000 * ETH_WEI_DECIMALS) + ); + } + true => { + let ExecutionResult::Reverted { reason } = receipt.execution_result else { unreachable!() }; + assert!(reason.contains("ERC20: insufficient balance")); + + let fees_fri = felt_to_u128(&block.inner.receipts[0].actual_fee().amount).unwrap(); + assert_eq!(chain.get_bal_strk_eth(sequencer_address), (fees_fri, 0)); + assert_eq!( + chain.get_bal_strk_eth(contract_0.address), + (10_000 * STRK_FRI_DECIMALS - fees_fri, 10_000 * ETH_WEI_DECIMALS) + ); + assert_eq!( + chain.get_bal_strk_eth(contract_1.address), + (10_000 * STRK_FRI_DECIMALS, 10_000 * ETH_WEI_DECIMALS) + ); + } + } + } +} diff --git a/crates/client/devnet/src/predeployed_contracts.rs b/crates/client/devnet/src/predeployed_contracts.rs new file mode 100644 index 000000000..2ccf6fdf3 --- /dev/null +++ b/crates/client/devnet/src/predeployed_contracts.rs @@ -0,0 +1,121 @@ +use anyhow::Context; +use blockifier::abi::{abi_utils::get_fee_token_var_address, sierra_types::next_storage_key}; +use core::fmt; +use mc_db::MadaraBackend; +use mp_block::{BlockId, BlockTag}; +use starknet_core::types::Felt; +use starknet_signers::SigningKey; + +use crate::{ + ContractFeeTokensBalance, ERC20_ETH_CONTRACT_ADDRESS, ERC20_STRK_CONTRACT_ADDRESS, ETH_WEI_DECIMALS, + STRK_FRI_DECIMALS, +}; + +pub struct DevnetPredeployedContract { + pub address: Felt, + pub secret: SigningKey, + pub pubkey: Felt, + pub balance: ContractFeeTokensBalance, +} + +pub struct DevnetKeys(pub Vec); + +impl fmt::Display for DevnetKeys { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + writeln!(f)?; + writeln!(f, "==== DEVNET PREDEPLOYED CONTRACTS ====")?; + writeln!(f)?; + for (i, contract) in self.0.iter().enumerate() { + writeln!(f, "(#{}) Address: {:#x}", i + 1, contract.address,)?; + writeln!(f, " Private key: {:#x}", contract.secret.secret_scalar())?; + match contract.balance.as_u128_fri_wei() { + Ok((fri, wei)) => { + let (strk, eth) = (fri / STRK_FRI_DECIMALS, wei / ETH_WEI_DECIMALS); + writeln!(f, " Balance: {strk} STRK, {eth} ETH")?; + writeln!(f)?; + } + Err(err) => writeln!(f, "Error getting balance: {err:#}\n")?, + } + } + Ok(()) + } +} + +/// Returns an `u128`. This is for tests only as an ERC20 contract may have a higher balance than an u128. +pub fn get_bal_contract( + backend: &MadaraBackend, + contract_address: Felt, + fee_token_address: Felt, +) -> anyhow::Result { + let low_key = get_fee_token_var_address( + contract_address + .try_into() + .with_context(|| format!("Converting felt {:#x} to contract address", contract_address))?, + ); + let high_key = next_storage_key(&low_key).unwrap(); + let low = backend + .get_contract_storage_at(&BlockId::Tag(BlockTag::Pending), &fee_token_address, &low_key) + .unwrap() + .unwrap_or(Felt::ZERO); + let high = backend + .get_contract_storage_at(&BlockId::Tag(BlockTag::Pending), &fee_token_address, &high_key) + .unwrap() + .unwrap_or(Felt::ZERO); + log::debug!("get_fee_token_balance contract_address={contract_address:#x} fee_token_address={fee_token_address:#x} low_key={low_key:?}, got {low:#x} {high:#x}"); + + assert_eq!(high, Felt::ZERO); // for now we never use high let's keep it out of the api + // (blockifier does not even support it fully I believe, as the total supply of STRK/ETH would not reach the high bits.) + + Ok(low) +} + +/// (STRK in FRI, ETH in WEI) +pub fn get_fee_tokens_balance( + backend: &MadaraBackend, + contract_address: Felt, +) -> anyhow::Result { + Ok(ContractFeeTokensBalance { + fri: get_bal_contract(backend, contract_address, ERC20_STRK_CONTRACT_ADDRESS)?, + wei: get_bal_contract(backend, contract_address, ERC20_ETH_CONTRACT_ADDRESS)?, + }) +} + +impl DevnetKeys { + pub fn from_db(backend: &MadaraBackend) -> anyhow::Result { + let keys = backend + .get_devnet_predeployed_keys() + .context("Getting the devnet predeployed keys from db")? + .context("The current database was not initialized in devnet mode")?; + + let keys = keys + .0 + .into_iter() + .map(|k| { + Ok(DevnetPredeployedContract { + address: k.address, + secret: SigningKey::from_secret_scalar(k.secret), + pubkey: k.pubkey, + balance: get_fee_tokens_balance(backend, k.address)?, + }) + }) + .collect::>()?; + + Ok(Self(keys)) + } + + pub fn save_to_db(&self, backend: &MadaraBackend) -> anyhow::Result<()> { + let keys = mc_db::devnet_db::DevnetPredeployedKeys( + self.0 + .iter() + .map(|k| mc_db::devnet_db::DevnetPredeployedContractKey { + address: k.address, + secret: k.secret.secret_scalar(), + pubkey: k.pubkey, + }) + .collect(), + ); + backend.set_devnet_predeployed_keys(keys).context("Saving devnet predeployed contracts keys to database")?; + + Ok(()) + } +} diff --git a/crates/client/exec/Cargo.toml b/crates/client/exec/Cargo.toml index a349194d5..696a97fd6 100644 --- a/crates/client/exec/Cargo.toml +++ b/crates/client/exec/Cargo.toml @@ -14,11 +14,13 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # Madara +mc-block-import = { workspace = true } mc-db = { workspace = true } mp-block = { workspace = true } mp-chain-config = { workspace = true } mp-class = { workspace = true } mp-convert = { workspace = true } +mp-state-update = { workspace = true } # Starknet blockifier = { workspace = true } @@ -28,5 +30,16 @@ starknet-types-core = { workspace = true } starknet_api = { workspace = true } # Other +anyhow = { workspace = true } +lazy_static = { workspace = true } log = { workspace = true } +rand = { workspace = true } +serde_json = { workspace = true } +starknet-signers = { workspace = true } thiserror = { workspace = true } + +[dev-dependencies] + +rstest = { workspace = true } +mc-db = { workspace = true, features = ["testing"] } +tokio = { workspace = true, features = ["rt-multi-thread"] } diff --git a/crates/client/exec/src/block_context.rs b/crates/client/exec/src/block_context.rs index f69ae140e..51c4a5c33 100644 --- a/crates/client/exec/src/block_context.rs +++ b/crates/client/exec/src/block_context.rs @@ -41,6 +41,12 @@ impl ExecutionContext { } }; + log::debug!( + "Init cached state on top of {:?}, block number {:?}", + on_top_of, + self.block_context.block_info().block_number.0 + ); + CachedState::new(BlockifierStateAdapter::new( Arc::clone(&self.backend), self.block_context.block_info().block_number.0, @@ -48,7 +54,8 @@ impl ExecutionContext { )) } - pub fn new(backend: Arc, block_info: &MadaraMaybePendingBlockInfo) -> Result { + /// Create an execution context for executing transactions **within** that block. + pub fn new_in_block(backend: Arc, block_info: &MadaraMaybePendingBlockInfo) -> Result { let (db_id, protocol_version, block_number, block_timestamp, sequencer_address, l1_gas_price, l1_da_mode) = match block_info { MadaraMaybePendingBlockInfo::Pending(block) => ( diff --git a/crates/client/exec/src/blockifier_state_adapter.rs b/crates/client/exec/src/blockifier_state_adapter.rs index 4dd9816c6..40136513e 100644 --- a/crates/client/exec/src/blockifier_state_adapter.rs +++ b/crates/client/exec/src/blockifier_state_adapter.rs @@ -56,7 +56,7 @@ impl StateReader for BlockifierStateAdapter { let Some(on_top_of_block_id) = self.on_top_of_block_id else { return Ok(Felt::ZERO) }; - Ok(self + let res = self .backend .get_contract_storage_at(&on_top_of_block_id, &contract_address.to_felt(), &key.to_felt()) .map_err(|err| { @@ -67,7 +67,17 @@ impl StateReader for BlockifierStateAdapter { "Failed to retrieve storage value for contract {contract_address:#?} at key {key:#?}", )) })? - .unwrap_or(Felt::ZERO)) + .unwrap_or(Felt::ZERO); + + log::debug!( + "get_storage_at: on={:?}, contract={:?} key={:?} => {:#x}", + self.on_top_of_block_id, + contract_address, + key, + res + ); + + Ok(res) } fn get_nonce_at(&self, contract_address: ContractAddress) -> StateResult { @@ -170,8 +180,11 @@ fn block_hash_storage_check_range(chain_id: &ChainId, current_block: u64, to_che // Allowed range is first_v0_12_0_block..=(current_block - 10). let first_block = if chain_id == &ChainId::Mainnet { 103_129 } else { 0 }; - #[allow(clippy::reversed_empty_ranges)] - current_block.checked_sub(10).map(|end| first_block..=end).unwrap_or(1..=0).contains(&to_check) + if let Some(end) = current_block.checked_sub(10) { + (first_block..=end).contains(&to_check) + } else { + false + } } #[cfg(test)] diff --git a/crates/client/mempool/Cargo.toml b/crates/client/mempool/Cargo.toml index a46b4997d..e22c30680 100644 --- a/crates/client/mempool/Cargo.toml +++ b/crates/client/mempool/Cargo.toml @@ -13,12 +13,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dev-dependencies] +rstest = { workspace = true } +mc-db = { workspace = true, features = ["testing"] } +tokio = { workspace = true, features = ["rt-multi-thread"] } proptest.workspace = true proptest-derive.workspace = true bitvec.workspace = true env_logger.workspace = true - blockifier = { workspace = true, features = ["testing"] } +mockall.workspace = true +assert_matches.workspace = true + +[features] +testing = ["blockifier/testing", "mc-db/testing", "mockall"] [dependencies] @@ -37,6 +44,8 @@ mp-utils.workspace = true # Starknet blockifier.workspace = true +starknet-core.workspace = true +starknet-signers.workspace = true starknet-types-core.workspace = true starknet_api.workspace = true @@ -47,3 +56,5 @@ hyper.workspace = true log.workspace = true thiserror.workspace = true tokio.workspace = true + +mockall = { workspace = true, optional = true } diff --git a/crates/client/mempool/src/block_production.rs b/crates/client/mempool/src/block_production.rs index 8657ca0ec..9971e4897 100644 --- a/crates/client/mempool/src/block_production.rs +++ b/crates/client/mempool/src/block_production.rs @@ -26,7 +26,7 @@ use std::sync::Arc; use crate::close_block::close_block; use crate::header::make_pending_header; -use crate::{clone_account_tx, L1DataProvider, Mempool, MempoolTransaction}; +use crate::{clone_account_tx, L1DataProvider, Mempool, MempoolProvider, MempoolTransaction}; /// We always take transactions in batches from the mempool const TX_BATCH_SIZE: usize = 128; @@ -39,8 +39,6 @@ pub enum Error { Execution(#[from] TransactionExecutionError), #[error(transparent)] ExecutionContext(#[from] mc_exec::Error), - #[error("No genesis block in storage")] - NoGenesis, #[error("Import error: {0:#}")] Import(#[from] mc_block_import::BlockImportError), } @@ -158,21 +156,29 @@ fn finalize_execution_state( pub struct BlockProductionTask { importer: Arc, backend: Arc, - mempool: Arc, + mempool: Arc, block: MadaraPendingBlock, declared_classes: Vec, - executor: TransactionExecutor, + pub(crate) executor: TransactionExecutor, l1_data_provider: Arc, current_pending_tick: usize, } impl BlockProductionTask { + #[cfg(any(test, feature = "testing"))] + pub fn set_current_pending_tick(&mut self, n: usize) { + self.current_pending_tick = n; + } + pub fn new( backend: Arc, + importer: Arc, mempool: Arc, l1_data_provider: Arc, ) -> Result { - let parent_block_hash = backend.get_block_hash(&BlockId::Tag(BlockTag::Latest))?.ok_or(Error::NoGenesis)?; + let parent_block_hash = backend + .get_block_hash(&BlockId::Tag(BlockTag::Latest))? + .unwrap_or(/* genesis block's parent hash */ Felt::ZERO); let pending_block = MadaraPendingBlock::new_empty(make_pending_header( parent_block_hash, backend.chain_config(), @@ -184,13 +190,13 @@ impl BlockProductionTask { // l1_da_mode: l1_data_provider.get_da_mode(), // })?; let mut executor = - ExecutionContext::new(Arc::clone(&backend), &pending_block.info.clone().into())?.tx_executor(); + ExecutionContext::new_in_block(Arc::clone(&backend), &pending_block.info.clone().into())?.tx_executor(); let bouncer_config = backend.chain_config().bouncer_config.clone(); executor.bouncer = Bouncer::new(bouncer_config); Ok(Self { - importer: BlockImporter::new(Arc::clone(&backend)).into(), + importer, backend, mempool, executor, @@ -232,10 +238,11 @@ impl BlockProductionTask { let n_executed_txs = executed_txs.len(); for (exec_result, mempool_tx) in Iterator::zip(all_results.into_iter(), executed_txs) { + log::debug!("res for {:?}", mempool_tx); match exec_result { Ok(execution_info) => { - // Note: reverted txs also appear as Ok here. - log::debug!("Successful execution of transaction {:?}", mempool_tx.tx_hash()); + // Reverted transactions appear here as Ok too. + log::debug!("Successful execution of transaction {}", mempool_tx.tx_hash()); if let Some(class) = mempool_tx.converted_class { self.declared_classes.push(class); @@ -250,8 +257,11 @@ impl BlockProductionTask { self.block.inner.transactions.push(converted_tx.transaction); } Err(err) => { - // TODO: revert handling - log::error!("Unsuccessful execution of transaction {:?}: {err:#}", mempool_tx.tx_hash()); + // These are the transactions that have errored but we can't revert them. It can be because of an internal server error, but + // errors during the execution of Declare and DeployAccount also appear here as they cannot be reverted. + // We reject them. + // Note that this is a big DoS vector. + log::error!("Unsuccessful execution of transaction {}: {err:#}", mempool_tx.tx_hash()); } } } @@ -272,17 +282,11 @@ impl BlockProductionTask { } /// Each "tick" of the block time updates the pending block but only with the appropriate fraction of the total bouncer capacity. - fn on_pending_time_tick(&mut self) -> Result<(), Error> { + pub fn on_pending_time_tick(&mut self) -> Result<(), Error> { let current_pending_tick = self.current_pending_tick; - self.current_pending_tick += 1; let n_pending_ticks_per_block = self.backend.chain_config().n_pending_ticks_per_block(); - if current_pending_tick == 0 || current_pending_tick >= n_pending_ticks_per_block { - // first tick is ignored. - // out of range ticks are also ignored. - return Ok(()); - } log::debug!("begin pending tick {}/{}", current_pending_tick, n_pending_ticks_per_block); // Reduced bouncer capacity for the current pending tick @@ -320,7 +324,7 @@ impl BlockProductionTask { } /// This creates a block, continuing the current pending block state up to the full bouncer limit. - async fn on_block_time(&mut self) -> Result<(), Error> { + pub(crate) async fn on_block_time(&mut self) -> Result<(), Error> { let block_n = self.block_n(); log::debug!("closing block #{}", block_n); @@ -339,6 +343,8 @@ impl BlockProductionTask { let block_to_close = mem::replace(&mut self.block, new_empty_block); let _declared_classes = mem::take(&mut self.declared_classes); + let n_txs = block_to_close.inner.transactions.len(); + // This is compute heavy as it does the commitments and trie computations. let import_result = close_block( &self.importer, @@ -352,9 +358,11 @@ impl BlockProductionTask { // Prepare for next block. self.executor = - ExecutionContext::new(Arc::clone(&self.backend), &self.block.info.clone().into())?.tx_executor(); + ExecutionContext::new_in_block(Arc::clone(&self.backend), &self.block.info.clone().into())?.tx_executor(); self.current_pending_tick = 0; + log::info!("⛏️ Closed block #{} with {} transactions", block_n, n_txs); + Ok(()) } @@ -368,7 +376,7 @@ impl BlockProductionTask { tokio::time::interval_at(start, self.backend.chain_config().pending_block_update_time); interval_pending_block_update.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Delay); - log::info!("⛏️ Starting block production on top of block {}", self.block_n()); + log::info!("⛏️ Starting block production at block #{}", self.block_n()); loop { tokio::select! { @@ -380,9 +388,19 @@ impl BlockProductionTask { interval_pending_block_update.reset_at(instant + interval_pending_block_update.period()); }, _ = interval_pending_block_update.tick() => { + let n_pending_ticks_per_block = self.backend.chain_config().n_pending_ticks_per_block(); + + if self.current_pending_tick == 0 || self.current_pending_tick >= n_pending_ticks_per_block { + // first tick is ignored. + // out of range ticks are also ignored. + self.current_pending_tick += 1; + continue + } + if let Err(err) = self.on_pending_time_tick() { log::error!("Pending block update task has errored: {err:#}"); } + self.current_pending_tick += 1; }, _ = graceful_shutdown() => break, } diff --git a/crates/client/mempool/src/close_block.rs b/crates/client/mempool/src/close_block.rs index d1ec2443e..181303651 100644 --- a/crates/client/mempool/src/close_block.rs +++ b/crates/client/mempool/src/close_block.rs @@ -1,5 +1,5 @@ use mc_block_import::{ - BlockImportError, BlockImportResult, BlockImporter, UnverifiedFullBlock, UnverifiedHeader, Validation, + BlockImportError, BlockImportResult, BlockImporter, BlockValidationContext, UnverifiedFullBlock, UnverifiedHeader, }; use mp_block::{header::PendingHeader, MadaraPendingBlock, MadaraPendingBlockInfo}; use mp_state_update::StateDiff; @@ -13,11 +13,7 @@ pub async fn close_block( chain_id: ChainId, block_number: u64, ) -> Result { - let validation = Validation { - trust_transaction_hashes: true, // no need to recompute tx hashes - chain_id, - trust_global_tries: false, - }; + let validation = BlockValidationContext::new(chain_id).trust_transaction_hashes(true); let MadaraPendingBlock { info, inner } = block; let MadaraPendingBlockInfo { header, tx_hashes: _tx_hashes } = info; diff --git a/crates/client/mempool/src/inner.rs b/crates/client/mempool/src/inner.rs index bedf332a1..ff0ac726a 100644 --- a/crates/client/mempool/src/inner.rs +++ b/crates/client/mempool/src/inner.rs @@ -22,6 +22,7 @@ use std::{ pub type ArrivedAtTimestamp = SystemTime; +#[derive(Debug)] pub struct MempoolTransaction { pub tx: AccountTransaction, pub arrived_at: ArrivedAtTimestamp, diff --git a/crates/client/mempool/src/l1.rs b/crates/client/mempool/src/l1.rs index d85a0c940..51842cbd6 100644 --- a/crates/client/mempool/src/l1.rs +++ b/crates/client/mempool/src/l1.rs @@ -54,6 +54,7 @@ impl Default for GasPriceProvider { } } +#[cfg_attr(any(test, feature = "testing"), mockall::automock)] pub trait L1DataProvider: Send + Sync { fn get_gas_prices(&self) -> GasPrices; fn get_gas_prices_last_update(&self) -> SystemTime; diff --git a/crates/client/mempool/src/lib.rs b/crates/client/mempool/src/lib.rs index 1c05f7545..b740ca853 100644 --- a/crates/client/mempool/src/lib.rs +++ b/crates/client/mempool/src/lib.rs @@ -1,12 +1,11 @@ use blockifier::blockifier::stateful_validator::StatefulValidatorError; use blockifier::transaction::account_transaction::AccountTransaction; +use blockifier::transaction::transaction_execution::Transaction; use blockifier::transaction::transactions::DeclareTransaction; use blockifier::transaction::transactions::DeployAccountTransaction; use blockifier::transaction::transactions::InvokeTransaction; use header::make_pending_header; use inner::MempoolInner; -pub use inner::{ArrivedAtTimestamp, MempoolTransaction}; -pub use l1::{GasPriceProvider, L1DataProvider}; use mc_db::db_block_id::DbBlockId; use mc_db::MadaraBackend; use mc_db::MadaraStorageError; @@ -15,12 +14,26 @@ use mp_block::BlockId; use mp_block::BlockTag; use mp_block::MadaraPendingBlockInfo; use mp_class::ConvertedClass; +use mp_transactions::broadcasted_to_blockifier; +use mp_transactions::BroadcastedToBlockifierError; use starknet_api::core::{ContractAddress, Nonce}; use starknet_api::transaction::TransactionHash; +use starknet_core::types::BroadcastedDeclareTransaction; +use starknet_core::types::BroadcastedDeployAccountTransaction; +use starknet_core::types::BroadcastedInvokeTransaction; +use starknet_core::types::BroadcastedTransaction; +use starknet_core::types::DeclareTransactionResult; +use starknet_core::types::DeployAccountTransactionResult; +use starknet_core::types::InvokeTransactionResult; use starknet_types_core::felt::Felt; use std::sync::Arc; use std::sync::RwLock; +pub use inner::{ArrivedAtTimestamp, MempoolTransaction}; +#[cfg(any(test, feature = "testing"))] +pub use l1::MockL1DataProvider; +pub use l1::{GasPriceProvider, L1DataProvider}; + pub mod block_production; mod close_block; pub mod header; @@ -31,14 +44,33 @@ mod l1; pub enum Error { #[error("Storage error: {0:#}")] StorageError(#[from] MadaraStorageError), - #[error("No genesis block in storage")] - NoGenesis, #[error("Validation error: {0:#}")] Validation(#[from] StatefulValidatorError), #[error(transparent)] InnerMempool(#[from] inner::TxInsersionError), #[error(transparent)] Exec(#[from] mc_exec::Error), + #[error("Preprocessing transaction: {0:#}")] + BroadcastedToBlockifier(#[from] BroadcastedToBlockifierError), +} +impl Error { + pub fn is_internal(&self) -> bool { + !matches!(self, Error::Validation(_)) + } +} + +#[cfg_attr(test, mockall::automock)] +pub trait MempoolProvider: Send + Sync { + fn accept_invoke_tx(&self, tx: BroadcastedInvokeTransaction) -> Result; + fn accept_declare_tx(&self, tx: BroadcastedDeclareTransaction) -> Result; + fn accept_deploy_account_tx( + &self, + tx: BroadcastedDeployAccountTransaction, + ) -> Result; + fn take_txs_chunk(&self, dest: &mut Vec, n: usize); + fn take_tx(&self) -> Option; + fn re_add_txs(&self, txs: Vec); + fn chain_id(&self) -> Felt; } pub struct Mempool { @@ -52,11 +84,9 @@ impl Mempool { Mempool { backend, l1_data_provider, inner: Default::default() } } - pub fn accept_account_tx( - &self, - tx: AccountTransaction, - converted_class: Option, - ) -> Result<(), Error> { + fn accept_tx(&self, tx: Transaction, converted_class: Option) -> Result<(), Error> { + let Transaction::AccountTransaction(tx) = tx else { panic!("L1HandlerTransaction not supported yet") }; + // The timestamp *does not* take the transaction validation time into account. let arrived_at = ArrivedAtTimestamp::now(); @@ -65,8 +95,10 @@ impl Mempool { block } else { // No current pending block, we'll make an unsaved empty one for the sake of validating this tx. - let parent_block_hash = - self.backend.get_block_hash(&BlockId::Tag(BlockTag::Latest))?.ok_or(Error::NoGenesis)?; + let parent_block_hash = self + .backend + .get_block_hash(&BlockId::Tag(BlockTag::Latest))? + .unwrap_or(/* genesis block's parent hash */ Felt::ZERO); MadaraPendingBlockInfo::new( make_pending_header(parent_block_hash, self.backend.chain_config(), self.l1_data_provider.as_ref()), vec![], @@ -89,7 +121,7 @@ impl Mempool { }; // Perform validations - let exec_context = ExecutionContext::new(Arc::clone(&self.backend), &pending_block_info)?; + let exec_context = ExecutionContext::new_in_block(Arc::clone(&self.backend), &pending_block_info)?; let mut validator = exec_context.tx_validator(); validator.perform_validations(clone_account_tx(&tx), deploy_account_tx_hash.is_some())?; @@ -104,23 +136,95 @@ impl Mempool { Ok(()) } +} + +pub fn transaction_hash(tx: &Transaction) -> Felt { + match tx { + Transaction::AccountTransaction(tx) => match tx { + AccountTransaction::Declare(tx) => *tx.tx_hash, + AccountTransaction::DeployAccount(tx) => *tx.tx_hash, + AccountTransaction::Invoke(tx) => *tx.tx_hash, + }, + Transaction::L1HandlerTransaction(tx) => *tx.tx_hash, + } +} + +fn declare_class_hash(tx: &Transaction) -> Option { + match tx { + Transaction::AccountTransaction(AccountTransaction::Declare(tx)) => Some(*tx.class_hash()), + _ => None, + } +} + +fn deployed_contract_address(tx: &Transaction) -> Option { + match tx { + Transaction::AccountTransaction(AccountTransaction::DeployAccount(tx)) => Some(**tx.contract_address), + _ => None, + } +} + +impl MempoolProvider for Mempool { + fn accept_invoke_tx(&self, tx: BroadcastedInvokeTransaction) -> Result { + let (tx, classes) = broadcasted_to_blockifier( + BroadcastedTransaction::Invoke(tx), + self.chain_id(), + self.backend.chain_config().latest_protocol_version, + )?; + + let res = InvokeTransactionResult { transaction_hash: transaction_hash(&tx) }; + self.accept_tx(tx, classes)?; + Ok(res) + } + + fn accept_declare_tx(&self, tx: BroadcastedDeclareTransaction) -> Result { + let (tx, classes) = broadcasted_to_blockifier( + BroadcastedTransaction::Declare(tx), + self.chain_id(), + self.backend.chain_config().latest_protocol_version, + )?; + + let res = DeclareTransactionResult { + transaction_hash: transaction_hash(&tx), + class_hash: declare_class_hash(&tx).expect("Created transaction should be declare"), + }; + self.accept_tx(tx, classes)?; + Ok(res) + } + + fn accept_deploy_account_tx( + &self, + tx: BroadcastedDeployAccountTransaction, + ) -> Result { + let (tx, classes) = broadcasted_to_blockifier( + BroadcastedTransaction::DeployAccount(tx), + self.chain_id(), + self.backend.chain_config().latest_protocol_version, + )?; + + let res = DeployAccountTransactionResult { + transaction_hash: transaction_hash(&tx), + contract_address: deployed_contract_address(&tx).expect("Created transaction should be deploy account"), + }; + self.accept_tx(tx, classes)?; + Ok(res) + } - pub fn take_txs_chunk(&self, dest: &mut Vec, n: usize) { + fn take_txs_chunk(&self, dest: &mut Vec, n: usize) { let mut inner = self.inner.write().expect("Poisoned lock"); inner.pop_next_chunk(dest, n) } - pub fn take_tx(&self) -> Option { + fn take_tx(&self) -> Option { let mut inner = self.inner.write().expect("Poisoned lock"); inner.pop_next() } - pub fn re_add_txs(&self, txs: Vec) { + fn re_add_txs(&self, txs: Vec) { let mut inner = self.inner.write().expect("Poisoned lock"); inner.re_add_txs(txs) } - pub fn chain_id(&self) -> Felt { + fn chain_id(&self) -> Felt { Felt::from_bytes_be_slice(format!("{}", self.backend.chain_config().chain_id).as_bytes()) } } diff --git a/crates/client/rpc/src/errors.rs b/crates/client/rpc/src/errors.rs index 70b621645..7af071406 100644 --- a/crates/client/rpc/src/errors.rs +++ b/crates/client/rpc/src/errors.rs @@ -59,7 +59,7 @@ pub enum StarknetRpcApiError { #[error("Account balance is smaller than the transaction's max_fee")] InsufficientAccountBalance, #[error("Account validation failed")] - ValidationFailure, + ValidationFailure { error: String }, #[error("Compilation failed")] CompilationFailed, #[error("Contract class size is too large")] @@ -107,7 +107,7 @@ impl From<&StarknetRpcApiError> for i32 { StarknetRpcApiError::InvalidTxnNonce => 52, StarknetRpcApiError::InsufficientMaxFee => 53, StarknetRpcApiError::InsufficientAccountBalance => 54, - StarknetRpcApiError::ValidationFailure => 55, + StarknetRpcApiError::ValidationFailure { .. } => 55, StarknetRpcApiError::CompilationFailed => 56, StarknetRpcApiError::ContractClassSizeTooLarge => 57, StarknetRpcApiError::NonAccount => 58, @@ -178,7 +178,7 @@ impl From for StarknetRpcApiError { StarknetError::InvalidTransactionNonce => StarknetRpcApiError::InvalidTxnNonce, StarknetError::InsufficientMaxFee => StarknetRpcApiError::InsufficientMaxFee, StarknetError::InsufficientAccountBalance => StarknetRpcApiError::InsufficientAccountBalance, - StarknetError::ValidationFailure(_) => StarknetRpcApiError::ValidationFailure, + StarknetError::ValidationFailure(error) => StarknetRpcApiError::ValidationFailure { error }, StarknetError::CompilationFailed => StarknetRpcApiError::CompilationFailed, StarknetError::ContractClassSizeIsTooLarge => StarknetRpcApiError::ContractClassSizeTooLarge, StarknetError::NonAccount => StarknetRpcApiError::NonAccount, diff --git a/crates/client/rpc/src/lib.rs b/crates/client/rpc/src/lib.rs index 72cdd42ed..42e981afc 100644 --- a/crates/client/rpc/src/lib.rs +++ b/crates/client/rpc/src/lib.rs @@ -26,7 +26,7 @@ use errors::{StarknetRpcApiError, StarknetRpcResult}; use providers::AddTransactionProvider; use utils::ResultExt; -/// A Starknet RPC server for Deoxys +/// A Starknet RPC server for Madara #[derive(Clone)] pub struct Starknet { backend: Arc, diff --git a/crates/client/rpc/src/providers/mempool.rs b/crates/client/rpc/src/providers/mempool.rs index 2c16da6d9..df69e7746 100644 --- a/crates/client/rpc/src/providers/mempool.rs +++ b/crates/client/rpc/src/providers/mempool.rs @@ -1,140 +1,52 @@ -use std::sync::Arc; - use super::AddTransactionProvider; -use crate::{bail_internal_server_error, errors::StarknetRpcApiError}; -use blockifier::transaction::account_transaction::AccountTransaction; -use blockifier::transaction::transaction_execution::Transaction; +use crate::{errors::StarknetRpcApiError, utils::display_internal_server_error}; use jsonrpsee::core::{async_trait, RpcResult}; use mc_mempool::Mempool; -use mp_chain_config::StarknetVersion; -use mp_class::ConvertedClass; -use mp_transactions::broadcasted_to_blockifier; +use mc_mempool::MempoolProvider; use starknet_core::types::{ BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, BroadcastedInvokeTransaction, - BroadcastedTransaction, DeclareTransactionResult, DeployAccountTransactionResult, Felt, InvokeTransactionResult, + DeclareTransactionResult, DeployAccountTransactionResult, InvokeTransactionResult, }; +use std::sync::Arc; /// This [`AddTransactionProvider`] adds the received transactions to a mempool. -pub struct MempoolProvider { +pub struct MempoolAddTxProvider { mempool: Arc, } -impl MempoolProvider { +impl MempoolAddTxProvider { pub fn new(mempool: Arc) -> Self { Self { mempool } } } +fn make_err(err: mc_mempool::Error) -> StarknetRpcApiError { + if err.is_internal() { + display_internal_server_error(format!("{err:#}")); + StarknetRpcApiError::InternalServerError + } else { + StarknetRpcApiError::ValidationFailure { error: format!("{err:#}") } + } +} + #[async_trait] -impl AddTransactionProvider for MempoolProvider { +impl AddTransactionProvider for MempoolAddTxProvider { async fn add_declare_transaction( &self, declare_transaction: BroadcastedDeclareTransaction, ) -> RpcResult { - Ok(add_declare_transaction(&self.mempool, declare_transaction).await?) + Ok(self.mempool.accept_declare_tx(declare_transaction).map_err(make_err)?) } async fn add_deploy_account_transaction( &self, deploy_account_transaction: BroadcastedDeployAccountTransaction, ) -> RpcResult { - Ok(add_deploy_account_transaction(&self.mempool, deploy_account_transaction).await?) + Ok(self.mempool.accept_deploy_account_tx(deploy_account_transaction).map_err(make_err)?) } async fn add_invoke_transaction( &self, invoke_transaction: BroadcastedInvokeTransaction, ) -> RpcResult { - Ok(add_invoke_transaction(&self.mempool, invoke_transaction).await?) + Ok(self.mempool.accept_invoke_tx(invoke_transaction).map_err(make_err)?) } } - -fn transaction_hash(tx: &Transaction) -> Felt { - match tx { - Transaction::AccountTransaction(tx) => match tx { - AccountTransaction::Declare(tx) => *tx.tx_hash, - AccountTransaction::DeployAccount(tx) => *tx.tx_hash, - AccountTransaction::Invoke(tx) => *tx.tx_hash, - }, - Transaction::L1HandlerTransaction(tx) => *tx.tx_hash, - } -} - -fn declare_class_hash(tx: &Transaction) -> Option { - match tx { - Transaction::AccountTransaction(AccountTransaction::Declare(tx)) => Some(*tx.class_hash()), - _ => None, - } -} - -fn deployed_contract_address(tx: &Transaction) -> Option { - match tx { - Transaction::AccountTransaction(AccountTransaction::DeployAccount(tx)) => Some(**tx.contract_address), - _ => None, - } -} - -async fn add_tx_to_mempool( - mempool: &Arc, - tx: Transaction, - converted_class: Option, -) -> RpcResult<()> { - let Transaction::AccountTransaction(tx) = tx else { - bail_internal_server_error!("Created transaction should be an account transaction") - }; - - mempool - .accept_account_tx(tx, converted_class) - .map_err(|err| StarknetRpcApiError::TxnExecutionError { tx_index: 0, error: format!("{err:#}") })?; - Ok(()) -} - -async fn add_declare_transaction( - mempool: &Arc, - declare_transaction: BroadcastedDeclareTransaction, -) -> RpcResult { - let (tx, classes) = broadcasted_to_blockifier( - BroadcastedTransaction::Declare(declare_transaction), - mempool.chain_id(), - Default::default(), - ) - .map_err(|err| StarknetRpcApiError::TxnExecutionError { tx_index: 0, error: format!("{err:#}") })?; - - let res = DeclareTransactionResult { - transaction_hash: transaction_hash(&tx), - class_hash: declare_class_hash(&tx).expect("Created transaction should be declare"), - }; - add_tx_to_mempool(mempool, tx, classes).await?; - Ok(res) -} -async fn add_deploy_account_transaction( - mempool: &Arc, - deploy_account_transaction: BroadcastedDeployAccountTransaction, -) -> RpcResult { - let (tx, classes) = broadcasted_to_blockifier( - BroadcastedTransaction::DeployAccount(deploy_account_transaction), - mempool.chain_id(), - StarknetVersion::LATEST, - ) - .map_err(|err| StarknetRpcApiError::TxnExecutionError { tx_index: 0, error: format!("{err:#}") })?; - - let res = DeployAccountTransactionResult { - transaction_hash: transaction_hash(&tx), - contract_address: deployed_contract_address(&tx).expect("Created transaction should be deploy account"), - }; - add_tx_to_mempool(mempool, tx, classes).await?; - Ok(res) -} -async fn add_invoke_transaction( - mempool: &Arc, - invoke_transaction: BroadcastedInvokeTransaction, -) -> RpcResult { - let (tx, classes) = broadcasted_to_blockifier( - BroadcastedTransaction::Invoke(invoke_transaction), - mempool.chain_id(), - StarknetVersion::LATEST, - ) - .map_err(|err| StarknetRpcApiError::TxnExecutionError { tx_index: 0, error: format!("{err:#}") })?; - - let res = InvokeTransactionResult { transaction_hash: transaction_hash(&tx) }; - add_tx_to_mempool(mempool, tx, classes).await?; - Ok(res) -} diff --git a/crates/client/rpc/src/utils/mod.rs b/crates/client/rpc/src/utils/mod.rs index fe6402215..e073a36eb 100644 --- a/crates/client/rpc/src/utils/mod.rs +++ b/crates/client/rpc/src/utils/mod.rs @@ -5,18 +5,22 @@ use std::fmt; use crate::StarknetRpcApiError; +pub fn display_internal_server_error(err: impl fmt::Display) { + log::error!(target: "rpc_errors", "{:#}", err); +} + #[macro_export] macro_rules! bail_internal_server_error { ($msg:literal $(,)?) => {{ - log::error!(target: "rpc_errors", "{:#}", anyhow::anyhow!($msg)); + $crate::utils::display_internal_server_error(anyhow::anyhow!($msg)); return ::core::result::Result::Err($crate::StarknetRpcApiError::InternalServerError.into()) }}; ($err:expr $(,)?) => { - log::error!(target: "rpc_errors", "{:#}", anyhow::anyhow!($err)); + $crate::utils::display_internal_server_error(anyhow::anyhow!($err)); return ::core::result::Result::Err($crate::StarknetRpcApiError::InternalServerError.into()) }; ($fmt:expr, $($arg:tt)*) => { - log::error!(target: "rpc_errors", "{:#}", anyhow::anyhow!($fmt, $($arg)*)); + $crate::utils::display_internal_server_error(anyhow::anyhow!($fmt, $($arg)*)); return ::core::result::Result::Err($crate::StarknetRpcApiError::InternalServerError.into()) }; } @@ -36,7 +40,7 @@ impl> ResultExt for Result { match self { Ok(val) => Ok(val), Err(err) => { - log::error!(target: "rpc_errors", "{}: {:#}", context, E::into(err)); + display_internal_server_error(format!("{}: {:#}", context, E::into(err))); Err(StarknetRpcApiError::InternalServerError) } } @@ -50,7 +54,7 @@ impl> ResultExt for Result { match self { Ok(val) => Ok(val), Err(err) => { - log::error!(target: "rpc_errors", "{}: {:#}", context_fn(), E::into(err)); + display_internal_server_error(format!("{}: {:#}", context_fn(), E::into(err))); Err(StarknetRpcApiError::InternalServerError) } } @@ -89,8 +93,7 @@ impl OptionExt for Option { match self { Some(val) => Ok(val), None => { - let error = anyhow::Error::msg(context); - log::error!(target: "rpc_errors", "{:#}", error); + display_internal_server_error(anyhow::Error::msg(context)); Err(StarknetRpcApiError::InternalServerError) } } @@ -104,8 +107,7 @@ impl OptionExt for Option { match self { Some(val) => Ok(val), None => { - let error = anyhow::Error::msg(context_fn()); - log::error!(target: "rpc_errors", "{:#}", error); + display_internal_server_error(anyhow::Error::msg(context_fn())); Err(StarknetRpcApiError::InternalServerError) } } diff --git a/crates/client/rpc/src/versions/v0_7_1/methods/read/call.rs b/crates/client/rpc/src/versions/v0_7_1/methods/read/call.rs index 4bf4b1f9b..553b21d36 100644 --- a/crates/client/rpc/src/versions/v0_7_1/methods/read/call.rs +++ b/crates/client/rpc/src/versions/v0_7_1/methods/read/call.rs @@ -33,7 +33,7 @@ use crate::Starknet; pub fn call(starknet: &Starknet, request: FunctionCall, block_id: BlockId) -> StarknetRpcResult> { let block_info = starknet.get_block_info(&block_id)?; - let exec_context = ExecutionContext::new(Arc::clone(&starknet.backend), &block_info)?; + let exec_context = ExecutionContext::new_in_block(Arc::clone(&starknet.backend), &block_info)?; if block_info.protocol_version() < &FALLBACK_TO_SEQUENCER_WHEN_VERSION_BELOW { return Err(StarknetRpcApiError::UnsupportedTxnVersion); diff --git a/crates/client/rpc/src/versions/v0_7_1/methods/read/estimate_fee.rs b/crates/client/rpc/src/versions/v0_7_1/methods/read/estimate_fee.rs index 11edaad15..5f9fc37a7 100644 --- a/crates/client/rpc/src/versions/v0_7_1/methods/read/estimate_fee.rs +++ b/crates/client/rpc/src/versions/v0_7_1/methods/read/estimate_fee.rs @@ -34,7 +34,7 @@ pub async fn estimate_fee( return Err(StarknetRpcApiError::UnsupportedTxnVersion); } - let exec_context = ExecutionContext::new(Arc::clone(&starknet.backend), &block_info)?; + let exec_context = ExecutionContext::new_in_block(Arc::clone(&starknet.backend), &block_info)?; let transactions = request .into_iter() diff --git a/crates/client/rpc/src/versions/v0_7_1/methods/read/estimate_message_fee.rs b/crates/client/rpc/src/versions/v0_7_1/methods/read/estimate_message_fee.rs index a14936311..c5a208a2e 100644 --- a/crates/client/rpc/src/versions/v0_7_1/methods/read/estimate_message_fee.rs +++ b/crates/client/rpc/src/versions/v0_7_1/methods/read/estimate_message_fee.rs @@ -40,7 +40,7 @@ pub async fn estimate_message_fee( return Err(StarknetRpcApiError::UnsupportedTxnVersion); } - let exec_context = ExecutionContext::new(Arc::clone(&starknet.backend), &block_info)?; + let exec_context = ExecutionContext::new_in_block(Arc::clone(&starknet.backend), &block_info)?; let transaction = convert_message_into_transaction(message, starknet.chain_id()); let execution_result = exec_context diff --git a/crates/client/rpc/src/versions/v0_7_1/methods/trace/simulate_transactions.rs b/crates/client/rpc/src/versions/v0_7_1/methods/trace/simulate_transactions.rs index 9354ae675..eef9af8b0 100644 --- a/crates/client/rpc/src/versions/v0_7_1/methods/trace/simulate_transactions.rs +++ b/crates/client/rpc/src/versions/v0_7_1/methods/trace/simulate_transactions.rs @@ -19,7 +19,7 @@ pub async fn simulate_transactions( if starknet_version < FALLBACK_TO_SEQUENCER_WHEN_VERSION_BELOW { return Err(StarknetRpcApiError::UnsupportedTxnVersion); } - let exec_context = ExecutionContext::new(Arc::clone(&starknet.backend), &block_info)?; + let exec_context = ExecutionContext::new_in_block(Arc::clone(&starknet.backend), &block_info)?; let charge_fee = !simulation_flags.contains(&SimulationFlag::SkipFeeCharge); let validate = !simulation_flags.contains(&SimulationFlag::SkipValidate); diff --git a/crates/client/rpc/src/versions/v0_7_1/methods/trace/trace_block_transactions.rs b/crates/client/rpc/src/versions/v0_7_1/methods/trace/trace_block_transactions.rs index de261ddbf..cfb242775 100644 --- a/crates/client/rpc/src/versions/v0_7_1/methods/trace/trace_block_transactions.rs +++ b/crates/client/rpc/src/versions/v0_7_1/methods/trace/trace_block_transactions.rs @@ -19,7 +19,7 @@ pub async fn trace_block_transactions( return Err(StarknetRpcApiError::UnsupportedTxnVersion); } - let exec_context = ExecutionContext::new(Arc::clone(&starknet.backend), &block.info)?; + let exec_context = ExecutionContext::new_in_block(Arc::clone(&starknet.backend), &block.info)?; let transactions: Vec<_> = block .inner diff --git a/crates/client/rpc/src/versions/v0_7_1/methods/trace/trace_transaction.rs b/crates/client/rpc/src/versions/v0_7_1/methods/trace/trace_transaction.rs index 3e85e5090..3d31e04cb 100644 --- a/crates/client/rpc/src/versions/v0_7_1/methods/trace/trace_transaction.rs +++ b/crates/client/rpc/src/versions/v0_7_1/methods/trace/trace_transaction.rs @@ -28,7 +28,7 @@ pub async fn trace_transaction( return Err(StarknetRpcApiError::UnsupportedTxnVersion); } - let exec_context = ExecutionContext::new(Arc::clone(&starknet.backend), &block.info)?; + let exec_context = ExecutionContext::new_in_block(Arc::clone(&starknet.backend), &block.info)?; let mut block_txs = Iterator::zip(block.inner.transactions.into_iter(), block.info.tx_hashes()) .map(|(tx, hash)| to_blockifier_transactions(starknet, block.info.as_block_id(), tx, &TransactionHash(*hash))); diff --git a/crates/client/sync/src/fetch/fetchers.rs b/crates/client/sync/src/fetch/fetchers.rs index e5f8eda6c..8d5d8b363 100644 --- a/crates/client/sync/src/fetch/fetchers.rs +++ b/crates/client/sync/src/fetch/fetchers.rs @@ -93,27 +93,37 @@ impl From for starknet_core::types::BlockId { pub async fn fetch_pending_block_and_updates( backend: &MadaraBackend, provider: &SequencerGatewayProvider, -) -> Result { +) -> Result, FetchError> { let block_id = FetchBlockId::Pending; let sw = PerfStopwatch::new(); let (state_update, block) = retry(|| fetch_state_update_with_block(provider, block_id), MAX_RETRY, BASE_DELAY).await?; - let class_update = fetch_class_updates(backend, &state_update, block_id, provider).await?; - - stopwatch_end!(sw, "fetching {:?}: {:?}", block_id); let block = starknet_core::types::MaybePendingBlockWithReceipts::try_from(block) .context("Converting the FGW format to starknet_types_core")?; - let MaybePendingBlockWithReceipts::PendingBlock(block) = block else { - return Err(anyhow::anyhow!("Fetched a pending block, got a closed one").into()); + let block = match block { + MaybePendingBlockWithReceipts::Block(block) => { + // HACK: Apparently the FGW sometimes returns a closed block when fetching the pending block. Interesting..? + log::debug!( + "Fetched a pending block, got a closed one: block_number={:?} block_hash={:#x}", + block.block_number, + block.block_hash + ); + return Ok(None); + } + MaybePendingBlockWithReceipts::PendingBlock(block) => block, }; + let class_update = fetch_class_updates(backend, &state_update, block_id, provider).await?; + + stopwatch_end!(sw, "fetching {:?}: {:?}", block_id); + let (transactions, receipts) = block.transactions.into_iter().map(|t| (t.transaction.into(), t.receipt.into())).unzip(); - Ok(UnverifiedPendingFullBlock { + Ok(Some(UnverifiedPendingFullBlock { header: UnverifiedHeader { parent_block_hash: Some(block.parent_hash), sequencer_address: block.sequencer_address, @@ -133,7 +143,7 @@ pub async fn fetch_pending_block_and_updates( transactions, receipts, declared_classes: class_update.into_iter().map(Into::into).collect(), - }) + })) } pub async fn fetch_block_and_updates( diff --git a/crates/client/sync/src/l2.rs b/crates/client/sync/src/l2.rs index f75d4d66f..5c09b5f3f 100644 --- a/crates/client/sync/src/l2.rs +++ b/crates/client/sync/src/l2.rs @@ -6,7 +6,7 @@ use crate::utils::trim_hash; use anyhow::Context; use futures::{stream, StreamExt}; use mc_block_import::{ - BlockImportResult, BlockImporter, PreValidatedBlock, UnverifiedFullBlock, UnverifiedPendingFullBlock, Validation, + BlockImportResult, BlockImporter, BlockValidationContext, PreValidatedBlock, UnverifiedFullBlock, }; use mc_db::db_metrics::DbMetrics; use mc_db::MadaraBackend; @@ -51,7 +51,7 @@ async fn l2_verify_and_apply_task( backend: Arc, mut updates_receiver: mpsc::Receiver, block_import: Arc, - validation: Validation, + validation: BlockValidationContext, backup_every_n_blocks: Option, block_metrics: BlockMetrics, db_metrics: DbMetrics, @@ -121,7 +121,7 @@ async fn l2_block_conversion_task( updates_receiver: mpsc::Receiver, output: mpsc::Sender, block_import: Arc, - validation: Validation, + validation: BlockValidationContext, ) -> anyhow::Result<()> { // Items of this stream are futures that resolve to blocks, which becomes a regular stream of blocks // using futures buffered. @@ -152,7 +152,7 @@ async fn l2_block_conversion_task( async fn l2_pending_block_task( backend: Arc, block_import: Arc, - validation: Validation, + validation: BlockValidationContext, sync_finished_cb: oneshot::Receiver<()>, provider: Arc, pending_block_poll_interval: Duration, @@ -176,9 +176,14 @@ async fn l2_pending_block_task( while wait_or_graceful_shutdown(interval.tick()).await.is_some() { log::debug!("getting pending block..."); - let block: UnverifiedPendingFullBlock = + let block = fetch_pending_block_and_updates(&backend, &provider).await.context("Getting pending block from FGW")?; + let Some(block) = block else { + // No pending block. + continue; + }; + // HACK(see issue #239): The latest block in db may not match the pending parent block hash // Just silently ignore it for now and move along. let import_block = || async { @@ -232,7 +237,12 @@ pub async fn sync( // we are using separate tasks so that fetches don't get clogged up if by any chance the verify task // starves the tokio worker let block_importer = Arc::new(BlockImporter::new(Arc::clone(backend))); - let validation = Validation { trust_transaction_hashes: false, trust_global_tries: config.verify, chain_id }; + let validation = BlockValidationContext { + trust_transaction_hashes: false, + trust_global_tries: config.verify, + chain_id, + trust_class_hashes: false, + }; let mut join_set = JoinSet::new(); join_set.spawn(l2_fetch_task( diff --git a/crates/client/sync/src/lib.rs b/crates/client/sync/src/lib.rs index b5dc1388d..bc73b4ffb 100644 --- a/crates/client/sync/src/lib.rs +++ b/crates/client/sync/src/lib.rs @@ -60,7 +60,7 @@ pub async fn sync( block_metrics, db_metrics, starting_block, - fetch_config.chain_id.clone(), + backend.chain_config().chain_id.clone(), telemetry, ) .await?; diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 9e8cd12c7..46b16c71b 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -18,7 +18,9 @@ name = "madara" [dependencies] # Madara +mc-block-import = { workspace = true } mc-db = { workspace = true } +mc-devnet = { workspace = true } mc-eth = { workspace = true } mc-mempool = { workspace = true } mc-metrics = { workspace = true } diff --git a/crates/node/src/cli/block_production.rs b/crates/node/src/cli/block_production.rs index f1db94017..3a848f409 100644 --- a/crates/node/src/cli/block_production.rs +++ b/crates/node/src/cli/block_production.rs @@ -5,4 +5,12 @@ pub struct BlockProductionParams { /// The block production service is only enabled with the authority (sequencer) mode. #[arg(long, alias = "no-block-production")] pub block_production_disabled: bool, + + /// Launch in block production mode, with devnet contracts. + #[arg(long)] + pub devnet: bool, + + /// Create this number of contracts in the genesis block for the devnet configuration. + #[arg(long, default_value_t = 10)] + pub devnet_contracts: u64, } diff --git a/crates/node/src/cli/mod.rs b/crates/node/src/cli/mod.rs index d6dd59e84..58ceeb01b 100644 --- a/crates/node/src/cli/mod.rs +++ b/crates/node/src/cli/mod.rs @@ -80,6 +80,10 @@ impl RunCmd { } self.name.as_ref().expect("Name was just set") } + + pub fn is_authority(&self) -> bool { + self.authority || self.block_production_params.devnet + } } /// Starknet network types. diff --git a/crates/node/src/main.rs b/crates/node/src/main.rs index bd8b08bd8..829d48588 100644 --- a/crates/node/src/main.rs +++ b/crates/node/src/main.rs @@ -6,6 +6,7 @@ use std::sync::Arc; use anyhow::Context; use clap::Parser; +use mc_block_import::BlockImporter; mod cli; mod service; mod util; @@ -15,7 +16,7 @@ use cli::RunCmd; use mc_db::DatabaseService; use mc_mempool::{GasPriceProvider, L1DataProvider, Mempool}; use mc_metrics::MetricsService; -use mc_rpc::providers::{AddTransactionProvider, ForwardToProvider, MempoolProvider}; +use mc_rpc::providers::{AddTransactionProvider, ForwardToProvider, MempoolAddTxProvider}; use mc_telemetry::{SysInfo, TelemetryService}; use mp_convert::ToFelt; use mp_utils::service::{Service, ServiceGroup}; @@ -41,7 +42,7 @@ async fn main() -> anyhow::Result<()> { log::info!("✌️ Version {}", node_version); log::info!("💁 Support URL: {}", GREET_SUPPORT_URL); log::info!("🏷 Node Name: {}", node_name); - let role = if run_cmd.authority { "authority" } else { "full node" }; + let role = if run_cmd.is_authority() { "authority" } else { "full node" }; log::info!("👤 Role: {}", role); log::info!("🌐 Network: {}", chain_config.chain_name); @@ -71,6 +72,8 @@ async fn main() -> anyhow::Result<()> { .await .context("Initializing db service")?; + let importer = Arc::new(BlockImporter::new(Arc::clone(db_service.backend()))); + let l1_gas_setter = GasPriceProvider::new(); let l1_data_provider: Arc = Arc::new(l1_gas_setter.clone()); @@ -81,7 +84,7 @@ async fn main() -> anyhow::Result<()> { l1_gas_setter, chain_config.chain_id.clone(), chain_config.eth_core_contract_address, - run_cmd.authority, + run_cmd.is_authority(), ) .await .context("Initializing the l1 sync service")?; @@ -89,7 +92,7 @@ async fn main() -> anyhow::Result<()> { // Block provider startup. // `rpc_add_txs_method_provider` is a trait object that tells the RPC task where to put the transactions when using the Write endpoints. let (block_provider_service, rpc_add_txs_method_provider): (_, Arc) = - match run_cmd.authority { + match run_cmd.is_authority() { // Block production service. (authority) true => { let mempool = Arc::new(Mempool::new(Arc::clone(db_service.backend()), Arc::clone(&l1_data_provider))); @@ -98,12 +101,13 @@ async fn main() -> anyhow::Result<()> { &run_cmd.block_production_params, &db_service, Arc::clone(&mempool), + importer, Arc::clone(&l1_data_provider), prometheus_service.registry(), telemetry_service.new_handle(), )?; - (ServiceGroup::default().with(block_production_service), Arc::new(MempoolProvider::new(mempool))) + (ServiceGroup::default().with(block_production_service), Arc::new(MempoolAddTxProvider::new(mempool))) } // Block sync service. (full node) false => { diff --git a/crates/node/src/service/block_production.rs b/crates/node/src/service/block_production.rs index 72fd2bac9..d0522bfb0 100644 --- a/crates/node/src/service/block_production.rs +++ b/crates/node/src/service/block_production.rs @@ -1,6 +1,9 @@ -use std::sync::Arc; +use std::{io::Write, sync::Arc}; +use anyhow::Context; +use mc_block_import::{BlockImporter, BlockValidationContext}; use mc_db::{DatabaseService, MadaraBackend}; +use mc_devnet::{ChainGenesisDescription, DevnetKeys}; use mc_mempool::{block_production::BlockProductionTask, L1DataProvider, Mempool}; use mc_metrics::MetricsRegistry; use mc_telemetry::TelemetryHandle; @@ -11,8 +14,11 @@ use crate::cli::block_production::BlockProductionParams; struct StartParams { backend: Arc, + block_import: Arc, mempool: Arc, l1_data_provider: Arc, + is_devnet: bool, + n_devnet_contracts: u64, } pub struct BlockProductionService { @@ -24,6 +30,7 @@ impl BlockProductionService { config: &BlockProductionParams, db_service: &DatabaseService, mempool: Arc, + block_import: Arc, l1_data_provider: Arc, _metrics_handle: MetricsRegistry, _telemetry: TelemetryHandle, @@ -33,7 +40,14 @@ impl BlockProductionService { } Ok(Self { - start: Some(StartParams { backend: Arc::clone(db_service.backend()), l1_data_provider, mempool }), + start: Some(StartParams { + backend: Arc::clone(db_service.backend()), + l1_data_provider, + mempool, + block_import, + n_devnet_contracts: config.devnet_contracts, + is_devnet: config.devnet, + }), enabled: true, }) } @@ -41,15 +55,51 @@ impl BlockProductionService { #[async_trait::async_trait] impl Service for BlockProductionService { - // TODO(cchudant,30-07-2024): special threading requirements for the block production task + // TODO(cchudant,2024-07-30): special threading requirements for the block production task async fn start(&mut self, join_set: &mut JoinSet>) -> anyhow::Result<()> { if !self.enabled { return Ok(()); } - let StartParams { backend, l1_data_provider, mempool } = self.start.take().expect("Service already started"); + let StartParams { backend, l1_data_provider, mempool, is_devnet, n_devnet_contracts, block_import } = + self.start.take().expect("Service already started"); + + if is_devnet { + // DEVNET: we the genesis block for the devnet if not deployed, otherwise we only print the devnet keys. + + let keys = if (backend.get_latest_block_n().context("Getting the latest block number in db")?).is_none() { + // deploy devnet genesis + + log::info!("⛏️ Deploying devnet genesis block"); + + let mut genesis_config = ChainGenesisDescription::base_config(); + let contracts = genesis_config.add_devnet_contracts(n_devnet_contracts); + + let genesis_block = genesis_config + .build(backend.chain_config()) + .context("Building genesis block from devnet config")?; + + block_import + .add_block(genesis_block, BlockValidationContext::new(backend.chain_config().chain_id.clone())) + .await + .context("Importing devnet genesis block")?; + + contracts.save_to_db(&backend).context("Saving predeployed devnet contract keys to database")?; + + contracts + } else { + DevnetKeys::from_db(&backend).context("Getting the devnet predeployed contract keys and balances")? + }; + + // display devnet welcome message :) + // we display it to stdout instead of stderr + + let msg = format!("{}", keys); + + std::io::stdout().write(msg.as_bytes()).context("Writing devnet welcome message to stdout")?; + } join_set.spawn(async move { - BlockProductionTask::new(backend, mempool, l1_data_provider)?.block_production_task().await?; + BlockProductionTask::new(backend, block_import, mempool, l1_data_provider)?.block_production_task().await?; Ok(()) }); diff --git a/crates/node/src/service/l1.rs b/crates/node/src/service/l1.rs index 23f956fa7..306a0957e 100644 --- a/crates/node/src/service/l1.rs +++ b/crates/node/src/service/l1.rs @@ -58,9 +58,12 @@ impl L1SyncService { if gas_price_sync_enabled { let eth_client = eth_client .clone() - .context("EthereumClient is required to start the l1 sync service but not provided.")?; + .context("L1 gas prices require the ethereum service to be enabled. Either disable gas prices syncing using `--no-gas-price-sync`, or remove the `--no-l1-sync` argument.")?; // running at-least once before the block production service - mc_eth::l1_gas_price::gas_price_worker(ð_client, l1_gas_provider.clone(), gas_price_poll_ms).await?; + log::info!("⏳ Getting initial L1 gas prices"); + mc_eth::l1_gas_price::gas_price_worker_once(ð_client, l1_gas_provider.clone(), gas_price_poll_ms) + .await + .context("Getting initial ethereum gas prices")?; } Ok(Self { diff --git a/crates/node/src/service/rpc/server.rs b/crates/node/src/service/rpc/server.rs index 793593f0d..379244203 100644 --- a/crates/node/src/service/rpc/server.rs +++ b/crates/node/src/service/rpc/server.rs @@ -184,7 +184,7 @@ pub async fn start_server( }); let server = hyper::Server::from_tcp(std_listener) - .with_context(|| format!("creating hyper server at: {addr}"))? + .with_context(|| format!("Creating hyper server at: {addr}"))? .serve(make_service); join_set.spawn(async move { @@ -198,7 +198,7 @@ pub async fn start_server( wait_or_graceful_shutdown(stop_handle.shutdown()).await; }) .await - .context("running rpc server") + .context("Running rpc server") }); Ok(server_handle) diff --git a/crates/primitives/chain_config/src/chain_config.rs b/crates/primitives/chain_config/src/chain_config.rs index 6b9688624..dbf06cac0 100644 --- a/crates/primitives/chain_config/src/chain_config.rs +++ b/crates/primitives/chain_config/src/chain_config.rs @@ -33,7 +33,7 @@ lazy_static::lazy_static! { #[derive(Debug)] pub struct ChainConfig { - /// Internal chain name. + /// Human readable chain name, for displaying to the console. pub chain_name: String, pub chain_id: ChainId, @@ -178,6 +178,8 @@ impl ChainConfig { Self { chain_name: "Test".into(), chain_id: ChainId::Other("MADARA_TEST".into()), + // We need a sequencer address for fee transfers to work in block production. + sequencer_address: Felt::from_hex_unchecked("0x123").try_into().unwrap(), ..ChainConfig::starknet_sepolia() } } diff --git a/crates/primitives/transactions/src/lib.rs b/crates/primitives/transactions/src/lib.rs index ee39fd09f..22bbbd523 100644 --- a/crates/primitives/transactions/src/lib.rs +++ b/crates/primitives/transactions/src/lib.rs @@ -1,18 +1,18 @@ +use mp_convert::ToFelt; +use starknet_api::transaction::TransactionVersion; +use starknet_types_core::{felt::Felt, hash::StarkHash}; + mod broadcasted_to_blockifier; -pub mod compute_hash; mod from_blockifier; mod from_broadcasted_transaction; mod from_starknet_core; mod from_starknet_provider; mod into_starknet_api; mod to_starknet_core; -pub mod utils; -pub use broadcasted_to_blockifier::broadcasted_to_blockifier; -use mp_convert::ToFelt; -// pub use from_starknet_provider::TransactionTypeError; -use starknet_api::transaction::TransactionVersion; -use starknet_types_core::{felt::Felt, hash::StarkHash}; +pub mod compute_hash; +pub mod utils; +pub use broadcasted_to_blockifier::{broadcasted_to_blockifier, BroadcastedToBlockifierError}; const SIMULATE_TX_VERSION_OFFSET: Felt = Felt::from_hex_unchecked("0x100000000000000000000000000000000"); diff --git a/crates/primitives/utils/src/lib.rs b/crates/primitives/utils/src/lib.rs index 122b700ad..74b3f8f3f 100644 --- a/crates/primitives/utils/src/lib.rs +++ b/crates/primitives/utils/src/lib.rs @@ -27,11 +27,16 @@ where static CTRL_C: AtomicBool = AtomicBool::new(false); async fn graceful_shutdown_inner() { - let mut sigint = - tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()).expect("SIGINT not supported"); + let sigint = async { + match tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) { + Ok(mut signal) => signal.recv().await, + // SIGTERM not supported + Err(_) => core::future::pending().await, + } + }; tokio::select! { _ = tokio::signal::ctrl_c() => {}, - _ = sigint.recv() => {}, + _ = sigint => {}, }; CTRL_C.store(true, Ordering::SeqCst); }