From dbcad6daa341eee210dd16c2ccd1b8d342d70798 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Sat, 29 May 2021 15:12:49 +0200 Subject: [PATCH 01/17] Add Statemint --- Cargo.lock | 4318 +++++++++++------ Cargo.toml | 5 + pallets/collator-selection/Cargo.toml | 57 + pallets/collator-selection/README.md | 1 + .../collator-selection/src/benchmarking.rs | 187 + pallets/collator-selection/src/lib.rs | 434 ++ pallets/collator-selection/src/mock.rs | 241 + pallets/collator-selection/src/tests.rs | 331 ++ pallets/collator-selection/src/weights.rs | 131 + polkadot-parachains/res/statemint.json | 55 + polkadot-parachains/src/chain_spec.rs | 487 +- polkadot-parachains/src/command.rs | 26 +- polkadot-parachains/statemine/Cargo.toml | 368 ++ polkadot-parachains/statemine/build.rs | 9 + .../statemine/src/constants.rs | 72 + polkadot-parachains/statemine/src/lib.rs | 837 ++++ .../statemine/src/weights/mod.rs | 7 + .../statemine/src/weights/pallet_assets.rs | 169 + .../statemine/src/weights/pallet_balances.rs | 64 + .../src/weights/pallet_collator_selection.rs | 83 + .../statemine/src/weights/pallet_multisig.rs | 115 + .../statemine/src/weights/pallet_proxy.rs | 114 + .../statemine/src/weights/pallet_timestamp.rs | 47 + .../statemine/src/weights/pallet_utility.rs | 52 + .../statemint-common/Cargo.toml | 128 + .../statemint-common/src/impls.rs | 202 + .../statemint-common/src/lib.rs | 87 + polkadot-parachains/statemint/Cargo.toml | 368 ++ polkadot-parachains/statemint/build.rs | 9 + .../statemint/src/constants.rs | 72 + polkadot-parachains/statemint/src/lib.rs | 827 ++++ .../statemint/src/weights/mod.rs | 7 + .../statemint/src/weights/pallet_assets.rs | 169 + .../statemint/src/weights/pallet_balances.rs | 64 + .../src/weights/pallet_collator_selection.rs | 83 + .../statemint/src/weights/pallet_multisig.rs | 115 + .../statemint/src/weights/pallet_proxy.rs | 112 + .../statemint/src/weights/pallet_timestamp.rs | 47 + .../statemint/src/weights/pallet_utility.rs | 52 + polkadot-parachains/westmint/Cargo.toml | 375 ++ polkadot-parachains/westmint/build.rs | 9 + polkadot-parachains/westmint/src/constants.rs | 72 + polkadot-parachains/westmint/src/lib.rs | 816 ++++ .../westmint/src/weights/mod.rs | 7 + .../westmint/src/weights/pallet_assets.rs | 169 + .../westmint/src/weights/pallet_balances.rs | 64 + .../src/weights/pallet_collator_selection.rs | 83 + .../westmint/src/weights/pallet_multisig.rs | 115 + .../westmint/src/weights/pallet_proxy.rs | 112 + .../westmint/src/weights/pallet_timestamp.rs | 47 + .../westmint/src/weights/pallet_utility.rs | 52 + 51 files changed, 11013 insertions(+), 1460 deletions(-) create mode 100644 pallets/collator-selection/Cargo.toml create mode 100644 pallets/collator-selection/README.md create mode 100644 pallets/collator-selection/src/benchmarking.rs create mode 100644 pallets/collator-selection/src/lib.rs create mode 100644 pallets/collator-selection/src/mock.rs create mode 100644 pallets/collator-selection/src/tests.rs create mode 100644 pallets/collator-selection/src/weights.rs create mode 100755 polkadot-parachains/res/statemint.json create mode 100644 polkadot-parachains/statemine/Cargo.toml create mode 100644 polkadot-parachains/statemine/build.rs create mode 100644 polkadot-parachains/statemine/src/constants.rs create mode 100644 polkadot-parachains/statemine/src/lib.rs create mode 100644 polkadot-parachains/statemine/src/weights/mod.rs create mode 100644 polkadot-parachains/statemine/src/weights/pallet_assets.rs create mode 100644 polkadot-parachains/statemine/src/weights/pallet_balances.rs create mode 100644 polkadot-parachains/statemine/src/weights/pallet_collator_selection.rs create mode 100644 polkadot-parachains/statemine/src/weights/pallet_multisig.rs create mode 100644 polkadot-parachains/statemine/src/weights/pallet_proxy.rs create mode 100644 polkadot-parachains/statemine/src/weights/pallet_timestamp.rs create mode 100644 polkadot-parachains/statemine/src/weights/pallet_utility.rs create mode 100644 polkadot-parachains/statemint-common/Cargo.toml create mode 100644 polkadot-parachains/statemint-common/src/impls.rs create mode 100644 polkadot-parachains/statemint-common/src/lib.rs create mode 100644 polkadot-parachains/statemint/Cargo.toml create mode 100644 polkadot-parachains/statemint/build.rs create mode 100644 polkadot-parachains/statemint/src/constants.rs create mode 100644 polkadot-parachains/statemint/src/lib.rs create mode 100644 polkadot-parachains/statemint/src/weights/mod.rs create mode 100644 polkadot-parachains/statemint/src/weights/pallet_assets.rs create mode 100644 polkadot-parachains/statemint/src/weights/pallet_balances.rs create mode 100644 polkadot-parachains/statemint/src/weights/pallet_collator_selection.rs create mode 100644 polkadot-parachains/statemint/src/weights/pallet_multisig.rs create mode 100644 polkadot-parachains/statemint/src/weights/pallet_proxy.rs create mode 100644 polkadot-parachains/statemint/src/weights/pallet_timestamp.rs create mode 100644 polkadot-parachains/statemint/src/weights/pallet_utility.rs create mode 100644 polkadot-parachains/westmint/Cargo.toml create mode 100644 polkadot-parachains/westmint/build.rs create mode 100644 polkadot-parachains/westmint/src/constants.rs create mode 100644 polkadot-parachains/westmint/src/lib.rs create mode 100644 polkadot-parachains/westmint/src/weights/mod.rs create mode 100644 polkadot-parachains/westmint/src/weights/pallet_assets.rs create mode 100644 polkadot-parachains/westmint/src/weights/pallet_balances.rs create mode 100644 polkadot-parachains/westmint/src/weights/pallet_collator_selection.rs create mode 100644 polkadot-parachains/westmint/src/weights/pallet_multisig.rs create mode 100644 polkadot-parachains/westmint/src/weights/pallet_proxy.rs create mode 100644 polkadot-parachains/westmint/src/weights/pallet_timestamp.rs create mode 100644 polkadot-parachains/westmint/src/weights/pallet_utility.rs diff --git a/Cargo.lock b/Cargo.lock index 6c5a4a2b065..3b35ee51e87 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -489,16 +489,16 @@ dependencies = [ "sc-keystore", "sc-network", "sc-network-gossip", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-keystore", - "sp-runtime", - "sp-utils", - "substrate-prometheus-endpoint", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", ] @@ -519,8 +519,8 @@ dependencies = [ "sc-rpc", "serde", "serde_json", - "sp-core", - "sp-runtime", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -529,11 +529,11 @@ version = "0.1.0" source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#5f2d59bdaae602d381d02a3ee705c34b511a7114" dependencies = [ "parity-scale-codec", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-runtime", - "sp-std", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -712,13 +712,13 @@ version = "0.1.0" source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" dependencies = [ "finality-grandpa", - "frame-support", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "serde", - "sp-core", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-finality-grandpa", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -727,10 +727,10 @@ version = "0.1.0" source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" dependencies = [ "bp-runtime", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-std", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -740,14 +740,14 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "bp-messages", "bp-runtime", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-api", - "sp-core", - "sp-runtime", - "sp-std", - "sp-version", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -760,10 +760,10 @@ dependencies = [ "bp-polkadot-core", "bp-runtime", "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-std", - "sp-version", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -771,16 +771,16 @@ name = "bp-runtime" version = "0.1.0" source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" dependencies = [ - "frame-support", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "hash-db", "num-traits", "parity-scale-codec", - "sp-core", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-trie", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -792,10 +792,10 @@ dependencies = [ "ed25519-dalek", "finality-grandpa", "parity-scale-codec", - "sp-application-crypto", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-finality-grandpa", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -808,10 +808,10 @@ dependencies = [ "bp-polkadot-core", "bp-runtime", "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-std", - "sp-version", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -1413,16 +1413,16 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-overseer", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "sc-client-api", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-io", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-runtime", - "sp-state-machine", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-client", "tracing", ] @@ -1442,17 +1442,17 @@ dependencies = [ "sc-consensus-aura", "sc-consensus-slots", "sc-telemetry", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -1469,22 +1469,22 @@ dependencies = [ "futures 0.3.14", "futures-timer 3.0.2", "parity-scale-codec", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-runtime", "polkadot-test-client", "sc-cli", "sc-client-api", "sc-service", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-tracing", - "sp-trie", - "substrate-prometheus-endpoint", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-utils", "tokio 0.2.24", "tracing", @@ -1502,14 +1502,14 @@ dependencies = [ "parking_lot 0.10.2", "polkadot-service", "sc-client-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", - "substrate-prometheus-endpoint", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -1525,21 +1525,21 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "polkadot-node-primitives", - "polkadot-parachain", - "polkadot-primitives", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-service", "polkadot-statement-table", "polkadot-test-client", "sc-cli", "sc-client-api", "sc-service", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-keystore", - "sp-runtime", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-utils", "tokio 0.2.24", "tracing", @@ -1557,8 +1557,8 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-overseer", - "polkadot-parachain", - "polkadot-primitives", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-service", "polkadot-statement-table", "polkadot-test-client", @@ -1566,13 +1566,13 @@ dependencies = [ "sc-cli", "sc-client-api", "sc-service", - "sp-api", - "sp-consensus", - "sp-core", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-keystore", - "sp-maybe-compressed-blob", - "sp-runtime", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-utils", "tokio 0.2.24", "tracing", @@ -1589,7 +1589,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "polkadot-overseer", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-service", "sc-chain-spec", "sc-client-api", @@ -1597,11 +1597,11 @@ dependencies = [ "sc-service", "sc-telemetry", "sc-tracing", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -1610,16 +1610,16 @@ name = "cumulus-pallet-aura-ext" version = "0.1.0" dependencies = [ "cumulus-pallet-parachain-system", - "frame-executive", - "frame-support", - "frame-system", - "pallet-aura", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "serde", - "sp-application-crypto", - "sp-consensus-aura", - "sp-runtime", - "sp-std", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -1627,19 +1627,19 @@ name = "cumulus-pallet-dmp-queue" version = "0.1.0" dependencies = [ "cumulus-primitives-core", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "parity-scale-codec", "rand 0.8.3", "rand_chacha 0.3.0", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", - "xcm", - "xcm-executor", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] @@ -1652,35 +1652,35 @@ dependencies = [ "cumulus-test-relay-sproof-builder", "env_logger 0.7.1", "environmental", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "hash-db", "hex-literal 0.2.1", "lazy_static", "log", "memory-db", - "pallet-balances", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "polkadot-parachain", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "sc-client-api", "sc-executor", "sc-executor-common", "serde", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-externalities", - "sp-inherents", - "sp-io", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-trie", - "sp-version", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-runtime-client", "trie-db", - "xcm", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] @@ -1688,14 +1688,14 @@ name = "cumulus-pallet-xcm" version = "0.1.0" dependencies = [ "cumulus-primitives-core", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "serde", - "sp-io", - "sp-runtime", - "sp-std", - "xcm", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] @@ -1703,16 +1703,16 @@ name = "cumulus-pallet-xcmp-queue" version = "0.1.0" dependencies = [ "cumulus-primitives-core", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "parity-scale-codec", "rand 0.8.3", "rand_chacha 0.3.0", - "sp-runtime", - "sp-std", - "xcm", - "xcm-executor", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] @@ -1721,30 +1721,30 @@ version = "0.1.0" dependencies = [ "cumulus-pallet-xcm", "cumulus-primitives-core", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "serde", - "sp-runtime", - "sp-std", - "xcm", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] name = "cumulus-primitives-core" version = "0.1.0" dependencies = [ - "frame-support", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "impl-trait-for-tuples", "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-primitives", - "sp-api", - "sp-runtime", - "sp-std", - "sp-trie", - "xcm", + "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] @@ -1756,13 +1756,13 @@ dependencies = [ "parity-scale-codec", "polkadot-service", "sc-client-api", - "sp-api", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-trie", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -1771,16 +1771,16 @@ name = "cumulus-primitives-utility" version = "0.1.0" dependencies = [ "cumulus-primitives-core", - "frame-support", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "impl-trait-for-tuples", "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-primitives", - "sp-runtime", - "sp-std", - "sp-trie", - "xcm", + "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] @@ -1795,40 +1795,40 @@ dependencies = [ "cumulus-ping", "cumulus-primitives-core", "cumulus-primitives-utility", - "frame-executive", - "frame-support", - "frame-system", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "hex", "hex-literal 0.3.1", "log", - "pallet-assets", - "pallet-aura", - "pallet-balances", - "pallet-randomness-collective-flip", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-xcm", + "pallet-assets 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=master)", "parachain-info", "parity-scale-codec", - "polkadot-parachain", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "serde", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder 4.0.0", - "xcm", - "xcm-builder", - "xcm-executor", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] @@ -1840,31 +1840,31 @@ dependencies = [ "cumulus-pallet-xcm", "cumulus-primitives-core", "cumulus-primitives-utility", - "frame-executive", - "frame-support", - "frame-system", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "hex", "hex-literal 0.3.1", "log", "parachain-info", "parity-scale-codec", - "polkadot-parachain", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "serde", - "sp-api", - "sp-block-builder", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder 4.0.0", - "xcm", - "xcm-builder", - "xcm-executor", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] @@ -1876,23 +1876,23 @@ dependencies = [ "cumulus-test-relay-sproof-builder", "cumulus-test-runtime", "cumulus-test-service", - "frame-system", - "pallet-balances", - "pallet-transaction-payment", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "sc-block-builder", "sc-consensus", "sc-service", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-inherents", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-runtime", - "sp-state-machine", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-test-primitives", - "sp-timestamp", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-client", ] @@ -1902,10 +1902,10 @@ version = "0.1.0" dependencies = [ "cumulus-primitives-core", "parity-scale-codec", - "polkadot-primitives", - "sp-runtime", - "sp-state-machine", - "sp-std", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -1921,29 +1921,29 @@ version = "0.1.0" dependencies = [ "cumulus-pallet-parachain-system", "cumulus-primitives-core", - "frame-executive", - "frame-support", - "frame-system", - "pallet-balances", - "pallet-randomness-collective-flip", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "parity-scale-codec", - "polkadot-parachain", - "serde", - "sp-api", - "sp-block-builder", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder 4.0.0", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "serde", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -1952,29 +1952,29 @@ version = "0.1.0" dependencies = [ "cumulus-pallet-parachain-system", "cumulus-primitives-core", - "frame-executive", - "frame-support", - "frame-system", - "pallet-balances", - "pallet-randomness-collective-flip", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "parity-scale-codec", - "polkadot-parachain", - "serde", - "sp-api", - "sp-block-builder", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder 4.0.0", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "serde", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -1991,13 +1991,13 @@ dependencies = [ "cumulus-test-relay-validation-worker-provider", "cumulus-test-runtime", "cumulus-test-runtime-upgrade", - "frame-system", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "futures 0.3.14", "jsonrpc-core", - "pallet-transaction-payment", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "polkadot-overseer", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-service", "polkadot-test-runtime", "polkadot-test-service", @@ -2015,20 +2015,20 @@ dependencies = [ "sc-tracing", "sc-transaction-pool", "serde", - "sp-api", - "sp-arithmetic", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-core", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-timestamp", - "sp-transaction-pool", - "sp-trie", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-client", "substrate-test-utils", "tokio 0.2.24", @@ -2203,6 +2203,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + [[package]] name = "dyn-clonable" version = "0.9.0" @@ -2565,18 +2571,37 @@ name = "frame-benchmarking" version = "3.1.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "linregress", + "log", + "parity-scale-codec", + "paste 1.0.4", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "frame-benchmarking" +version = "3.1.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "linregress", "log", "parity-scale-codec", "paste 1.0.4", - "sp-api", - "sp-io", - "sp-runtime", - "sp-runtime-interface", - "sp-std", - "sp-storage", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -2586,7 +2611,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "Inflector", "chrono", - "frame-benchmarking", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", "handlebars", "parity-scale-codec", "sc-cli", @@ -2594,11 +2619,11 @@ dependencies = [ "sc-executor", "sc-service", "serde", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-runtime", - "sp-state-machine", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "structopt", ] @@ -2607,12 +2632,12 @@ name = "frame-election-provider-support" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-arithmetic", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-npos-elections", - "sp-std", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -2620,14 +2645,29 @@ name = "frame-executive" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-tracing", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "frame-executive" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "parity-scale-codec", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -2637,8 +2677,19 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "parity-scale-codec", "serde", - "sp-core", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "frame-metadata" +version = "13.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "parity-scale-codec", + "serde", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -2647,24 +2698,51 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "bitflags", - "frame-metadata", - "frame-support-procedural", + "frame-metadata 13.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support-procedural 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "impl-trait-for-tuples", + "log", + "once_cell", + "parity-scale-codec", + "paste 1.0.4", + "serde", + "smallvec 1.6.1", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "frame-support" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "bitflags", + "frame-metadata 13.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support-procedural 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "impl-trait-for-tuples", "log", + "max-encoded-len", "once_cell", "parity-scale-codec", "paste 1.0.4", "serde", "smallvec 1.6.1", - "sp-arithmetic", - "sp-core", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-state-machine", - "sp-std", - "sp-tracing", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -2673,7 +2751,19 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "Inflector", - "frame-support-procedural-tools", + "frame-support-procedural-tools 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.68", +] + +[[package]] +name = "frame-support-procedural" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "Inflector", + "frame-support-procedural-tools 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "proc-macro2 1.0.26", "quote 1.0.9", "syn 1.0.68", @@ -2684,7 +2774,19 @@ name = "frame-support-procedural-tools" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support-procedural-tools-derive", + "frame-support-procedural-tools-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "proc-macro-crate 1.0.0", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.68", +] + +[[package]] +name = "frame-support-procedural-tools" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-support-procedural-tools-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", "quote 1.0.9", @@ -2701,21 +2803,62 @@ dependencies = [ "syn 1.0.68", ] +[[package]] +name = "frame-support-procedural-tools-derive" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.68", +] + [[package]] name = "frame-system" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "serde", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "frame-system" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "impl-trait-for-tuples", "log", "parity-scale-codec", "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", +] + +[[package]] +name = "frame-system-benchmarking" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "parity-scale-codec", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -2724,7 +2867,16 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "parity-scale-codec", - "sp-api", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "frame-system-rpc-runtime-api" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "parity-scale-codec", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -2732,11 +2884,11 @@ name = "frame-try-runtime" version = "0.9.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-std", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -3810,16 +3962,16 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "beefy-primitives", "bitvec", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "frame-try-runtime", "log", "pallet-authority-discovery", - "pallet-authorship", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-babe", - "pallet-balances", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-bounties", "pallet-collective", "pallet-democracy", @@ -3832,54 +3984,54 @@ dependencies = [ "pallet-indices", "pallet-membership", "pallet-mmr-primitives", - "pallet-multisig", + "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-nicks", "pallet-offences", - "pallet-proxy", - "pallet-randomness-collective-flip", + "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-recovery", "pallet-scheduler", - "pallet-session", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-society", "pallet-staking", "pallet-staking-reward-fn", - "pallet-timestamp", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-treasury", - "pallet-utility", + "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-vesting", - "pallet-xcm", + "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=master)", "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "rustc-hex", "serde", "serde_derive", "smallvec 1.6.1", - "sp-api", - "sp-arithmetic", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-authority-discovery", - "sp-block-builder", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-core", - "sp-inherents", - "sp-io", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "static_assertions", "substrate-wasm-builder 3.0.0", - "xcm", - "xcm-builder", - "xcm-executor", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] @@ -4582,6 +4734,28 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "max-encoded-len" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "impl-trait-for-tuples", + "max-encoded-len-derive", + "parity-scale-codec", + "primitive-types", +] + +[[package]] +name = "max-encoded-len-derive" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "proc-macro-crate 1.0.0", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.68", +] + [[package]] name = "maybe-uninit" version = "2.0.0" @@ -4915,6 +5089,18 @@ dependencies = [ "void", ] +[[package]] +name = "node-primitives" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "parity-scale-codec", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", +] + [[package]] name = "nodrop" version = "0.1.14" @@ -5066,12 +5252,26 @@ name = "pallet-assets" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-assets" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "max-encoded-len", + "parity-scale-codec", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5079,15 +5279,31 @@ name = "pallet-aura" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", - "pallet-session", - "pallet-timestamp", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-aura" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "parity-scale-codec", - "sp-application-crypto", - "sp-consensus-aura", - "sp-runtime", - "sp-std", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5095,14 +5311,14 @@ name = "pallet-authority-discovery" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", - "pallet-session", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-application-crypto", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-authority-discovery", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5110,13 +5326,27 @@ name = "pallet-authorship" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "impl-trait-for-tuples", + "parity-scale-codec", + "sp-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-authorship" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "impl-trait-for-tuples", "parity-scale-codec", - "sp-authorship", - "sp-runtime", - "sp-std", + "sp-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5124,22 +5354,22 @@ name = "pallet-babe" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", - "pallet-authorship", - "pallet-session", - "pallet-timestamp", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-application-crypto", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", "sp-consensus-vrf", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5147,13 +5377,28 @@ name = "pallet-balances" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "log", + "parity-scale-codec", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-balances" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "log", + "max-encoded-len", "parity-scale-codec", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5162,13 +5407,13 @@ version = "0.1.0" source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#5f2d59bdaae602d381d02a3ee705c34b511a7114" dependencies = [ "beefy-primitives", - "frame-support", - "frame-system", - "pallet-session", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "serde", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5176,12 +5421,12 @@ name = "pallet-bounties" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-treasury", "parity-scale-codec", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5193,16 +5438,40 @@ dependencies = [ "bp-runtime", "bp-test-utils", "finality-grandpa", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "num-traits", "parity-scale-codec", "serde", "sp-finality-grandpa", - "sp-runtime", - "sp-std", - "sp-trie", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-collator-selection" +version = "3.0.0" +dependencies = [ + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "log", + "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "parity-scale-codec", + "serde", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5210,14 +5479,14 @@ name = "pallet-collective" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "parity-scale-codec", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5225,14 +5494,14 @@ name = "pallet-democracy" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "serde", - "sp-io", - "sp-runtime", - "sp-std", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5241,16 +5510,16 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "frame-election-provider-support", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "parity-scale-codec", - "sp-arithmetic", - "sp-core", - "sp-io", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-npos-elections", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "static_assertions", ] @@ -5259,15 +5528,15 @@ name = "pallet-elections-phragmen" version = "4.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "parity-scale-codec", - "sp-core", - "sp-io", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-npos-elections", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5275,13 +5544,13 @@ name = "pallet-gilt" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-arithmetic", - "sp-runtime", - "sp-std", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5289,20 +5558,20 @@ name = "pallet-grandpa" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", - "pallet-authorship", - "pallet-session", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-application-crypto", - "sp-core", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-finality-grandpa", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5311,13 +5580,13 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "enumflags2", - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-io", - "sp-runtime", - "sp-std", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5325,17 +5594,17 @@ name = "pallet-im-online" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", - "pallet-authorship", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5343,14 +5612,14 @@ name = "pallet-indices" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-core", - "sp-io", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5358,14 +5627,14 @@ name = "pallet-membership" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "parity-scale-codec", - "sp-io", - "sp-runtime", - "sp-std", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5374,15 +5643,15 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "ckb-merkle-mountain-range", - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-mmr-primitives", "parity-scale-codec", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5390,15 +5659,15 @@ name = "pallet-mmr-primitives" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "parity-scale-codec", "serde", - "sp-api", - "sp-core", - "sp-runtime", - "sp-std", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5412,11 +5681,11 @@ dependencies = [ "pallet-mmr-primitives", "parity-scale-codec", "serde", - "sp-api", - "sp-blockchain", - "sp-core", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-rpc", - "sp-runtime", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5424,13 +5693,28 @@ name = "pallet-multisig" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-multisig" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "parity-scale-codec", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5438,12 +5722,12 @@ name = "pallet-nicks" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-io", - "sp-runtime", - "sp-std", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5451,15 +5735,15 @@ name = "pallet-offences" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", - "pallet-balances", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "serde", - "sp-runtime", - "sp-staking", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5467,13 +5751,29 @@ name = "pallet-proxy" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-proxy" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "max-encoded-len", "parity-scale-codec", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5481,12 +5781,25 @@ name = "pallet-randomness-collective-flip" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "safe-mix", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-randomness-collective-flip" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "parity-scale-codec", "safe-mix", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5495,12 +5808,12 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "enumflags2", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-io", - "sp-runtime", - "sp-std", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5508,14 +5821,14 @@ name = "pallet-scheduler" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "parity-scale-codec", - "sp-io", - "sp-runtime", - "sp-std", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5523,18 +5836,37 @@ name = "pallet-session" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "impl-trait-for-tuples", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-session" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "impl-trait-for-tuples", - "pallet-timestamp", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "parity-scale-codec", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-trie", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5542,12 +5874,12 @@ name = "pallet-society" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "rand_chacha 0.2.2", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5556,19 +5888,19 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "frame-election-provider-support", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", - "pallet-authorship", - "pallet-session", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "paste 1.0.4", "serde", - "sp-application-crypto", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "static_assertions", ] @@ -5589,7 +5921,7 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "log", - "sp-arithmetic", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5597,12 +5929,25 @@ name = "pallet-sudo" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-sudo" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "parity-scale-codec", - "sp-io", - "sp-runtime", - "sp-std", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5610,16 +5955,34 @@ name = "pallet-timestamp" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-timestamp" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "impl-trait-for-tuples", "log", "parity-scale-codec", - "sp-inherents", - "sp-runtime", - "sp-std", - "sp-timestamp", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5627,13 +5990,13 @@ name = "pallet-tips" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-treasury", "parity-scale-codec", "serde", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5641,15 +6004,31 @@ name = "pallet-transaction-payment" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "serde", + "smallvec 1.6.1", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-transaction-payment" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "parity-scale-codec", "serde", "smallvec 1.6.1", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5660,13 +6039,13 @@ dependencies = [ "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", - "pallet-transaction-payment-rpc-runtime-api", + "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-api", - "sp-blockchain", - "sp-core", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-rpc", - "sp-runtime", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5674,10 +6053,21 @@ name = "pallet-transaction-payment-rpc-runtime-api" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "pallet-transaction-payment", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-transaction-payment-rpc-runtime-api" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "parity-scale-codec", - "sp-api", - "sp-runtime", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5685,14 +6075,14 @@ name = "pallet-treasury" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "impl-trait-for-tuples", - "pallet-balances", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "serde", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5700,13 +6090,28 @@ name = "pallet-utility" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "pallet-utility" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "parity-scale-codec", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -5715,11 +6120,11 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "enumflags2", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -5727,14 +6132,29 @@ name = "pallet-xcm" version = "0.1.0" source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "serde", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", +] + +[[package]] +name = "pallet-xcm" +version = "0.1.0" +source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "serde", - "sp-runtime", - "sp-std", - "xcm", - "xcm-executor", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", ] [[package]] @@ -5742,8 +6162,8 @@ name = "parachain-info" version = "0.1.0" dependencies = [ "cumulus-primitives-core", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "serde", ] @@ -5877,6 +6297,12 @@ version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" +[[package]] +name = "parity-wasm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" + [[package]] name = "parity-ws" version = "0.10.0" @@ -6200,7 +6626,7 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "tracing", ] @@ -6213,7 +6639,7 @@ dependencies = [ "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "tracing", ] @@ -6231,11 +6657,11 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "rand 0.8.3", - "sp-application-crypto", - "sp-core", - "sp-keystore", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", ] @@ -6253,7 +6679,7 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "rand 0.8.3", "thiserror", "tracing", @@ -6271,8 +6697,8 @@ dependencies = [ "polkadot-service", "sc-cli", "sc-service", - "sp-core", - "sp-trie", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "structopt", "substrate-build-script-utils", "thiserror", @@ -6302,13 +6728,13 @@ dependencies = [ "jsonrpc-core", "log", "nix", - "pallet-sudo", + "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "parking_lot 0.10.2", "polkadot-cli", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-service", "polkadot-test-client", "polkadot-test-runtime", @@ -6328,23 +6754,23 @@ dependencies = [ "sc-tracing", "sc-transaction-pool", "serde", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-timestamp", - "sp-transaction-pool", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "structopt", "substrate-build-script-utils", - "substrate-prometheus-endpoint", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-client", "substrate-test-runtime-client", "tempfile", @@ -6364,10 +6790,10 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-core", - "sp-keystore", - "sp-runtime", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", ] @@ -6379,9 +6805,21 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "parity-scale-codec", "parity-util-mem", - "sp-core", - "sp-runtime", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "polkadot-core-primitives" +version = "0.9.3" +source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +dependencies = [ + "parity-scale-codec", + "parity-util-mem", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -6391,10 +6829,10 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "parity-scale-codec", "polkadot-node-primitives", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "reed-solomon-novelpoly", - "sp-core", - "sp-trie", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", ] @@ -6407,9 +6845,9 @@ dependencies = [ "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-application-crypto", - "sp-keystore", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -6425,10 +6863,10 @@ dependencies = [ "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "sc-authority-discovery", "sc-network", - "sp-consensus", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "strum", "tracing", ] @@ -6444,9 +6882,9 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-core", - "sp-maybe-compressed-blob", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", ] @@ -6468,15 +6906,15 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-overseer", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "sc-client-api", "sc-keystore", "schnorrkel", - "sp-application-crypto", - "sp-blockchain", - "sp-consensus", - "sp-consensus-slots", - "sp-runtime", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -6495,7 +6933,7 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-overseer", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "thiserror", "tracing", ] @@ -6511,9 +6949,9 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-statement-table", - "sp-keystore", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", ] @@ -6526,8 +6964,8 @@ dependencies = [ "futures 0.3.14", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-keystore", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", "wasm-timer", @@ -6542,8 +6980,8 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-keystore", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", ] @@ -6560,9 +6998,9 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-parachain", - "polkadot-primitives", - "sp-maybe-compressed-blob", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -6574,8 +7012,8 @@ dependencies = [ "futures 0.3.14", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-blockchain", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -6589,10 +7027,10 @@ dependencies = [ "futures-timer 3.0.2", "polkadot-node-subsystem", "polkadot-overseer", - "polkadot-primitives", - "sp-blockchain", - "sp-inherents", - "sp-runtime", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", ] @@ -6607,7 +7045,7 @@ dependencies = [ "futures-timer 3.0.2", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "thiserror", "tracing", ] @@ -6626,17 +7064,17 @@ dependencies = [ "libc", "parity-scale-codec", "pin-project 1.0.4", - "polkadot-core-primitives", - "polkadot-parachain", + "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "rand 0.8.3", "sc-executor", "sc-executor-common", "sc-executor-wasmtime", "slotmap", - "sp-core", - "sp-externalities", - "sp-io", - "sp-wasm-interface", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -6650,11 +7088,11 @@ dependencies = [ "parity-util-mem", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-api", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-authority-discovery", "sp-consensus-babe", - "sp-core", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -6670,9 +7108,9 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.11.1", "polkadot-node-primitives", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "sc-network", - "sp-core", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", ] @@ -6685,7 +7123,7 @@ dependencies = [ "parity-scale-codec", "polkadot-node-jaeger", "polkadot-node-primitives", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "sc-network", "strum", "thiserror", @@ -6698,17 +7136,17 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "futures 0.3.14", "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-statement-table", "schnorrkel", "serde", - "sp-application-crypto", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", "sp-consensus-vrf", - "sp-core", - "sp-maybe-compressed-blob", - "sp-runtime", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "zstd", ] @@ -6732,13 +7170,13 @@ dependencies = [ "polkadot-node-jaeger", "polkadot-node-network-protocol", "polkadot-node-primitives", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-procmacro-subsystem-dispatch-gen", "polkadot-statement-table", "sc-network", "smallvec 1.6.1", - "sp-core", - "substrate-prometheus-endpoint", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", ] @@ -6757,11 +7195,11 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-statement-table", "sc-network", "smallvec 1.6.1", - "sp-core", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -6781,14 +7219,14 @@ dependencies = [ "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "rand 0.8.3", "sc-network", - "sp-application-crypto", - "sp-core", - "sp-keystore", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "streamunordered", - "substrate-prometheus-endpoint", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", ] @@ -6804,10 +7242,10 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-procmacro-overseer-subsystems-gen", "sc-client-api", - "sp-api", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", ] @@ -6819,44 +7257,89 @@ dependencies = [ "derive_more 0.99.11", "parity-scale-codec", "parity-util-mem", - "polkadot-core-primitives", + "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "serde", - "sp-core", - "sp-runtime", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] -name = "polkadot-primitives" +name = "polkadot-parachain" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" dependencies = [ - "bitvec", - "frame-system", - "hex-literal 0.3.1", + "derive_more 0.99.11", "parity-scale-codec", "parity-util-mem", - "polkadot-core-primitives", - "polkadot-parachain", + "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", "serde", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-authority-discovery", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-staking", - "sp-std", - "sp-trie", - "sp-version", - "thiserror", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] -name = "polkadot-procmacro-overseer-subsystems-gen" +name = "polkadot-primitives" +version = "0.9.3" +source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +dependencies = [ + "bitvec", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "hex-literal 0.3.1", + "parity-scale-codec", + "parity-util-mem", + "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "serde", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-authority-discovery", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "thiserror", +] + +[[package]] +name = "polkadot-primitives" +version = "0.9.3" +source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +dependencies = [ + "bitvec", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "hex-literal 0.3.1", + "parity-scale-codec", + "parity-util-mem", + "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "serde", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-authority-discovery", + "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "thiserror", +] + +[[package]] +name = "polkadot-procmacro-overseer-subsystems-gen" version = "0.1.0" source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" dependencies = [ @@ -6888,7 +7371,7 @@ dependencies = [ "pallet-mmr-rpc", "pallet-transaction-payment-rpc", "parity-scale-codec", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "sc-chain-spec", "sc-client-api", "sc-consensus-babe", @@ -6899,14 +7382,14 @@ dependencies = [ "sc-keystore", "sc-rpc", "sc-sync-state-rpc", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-keystore", - "sp-runtime", - "sp-transaction-pool", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-frame-rpc-system", ] @@ -6917,16 +7400,16 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "beefy-primitives", "bitvec", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "frame-try-runtime", "log", "pallet-authority-discovery", - "pallet-authorship", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-babe", - "pallet-balances", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-bounties", "pallet-collective", "pallet-democracy", @@ -6938,44 +7421,44 @@ dependencies = [ "pallet-indices", "pallet-membership", "pallet-mmr-primitives", - "pallet-multisig", + "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-nicks", "pallet-offences", - "pallet-proxy", - "pallet-randomness-collective-flip", + "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-scheduler", - "pallet-session", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-staking", "pallet-staking-reward-curve", - "pallet-timestamp", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-treasury", - "pallet-utility", + "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-vesting", "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-common", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "rustc-hex", "serde", "serde_derive", "smallvec 1.6.1", - "sp-api", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-authority-discovery", - "sp-block-builder", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-core", - "sp-inherents", - "sp-io", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "static_assertions", "substrate-wasm-builder 3.0.0", ] @@ -6987,39 +7470,81 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "beefy-primitives", "bitvec", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "impl-trait-for-tuples", + "libsecp256k1", + "log", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-beefy", + "pallet-mmr", + "pallet-offences", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-staking", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-treasury", + "pallet-vesting", + "parity-scale-codec", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "rustc-hex", + "serde", + "serde_derive", + "slot-range-helper 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "static_assertions", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", +] + +[[package]] +name = "polkadot-runtime-common" +version = "0.9.3" +source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +dependencies = [ + "beefy-primitives", + "bitvec", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "impl-trait-for-tuples", "libsecp256k1", "log", - "pallet-authorship", - "pallet-balances", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-beefy", "pallet-mmr", "pallet-offences", - "pallet-session", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-staking", - "pallet-timestamp", - "pallet-transaction-payment", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-treasury", "pallet-vesting", "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-parachains", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", "rustc-hex", "serde", "serde_derive", - "slot-range-helper", - "sp-api", - "sp-core", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", + "slot-range-helper 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "static_assertions", - "xcm", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", ] [[package]] @@ -7029,34 +7554,71 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "bitvec", "derive_more 0.99.11", - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "log", + "pallet-authority-discovery", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-offences", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-staking", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-vesting", + "parity-scale-codec", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "rand 0.8.3", + "rand_chacha 0.3.0", + "rustc-hex", + "serde", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", +] + +[[package]] +name = "polkadot-runtime-parachains" +version = "0.9.3" +source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +dependencies = [ + "bitvec", + "derive_more 0.99.11", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "pallet-authority-discovery", - "pallet-authorship", - "pallet-balances", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-offences", - "pallet-session", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-staking", - "pallet-timestamp", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-vesting", "parity-scale-codec", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", "rand 0.8.3", "rand_chacha 0.3.0", "rustc-hex", "serde", - "sp-api", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "xcm", - "xcm-executor", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", ] [[package]] @@ -7066,8 +7628,8 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "beefy-gadget", "beefy-primitives", - "frame-benchmarking", - "frame-system-rpc-runtime-api", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "futures 0.3.14", "hex-literal 0.3.1", "kusama-runtime", @@ -7077,7 +7639,7 @@ dependencies = [ "pallet-im-online", "pallet-mmr-primitives", "pallet-staking", - "pallet-transaction-payment-rpc-runtime-api", + "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "polkadot-approval-distribution", "polkadot-availability-bitfield-distribution", "polkadot-availability-distribution", @@ -7100,11 +7662,11 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-overseer", - "polkadot-parachain", - "polkadot-primitives", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-rpc", "polkadot-runtime", - "polkadot-runtime-parachains", + "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-statement-distribution", "rococo-runtime", "sc-authority-discovery", @@ -7126,26 +7688,26 @@ dependencies = [ "sc-telemetry", "sc-transaction-pool", "serde", - "sp-api", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-authority-discovery", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-core", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-finality-grandpa", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-storage", - "sp-timestamp", - "sp-transaction-pool", - "sp-trie", - "substrate-prometheus-endpoint", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", "westend-runtime", @@ -7164,10 +7726,10 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "sc-network", - "sp-keystore", - "sp-staking", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", ] @@ -7178,8 +7740,8 @@ version = "0.9.3" source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" dependencies = [ "parity-scale-codec", - "polkadot-primitives", - "sp-core", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -7189,21 +7751,21 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", - "polkadot-primitives", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-test-runtime", "polkadot-test-service", "sc-block-builder", "sc-consensus", "sc-service", - "sp-api", - "sp-blockchain", - "sp-consensus", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-timestamp", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-client", ] @@ -7215,52 +7777,52 @@ dependencies = [ "beefy-primitives", "bitvec", "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "pallet-authority-discovery", - "pallet-authorship", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-babe", - "pallet-balances", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-grandpa", "pallet-indices", "pallet-mmr-primitives", "pallet-nicks", "pallet-offences", - "pallet-randomness-collective-flip", - "pallet-session", + "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-staking", "pallet-staking-reward-curve", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", + "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-vesting", "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "rustc-hex", "serde", "serde_derive", "smallvec 1.6.1", - "sp-api", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-authority-discovery", - "sp-block-builder", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-wasm-builder 3.0.0", ] @@ -7269,22 +7831,22 @@ name = "polkadot-test-service" version = "0.9.3" source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" dependencies = [ - "frame-benchmarking", - "frame-system", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "futures 0.1.30", "futures 0.3.14", "hex", - "pallet-balances", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-staking", - "pallet-transaction-payment", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-overseer", - "polkadot-parachain", - "polkadot-primitives", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-rpc", - "polkadot-runtime-common", - "polkadot-runtime-parachains", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "polkadot-service", "polkadot-test-runtime", "rand 0.8.3", @@ -7300,17 +7862,17 @@ dependencies = [ "sc-service", "sc-tracing", "sc-transaction-pool", - "sp-arithmetic", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-authority-discovery", - "sp-blockchain", - "sp-consensus", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-core", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-finality-grandpa", - "sp-inherents", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-runtime", - "sp-state-machine", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-client", "tempfile", "tracing", @@ -8001,9 +8563,9 @@ dependencies = [ "jsonrpsee-ws-client", "log", "parity-scale-codec", - "sp-core", - "sp-io", - "sp-runtime", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8074,16 +8636,16 @@ dependencies = [ "beefy-primitives", "bp-rococo", "bp-wococo", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "hex-literal 0.3.1", "log", "pallet-authority-discovery", - "pallet-authorship", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-babe", - "pallet-balances", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-beefy", "pallet-bridge-grandpa", "pallet-collective", @@ -8094,42 +8656,42 @@ dependencies = [ "pallet-mmr", "pallet-mmr-primitives", "pallet-offences", - "pallet-proxy", - "pallet-session", + "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-staking", "pallet-staking-reward-curve", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-utility", - "pallet-xcm", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", + "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=master)", + "parity-scale-codec", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "serde", "serde_derive", "smallvec 1.6.1", - "sp-api", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-authority-discovery", - "sp-block-builder", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-wasm-builder 3.0.0", - "xcm", - "xcm-builder", - "xcm-executor", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", ] [[package]] @@ -8142,6 +8704,29 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "runtime-common" +version = "0.8.30" +dependencies = [ + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "node-primitives", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-collator-selection", + "parity-scale-codec", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "serde", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", +] + [[package]] name = "rust-argon2" version = "0.8.3" @@ -8293,13 +8878,13 @@ dependencies = [ "sc-client-api", "sc-network", "serde_json", - "sp-api", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-authority-discovery", - "sp-blockchain", - "sp-core", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8315,14 +8900,14 @@ dependencies = [ "sc-client-api", "sc-proposer-metrics", "sc-telemetry", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-transaction-pool", - "substrate-prometheus-endpoint", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8332,13 +8917,13 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "parity-scale-codec", "sc-client-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8358,8 +8943,8 @@ dependencies = [ "serde_json", "sp-chain-spec", "sp-consensus-babe", - "sp-core", - "sp-runtime", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8397,14 +8982,14 @@ dependencies = [ "sc-tracing", "serde", "serde_json", - "sp-blockchain", - "sp-core", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-keystore", - "sp-panic-handler", - "sp-runtime", - "sp-utils", - "sp-version", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-panic-handler 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "structopt", "thiserror", "tiny-bip39", @@ -8426,23 +9011,23 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.11.1", "sc-executor", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-database", - "sp-externalities", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-storage", - "sp-transaction-pool", - "sp-trie", - "sp-utils", - "sp-version", - "substrate-prometheus-endpoint", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-database 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8464,15 +9049,15 @@ dependencies = [ "sc-client-api", "sc-executor", "sc-state-db", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-database", - "sp-runtime", - "sp-state-machine", - "sp-trie", - "substrate-prometheus-endpoint", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-database 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8482,9 +9067,9 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "parking_lot 0.11.1", "sc-client-api", - "sp-blockchain", - "sp-consensus", - "sp-runtime", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8502,20 +9087,20 @@ dependencies = [ "sc-client-api", "sc-consensus-slots", "sc-telemetry", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-aura", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-version", - "substrate-prometheus-endpoint", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8546,22 +9131,22 @@ dependencies = [ "sc-telemetry", "schnorrkel", "serde", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-consensus-slots", + "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-vrf", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-utils", - "sp-version", - "substrate-prometheus-endpoint", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8578,14 +9163,14 @@ dependencies = [ "sc-consensus-epochs", "sc-rpc-api", "serde", - "sp-api", - "sp-application-crypto", - "sp-blockchain", - "sp-consensus", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-core", - "sp-keystore", - "sp-runtime", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8597,8 +9182,8 @@ dependencies = [ "parity-scale-codec", "sc-client-api", "sc-consensus", - "sp-blockchain", - "sp-runtime", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8614,18 +9199,18 @@ dependencies = [ "parity-scale-codec", "sc-client-api", "sc-telemetry", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-timestamp", - "sp-trie", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", ] @@ -8635,8 +9220,8 @@ version = "0.9.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "sc-client-api", - "sp-authorship", - "sp-runtime", + "sp-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", ] @@ -8655,18 +9240,18 @@ dependencies = [ "sc-executor-common", "sc-executor-wasmi", "sc-executor-wasmtime", - "sp-api", - "sp-core", - "sp-externalities", - "sp-io", - "sp-panic-handler", - "sp-runtime-interface", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-panic-handler 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-serializer", "sp-tasks", - "sp-trie", - "sp-version", - "sp-wasm-interface", - "wasmi", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "wasmi 0.6.2", ] [[package]] @@ -8679,12 +9264,12 @@ dependencies = [ "parity-wasm 0.41.0", "pwasm-utils", "sp-allocator", - "sp-core", - "sp-maybe-compressed-blob", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-serializer", - "sp-wasm-interface", + "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", - "wasmi", + "wasmi 0.6.2", ] [[package]] @@ -8696,10 +9281,10 @@ dependencies = [ "parity-scale-codec", "sc-executor-common", "sp-allocator", - "sp-core", - "sp-runtime-interface", - "sp-wasm-interface", - "wasmi", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "wasmi 0.6.2", ] [[package]] @@ -8714,9 +9299,9 @@ dependencies = [ "sc-executor-common", "scoped-tls", "sp-allocator", - "sp-core", - "sp-runtime-interface", - "sp-wasm-interface", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "wasmtime", ] @@ -8746,18 +9331,18 @@ dependencies = [ "sc-network-gossip", "sc-telemetry", "serde_json", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-core", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-finality-grandpa", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-utils", - "substrate-prometheus-endpoint", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8779,9 +9364,9 @@ dependencies = [ "sc-rpc", "serde", "serde_json", - "sp-blockchain", - "sp-core", - "sp-runtime", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8800,9 +9385,9 @@ dependencies = [ "sc-finality-grandpa", "sc-network", "sc-service", - "sp-blockchain", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-finality-grandpa", - "sp-runtime", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8816,10 +9401,10 @@ dependencies = [ "parity-util-mem", "sc-client-api", "sc-network", - "sp-blockchain", - "sp-runtime", - "sp-transaction-pool", - "sp-utils", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "wasm-timer", ] @@ -8837,9 +9422,9 @@ dependencies = [ "parking_lot 0.11.1", "rand 0.7.3", "serde_json", - "sp-application-crypto", - "sp-core", - "sp-keystore", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "subtle 2.4.0", ] @@ -8854,12 +9439,12 @@ dependencies = [ "parking_lot 0.11.1", "sc-client-api", "sc-executor", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-externalities", - "sp-runtime", - "sp-state-machine", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -8901,13 +9486,13 @@ dependencies = [ "serde", "serde_json", "smallvec 1.6.1", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "sp-utils", - "substrate-prometheus-endpoint", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "unsigned-varint 0.6.0", "void", @@ -8926,8 +9511,8 @@ dependencies = [ "log", "lru", "sc-network", - "sp-runtime", - "substrate-prometheus-endpoint", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", "wasm-timer", ] @@ -8952,11 +9537,11 @@ dependencies = [ "sc-client-api", "sc-keystore", "sc-network", - "sp-api", - "sp-core", - "sp-offchain", - "sp-runtime", - "sp-utils", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "threadpool", ] @@ -8969,7 +9554,7 @@ dependencies = [ "libp2p", "log", "serde_json", - "sp-utils", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "wasm-timer", ] @@ -8979,7 +9564,7 @@ version = "0.9.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "log", - "substrate-prometheus-endpoint", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -9001,20 +9586,20 @@ dependencies = [ "sc-rpc-api", "sc-tracing", "serde_json", - "sp-api", - "sp-blockchain", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-chain-spec", - "sp-core", - "sp-keystore", - "sp-offchain", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-rpc", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-tracing", - "sp-transaction-pool", - "sp-utils", - "sp-version", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -9034,12 +9619,12 @@ dependencies = [ "serde", "serde_json", "sp-chain-spec", - "sp-core", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-rpc", - "sp-runtime", - "sp-tracing", - "sp-transaction-pool", - "sp-version", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -9056,8 +9641,8 @@ dependencies = [ "log", "serde", "serde_json", - "sp-runtime", - "substrate-prometheus-endpoint", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -9098,25 +9683,25 @@ dependencies = [ "sc-transaction-pool", "serde", "serde_json", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-externalities", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-tracing", - "sp-transaction-pool", - "sp-trie", - "sp-utils", - "sp-version", - "substrate-prometheus-endpoint", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "tempfile", "thiserror", "tracing", @@ -9135,7 +9720,7 @@ dependencies = [ "parity-util-mem-derive", "parking_lot 0.11.1", "sc-client-api", - "sp-core", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", ] @@ -9154,8 +9739,8 @@ dependencies = [ "sc-finality-grandpa", "sc-rpc-api", "serde_json", - "sp-blockchain", - "sp-runtime", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", ] @@ -9199,14 +9784,14 @@ dependencies = [ "sc-tracing-proc-macro", "serde", "serde_json", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-core", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-rpc", - "sp-runtime", - "sp-storage", - "sp-tracing", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "tracing", "tracing-log", @@ -9240,11 +9825,11 @@ dependencies = [ "parking_lot 0.11.1", "retain_mut", "serde", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-transaction-pool", - "sp-utils", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "wasm-timer", ] @@ -9263,14 +9848,14 @@ dependencies = [ "parking_lot 0.11.1", "sc-client-api", "sc-transaction-graph", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-tracing", - "sp-transaction-pool", - "sp-utils", - "substrate-prometheus-endpoint", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", "wasm-timer", ] @@ -9596,8 +10181,20 @@ dependencies = [ "enumn", "parity-scale-codec", "paste 1.0.4", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "slot-range-helper" +version = "0.9.3" +source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +dependencies = [ + "enumn", + "parity-scale-codec", + "paste 1.0.4", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -9685,9 +10282,9 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "log", - "sp-core", - "sp-std", - "sp-wasm-interface", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "thiserror", ] @@ -9699,12 +10296,29 @@ dependencies = [ "hash-db", "log", "parity-scale-codec", - "sp-api-proc-macro", - "sp-core", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-version", + "sp-api-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "thiserror", +] + +[[package]] +name = "sp-api" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "hash-db", + "log", + "parity-scale-codec", + "sp-api-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "thiserror", ] @@ -9720,6 +10334,18 @@ dependencies = [ "syn 1.0.68", ] +[[package]] +name = "sp-api-proc-macro" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "blake2-rfc", + "proc-macro-crate 1.0.0", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.68", +] + [[package]] name = "sp-application-crypto" version = "3.0.0" @@ -9727,9 +10353,22 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "parity-scale-codec", "serde", - "sp-core", - "sp-io", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-application-crypto" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "max-encoded-len", + "parity-scale-codec", + "serde", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -9741,8 +10380,22 @@ dependencies = [ "num-traits", "parity-scale-codec", "serde", - "sp-debug-derive", - "sp-std", + "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "static_assertions", +] + +[[package]] +name = "sp-arithmetic" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "serde", + "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "static_assertions", ] @@ -9752,10 +10405,10 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "parity-scale-codec", - "sp-api", - "sp-application-crypto", - "sp-runtime", - "sp-std", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -9765,9 +10418,21 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "async-trait", "parity-scale-codec", - "sp-inherents", - "sp-runtime", - "sp-std", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-authorship" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "async-trait", + "parity-scale-codec", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -9776,10 +10441,22 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "parity-scale-codec", - "sp-api", - "sp-inherents", - "sp-runtime", - "sp-std", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-block-builder" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "parity-scale-codec", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -9792,11 +10469,29 @@ dependencies = [ "lru", "parity-scale-codec", "parking_lot 0.11.1", - "sp-api", - "sp-consensus", - "sp-database", - "sp-runtime", - "sp-state-machine", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-database 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "thiserror", +] + +[[package]] +name = "sp-blockchain" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "futures 0.3.14", + "log", + "lru", + "parity-scale-codec", + "parking_lot 0.11.1", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-database 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "thiserror", ] @@ -9822,16 +10517,43 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.11.1", "serde", - "sp-api", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-trie", - "sp-utils", - "sp-version", - "substrate-prometheus-endpoint", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "thiserror", + "wasm-timer", +] + +[[package]] +name = "sp-consensus" +version = "0.9.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "async-trait", + "futures 0.3.14", + "futures-timer 3.0.2", + "libp2p", + "log", + "parity-scale-codec", + "parking_lot 0.11.1", + "serde", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "thiserror", "wasm-timer", ] @@ -9843,14 +10565,31 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "async-trait", "parity-scale-codec", - "sp-api", - "sp-application-crypto", - "sp-consensus", - "sp-consensus-slots", - "sp-inherents", - "sp-runtime", - "sp-std", - "sp-timestamp", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-consensus-aura" +version = "0.9.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "async-trait", + "parity-scale-codec", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -9862,17 +10601,17 @@ dependencies = [ "merlin", "parity-scale-codec", "serde", - "sp-api", - "sp-application-crypto", - "sp-consensus", - "sp-consensus-slots", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-vrf", - "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-std", - "sp-timestamp", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -9881,8 +10620,18 @@ version = "0.9.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "parity-scale-codec", - "sp-arithmetic", - "sp-runtime", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-consensus-slots" +version = "0.9.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "parity-scale-codec", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -9892,9 +10641,9 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "parity-scale-codec", "schnorrkel", - "sp-core", - "sp-runtime", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -9927,17 +10676,62 @@ dependencies = [ "secrecy", "serde", "sha2 0.9.2", - "sp-debug-derive", - "sp-externalities", - "sp-runtime-interface", - "sp-std", - "sp-storage", + "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-bip39", + "thiserror", + "tiny-bip39", + "tiny-keccak", + "twox-hash", + "wasmi 0.6.2", + "zeroize", +] + +[[package]] +name = "sp-core" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "base58", + "blake2-rfc", + "byteorder", + "dyn-clonable", + "ed25519-dalek", + "futures 0.3.14", + "hash-db", + "hash256-std-hasher", + "hex", + "impl-serde", + "lazy_static", + "libsecp256k1", + "log", + "max-encoded-len", + "merlin", + "num-traits", + "parity-scale-codec", + "parity-util-mem", + "parking_lot 0.11.1", + "primitive-types", + "rand 0.7.3", + "regex", + "schnorrkel", + "secrecy", + "serde", + "sha2 0.9.2", + "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "substrate-bip39", "thiserror", "tiny-bip39", "tiny-keccak", "twox-hash", - "wasmi", + "wasmi 0.9.0", "zeroize", ] @@ -9950,6 +10744,15 @@ dependencies = [ "parking_lot 0.11.1", ] +[[package]] +name = "sp-database" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "kvdb", + "parking_lot 0.11.1", +] + [[package]] name = "sp-debug-derive" version = "3.0.0" @@ -9960,6 +10763,16 @@ dependencies = [ "syn 1.0.68", ] +[[package]] +name = "sp-debug-derive" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.68", +] + [[package]] name = "sp-externalities" version = "0.9.0" @@ -9967,8 +10780,19 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "environmental", "parity-scale-codec", - "sp-std", - "sp-storage", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-externalities" +version = "0.9.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -9980,12 +10804,12 @@ dependencies = [ "log", "parity-scale-codec", "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "sp-runtime", - "sp-std", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -9996,9 +10820,23 @@ dependencies = [ "async-trait", "impl-trait-for-tuples", "parity-scale-codec", - "sp-core", - "sp-runtime", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "thiserror", +] + +[[package]] +name = "sp-inherents" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "async-trait", + "impl-trait-for-tuples", + "parity-scale-codec", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "thiserror", ] @@ -10013,28 +10851,53 @@ dependencies = [ "log", "parity-scale-codec", "parking_lot 0.11.1", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-maybe-compressed-blob", - "sp-runtime-interface", - "sp-state-machine", - "sp-std", - "sp-tracing", - "sp-trie", - "sp-wasm-interface", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing", "tracing-core", ] [[package]] -name = "sp-keyring" +name = "sp-io" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "futures 0.3.14", + "hash-db", + "libsecp256k1", + "log", + "parity-scale-codec", + "parking_lot 0.11.1", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "tracing", + "tracing-core", +] + +[[package]] +name = "sp-keyring" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "lazy_static", - "sp-core", - "sp-runtime", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "strum", ] @@ -10051,8 +10914,24 @@ dependencies = [ "parking_lot 0.11.1", "schnorrkel", "serde", - "sp-core", - "sp-externalities", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-keystore" +version = "0.9.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "async-trait", + "derive_more 0.99.11", + "futures 0.3.14", + "merlin", + "parity-scale-codec", + "parking_lot 0.11.1", + "schnorrkel", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -10064,6 +10943,15 @@ dependencies = [ "zstd", ] +[[package]] +name = "sp-maybe-compressed-blob" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "ruzstd", + "zstd", +] + [[package]] name = "sp-npos-elections" version = "3.0.0" @@ -10071,10 +10959,10 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "parity-scale-codec", "serde", - "sp-arithmetic", - "sp-core", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-npos-elections-compact", - "sp-std", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -10093,9 +10981,19 @@ name = "sp-offchain" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "sp-api", - "sp-core", - "sp-runtime", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-offchain" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -10106,6 +11004,14 @@ dependencies = [ "backtrace", ] +[[package]] +name = "sp-panic-handler" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "backtrace", +] + [[package]] name = "sp-rpc" version = "3.0.0" @@ -10113,7 +11019,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "rustc-hash", "serde", - "sp-core", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "tracing-core", ] @@ -10131,11 +11037,33 @@ dependencies = [ "paste 1.0.4", "rand 0.7.3", "serde", - "sp-application-crypto", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-std", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-runtime" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "max-encoded-len", + "parity-scale-codec", + "parity-util-mem", + "paste 1.0.4", + "rand 0.7.3", + "serde", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -10146,12 +11074,29 @@ dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", "primitive-types", - "sp-externalities", - "sp-runtime-interface-proc-macro", - "sp-std", - "sp-storage", - "sp-tracing", - "sp-wasm-interface", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime-interface-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime-interface-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "static_assertions", ] @@ -10167,6 +11112,18 @@ dependencies = [ "syn 1.0.68", ] +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "Inflector", + "proc-macro-crate 1.0.0", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.68", +] + [[package]] name = "sp-serializer" version = "3.0.0" @@ -10182,11 +11139,24 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "parity-scale-codec", - "sp-api", - "sp-core", - "sp-runtime", - "sp-staking", - "sp-std", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-session" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "parity-scale-codec", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -10195,8 +11165,18 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "parity-scale-codec", - "sp-runtime", - "sp-std", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-staking" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "parity-scale-codec", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -10211,11 +11191,34 @@ dependencies = [ "parking_lot 0.11.1", "rand 0.7.3", "smallvec 1.6.1", - "sp-core", - "sp-externalities", - "sp-panic-handler", - "sp-std", - "sp-trie", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-panic-handler 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "thiserror", + "tracing", + "trie-db", + "trie-root 0.16.0", +] + +[[package]] +name = "sp-state-machine" +version = "0.9.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "hash-db", + "log", + "num-traits", + "parity-scale-codec", + "parking_lot 0.11.1", + "rand 0.7.3", + "smallvec 1.6.1", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-panic-handler 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "thiserror", "tracing", "trie-db", @@ -10227,6 +11230,11 @@ name = "sp-std" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +[[package]] +name = "sp-std" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" + [[package]] name = "sp-storage" version = "3.0.0" @@ -10236,8 +11244,21 @@ dependencies = [ "parity-scale-codec", "ref-cast", "serde", - "sp-debug-derive", - "sp-std", + "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-storage" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -10246,11 +11267,11 @@ version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "log", - "sp-core", - "sp-externalities", - "sp-io", - "sp-runtime-interface", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -10261,9 +11282,9 @@ dependencies = [ "parity-scale-codec", "parity-util-mem", "serde", - "sp-application-crypto", - "sp-core", - "sp-runtime", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -10275,10 +11296,27 @@ dependencies = [ "futures-timer 3.0.2", "log", "parity-scale-codec", - "sp-api", - "sp-inherents", - "sp-runtime", - "sp-std", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "thiserror", + "wasm-timer", +] + +[[package]] +name = "sp-timestamp" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "async-trait", + "futures-timer 3.0.2", + "log", + "parity-scale-codec", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "thiserror", "wasm-timer", ] @@ -10295,7 +11333,25 @@ dependencies = [ "serde", "serde_json", "slog", - "sp-std", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "sp-tracing" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "erased-serde", + "log", + "parity-scale-codec", + "parking_lot 0.10.2", + "serde", + "serde_json", + "slog", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "tracing", "tracing-core", "tracing-subscriber", @@ -10311,9 +11367,25 @@ dependencies = [ "log", "parity-scale-codec", "serde", - "sp-api", - "sp-blockchain", - "sp-runtime", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "thiserror", +] + +[[package]] +name = "sp-transaction-pool" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "derive_more 0.99.11", + "futures 0.3.14", + "log", + "parity-scale-codec", + "serde", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "thiserror", ] @@ -10325,8 +11397,22 @@ dependencies = [ "hash-db", "memory-db", "parity-scale-codec", - "sp-core", - "sp-std", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "trie-db", + "trie-root 0.16.0", +] + +[[package]] +name = "sp-trie" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "hash-db", + "memory-db", + "parity-scale-codec", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "trie-db", "trie-root 0.16.0", ] @@ -10343,6 +11429,18 @@ dependencies = [ "prometheus", ] +[[package]] +name = "sp-utils" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "futures 0.3.14", + "futures-core", + "futures-timer 3.0.2", + "lazy_static", + "prometheus", +] + [[package]] name = "sp-version" version = "3.0.0" @@ -10351,9 +11449,22 @@ dependencies = [ "impl-serde", "parity-scale-codec", "serde", - "sp-runtime", - "sp-std", - "sp-version-proc-macro", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", +] + +[[package]] +name = "sp-version" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "serde", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-version-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", ] [[package]] @@ -10368,6 +11479,18 @@ dependencies = [ "syn 1.0.68", ] +[[package]] +name = "sp-version-proc-macro" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "parity-scale-codec", + "proc-macro-crate 1.0.0", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.68", +] + [[package]] name = "sp-wasm-interface" version = "3.0.0" @@ -10375,8 +11498,19 @@ source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289 dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", - "sp-std", - "wasmi", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "wasmi 0.6.2", +] + +[[package]] +name = "sp-wasm-interface" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "impl-trait-for-tuples", + "parity-scale-codec", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "wasmi 0.9.0", ] [[package]] @@ -10391,6 +11525,124 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "statemine-runtime" +version = "2.0.0" +dependencies = [ + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-utility", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "hex-literal 0.3.1", + "node-primitives", + "pallet-assets 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-collator-selection", + "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "parachain-info", + "parity-scale-codec", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "runtime-common", + "serde", + "smallvec 1.6.1", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", +] + +[[package]] +name = "statemint-runtime" +version = "2.0.0" +dependencies = [ + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-utility", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "hex-literal 0.3.1", + "node-primitives", + "pallet-assets 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-collator-selection", + "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "parachain-info", + "parity-scale-codec", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "runtime-common", + "serde", + "smallvec 1.6.1", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -10539,7 +11791,7 @@ name = "substrate-frame-rpc-system" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ - "frame-system-rpc-runtime-api", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "futures 0.3.14", "jsonrpc-core", "jsonrpc-core-client", @@ -10549,12 +11801,12 @@ dependencies = [ "sc-client-api", "sc-rpc-api", "serde", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-transaction-pool", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -10571,6 +11823,20 @@ dependencies = [ "tokio 0.2.24", ] +[[package]] +name = "substrate-prometheus-endpoint" +version = "0.9.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "async-std", + "derive_more 0.99.11", + "futures-util", + "hyper 0.13.9", + "log", + "prometheus", + "tokio 0.2.24", +] + [[package]] name = "substrate-test-client" version = "2.0.1" @@ -10591,13 +11857,13 @@ dependencies = [ "sc-service", "serde", "serde_json", - "sp-blockchain", - "sp-consensus", - "sp-core", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-keystore", - "sp-runtime", - "sp-state-machine", + "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", ] [[package]] @@ -10606,38 +11872,38 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" dependencies = [ "cfg-if 1.0.0", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "log", "memory-db", "pallet-babe", - "pallet-timestamp", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", "parity-util-mem", "sc-service", "serde", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-consensus-aura", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-core", - "sp-externalities", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-finality-grandpa", - "sp-inherents", - "sp-io", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-keyring", - "sp-offchain", - "sp-runtime", - "sp-runtime-interface", - "sp-session", - "sp-state-machine", - "sp-std", - "sp-transaction-pool", - "sp-trie", - "sp-version", - "substrate-wasm-builder 4.0.0", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "trie-db", ] @@ -10653,11 +11919,11 @@ dependencies = [ "sc-consensus", "sc-light", "sc-service", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "substrate-test-client", "substrate-test-runtime", ] @@ -10707,7 +11973,23 @@ dependencies = [ "atty", "build-helper", "cargo_metadata 0.13.1", - "sp-maybe-compressed-blob", + "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "tempfile", + "toml", + "walkdir", + "wasm-gc-api", +] + +[[package]] +name = "substrate-wasm-builder" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +dependencies = [ + "ansi_term 0.12.1", + "atty", + "build-helper", + "cargo_metadata 0.13.1", + "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", "tempfile", "toml", "walkdir", @@ -11389,12 +12671,12 @@ dependencies = [ "sc-client-api", "sc-executor", "sc-service", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-externalities", - "sp-runtime", - "sp-state-machine", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", "structopt", ] @@ -11754,7 +13036,22 @@ dependencies = [ "num-rational", "num-traits", "parity-wasm 0.41.0", - "wasmi-validation", + "wasmi-validation 0.3.0", +] + +[[package]] +name = "wasmi" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ee05bba3d1d994652079893941a2ef9324d2b58a63c31b40678fb7eddd7a5a" +dependencies = [ + "downcast-rs", + "libc", + "memory_units", + "num-rational", + "num-traits", + "parity-wasm 0.42.2", + "wasmi-validation 0.4.0", ] [[package]] @@ -11766,6 +13063,15 @@ dependencies = [ "parity-wasm 0.41.0", ] +[[package]] +name = "wasmi-validation" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb8e860796d8be48efef530b60eebf84e74a88bce107374fffb0da97d504b8" +dependencies = [ + "parity-wasm 0.42.2", +] + [[package]] name = "wasmparser" version = "0.76.0" @@ -12046,16 +13352,16 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a59 dependencies = [ "beefy-primitives", "bitvec", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "frame-try-runtime", "log", "pallet-authority-discovery", - "pallet-authorship", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-babe", - "pallet-balances", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-collective", "pallet-democracy", "pallet-election-provider-multi-phase", @@ -12066,54 +13372,114 @@ dependencies = [ "pallet-indices", "pallet-membership", "pallet-mmr-primitives", - "pallet-multisig", + "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-nicks", "pallet-offences", - "pallet-proxy", - "pallet-randomness-collective-flip", + "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-recovery", "pallet-scheduler", - "pallet-session", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-society", "pallet-staking", "pallet-staking-reward-curve", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", + "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-treasury", - "pallet-utility", + "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "pallet-vesting", - "pallet-xcm", + "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=master)", "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", "rustc-hex", "serde", "serde_derive", "smallvec 1.6.1", - "sp-api", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-authority-discovery", - "sp-block-builder", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-consensus-babe", - "sp-core", - "sp-inherents", - "sp-io", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "static_assertions", "substrate-wasm-builder 3.0.0", - "xcm", - "xcm-builder", - "xcm-executor", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", +] + +[[package]] +name = "westmint-runtime" +version = "2.0.0" +dependencies = [ + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-utility", + "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "hex-literal 0.3.1", + "node-primitives", + "pallet-assets 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-collator-selection", + "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "parachain-info", + "parity-scale-codec", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "runtime-common", + "serde", + "smallvec 1.6.1", + "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", ] [[package]] @@ -12230,23 +13596,52 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "xcm" +version = "0.9.3" +source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +dependencies = [ + "derivative", + "impl-trait-for-tuples", + "parity-scale-codec", +] + [[package]] name = "xcm-builder" version = "0.9.3" source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" dependencies = [ - "frame-support", - "frame-system", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "impl-trait-for-tuples", - "pallet-transaction-payment", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "parity-scale-codec", - "polkadot-parachain", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std", - "xcm", - "xcm-executor", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", +] + +[[package]] +name = "xcm-builder" +version = "0.9.3" +source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "impl-trait-for-tuples", + "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "parity-scale-codec", + "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", ] [[package]] @@ -12254,16 +13649,33 @@ name = "xcm-executor" version = "0.9.3" source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" dependencies = [ - "frame-support", + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", +] + +[[package]] +name = "xcm-executor" +version = "0.9.3" +source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +dependencies = [ + "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", "impl-trait-for-tuples", "log", "parity-scale-codec", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "xcm", + "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index b20ce59c277..6c577eb54eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ members = [ "client/pov-recovery", "client/service", "pallets/aura-ext", + "pallets/collator-selection", "pallets/dmp-queue", "pallets/parachain-system", "pallets/xcm", @@ -20,6 +21,10 @@ members = [ "polkadot-parachains/pallets/ping", "polkadot-parachains/rococo-runtime", "polkadot-parachains/shell-runtime", + "polkadot-parachains/statemint-common", + "polkadot-parachains/statemint", + "polkadot-parachains/statemine", + "polkadot-parachains/westmint", "test/runtime", "test/runtime-upgrade", "test/client", diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml new file mode 100644 index 00000000000..15d98e3da74 --- /dev/null +++ b/pallets/collator-selection/Cargo.toml @@ -0,0 +1,57 @@ +[package] +authors = ['Anonymous'] +description = 'parachain staking pallet.' +edition = '2018' +homepage = 'https://substrate.dev' +license = 'Apache-2.0' +name = 'pallet-collator-selection' +readme = 'README.md' +repository = 'https://github.com/paritytech/substrate/' +version = '3.0.0' + +[package.metadata.docs.rs] +targets = ['x86_64-unknown-linux-gnu'] + +[dependencies] +log = { version = "0.4.0", default-features = false } +codec = { default-features = false, features = ['derive'], package = 'parity-scale-codec', version = '2.0.0' } +serde = { version = "1.0.119", default-features = false } +sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +sp-staking = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +frame-support = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +frame-system = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +pallet-authorship = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +pallet-session = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } + +frame-benchmarking = { default-features = false, optional = true, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } + +[dev-dependencies] +sp-core = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +sp-io = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +sp-tracing = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +sp-runtime = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +pallet-timestamp = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +sp-consensus-aura = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '0.9.0' } +pallet-balances = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +pallet-aura = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } + +[features] +default = ['std'] +runtime-benchmarks = [ + 'frame-benchmarking', + 'frame-support/runtime-benchmarks', + 'frame-system/runtime-benchmarks', +] +std = [ + 'codec/std', + 'log/std', + 'sp-runtime/std', + 'sp-staking/std', + 'sp-std/std', + 'frame-support/std', + 'frame-system/std', + 'frame-benchmarking/std', + 'pallet-authorship/std', + 'pallet-session/std', +] diff --git a/pallets/collator-selection/README.md b/pallets/collator-selection/README.md new file mode 100644 index 00000000000..9718db58b37 --- /dev/null +++ b/pallets/collator-selection/README.md @@ -0,0 +1 @@ +License: Apache-2.0 \ No newline at end of file diff --git a/pallets/collator-selection/src/benchmarking.rs b/pallets/collator-selection/src/benchmarking.rs new file mode 100644 index 00000000000..c7570905a0e --- /dev/null +++ b/pallets/collator-selection/src/benchmarking.rs @@ -0,0 +1,187 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Benchmarking setup for pallet-collator-selection + +use super::*; + +#[allow(unused)] +use crate::Pallet as CollatorSelection; +use sp_std::prelude::*; +use frame_benchmarking::{benchmarks, impl_benchmark_test_suite, whitelisted_caller, account}; +use frame_system::{RawOrigin, EventRecord}; +use frame_support::{ + assert_ok, + traits::{Currency, Get, EnsureOrigin}, +}; +use pallet_authorship::EventHandler; +use pallet_session::SessionManager; + +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + +const SEED: u32 = 0; + +// TODO: remove if this is given in substrate commit. +macro_rules! whitelist { + ($acc:ident) => { + frame_benchmarking::benchmarking::add_to_whitelist( + frame_system::Account::::hashed_key_for(&$acc).into() + ); + }; +} + +fn assert_last_event(generic_event: ::Event) { + let events = frame_system::Pallet::::events(); + let system_event: ::Event = generic_event.into(); + // compare to the last event record + let EventRecord { event, .. } = &events[events.len() - 1]; + assert_eq!(event, &system_event); +} + +fn register_candidates(count: u32) { + let candidates = (0..count).map(|c| account("candidate", c, SEED)).collect::>(); + assert!(>::get() > 0u32.into(), "Bond cannot be zero!"); + for who in candidates { + T::Currency::make_free_balance_be(&who, >::get() * 2u32.into()); + >::register_as_candidate(RawOrigin::Signed(who).into()).unwrap(); + } +} + +benchmarks! { + where_clause { where T: pallet_authorship::Config } + + set_invulnerables { + let b in 1 .. T::MaxInvulnerables::get(); + let new_invulnerables = (0..b).map(|c| account("candidate", c, SEED)).collect::>(); + let origin = T::UpdateOrigin::successful_origin(); + }: { + assert_ok!( + >::set_invulnerables(origin, new_invulnerables.clone()) + ); + } + verify { + assert_last_event::(Event::NewInvulnerables(new_invulnerables).into()); + } + + set_desired_candidates { + let max: u32 = 999; + let origin = T::UpdateOrigin::successful_origin(); + }: { + assert_ok!( + >::set_desired_candidates(origin, max.clone()) + ); + } + verify { + assert_last_event::(Event::NewDesiredCandidates(max).into()); + } + + set_candidacy_bond { + let bond: BalanceOf = T::Currency::minimum_balance() * 10u32.into(); + let origin = T::UpdateOrigin::successful_origin(); + }: { + assert_ok!( + >::set_candidacy_bond(origin, bond.clone()) + ); + } + verify { + assert_last_event::(Event::NewCandidacyBond(bond).into()); + } + + // worse case is when we have all the max-candidate slots filled except one, and we fill that + // one. + register_as_candidate { + let c in 1 .. T::MaxCandidates::get(); + + >::put(T::Currency::minimum_balance()); + >::put(c + 1); + register_candidates::(c); + + let caller: T::AccountId = whitelisted_caller(); + let bond: BalanceOf = T::Currency::minimum_balance() * 2u32.into(); + T::Currency::make_free_balance_be(&caller, bond.clone()); + + }: _(RawOrigin::Signed(caller.clone())) + verify { + assert_last_event::(Event::CandidateAdded(caller, bond / 2u32.into()).into()); + } + + // worse case is the last candidate leaving. + leave_intent { + let c in 1 .. T::MaxCandidates::get(); + >::put(T::Currency::minimum_balance()); + >::put(c); + register_candidates::(c); + + let leaving = >::get().last().unwrap().who.clone(); + whitelist!(leaving); + }: _(RawOrigin::Signed(leaving.clone())) + verify { + assert_last_event::(Event::CandidateRemoved(leaving).into()); + } + + // worse case is paying a non-existing candidate account. + note_author { + let c in 1 .. T::MaxCandidates::get(); + >::put(T::Currency::minimum_balance()); + >::put(c); + register_candidates::(c); + + T::Currency::make_free_balance_be( + &>::account_id(), + T::Currency::minimum_balance() * 2u32.into(), + ); + let author = account("author", 0, SEED); + assert!(T::Currency::free_balance(&author) == 0u32.into()); + }: { + as EventHandler<_, _>>::note_author(author.clone()) + } verify { + assert!(T::Currency::free_balance(&author) > 0u32.into()); + } + + // worse case is on new session. + // TODO review this benchmark + new_session { + let r in 1 .. T::MaxCandidates::get(); + let c in 1 .. T::MaxCandidates::get(); + + >::put(T::Currency::minimum_balance()); + >::put(c); + frame_system::Pallet::::set_block_number(0u32.into()); + register_candidates::(c); + + let new_block: T::BlockNumber = 20u32.into(); + + let mut candidates = >::get(); + let non_removals = if c > r { c - r } else { 0 }; + + for i in 0..non_removals { + candidates[i as usize].last_block = new_block; + } + >::put(candidates.clone()); + + let pre_length = >::get().len(); + frame_system::Pallet::::set_block_number(new_block.clone()); + + assert!(>::get().len() == c as usize); + + }: { + as SessionManager<_>>::new_session(0) + } verify { + assert!(>::get().len() <= pre_length); + } +} + +impl_benchmark_test_suite!(CollatorSelection, crate::mock::new_test_ext(), crate::mock::Test,); diff --git a/pallets/collator-selection/src/lib.rs b/pallets/collator-selection/src/lib.rs new file mode 100644 index 00000000000..c7c9f2741cd --- /dev/null +++ b/pallets/collator-selection/src/lib.rs @@ -0,0 +1,434 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Collator Selection pallet. +//! +//! A pallet to manage collators in a parachain. +//! +//! ## Overview +//! +//! The Collator Selection pallet manages the collators of a parachain. **Collation is _not_ a +//! secure activity** and this pallet does not implement any game-theoretic mechanisms to meet BFT +//! safety assumptions of the chosen set. +//! +//! ## Terminology +//! +//! - Collator: A parachain block producer. +//! - Bond: An amount of `Balance` _reserved_ for candidate registration. +//! - Invulnerable: An account guaranteed to be in the collator set. +//! +//! ## Implementation +//! +//! The final [`Collators`] are aggregated from two individual lists: +//! +//! 1. [`Invulnerables`]: a set of collators appointed by governance. These accounts will always be +//! collators. +//! 2. [`Candidates`]: these are *candidates to the collation task* and may or may not be elected as +//! a final collator. +//! +//! The current implementation resolves congestion of [`Candidates`] in a first-come-first-serve +//! manner. +//! +//! ### Rewards +//! +//! The Collator Selection pallet maintains an on-chain account (the "Pot"). In each block, the +//! collator who authored it receives: +//! +//! - Half the value of the Pot. +//! - Half the value of the transaction fees within the block. The other half of the transaction +//! fees are deposited into the Pot. +//! +//! To initiate rewards an ED needs to be transferred to the pot address. +//! +//! Note: Eventually the Pot distribution may be modified as discussed in +//! [this issue](https://github.com/paritytech/statemint/issues/21#issuecomment-810481073). + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use pallet::*; + +#[cfg(test)] +mod mock; + +#[cfg(test)] +mod tests; + +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; +pub mod weights; + +#[frame_support::pallet] +pub mod pallet { + use frame_support::{ + dispatch::DispatchResultWithPostInfo, + pallet_prelude::*, + inherent::Vec, + traits::{ + Currency, ReservableCurrency, EnsureOrigin, ExistenceRequirement::KeepAlive, + }, + PalletId, + }; + use frame_system::pallet_prelude::*; + use frame_system::Config as SystemConfig; + use frame_support::{ + sp_runtime::{ + RuntimeDebug, + traits::{AccountIdConversion, CheckedSub, Zero}, + }, + weights::DispatchClass, + }; + use core::ops::Div; + use pallet_session::SessionManager; + use sp_staking::SessionIndex; + pub use crate::weights::WeightInfo; + + type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + + /// A convertor from collators id. Since this pallet does not have stash/controller, this is + /// just identity. + pub struct IdentityCollator; + impl sp_runtime::traits::Convert> for IdentityCollator { + fn convert(t: T) -> Option { + Some(t) + } + } + + /// Configure the pallet by specifying the parameters and types on which it depends. + #[pallet::config] + pub trait Config: frame_system::Config { + /// Overarching event type. + type Event: From> + IsType<::Event>; + + /// The currency mechanism. + type Currency: ReservableCurrency; + + /// Origin that can dictate updating parameters of this pallet. + type UpdateOrigin: EnsureOrigin; + + /// Account Identifier from which the internal Pot is generated. + type PotId: Get; + + /// Maximum number of candidates that we should have. This is used for benchmarking and is not + /// enforced. + /// + /// This does not take into account the invulnerables. + type MaxCandidates: Get; + + /// Maximum number of invulnerables. + /// + /// Used only for benchmarking. + type MaxInvulnerables: Get; + + // Will be kicked if block is not produced in threshold. + type KickThreshold: Get; + + /// The weight information of this pallet. + type WeightInfo: WeightInfo; + } + + /// Basic information about a collation candidate. + #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] + pub struct CandidateInfo { + /// Account identifier. + pub who: AccountId, + /// Reserved deposit. + pub deposit: Balance, + /// Last block at which they authored a block. + pub last_block: BlockNumber, + } + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + pub struct Pallet(_); + + /// The invulnerable, fixed collators. + #[pallet::storage] + #[pallet::getter(fn invulnerables)] + pub type Invulnerables = StorageValue<_, Vec, ValueQuery>; + + /// The (community, limited) collation candidates. + #[pallet::storage] + #[pallet::getter(fn candidates)] + pub type Candidates = StorageValue< + _, + Vec, T::BlockNumber>>, + ValueQuery, + >; + + /// Desired number of candidates. + /// + /// This should ideally always be less than [`Config::MaxCandidates`] for weights to be correct. + #[pallet::storage] + #[pallet::getter(fn desired_candidates)] + pub type DesiredCandidates = StorageValue<_, u32, ValueQuery>; + + /// Fixed deposit bond for each candidate. + #[pallet::storage] + #[pallet::getter(fn candidacy_bond)] + pub type CandidacyBond = StorageValue<_, BalanceOf, ValueQuery>; + + + #[pallet::genesis_config] + pub struct GenesisConfig { + pub invulnerables: Vec, + pub candidacy_bond: BalanceOf, + pub desired_candidates: u32, + } + + #[cfg(feature = "std")] + impl Default for GenesisConfig { + fn default() -> Self { + Self { + invulnerables: Default::default(), + candidacy_bond: Default::default(), + desired_candidates: Default::default(), + } + } + } + + #[pallet::genesis_build] + impl GenesisBuild for GenesisConfig { + fn build(&self) { + + let duplicate_invulnerables = self.invulnerables.iter().collect::>(); + assert!(duplicate_invulnerables.len() == self.invulnerables.len(), "duplicate invulnerables in genesis."); + + assert!( + T::MaxInvulnerables::get() >= (self.invulnerables.len() as u32), + "genesis invulnerables are more than T::MaxInvulnerables", + ); + assert!( + T::MaxCandidates::get() >= self.desired_candidates, + "genesis desired_candidates are more than T::MaxCandidates", + ); + + >::put(&self.desired_candidates); + >::put(&self.candidacy_bond); + >::put(&self.invulnerables); + } + } + + #[pallet::event] + #[pallet::metadata(T::AccountId = "AccountId", BalanceOf = "Balance")] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + NewInvulnerables(Vec), + NewDesiredCandidates(u32), + NewCandidacyBond(BalanceOf), + CandidateAdded(T::AccountId, BalanceOf), + CandidateRemoved(T::AccountId), + } + + // Errors inform users that something went wrong. + #[pallet::error] + pub enum Error { + TooManyCandidates, + Unknown, + Permission, + AlreadyCandidate, + NotCandidate, + AlreadyInvulnerable, + InvalidProof, + } + + #[pallet::hooks] + impl Hooks> for Pallet {} + + #[pallet::call] + impl Pallet { + #[pallet::weight(T::WeightInfo::set_invulnerables(new.len() as u32))] + pub fn set_invulnerables( + origin: OriginFor, + new: Vec, + ) -> DispatchResultWithPostInfo { + T::UpdateOrigin::ensure_origin(origin)?; + // we trust origin calls, this is just a for more accurate benchmarking + if (new.len() as u32) > T::MaxInvulnerables::get() { + log::warn!( + "invulnerables > T::MaxInvulnerables; you might need to run benchmarks again" + ); + } + >::put(&new); + Self::deposit_event(Event::NewInvulnerables(new)); + Ok(().into()) + } + + #[pallet::weight(T::WeightInfo::set_desired_candidates())] + pub fn set_desired_candidates(origin: OriginFor, max: u32) -> DispatchResultWithPostInfo { + T::UpdateOrigin::ensure_origin(origin)?; + // we trust origin calls, this is just a for more accurate benchmarking + if max > T::MaxCandidates::get() { + log::warn!( + "max > T::MaxCandidates; you might need to run benchmarks again" + ); + } + >::put(&max); + Self::deposit_event(Event::NewDesiredCandidates(max)); + Ok(().into()) + } + + #[pallet::weight(T::WeightInfo::set_candidacy_bond())] + pub fn set_candidacy_bond(origin: OriginFor, bond: BalanceOf) -> DispatchResultWithPostInfo { + T::UpdateOrigin::ensure_origin(origin)?; + >::put(&bond); + Self::deposit_event(Event::NewCandidacyBond(bond)); + Ok(().into()) + } + + #[pallet::weight(T::WeightInfo::register_as_candidate(T::MaxCandidates::get()))] + pub fn register_as_candidate(origin: OriginFor) -> DispatchResultWithPostInfo { + let who = ensure_signed(origin)?; + + // ensure we are below limit. + let length = >::decode_len().unwrap_or_default(); + ensure!((length as u32) < Self::desired_candidates(), Error::::TooManyCandidates); + ensure!(!Self::invulnerables().contains(&who), Error::::AlreadyInvulnerable); + + let deposit = Self::candidacy_bond(); + let incoming = CandidateInfo { who: who.clone(), deposit, last_block: frame_system::Pallet::::block_number() }; + + let current_count = + >::try_mutate(|candidates| -> Result { + if candidates.into_iter().any(|candidate| candidate.who == who) { + Err(Error::::AlreadyCandidate)? + } else { + T::Currency::reserve(&who, deposit)?; + candidates.push(incoming); + Ok(candidates.len()) + } + })?; + + Self::deposit_event(Event::CandidateAdded(who, deposit)); + Ok(Some(T::WeightInfo::register_as_candidate(current_count as u32)).into()) + } + + #[pallet::weight(T::WeightInfo::leave_intent(T::MaxCandidates::get()))] + pub fn leave_intent(origin: OriginFor) -> DispatchResultWithPostInfo { + let who = ensure_signed(origin)?; + + let current_count = Self::try_remove_candidate(&who)?; + + Ok(Some(T::WeightInfo::leave_intent(current_count as u32)).into()) + } + } + + impl Pallet { + /// Get a unique, inaccessible account id from the `PotId`. + pub fn account_id() -> T::AccountId { + T::PotId::get().into_account() + } + /// Removes a candidate if they exist and sends them back their deposit + fn try_remove_candidate(who: &T::AccountId) -> Result { + let current_count = >::try_mutate(|candidates| -> Result { + let index = candidates.iter().position(|candidate| candidate.who == *who).ok_or(Error::::NotCandidate)?; + T::Currency::unreserve(&who, candidates[index].deposit); + candidates.remove(index); + Ok(candidates.len()) + }); + Self::deposit_event(Event::CandidateRemoved(who.clone())); + current_count + } + + /// Assemble the current set of candidates and invulnerables into the next collator set. + /// + /// This is done on the fly, as frequent as we are told to do so, as the session manager. + pub fn assemble_collators(candidates: Vec) -> Vec { + let mut collators = Self::invulnerables(); + collators.extend( + candidates.into_iter().collect::>(), + ); + collators + } + /// Kicks out and candidates that did not produce a block in the kick threshold. + pub fn kick_stale_candidates(candidates: Vec, T::BlockNumber>>) -> Vec { + let now = frame_system::Pallet::::block_number(); + let kick_threshold = T::KickThreshold::get(); + let new_candidates = candidates.into_iter().filter_map(|c| { + let since_last = now - c.last_block; + if since_last < kick_threshold { + Some(c.who) + } else { + let outcome = Self::try_remove_candidate(&c.who); + if let Err(why) = outcome { + log::warn!("Failed to remove candidate {:?}", why); + debug_assert!(false, "failed to remove candidate {:?}", why); + } + None + } + }).collect::>(); + new_candidates + } + } + + /// Keep track of number of authored blocks per authority, uncles are counted as well since + /// they're a valid proof of being online. + impl + pallet_authorship::EventHandler for Pallet + { + fn note_author(author: T::AccountId) { + let pot = Self::account_id(); + // assumes an ED will be sent to pot. + let reward = T::Currency::free_balance(&pot).checked_sub(&T::Currency::minimum_balance()).unwrap_or_else(Zero::zero).div(2u32.into()); + // `reward` is half of pot account minus ED, this should never fail. + let _success = T::Currency::transfer(&pot, &author, reward, KeepAlive); + debug_assert!(_success.is_ok()); + let candidates_len = >::mutate(|candidates| -> usize { + if let Some(found) = candidates.iter_mut().find(|candidate| candidate.who == author) { + found.last_block = frame_system::Pallet::::block_number(); + } + candidates.len() + }); + frame_system::Pallet::::register_extra_weight_unchecked( + T::WeightInfo::note_author(candidates_len as u32), + DispatchClass::Mandatory, + ); + } + + fn note_uncle(_author: T::AccountId, _age: T::BlockNumber) { + //TODO can we ignore this? + } + } + + /// Play the role of the session manager. + impl SessionManager for Pallet { + fn new_session(index: SessionIndex) -> Option> { + log::info!( + "assembling new collators for new session {} at #{:?}", + index, + >::block_number(), + ); + + let candidates = Self::candidates(); + let candidates_len_before = candidates.len(); + let active_candidates = Self::kick_stale_candidates(candidates); + let active_candidates_len = active_candidates.len(); + let result = Self::assemble_collators(active_candidates); + let removed = candidates_len_before - active_candidates_len; + + frame_system::Pallet::::register_extra_weight_unchecked( + T::WeightInfo::new_session(candidates_len_before as u32, removed as u32), + DispatchClass::Mandatory, + ); + Some(result) + } + fn start_session(_: SessionIndex) { + // we don't care. + } + fn end_session(_: SessionIndex) { + // we don't care. + } + } +} diff --git a/pallets/collator-selection/src/mock.rs b/pallets/collator-selection/src/mock.rs new file mode 100644 index 00000000000..543d73985e9 --- /dev/null +++ b/pallets/collator-selection/src/mock.rs @@ -0,0 +1,241 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::*; +use crate as collator_selection; +use sp_core::H256; +use frame_support::{ + parameter_types, ord_parameter_types, + traits::{FindAuthor, GenesisBuild}, + PalletId +}; +use sp_runtime::{ + RuntimeAppPublic, + traits::{BlakeTwo256, IdentityLookup, OpaqueKeys}, + testing::{Header, UintAuthorityId}, +}; +use frame_system::{EnsureSignedBy}; +use frame_system as system; + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +// Configure a mock runtime to test the pallet. +frame_support::construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, + Session: pallet_session::{Pallet, Call, Storage, Event, Config}, + Aura: pallet_aura::{Pallet, Call, Storage, Config}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + CollatorSelection: collator_selection::{Pallet, Call, Storage, Event}, + Authorship: pallet_authorship::{Pallet, Call, Storage, Inherent}, + } +); + +parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const SS58Prefix: u8 = 42; +} + +impl system::Config for Test { + type BaseCallFilter = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); + type Origin = Origin; + type Call = Call; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = Event; + type BlockHashCount = BlockHashCount; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = SS58Prefix; + type OnSetCode = (); +} + +parameter_types! { + pub const ExistentialDeposit: u64 = 5; +} + +impl pallet_balances::Config for Test { + type Balance = u64; + type Event = Event; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxLocks = (); +} + +pub struct Author4; +impl FindAuthor for Author4 { + fn find_author<'a, I>(_digests: I) -> Option + where I: 'a + IntoIterator, + { + Some(4) + } +} + +impl pallet_authorship::Config for Test { + type FindAuthor = Author4; + type UncleGenerations = (); + type FilterUncle = (); + type EventHandler = CollatorSelection; +} + +parameter_types! { + pub const MinimumPeriod: u64 = 1; +} + +impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = Aura; + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); +} + +impl pallet_aura::Config for Test { + type AuthorityId = sp_consensus_aura::sr25519::AuthorityId; +} + +sp_runtime::impl_opaque_keys! { + pub struct MockSessionKeys { + // a key for aura authoring + pub aura: UintAuthorityId, + } +} + +impl From for MockSessionKeys { + fn from(aura: sp_runtime::testing::UintAuthorityId) -> Self { + Self { aura } + } +} + +parameter_types! { + pub static SessionHandlerCollators: Vec = vec![]; + pub static SessionChangeBlock: u64 = 0; +} + +pub struct TestSessionHandler; +impl pallet_session::SessionHandler for TestSessionHandler { + const KEY_TYPE_IDS: &'static [sp_runtime::KeyTypeId] = &[UintAuthorityId::ID]; + fn on_genesis_session(keys: &[(u64, Ks)]) { + SessionHandlerCollators::set(keys.into_iter().map(|(a, _)| *a).collect::>()) + } + fn on_new_session(_: bool, keys: &[(u64, Ks)], _: &[(u64, Ks)]) { + SessionChangeBlock::set(System::block_number()); + dbg!(keys.len()); + SessionHandlerCollators::set(keys.into_iter().map(|(a, _)| *a).collect::>()) + } + fn on_before_session_ending() {} + fn on_disabled(_: usize) {} +} + +parameter_types! { + pub const Offset: u64 = 0; + pub const Period: u64 = 10; +} + +impl pallet_session::Config for Test { + type Event = Event; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions; + type NextSessionRotation = pallet_session::PeriodicSessions; + type SessionManager = CollatorSelection; + type SessionHandler = TestSessionHandler; + type Keys = MockSessionKeys; + type DisabledValidatorsThreshold = (); + type WeightInfo = (); +} + +ord_parameter_types! { + pub const RootAccount: u64 = 777; +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const MaxCandidates: u32 = 20; + pub const MaxInvulnerables: u32 = 20; +} + +impl Config for Test { + type Event = Event; + type Currency = Balances; + type UpdateOrigin = EnsureSignedBy; + type PotId = PotId; + type MaxCandidates = MaxCandidates; + type MaxInvulnerables = MaxInvulnerables; + type KickThreshold = Period; + type WeightInfo = (); +} + +pub fn new_test_ext() -> sp_io::TestExternalities { + sp_tracing::try_init_simple(); + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + let invulnerables = vec![1, 2]; + let keys = invulnerables.iter().map(|i| + ( + *i, + *i, + MockSessionKeys { aura: UintAuthorityId(*i) }, + ) + ).collect::>(); + + let balances = pallet_balances::GenesisConfig:: { + balances: vec![ + (1, 100), + (2, 100), + (3, 100), + (4, 100), + (5, 100), + ], + }; + let collator_selection = collator_selection::GenesisConfig:: { + desired_candidates: 2, + candidacy_bond: 10, + invulnerables, + }; + let session = pallet_session::GenesisConfig:: { keys }; + balances.assimilate_storage(&mut t).unwrap(); + // collator selection must be initialized before session. + collator_selection.assimilate_storage(&mut t).unwrap(); + session.assimilate_storage(&mut t).unwrap(); + + t.into() +} + +pub fn initialize_to_block(n: u64) { + for i in System::block_number()+1..=n { + System::set_block_number(i); + >::on_initialize(i); + } +} diff --git a/pallets/collator-selection/src/tests.rs b/pallets/collator-selection/src/tests.rs new file mode 100644 index 00000000000..a1f00718cfc --- /dev/null +++ b/pallets/collator-selection/src/tests.rs @@ -0,0 +1,331 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +use crate as collator_selection; +use crate::{mock::*, Error, CandidateInfo}; +use frame_support::{ + assert_noop, assert_ok, + traits::{OnInitialize, Currency, GenesisBuild}, +}; +use sp_runtime::traits::BadOrigin; +use pallet_balances::Error as BalancesError; + +#[test] +fn basic_setup_works() { + new_test_ext().execute_with(|| { + assert_eq!(CollatorSelection::desired_candidates(), 2); + assert_eq!(CollatorSelection::candidacy_bond(), 10); + + assert!(CollatorSelection::candidates().is_empty()); + assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + }); +} + +#[test] +fn it_should_set_invulnerables() { + new_test_ext().execute_with(|| { + let new_set = vec![1, 2, 3, 4]; + assert_ok!(CollatorSelection::set_invulnerables( + Origin::signed(RootAccount::get()), + new_set.clone() + )); + assert_eq!(CollatorSelection::invulnerables(), new_set); + + // cannot set with non-root. + assert_noop!( + CollatorSelection::set_invulnerables(Origin::signed(1), new_set.clone()), + BadOrigin + ); + }); +} + +#[test] +fn set_desired_candidates_works() { + new_test_ext().execute_with(|| { + // given + assert_eq!(CollatorSelection::desired_candidates(), 2); + + // can set + assert_ok!(CollatorSelection::set_desired_candidates(Origin::signed(RootAccount::get()), 7)); + assert_eq!(CollatorSelection::desired_candidates(), 7); + + // rejects bad origin + assert_noop!(CollatorSelection::set_desired_candidates(Origin::signed(1), 8), BadOrigin); + }); +} + +#[test] +fn set_candidacy_bond() { + new_test_ext().execute_with(|| { + // given + assert_eq!(CollatorSelection::candidacy_bond(), 10); + + // can set + assert_ok!(CollatorSelection::set_candidacy_bond(Origin::signed(RootAccount::get()), 7)); + assert_eq!(CollatorSelection::candidacy_bond(), 7); + + // rejects bad origin. + assert_noop!(CollatorSelection::set_candidacy_bond(Origin::signed(1), 8), BadOrigin); + }); +} + +#[test] +fn cannot_register_candidate_if_too_many() { + new_test_ext().execute_with(|| { + // reset desired candidates: + >::put(0); + + // can't accept anyone anymore. + assert_noop!( + CollatorSelection::register_as_candidate(Origin::signed(3)), + Error::::TooManyCandidates, + ); + + // reset desired candidates: + >::put(1); + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(4))); + + // but no more + assert_noop!( + CollatorSelection::register_as_candidate(Origin::signed(5)), + Error::::TooManyCandidates, + ); + }) +} + +#[test] +fn cannot_register_as_candidate_if_invulnerable() { + new_test_ext().execute_with(|| { + assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + + // can't 1 because it is invulnerable. + assert_noop!( + CollatorSelection::register_as_candidate(Origin::signed(1)), + Error::::AlreadyInvulnerable, + ); + }) +} + +#[test] +fn cannot_register_dupe_candidate() { + new_test_ext().execute_with(|| { + // can add 3 as candidate + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(3))); + let addition = CandidateInfo { who: 3, deposit: 10, last_block: 0 }; + assert_eq!(CollatorSelection::candidates(), vec![addition]); + assert_eq!(Balances::free_balance(3), 90); + + // but no more + assert_noop!( + CollatorSelection::register_as_candidate(Origin::signed(3)), + Error::::AlreadyCandidate, + ); + }) +} + +#[test] +fn cannot_register_as_candidate_if_poor() { + new_test_ext().execute_with(|| { + assert_eq!(Balances::free_balance(&3), 100); + assert_eq!(Balances::free_balance(&33), 0); + + // works + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(3))); + + // poor + assert_noop!( + CollatorSelection::register_as_candidate(Origin::signed(33)), + BalancesError::::InsufficientBalance, + ); + }); +} + +#[test] +fn register_as_candidate_works() { + new_test_ext().execute_with(|| { + // given + assert_eq!(CollatorSelection::desired_candidates(), 2); + assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(CollatorSelection::candidates(), vec![]); + assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + + // take two endowed, non-invulnerables accounts. + assert_eq!(Balances::free_balance(&3), 100); + assert_eq!(Balances::free_balance(&4), 100); + + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(3))); + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(4))); + + assert_eq!(Balances::free_balance(&3), 90); + assert_eq!(Balances::free_balance(&4), 90); + + assert_eq!(CollatorSelection::candidates().len(), 2); + }); +} + +#[test] +fn leave_intent() { + new_test_ext().execute_with(|| { + // register a candidate. + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(3))); + assert_eq!(Balances::free_balance(3), 90); + + // cannot leave if not candidate. + assert_noop!( + CollatorSelection::leave_intent(Origin::signed(4)), + Error::::NotCandidate + ); + + // bond is returned + assert_ok!(CollatorSelection::leave_intent(Origin::signed(3))); + assert_eq!(Balances::free_balance(3), 100); + }); +} + +#[test] +fn authorship_event_handler() { + new_test_ext().execute_with(|| { + // put 100 in the pot + 5 for ED + Balances::make_free_balance_be(&CollatorSelection::account_id(), 105); + + // 4 is the default author. + assert_eq!(Balances::free_balance(4), 100); + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(4))); + // triggers `note_author` + Authorship::on_initialize(1); + + + let collator = CandidateInfo { + who: 4, + deposit: 10, + last_block: 0 + }; + + assert_eq!(CollatorSelection::candidates(), vec![collator]); + + // half of the pot goes to the collator who's the author (4 in tests). + assert_eq!(Balances::free_balance(4), 140); + // half + ED stays. + assert_eq!(Balances::free_balance(CollatorSelection::account_id()), 55); + }); +} + +#[test] +fn fees_edgecases() { + new_test_ext().execute_with(|| { + // Nothing panics, no reward when no ED in balance + Authorship::on_initialize(1); + // put some money into the pot at ED + Balances::make_free_balance_be(&CollatorSelection::account_id(), 5); + // 4 is the default author. + assert_eq!(Balances::free_balance(4), 100); + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(4))); + // triggers `note_author` + Authorship::on_initialize(1); + + + let collator = CandidateInfo { + who: 4, + deposit: 10, + last_block: 0 + }; + + assert_eq!(CollatorSelection::candidates(), vec![collator]); + + // Nothing received + assert_eq!(Balances::free_balance(4), 90); + // all fee stays + assert_eq!(Balances::free_balance(CollatorSelection::account_id()), 5); + }); +} + +#[test] +fn session_management_works() { + new_test_ext().execute_with(|| { + initialize_to_block(1); + + assert_eq!(SessionChangeBlock::get(), 0); + assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); + + initialize_to_block(4); + + assert_eq!(SessionChangeBlock::get(), 0); + assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); + + // add a new collator + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(3))); + + // session won't see this. + assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); + // but we have a new candidate. + assert_eq!(CollatorSelection::candidates().len(), 1); + + initialize_to_block(10); + assert_eq!(SessionChangeBlock::get(), 10); + // pallet-session has 1 session delay; current validators are the same. + assert_eq!(Session::validators(), vec![1, 2]); + // queued ones are changed, and now we have 3. + assert_eq!(Session::queued_keys().len(), 3); + // session handlers (aura, et. al.) cannot see this yet. + assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); + + initialize_to_block(20); + assert_eq!(SessionChangeBlock::get(), 20); + // changed are now reflected to session handlers. + assert_eq!(SessionHandlerCollators::get(), vec![1, 2, 3]); + }); +} + +#[test] +fn kick_mechanism() { + new_test_ext().execute_with(|| { + // add a new collator + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(3))); + assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(4))); + assert_eq!(CollatorSelection::candidates().len(), 2); + initialize_to_block(21); + assert_eq!(SessionChangeBlock::get(), 20); + // 4 authored this block, gets to stay 3 was kicked + assert_eq!(CollatorSelection::candidates().len(), 1); + assert_eq!(SessionHandlerCollators::get(), vec![1, 2, 4]); + let collator = CandidateInfo { + who: 4, + deposit: 10, + last_block: 21 + }; + assert_eq!(CollatorSelection::candidates(), vec![collator]); + // kicked collator gets funds back + assert_eq!(Balances::free_balance(3), 100); + }); +} + + +#[test] +#[should_panic = "duplicate invulnerables in genesis."] +fn cannot_set_genesis_value_twice() { + sp_tracing::try_init_simple(); + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + let invulnerables = vec![1, 1]; + + let collator_selection = collator_selection::GenesisConfig:: { + desired_candidates: 2, + candidacy_bond: 10, + invulnerables, + }; + // collator selection must be initialized before session. + collator_selection.assimilate_storage(&mut t).unwrap(); + +} diff --git a/pallets/collator-selection/src/weights.rs b/pallets/collator-selection/src/weights.rs new file mode 100644 index 00000000000..5c5099543c9 --- /dev/null +++ b/pallets/collator-selection/src/weights.rs @@ -0,0 +1,131 @@ +// This file is part of Substrate. + +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +// The weight info trait for `pallet_collator_selection`. +pub trait WeightInfo { + fn set_invulnerables(_b: u32) -> Weight; + fn set_desired_candidates() -> Weight; + fn set_candidacy_bond() -> Weight; + fn register_as_candidate(_c: u32) -> Weight; + fn leave_intent(_c: u32) -> Weight; + fn note_author(_c: u32) -> Weight; + fn new_session(_c: u32, _r: u32) -> Weight; +} + +/// Weights for pallet_collator_selection using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + fn set_invulnerables(b: u32, ) -> Weight { + (28_060_000 as Weight) + // Standard Error: 1_000 + .saturating_add((118_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_desired_candidates() -> Weight { + (25_000_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_candidacy_bond() -> Weight { + (25_000_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn register_as_candidate(c: u32, ) -> Weight { + (82_496_000 as Weight) + // Standard Error: 1_000 + .saturating_add((266_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn leave_intent(c: u32, ) -> Weight { + (65_836_000 as Weight) + // Standard Error: 2_000 + .saturating_add((273_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn note_author(c: u32, ) -> Weight { + (108_730_000 as Weight) + // Standard Error: 3_000 + .saturating_add((286_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn new_session(r: u32, c: u32, ) -> Weight { + (50_005_000 as Weight) + // Standard Error: 2_000 + .saturating_add((8_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 2_000 + .saturating_add((291_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} + + +// For backwards compatibility and tests +impl WeightInfo for () { + fn set_invulnerables(b: u32, ) -> Weight { + (28_060_000 as Weight) + // Standard Error: 1_000 + .saturating_add((118_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + fn set_desired_candidates() -> Weight { + (25_000_000 as Weight) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + fn set_candidacy_bond() -> Weight { + (25_000_000 as Weight) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + fn register_as_candidate(c: u32, ) -> Weight { + (82_496_000 as Weight) + // Standard Error: 1_000 + .saturating_add((266_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(RocksDbWeight::get().reads(3 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + fn leave_intent(c: u32, ) -> Weight { + (65_836_000 as Weight) + // Standard Error: 2_000 + .saturating_add((273_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(RocksDbWeight::get().reads(1 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + fn note_author(c: u32, ) -> Weight { + (108_730_000 as Weight) + // Standard Error: 3_000 + .saturating_add((286_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + } + fn new_session(r: u32, c: u32, ) -> Weight { + (50_005_000 as Weight) + // Standard Error: 2_000 + .saturating_add((8_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 2_000 + .saturating_add((291_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(RocksDbWeight::get().reads(3 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } +} diff --git a/polkadot-parachains/res/statemint.json b/polkadot-parachains/res/statemint.json new file mode 100755 index 00000000000..5807c84dfb5 --- /dev/null +++ b/polkadot-parachains/res/statemint.json @@ -0,0 +1,55 @@ +{ + "name": "Statemint Test", + "id": "statemint", + "chainType": "Live", + "bootNodes": [ + "/ip4/34.90.87.157/tcp/30333/p2p/12D3KooWLkFUv1NzGgaav72yM7QeEjWV6vbB12ZN6LAFJ2fS5LSu", + "/ip4/34.90.54.171/tcp/30333/p2p/12D3KooWCTCGqdT4JRH4oSQdYi4hmT2CJGPgP8qmB3dNiNg9iSLw", + "/ip4/34.91.163.123/tcp/30333/p2p/12D3KooWQD9UuMreNRxLAZcWzrXYYQkZ9NcfoAxGwQubMWLiGKt6", + "/ip4/35.204.76.198/tcp/30333/p2p/12D3KooWAEeojfMRiSSZWDZBXKj7E6hx5p6J4KowMHb6C3uBEiwD" ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": null, + "relay_chain": "rococo", + "para_id": 1, + "consensusEngine": null, + "lightSyncState": null, + "genesis": { + "raw": { + "top": { + "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x2241c74de78435b5f21fb95e40b919c30a73cb4a32776dffce87a062a05ff665", + "0x0d715f2646c8f85767b5d2764bb27826878d434d6125b40443fe11fd292d13a4": "0x00000100", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d3cf27e77d28361534aec3ff2f2f8a196a9099150aa91fd6cb5ec1a497e0d6b0e14cca7a863ed5608f6aa6a4970c6169": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x3f1467a096bcd71a5b6a0c8155e20810878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da925289dc5cf395ca10a801e5df215c687dee1e2a19c2f7ddee43e66373d58768c6dc9ba4424af6101a5497b2e4a945371": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000400000000000000000", + "0x682a59d51ab9e48a8c8cc418ff9708d2878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x7474449cca95dc5d0c00e71735a6d17d878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x5c0d1176a568c1f92944340dbfed9e9c878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x1809d78346727a0ef58c0fa03bafa323878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x7b3237373ffdfeb1cab4222e3b520d6b878d434d6125b40443fe11fd292d13a4": "0x00000100", + "0xd5e1a2fa16732ce6906189438c0a82c6878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0x01000000", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x042473746174656d696e74", + "0x26aa394eea5630e07c48ae0c9558cef7878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da933bec1f7f58aca8e7e138656f4aa4e1e2241c74de78435b5f21fb95e40b919c30a73cb4a32776dffce87a062a05ff665": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0xd57bce545fb382c34570e5dfbf338f5e878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9caa236617ff03fac93f5e8f12d4ec3e0c8f226d8a15b8d23241596862ce10d2db8359f816d45efb01c65524725543219": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x79e2fe5d327165001f8232643023ed8b878d434d6125b40443fe11fd292d13a4": "0x00000100", + "0xe38f185207498abb5c213d0fb059b3d8878d434d6125b40443fe11fd292d13a4": "0x00000100", + "0xf0c365c3cf59d671eb72da0e7a4113c4878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd00586496056eaa46d5134c108066937498f55f3dffeab67f75dbdf7be71f5d20914564fbc7273c66c0d376be47e661df3f3c6b6937038237acc01e9aa9e71b71b8f306dc4b079db14f0cbf25ad6d421ad964efbda594017e141e13e113b3c22b2919a10b75b38a2c683b1f9ec9f68d47b60b53289c56de135af9d55d49a90b4a55b100283dd455b15d9842ddab0928a4dc6ce24a148090810a100bca9edc37c9be510336ddc5cdb483230d4658411c76dad9ca8e1030080217559800a04a11b2ece85cb169502b3b40c840851d270b80d2838509a8bb15156c1a37d3dcd9346e7666b17f52050f7c508614acb1b373f3e60e9fd52ba813306b48c3178380b2b373b371091b94cd2df5932e31f6aac0de3609f77de5183f083ca3ceded93b3bf50e1f3b7b67d319634e2e77c79976a64d67dab787077e7002b39e172aead17bc7f6696e8fdedc1e35a60dee8fb6431480a89cb83af2000d249713a1b63609d6ac876a7ba87bdb245cf5243c3b8f1ec199e98c369d99e6f6f0800c271ca0478e075b68901eb9733ca35b054070412b74029ed57cee3e6235d5dd7934a9f508de1d894de2fb03debd9257d3c07f246c1af8ab4935076435a2a68177173589baebe1410fad07a0ee393609a6aea2e4f608be233ca3dbc3032850518fe0df12fe42279c258d52737b04ddfed86f6cfb63993ee9926b76842db4cf031e1aea99f3fe5a5ce2effcc6daab75c0b53d3bc842df97768440490a74f7889d1b9978eff7dd24f6eed593fddd78e4bd3fc91c662d91fe7e67a5ce2b974259eb3b75fe2473a8291a994e31f139352ba4d4392ec1028a0a52b04399ec9b949654120442105f6893d572858b2d68f526255a55eab0a2e4d28fac58d0c9c867562ce874ea15f5366364fa7e3fcd1cf82559d0ca287c9b95e97e7ac7211f7a1871a66f3432d149d677be0db3e93fba3d3b9802ceee0fe72464258adb206e54737bd4a8b8e8e8882635ca7ed5f04d0fca0ead0d80fe50d1ede9c20e54c4a3da95bcbbdc2c45b50c63f5a8c9bc0b2e607bfb6b7fed485cee48c06b8a26bd2ba0498dbe63600ff49d035dd36e1edb42df96411f12b4dda6454dda1e1d74a1ef3c9ad4f4bdf76e35a9c79b39dba5e940833578b02c04aeede1a9427987b257a1fdf6a8bc2359cd29fbca065c39fba595779a6e0f183638c229a06c56dea1fb6a239b4e1a2dd1fd6e1233453eb4bd2e19683b9320b4cd2521ca5ef70badfbbe0d5bb994c9bd289bdb23e69d5e42b5c4c887d611c8600b746f44d23a8223fc80ee897cbaf0802ed92f5f0641f74622ad3a6c4803dd1b11f180569d2b3da07b23d51a68d579011be8de888f338c416b93322481ee8b20b1822e74b908fbe3da1e295728ed1fd0f76a8d5cdbe3821efaee5e55341803533418c31424c4004a8b0114daa7e211c642dfa11432e8148d4c5fbed025d2849558ba33a7ff5e9b890ea44bf60b6d9fe290ed916285beb7390211d511d16627f90579a02b9754d57224b23d2e90026d67d9def2bda311767ee5ac8d4496f017e9de11c7dd86b1acdbe3022db43fc5230d04fafe62913ecfdd1f5cdde4fdc1ef37599b327302e97e7b78ea40371a615fbed0d2e397a50660502228eb60873a2350f61c74a1442c61daaf5aba571b89f4ac4cdb08bfcdbafba36e4f0d9e40e3906e72a993b544db999c31e28c90e35e99f6747283bddda62b2797ec972f5ff82c1e2182f2b9492737c61832046d6704caa44ed32168bf6a6ba3917e3b93397de6dcd4a9e8f6a86e0f1758a84e53366bdf890d23823249046db994a54e45f725c74d87aa71f6ac27b40cd36e046577cc5ab982a04f36eb49282bb8e27d05a12c4ad69350ae8d7c9b5e59f733453e74e7921075b28407d569cad3cabbfb928106a1950bc49fb572f9409f841264054862f0e5cb972f37ef957bcbcddc032de12fd40acf6f5eafe36ea089572e1a74927c1b56fd154b462b28ab258c261375d234044c98238e12d77e23910b0d3bd0aa5979a05537c6186b6c19634704a892a0a993bb07baf3ea9111944d9b6ec9b4c44fb8d458b341c5b40a15b9f8cbde78b8e09bbe689b64fc8d452efedea6cf25a86eaed6a3abda1f57bb0fba57d04210f43d4648a600c3dd4c8f0ed41dd1a43a9dbafb88923345da4ea3ec6a0a4f49a63d9a042713d8d779945f4168d13e77e1f77db57cc6d4174a263a6fe3912544f459d61e42bd324b6a56eed12425b6e7526a920d2d0c2069419476d33a0deaae4493eaa8090c34a98aa823d5cdb244939aba07d903753f40d7b09b3da36d162a436b103a339dbd9bb51107bee5742887f4a9b73884697f92558b11b0e9a66465caef3884dfef88d37fd59235137d3e9fa31166649a46f87d1e4d9aee5e4d72a9a849ee978ca3223b2cbc23c294fa24e12959a7bf731cc2743a94b544a19cbe71899214b677e89339fca51b8b740a28c32635eb02b35445de1963f2b1bf9ddca7c33bc6dc2499847f8fc1e9d3529b863307de551cab8a5947dcb45e6d9ca63306fb10a7bd6239c3ce676f39c3de925f7154c286ee1e51a7f3391ee94f6743fad337e24c0e5ee751afd872d499b0bf43d9e5bd538f92eeef2de12f14be6252e751e6ce2a5306e7ee11ec36bd71883b7bb396e8fb242b7b0efcf48a31b1ce44e7d1ea4c966c979d1daa1343a9eb58f4f3cab26e5996f58d47b80ba5767fb05bb232659674af3616612e947af5914b1a40797fc033599bc2bb7f88b8334a2ee12f94fa4608942835778f9095297cc721ee70b2db3026f9d3dbd73ebf3b12b93e0c7bc00230daab26d97b63c765988b2f62ba5c6276a2fabc0a2d6d4d72d5f70ba97f3eb2887b5b1fe9be91c8e7cca63fd43484a9c34f679b9e1a557d247527d709d3ca4e9852af7ab9196809a3334318858793a993d4fcc8a5558869b5116719e6ea117c104abd23ce67d612fddc865112ca9ce9f0fd4d826925bf3ff6ad49411ace1268643ab442dba3ca83eedb68cfd1e67dff914c618ff67dcbd8d9a13e6835c93a1dbeaa3652b39628f58fac4c3f87b212e11dba847be8ee8fcfe16dd847f229d9d0e2258dbadafee612a66e96266e7ca84a5096b033043e8c3108296db8d958edb2162e518ff8578ff840ae7ab6289f91a07cbe029ae428ff4dda32ac9c41f93dba866ff800e76f0f9e39dbc3ce6403ae1c762368a5fccaed26518350578200455de5da2b9bf50965afd412db06eaa695b6d17d65bb9316004286297cb9d93359b3a0acbe2b297541a7d727d47d57c82e90ba3d50d84075984eb38a4d832e615fbed037ad64b17f523242979b36776a16d4cdca5e29dab7614c1a41bf5103db8529376b04654fb8d4acc150556b95d88e15a8b1022d2b0063055cec02aefef65b15da87d675804a01177f1b01fbadaa45e2da1e156c7993fafd5193ba5b053db4d94d77b715159fe5a3a896f6ab6d52e357765771c479afd873ef39f7de217defedcf9d2b66b9262b9ff173989bcdda4d825fd9db6193f6155b2c9bf650272fb2e89c4c8ffa72fd015cedf5a2fdeafd1e4d62ef5b67ad1dd236678cb4bbb7bba9c394bdc522ec6d56a6ec55b3092b66b16c3476a14e624255b358321a9d3c8b0b756281360926bc43973480f2fb1b8fb49d1d8e45ae1dcab79ab4b4bfb108ef50fe6e1067a55aba3deadf774c52ae3e7f746dc4995eb5b54d9a5e1b9ded1b8730dd1eb1dbf424b74703b8a6b3575793b647db4e2ba4f5a2ec155b5793b64d72c608a4d3219de68c91f7e9efd3d461dabeb188fb9bb5ef9a7cb2f6dd3716e9e7b8d9e6dc1eade35641b5485ced419a5421124daad7a849350875773f40931a7555000414eacea36bfac67d9bc4685500757d779926b1bbbb5b4de2bb6f0f3773b6e749b5485c6f526da326d55376f61e4d6aca7aa04ca1ec56d7f4cd114d2b0fcabecc4a2af7ed518350f6ca49a6155b4e2ead38b61e39d7fefec844fb749baeaade6f8f2aa4eb6485d47d65755693f01b7bd612ed6598dd59dddb6d584b78279772931774773255c5ac8d383d7ac4ce7f8fd857f25bd646f74ed653f78a594d52df08672d51789b667119a6c251cfaac3e8f6c8fd735193dad97934e659f99fb37551f74ba6497df68a25d36a7b549d2311a6ad47d5acd53f67b9b4923a8cf62bee6506722c9736b9b4e5f6a88aa83b64352ef8cd364d6dd47df747e541ddd96d1894d43ff29215d2f78ebb30568ff8ad47ef7b8e38d49c31321d1eceed51b5687f9aad47fd27b7476ec21ef5d5a4a594bdc9a587aca6edececececdcb08f3609c6af3d82d02da244b133a3da025cdb93022a747b52c06300ba3d3b67d06a4757b5475cd512e0da9e1d30e8d2a555687bd4d33e8b41ae9e9d27d0da681ff2215c56b34d532fcaaf17ad90eefbad49eefb6d52fb1e3669e9be6211a7cdbda63b39bd626bba4d775ca244a7571c8bbc4fb3bebf571d71b647b551f68d4642f4dda69b64eae4d28e38ed155b937cdfb83daa32945f6d74b36241dd2759219dfe647ddf1e4db7614f2e9d646d94bd62ebc9a51bddd461b4cdd623be4ddb3493db23fef6e89973ba45941e37976a9bc45e21dd6f93f8fb8ae5d2d6a4febe6272694ba6555b2c9932c9b43589bfafda6292bf11a76fd3155fec3b2629573b7b7f234ecfbdf8155b2df7e277c4e16f6cb3f5a86fd3155b2df7e277c4e16f64737bd4b7699bb6699baed862c974630496f26ddaa6995c5a6a662cd52271f5d9b7495544d9d9454ddab3f368129fbd750ddfb05f4d5a2be8200dcabe4d5a5a6528fbf66033e7748b283113a9f6c7b53d3b3b1486ae15f270065d986a97b5704dba3d4830834e747b906005ca747354ebe35a57ad00ae75d5d25cebde1c6ec6e082cf1bc40bc313c3c3c3ebf2eef0ecf0eaf0e8f0e6f0e4f0def0d8f0daf0d26034bc315e1c9e1a0f0ecf08ee082f080f0c07c6cbc313c24bc3f3e201e155793e783d783f783c7867b83a383b340ddc179c16e705c7056786db82cb82c382b382ab82a3829b82eb715270517050704f704a70633824381f3823b822b8213821382bee0b1704e7850382fb81abe27ae076e0ba70397038703170535c140703d702e702c7e3b670616861687d706734303816b423b42fda179a172d084d4ba7d1a6b041342fb03598201e205a179e97f787a783c685b7f352c0b83829ee056e0ccd0c37074787a7e5b9a16de171796b784878613c31de95f7c5b3c2ce606e605f60599a16d8151816da9646865686368626867646b3d2ae3421b421342234301e191e1ad897b6d352c0d6f072c0b2c0b4c0b6c0cc605c786578667868bc333c30bc31bc2d0fcbfb021fa1ebd02f681eb6c2693038301adc06660373693ab01a380d5c06dec255602af014b887a5c0516028f013d8094c061e038b81cfe0303018f80bac85bdc05d602eb019bc0516025fe12e58079c03c6011b81b5e0284d1c81e2090d64000317b080130c4082800318e015a1045890c0c908749a3059728515558840494ea5628a1080208914517c8083d0f4c050da12b8072c0d4c0a2e0f4e0f7c03e60123630214e02f223004879bf000266a84b40d2aa6cb6d0554b3244da0f8c013574091648a279ea89849514592279ef82c2751f2012874aa1801089ed0892209132aa4a8828a279ed0e104016249d8264aa880422789144f2449020223d811d60a105441c51325609264044b9ea0e20aaa5345121194008a26ce8cb049a2a8c28a2a9e80e2092aaea049a2a8c28a08e85431022ba288820ac1b04861451449a4208289b14d4a9024e789264f24d1818249922a9284e08926254862a40a2ba868d2240905241bc292808a2b289324394cacb8c011c9aa6c121d28a4a04209144e9e48328224239080135224094108a070c207dbc14a9124499327446085145540c144c4bad82639512499228a1b6c139d2a923049324515549cc9a00a2a4030c35eb05150d1a40a2a98e86091e4891228b9e20a289e6092440a25548ce026270a2b94dcf0602e58113c01850e145240a193840918d6021350a1040a2a74a8a8828a1b4c059b1385154a3ef044129d114491048b24316c679958e1004ba66561ba820bd0a05baab66767877289e9787d83be015fc1532bc0eeae010c60000314a001a031027490768c1f90368066ce35362d6b6676cda68935d726d7668ce076d0b1d65aebb6cc7537736e599b587733009c6bc7ce01c0b5d61c6b53fbd1cd3ab2cfa735d89c63ae9de3d6cef938c2c7c739f7e98ffb34eba9bdd7acf50c5bc65abbed699a61705963ad4dd3c4189bbadb316bd70068e71a23a21de3e69c8b71ce31e7fa75632780d6aed1f48747ec5c331be1bab5e69a6bcd5a6b37b9e61cb70000a0b9d62d6aad07ebc6dbce35d76e6aadb173ae884f3b50dfe0d6ed5cb373b15b8cd145e758ec9eb2b9bb8eae6374ceb9e8fae35a64ccb58b2e76ec762ebae8ba39e728d79ce375ae5d77b7ebe69ca39a6bd79a73ceb56ed7dab56ece7573ed5c6bcccc1c6becdc7bcc1cb3364deb5a73ccce757773ae2d63ce39d698b9b16366d798fbb0feccb4c69fe69c6b6d9a69424c13648c3fb059900822b887f8bcd6da716cce3966d78ed97173ae3176ae35d798db4d6ce2c69639363506273623c4f4f97c5a6bae1d3736c3cc6d792cf332ef58e6c6cc3cd31abfc7ccd336b8836a1dec9c63c7bc535bd7dae7f3f97cde1c5e1d9828045628792204555011821058a144c7b148224515543c510515504c1105084060c53402a423c78e9c28a0f8801225560800c78e98216274c87c74a280a249155030d17942870a1188c08ad18d796326a64992105401c514514c501549aeb8020a1e22a042a78a1130993740a03302216e2499e2099d2aa86072c5135134a142043c64a448c22489144cac788284800224a182898e000e4012020b2b48a03304090105905902205100023c518024395028f9c01321a8828a299a4031c50da044091539416c34312246c70a2b46305024617225c97942078b24551c71e924098111a1263a4da8c0228900b0a0020449985c1104c4048a244aa278224908a06062854e9327a45042c514513ca1a364045080208914341f1d2650e83431a2004c9a1411a548d2a44912265788c08a289e6092c48915512461f204144da48822c91304c82121a000574491a4498d3545143a507ce089299a50510515201855250001150920000210500029923c6185ce1525601245119d24091310f070524512f696004f546105154d982471f284089e6062850e145158a14409144fe8609164082755246131db25606285089288e039a92209a38938e87548b6f4c495d8542a3924fba4f4e4c99327149212bf274f4aa5a9d490ec935223d927a509c9964a10c9964a4f18922d3d24252e31244f7819927dc2484afc8491ec93274f189227fc84913ce1d293274f1a9227257ef2a491ec93278de4c9222971e9498921d945f2844b0e49894b8c644ba546b25b2a954a0dc996b89194b8542a312407e83bf0eeb2089a40b1019c33e4e1bcc326c1cf75c1cfe7907eaa7f5e4d1d3ed25655fdc98a4528175644aabb4f7cfd9cdfadb67335d386a03ff837eb9b29f20e3a68d69c97e8933955f5fdf1965ab23659b9bd924b5f1cd2cefe224e557d6391cf2b17711a356b9b264318972851d83ec98f038c408743b937d4ac8dc259731a9f65cebb837cb3e738258c3cadc1b5d65ae319cce0883e5492af647fecd9abd6232432b8faef6e0a279170a047fbba5d6860c126200d30d0448ff64b702173d95c5c2861a3001bf010354c1011b50112471ca0476ed6dd42dd370be53563cba08c840228f3acee0f891e49e189840cd2a3031cd123d6a347ec3d620d73f5685f2fe5eabbf3eedeb95de77689f0fff3b4aaedb23d75a8588f374d6fd4a3d6da119373ceb9e96e72ce39778463a68620471c0089f3e02192b958a647ce21c1e6507da7ccc5f6ac31a9447446c5645e73adb63675186d6d8ad8ea51e341db9d6bcdb9d61a9355098f52e31642f5d87563acb57ba16a7a6e0271813f9f5d66ac79bf7b2c156bdf57d52e319da76b5c1d8e9b3a8c3a379b50e2015bd6c1583d5200123d726736481c00b43f5c9023821c316a77f61eef711e15f394abbffba346ea2e926122991e59fbc39d43942d6577627fb8730caefe9bb0c9aa64b750fe5e3fa896b23b2fd47daaf65c46e52cd3fb4fe64c7713b45ceb030f75df26b1163e836eab5691e7260965472345de9cef1d3e76d785ba3ff7b7857d52834e8756e0c316eafe5ec158303130303c6cb8592deade7bf39d92d5158dec7ba15804fe4d7f9fbfcf1cd2d4bd6a6ac3dc5aa21e4114a0841348946001654a17579a3446939ab65732d667f7cd8a46760f5c286382ddc522ef8e5e4fc2291681d30d6b9b94f3ee28f8ae32fd3d258db04f7fb1089cd34523ecee2d16795563cddb1c88215b6008d1ad421a515a9632287b896639a30a552d8b8cb2701317693b3b4df9bb40781e4181e3c964ba0e8c434ab41d36899dcdda94b55c3ac1b984d16936c7849bad343163c1c518f35cec4c9af25c4dab459930d5699eab31de2458c722bcb343d93916d91eea48ed8f41d6b895b035bd5bd3bedb66856cd6eba66715c15c50c2e0b3e03761f44bcd4c2adeb998f220aa1d5dcd051764eec13c57c391e911cfc5e6c53cd7696d974cd7fc35eda6bf8d36efa1622259e5387c85395eaff82a3acd91e3754467747c7474ebd89fc52c9c15d21cbf72dcc6d422c6b21e6715d11cb33641a7107d29e8977511a3b15e3d6b3a8fbf88f376e8b042f2f34a2e118942f2130a1d043ac723300f45d14192c72d29e2711859a7f37848d64679cc991d5287bb8eb9639a72e978fd5c74167144732fd13b16f95c34ab8ecfb422f38e56787e23339f04b909c3bd7212825aa2554c548751f712ed48c47d09bbcf1469d41dd246dd0eb954478f152a74a39b33463e77ff4cf7e3da32b6ac4179d02d630b175a99ba26552653200431882ff4f3254d4ad4c9443fb359b04939edf0fc6edd4dbfbb0df9a681741a5d077dbb46e6a26fd7d878e8db353187f93ce6731b1715cdcf65e436cd675e729ba66a0b749857187abd4414f42a9a5e3fa2a0d71175ee4b2bfe42e3172aba0ea7e37391dcfdf199d59dda24dc6ba395fa92f79a45126e3ad141adc83c7ea3114697bc37c9f9dc7ace672ec9f177e784d129dc5cf25e4577c2e8143a4edda6ab8d383ae692dd51155d3497bc7fee724c2b32d305d7b5081284b2cba60946c37ee33297f9dec8bc06c1f1eb7ba3858dc77c9726741c538b1b73194d5f665e375a846e636a51570b65b7613172970666564841bfe42e0de893aca7a08764bd28c8fad26a87eefe88b35ad39dbaac4d506afa8e2906d774eab551ea753a353d1699feb9939fcfac8cba7864bafbdca6977e8c38610ae74c1148df954cd409a3d39bee8ebd27aec44fb8145dc80bd50384e343e8dd81b79981767f6c8fa8a8886cc5cb38cac0cd9d830acd9ae1008335d63e3f68aeb97e747b80d085b4e8f600610aad9ec5321073a2dbc303405091e4dd1f3bf7477f23911797f0643183fba3bf03083bccdea40a99dcc0b53d3fe842ab45a94d62e126f18334a8a847bccf35d63c81f6aab054155f4136c7ca93203761f4e5f42be8d3a16f3a616c0af7ea7d924bdc6b89bad964c8ac4f7a8eb4266c323e82ee4b13770daa2496bdea78af425451c3516190084daf31b47ea810c840fa15b6d74a88c540faa0fdd1af6c49b0b1905d20ec83f63fb3364582852c03a9313d689f9ab5694582f6a1ccb1a33e934276d46f72795487d81d550050c8158efdd1ef5b2c448681f4fb428e40a267d5d142d0be9bb54f9fbc9a34bdbf9b4475ef6d887b7bb2445d6b268dd68bf6ccd91ec6866a7b54ee42dd2b244404a8343555d2d531558beef57995e95711f78da56917020280fea007a0ed9508eade52667fb43339c92621d58860366235105ed7b29af766138cc69d5f8908bd8a5eaf3797d1c411e8a15945b48e68e83c2b11b48eae26580d5f59d2eea812119a9588eaa059458fb35eb0ad16ebba28aba966e52bd4bd8a685d2f57580d676169dcbf80a50c6450c76be8a1eeecde9229abe0aa5c853a0792d91fbc94ab34a9dea07c77f6a2493587b6bb7fe4b5233e25ad1df1a1843be24fb2ed88473297350436da7349168db6c73bd4dda6b3e8913b1675bd5077eed2a5f6844bec201e987c156a57634cf239baca59cca2124bb999b1506d8f1d5dd5b210a6bb496c124d9785740ae8be725b53bd42d99a86cfad69da39e2f0ec88c3de24994d53317225a1b0e0376154a65cd58f0cc349d3782665dca314ed5ceea0c757ad19c082beb1eebe8dba47a9d3341e24759a0e898f73c648a3f18dc6395304f4f878d0d4e122fc382b13b1529da7156bf2fca6da1d7ddeb148eb88035fc930f8d527e2b04637f29c3102cfe7e9a4691ffe23ab3b01e5732cd276767847ef5537261885fc91b5d52c9860a2c3e83b2f90f7238cf612f6650d0adfb23ea1fc8f64b148efe8c0aa591b1b4a27dbbc0c447d646546a9b984d1574b94a7e99a099eb47b695433fba5d5ceda04ad4a82d09c25d509a3a15387bf259758af256a3dca7d484e61ed41b2360a7a944b6aa315f43db4dea444add9643fbdd261faf9c78a20d968944be02dd9a49a4a201415a4803ad141f79fb93baad45cb2d38a0bd8b5d89ee6b2a9c5e5821c375a64f1e9810f9280831a48610b556eb2d0e28ca6bf8ce6c96eb922082dce48430c8308e3c6fda6fd7d6fb4609f6070ed8d16d7d2f0dfd4c2cd6534fb36af1b2dd8d402329a7d3d7dd24acc5818aa35726d15deb0070a6ffd69a1ecbb49509b04fc424a2e65185ccd1e5f8350d0eb0142af48b402e874eb7544abd723287bed1dda680fadac87b28b7ea645e12bc743e434e6f0db2498d74661cc84998e2742a64e9684e8e7d725a1ac6eca942eae8cd163c69634bab83578b8a8020619af8c2a8642b3ca80aeab8915f4cecdbb4d47b9f4b340aa75e409b5a0913e9cb5a9758e104e901107a547eca059e3743c3d621df90557753b94bd8aa875f68e46fad6ac1f2e687faa021ca0d0fed4479a9fc562916b3a479c6a2e7113af6b2028ef0e32fd482b3c97cd7cf32494deb961c16fc280afba556f82d6f420fc7cac49b60a2894eccb17ba023acdfa240514beb22c2873e0bf50aa44ebc4c3e2917e2dd189d2493675914803289c4b1a40e1ab48647b28b54329eea1d45cc23d14dec179e3789ac4947d7a7d76e3761c14c7f3b4d02da2643de952b36a08edaae627577bbf75ebc698ba0ed2ccefbe7676765270b3fd66861091a5fced511f715a55f1c6254a11606aed7c72b1eff98c57f41671b86a6bc79e294ba62b83f468ef1a1274af00bae7c5e1b917d38d930caed3ca3bdd856a7b54d685b6577bbea6ef884ed7d4dd40bb3fa61a28f2452c95720557482bf2367df575dda6af69a588c9f31b5984dc1b29f766e3f428c42b9bae84904c2bd658634d6e128c4eef27390bfba3f110e255b372e4b8e8d3ab29c79423c7ab17891051b5d53beee211d6e211191db769178910313d99f3c0431a945d88574b8032c6587aad15f2e005657f7cd9f8469c1bef4da29d2d697afbb210968581b4ef781551eba216a4d6776bd81546d36efd8a444e719c5d61359c85656121cc0c06d2dee277cc2ad27145e6ca6459580dd3a263c785783cd3c26a8a783b338385bccb5c885945f23b66bd68655a4234c775302db4bd08392d4d8e4f92ed28c7a5dca5a939688ecbc8dd1f95089ae3db34c76bd3caccd80592e39c85852c6db569e52c5187ebb124994f1f2de97dfa114b7a8d4e9791919314995737228eccdc0bc79fc4712a73232e51a238feb9a3ae033e7ee390531c670b06c7731c47749bbe641de2d763648df97bf524d32124d31cb2858618e213c71043e0884b94e8109fc721659e43b61ec9fc0d212bd31cbfe210199928336b8e5fc7719bae2e6be3901cd1ca711cc791a3d768128fb7b39d26cdbc9d41019db398a1e54946a547ed53b22e7ad43e846455a48422cf82dfc819c6cccfe3d3ab1c33d34c8eb84489ce1c147178bc0a591d8934155525169d59c2f4ba9346df9784e89bd574c2f4fac621d7abdb74fc0e9926e9783b9fd124d1db794b9372bc9dd168128e3f39c471442243fc5d08b9b47a92883789384722334b98fe4e1a8feff8cc12a63377d2e812ee4285f892101562eefea842bc6fc52332e7319d30fdacef3a5ec523ec424c274c67667dbf8898334686b8101762e65caf3ec4ccd1711da632cfd1bc30391ce89d0a2197f2906c4a8fda6724e3a247ed0a0d3dc966f4a87d87642d3d6a97917c468fda7548ded2a3769164347ad49e4332971eb5e3909c068cac4c611e8a43987296fdd18e826bd4a3761bbf217bf4a8bdba61bd571d17a391e12c8ca611590af3e936384bbbccacf09af51289a28df92cae767efd17368925dc85eefea8ef4cdb5b3cc2feb234a9dfce6634e9bd9db56c124bdb5934c296308d89b90d8b914b61e4d24b2e0dc97a90ac569455442dc964a2ed95d4619f59213597c159314ba4e382a1d3b752743a6fcd2ecdfbf4dd24964ee78833cdbd82d08d27b8deaccb85f2f99c85d5d85889d2344bdbb7493656b8e8d152372ba495b3d0f6edd1660eeb2244cbb1826abbda5600638c31f629e28c7a84811e5d23ca5e83d68871ebd618636ead35c61863ad358607e794e8d9d65a6beeadb55d2717c21cc0ea11732bc339e796306d52a2d3b43f9cb381d373ecde74ce751afbd65a6badb173afb5b6b4fd3b98ff98d9f1b263e620a3dd33bfb7dc5a6b76ce39c76d9ac2eebdf7dec3f93298267a34bd8a4647bc76d6ad31d9e677b48b783076498bf127e6c6adb5e69899df63dedde5f6dee37635d91abf9ec90d10420821d55f082fa6dea95333877affbd5273a6c8d47cc7f3881e414a521484144551140561531445c14308217508e1298aa2e0ccd91ed613188d0475a11eb96fc4b1e903507744d3b86fbf37c1f068774cdad47fcf3d6ed741a81b311ac7fc5ebf3662352246e3ee46d489a8eb864d7afd277b8912edbf35fc800b2a0035946ca147d0edf101183bc57d30533cd7d6e981f1eeee2e33378c148e5f37e3b9cb18b7c68cdfbcdfdd6d5e7786f618638cb11e94d5f0681ae61c12ad31c6d80e638cb1779b66ad35180ef48882d37367bfa0d52809e5149728bdeebbc804d3d6ddad3106214551a728aadb24d74936f1b3430d7c0f4a24ad3dc658633978403b353033337fef228ea847dc0bfbeb609ce873bff5b3b8dae56884296bc65a7737736bef768eb5667c66e69e95798a63dddddd8cbd57286ac6decde65efc275d83ed04c7beb4bbbbd9bb39b70b1384bfb77ad4186b7f11a7b5e6d8ec766ed6f6deac25e618eb7777b3766d608c3136a4056bb4608d0a696b3c7ac45c45459c37f772cf3d2e51a2ee749aa21eb1c65a7b72e9ba06238e73eeb5d61a6359d0f7266bbba689bdc6ce1863cc0c3c50beadb5d6de376e74eedb6096e811fc74118f26b1b73b3949b9d8fb8e7d230e63ca7ead7bbbd52418719ce3ab47ef93b47af4fee21225caef3df770de7bd36bfaee6665fa5acb824e7fb2b6cb3937974deecfb5b7d6da9b95a99bedf9a15a095cdbe3832e680fba3d55bc2ca5be4ae0629500858c2b635c74cbc8c118e814c6e0a1dbf3032f681dd17711dd2920210db40abd4f17f58d3856aa43c974c724e59a31d272608573a688fb74f7695ae1f94d35a9b3484d1e3d7ab76928374208a72f83b97a743169b48a68894e7711f6687a2dd1213c50b649f0d35b6482299c75ca82d647825fcae2124be1ac4ca93984074a8f964e5f5ab1a6d387b4608d690e69c11aa750ba46c468de97c47469c5d712f6e5cb972f74084f941e2dcda2b6ebf3cfac8dc26ffcdca6b749db2338e934859fe4101e9e1e2d1dc2330567480bd66852892eed28623590d1bc3f4653a10866480bbcf4686985f40de1d9e9d1d2a5d3ac4c87b4608d1ebd275c72fdb6506407e0e8f61061a7c855f5800e0c0be54f0f4d7e9dbe4cabeeaaa2e4e795acd673a857afaab5dca7375a5d12caf6d42ac677bc4df724436f415cd775bd72d625a15c1bfbd3d4d3caf5d00bc4276b92cb077a5d20a6935c3428934c41b26fc37ad043ab4fe7b37bcef4eaed55557d234ef5254a52988ef0a7e95548c6578c5e51892bc6c757cd0a392bf488005512d0f890dc3dd0964dab8fb45e318b23913899347bf591d6ecfedcb2e4e7561710e8a157a10f7c8809a8e712fec2fa15e8d3f4030f82b17bee1ef1f97eda4339f19761debc7a34699ba21e35d3275c8a0d9dd0832e280fba3d3c1804ad424f42ed959d27d55c1ab4cd25eccb17d8a859050ce72e9a449dcf5578a742ee2a8c860f59cab55e68e529149e922c0a85b3ab3086cc7d4aee9777b719e3a1ecbbf1c8a9b7645f095fb599bd15855a4fa0d32969f130903e646b6dc140b6b217945b5a51220eebc6e2b6e8c9b287a5a869510bbe1d5e951d8cb041ebcdba2c9c17082fe8e95a21105000b1071a84ae150031055a648215b290ebd63f878fafe2918ac6c91d89c4bb579635451cebea119b323d62223e5c0d24adc75713473efcf49942bbb76020ccf3380a3f81f2162c642947a1155bb3f1e1e228f3af0756146b8beeee863d6aed35c656eb2dda49ae16bc93932455997e4f4e1f22f0d43916811f087bf4dc366a0c2c84a92db4628b193293522dad4295796855b269d05aa2ef6cfacaf7989311580a3f11e94f453e39f695b551c6c215a054a14d249a42db7934a9bd3519dade9875c9505b7ae44e6d794d8d818174632f7de62675b5367ecea4120b8112ad887cdedab9bdfd8305fd4c229f22d59c6470cd18f9fcfdfd333f5762d343a828858188682fb4d84b903b4b95eb5d8f51aec8c515a774945f1de522c7cca12b146ad0acb08a52a29428254ae12a2fc012a3c429314ae44224eac760a9b026864acc41cbe26459d6147acf7a4d7d99ee1b8f99627e436ed3c4b44ccc6d485147aba34429a28b95587b5cb0c428714a9c8265b21e4f61a1c268da77984ad76e672aac06e636a66956192a73381b9c6cc86d9a1809ad2934759438958868ab6e8944514a9412a56069a550bf28556cd88851221736e29438254a89526c3c46b111b9b011a77494dbe828178928f5986f33bbe0636cc41cc6c0cc0aad83a29428254a8952aab832b850e98232cf3a400b5a1fb6e890e592b1c355452256c359b288b2884459ccd072c61634b8c42851ca1858c8c032061975180599038ff7386214244a895cd0e112f1788f234641e670c1b388c77b1c310a12a5c429a32c59cc10f138224a89514459a8d0da5944593a4b1656c358b24c9d85b24729d6e75515258b8807c5c26aa08c284ae16245f954cfb9907b882135993bfcf4a95e59a7646da1d0b4615475ca0ac55354aca6e71e3bb210083463d5d373a008e2d0ac4d4aa02faba91ea7b585557d2838ebf41a6b10b737ecec64a962852f536801e85a6110684caf78cf5bd98a52a2f0a5cab45bbf2dbb4ed3b6df778ab27a5475260a5ebfaa537d0be6573fbe23919c9e95bfc3aa90f6acb1276b9abaad29f4294e361e0f8a31e6a0db889915662ab1e8e7570814ad6aea4cf433a9165d913d195c210551be6ca16b5023e85e61e78c9d32a801e85e61670a655568835fb94b21acfebeb5519da639af70ea34b5a2e040f88d323ddaef00fdb30377580d4f6134ad65b5da279ef87eed2aac06e60d3e242d1aba0ea7c3c86d9a2b4e389b8cef7fe424e5024d9d89b6eaf14d522e6b2ab168eb48a4cd9cf6cfeb87b553776770e6f0a7bf4f7352c7965509b5938220aad0115d2bace1c50a8330830a80ae150651e50a2ac042590674af90822ee814da9652df6a8a99b544635882ac83983acb6a4da1f09f9859ad28d49d229243fd53a469bc4d5b5bb0905aa207855acc2d1e16c28f99db230bf4d06370dd9af59ad58a4241137dafcc431df5eb9a31af3a13e5791d06c6fa057aaf8d3a0ae67a8514e63c6ba3534c08e60bd3ac2d58c8e7d343a019a525a1b47a64d1cfac8f7da60fe77c730add224a21763da8b64765519ad4ce532873417932c16a34ebc3d6e70c0e570e7507e370d5eb62358c05d68b56c6522fc63291d124eb093d4dfa9c9dcbe02c1f594bd3377e585238d4b4b66020ec45935ce54a1577a549500dc76c1df3145adf759a4ee72b4daacece70b898d6eb0d173c57ae42bdb31e9f51452bd36a6dc1403e338a15063185b1309626ad1506c143d9798c2b40a1626dc1409ec5c340dcf91969179628d56a2cac86ab301a8685b25b5bb0109e4e67a2fcaa33d18afa67877e66d59928e461df31c5e052d2a4449dab50134e387115cafea4b5050371b3f5887db862c39516052a51e0a27b5051747ba2f08232d230832f7ab0e090869e896e0f14b89481863a4c100485aee10f55b716ae1ef51b65b49964477704b9ea88097ba0b5076d1157c8a34915edc3bde13b544cb74d5115aac2a2cc2dbaacb8e358e1f98d9b4fac9b30668cf0df72da8493df00fbadccb29a1927dce3e34b377bc86a662c100fda1e74198fde8f3609fefe627134da1f1c2564344ddd7af581d6dc1e3d240fc628a8c4a2d4dfab128b56737bf49967b8aaa85e72190dbfc9e94997b8311d540100408f6b5b55c425ea669ef36a9b4a5edbde7bbf9c12440c3184a91030158f6b5b35b34347c5d78a2e28612c012a232e27196d5ab5e55c63cdeb40b5441b2d315ba0e231ae1c978d0ac78d0be42c1d8bb6a6c4a2ecb35b03f96aed0da7695608e79b5524734109e3d37d4ab6aacd6ad176e6b9e01f9c4d2ab128bb7bef3925961562f8e286d7c500e7982ff696bc23f6aa63916864994d2bf036cd18ced005250cd70870877fb2f15cad49edeeceda2496babb3708e59b336c0e61471deb664205baa084d1dc67d59ac46cc68b95a8e05b93ac1ec1ef190997754d8712867bdf1e7002158f717d2e2861b026443584293553c1e9821246b3af68075ed0fe11565f165741ae3aa2486ccf0eb8a8e99b5600d30fc709ec20fe300420d8e10d3cf8c31e6e969a3be1dc410b685bc994b11754efdae6f8e21d42887b7de7a05e7508d1ae0ac7a3e26b4557888881b0d70e6d12d3f7150b89397bb31098b33716729dfdb1107876110b7967872c2446d22afab0109802582ce49abb40aa8f49f2d81fec2149c48e245d20eea022287b0c0065b70440d9ab1f94fd4300066221702e03a93d2e16f2a6100b845d2a40feb30a3911442441c4104324600821844042081e3c6a78cccc906676ec40c00e1d3a0ea04324328028478e02e4c0818300386edc0872434606888c0d1b03b01113f3230606e60898ebf27185420208814034a01847d1b28cb0aa2a00d5e703800f45f5a0202c024ed39cde938f3acaf607bfded13e119b44db1fdc286bb43f0463fb83d1be10ddfb8327d9747a38ae699fc726e1f6873b4b2b4d3ac00874e8519bed6ad0132e31abc4a8863065d74ed510a67db1dfb8da997674afaacb41e119c69bbed47d5a1797281591f59980b2f3347b47ed9da3114627274d5d3d0165efc844a3edbd40da3b1661f4a180b253924d2ce24cbc3fda13b7ddd8168e5006dd9e238c410740b7e7082ca0977bd578478ed61265bb3fdcb4c26f13b4263d80076310516d8fda5ce874058c1e4dfb65353a688558d6a04c7908576be17861a103dd1e2c685020747bb080d1519a66fa74d5128d51742ac65b544ce8c6a91ba7a85fd6616ebdca61b51656c36aa8c113050c35e8f4ee3eec1aea38d450634602ed7d0cb4c9c337ef3d2f0c406141036ede79f8067e198d4dc7f00cc11a4244872609d1a41bcf714bc6f3659d2f2124d31b22cba27ea3e26b86b7301a3bbe1147c7a31c428ae48e6f939cec384c64829a391775eb1625a90993051327a0ebf0f835390b8ec8c4352b75d145bf1199085d978947a812b5769c875c4204cd99f952905c42049d398ccca1be74676ed37f152f8af8469c799bc632468fbaa7ad7824de9ad57a0cc523d7a959ab359b9428a8a28ac4594b341ef490e471eb3091899859a9c31ce657e85748827ec9e6216b1639f130311e146705510cc6551b0b9d6e5d8fef33a28e8813e39583ca31990b96319a14f3e94d4693ac5b33168f8b872504112122841002def8469c6885e5f88b476e9cb27ee3957539d0a959afd9a44479dc7ac5f1baa6258bb865cd0af3179908cd4abd5a071dd4a4c4e3d6751eb35a93d3983c40bf0e7a08f42ec45883eaa0db2306172b8c58b3a0a153928a43a8f7f8360366e26462017edf02edfc9e28e8f34401bf1d053cc380390afa6d86111f3a8c4c5c07bd82c1719a6f6402c701f08d46648e63e65097f9c600dca661e4d22af2f84626606e3d1a71989943dd888f6ed3914676951e4d6fb937945c1a9a2fe22369c4ba113300d208002e336b890260f6955aa2a0f790b544e52bca8af2363dbfb488cb8853c4dc6b1631e72422120181e4994aebd4ec2bb5abd0e954cd77767654b05db3c56fd8a91fd2ced2a4487519dd53c98873cdbda88b3a11444422cc254ef154c511e697e4b1b42ac2ea112d98571b8b50b3962e591bbd42afe211eba1594193b5dc865d4d4a4cc4539615fa6569b142d743bf1e9a4ef8c8f598f7b00010635e55cfe248c9eb30b236857948be78847abc153a8f5731e721bb8c1e4d1d233b4b8fb4d0e9381ef3da3d5a9ac4e353a869b162628e232626e68dc6cc1923318779cc616e442c623d66561cc73183e34b678ec45f5f3a5324e6328f9939f1d74bb444ad6f2412730b74ce92836316a11e4ffd138f5c0751bf982597c22cadae8e45e2a9c7c8ca8888c38307000010895816ccadc94312f1982230a7668d93d3e8d17418eec268a65b1c7b87d14cb7e9c676b018576d1e35a27899b2858b32a864e92e9a54390d3a7d3a7be91d56339dbbb01a359a44bd51d386cc21b2f4ff3b4a606f7a6e23a0f296c8449c39f1d4a9c95c7a645ddf5884fa356bfde3e432584b1a4dfab4f1e9368c08f9001e8cd1a3dd42a70f219d34d57121a493a6385e71163683b534897ac88c1e4dd53a653df41a5fe1001d264a93a65f303007c1c0c0bc5198396304e6a0c35ccf118b508799d53a95a547d3d298852edd48bd9ab176449c4b3a697a3dcaf572f50e9dce3b30bf5ec59ed23cbfe4755d6fd4af330d7de311ead774d27426e2c4b95728ea884b946868ea8844286ae658a7266b9995cbe8d174992dbdb3639272c5dc3aafe1a549d6a75733d46dda928deaa0749c2feacdc35eb234290a09e6d47734ca5e9a14fa745ea349a04fef9dcae2f1289d28b16e9d8734c2683c8c5402f3992516d328676ec9a6d57237686686607b14d3144632dd21975adf1171acb9978eebd021ba8e484424bacef4c2f1a5393e137172ccbd70845e4dd646d06d3a87954336ca11c779e0b8711e91c88d1b32672a332b531b33e73a752e632313d759c4a17e3d87faf56a5a3b21c168a657cceab83d8a997ca54757932ae8b75bb2b6da683c258b60c04ebf4d28db088867c16fdaadb358848a32f416c68c11a6f14ce32d5973a8f7194d72d2d4faf4d6d224984fef2d4dba3e595f0af3197160e65e168c75ebfa2391eba2ce949a8c2524998c1e4d07497e428fa653927b7a349d897079e9d1c46bf4288c6b7af3b01ae6e1692fac86a950a1137ba1d3af5c01e33d488ad30aa442a58beed6980857651e3a9d799a447d3a47e91a2837d3b71940bd3503aa5387cd009edf7c4edd6a067c4efd11879a7b5d4c9ce0b39945162346335dc468a6f35c461384d14c673281bd39a399be64027bd39fc0de54ffbc22f1f9def4eb884eed7b53bd8ae8f4aa490c309ae9706f5a2ea3a9cb65ba128c66fa937b53c9e95394ebddd5cde2ce53309ae9aeae1a74c282d14c33d4e50cf5f6fef482ebcd19eb7bf3eee68c35679a789fc0debc5b806fdcf9c6bd9a33d467ce50734602fd760bf0eb7ae19b8aadbda9d704f6064a3b9469e63497219e74894949c0d20525826e4f11d6a00b4387be43c30ceaeb0eff84228041b7a7085196d564f139fb7ee43602e24626dcccd9f721abc9a27403198d8bdba39e4c2c00656234ac7e6e81d0674246d347dc77566a5e33a74edf1ec9d08e47dce1b47ab46d4266b35e54b32b54f2ca8256705655a7db557628add87897b90e13c6141aba1be226751b92e73736beb26641970136661659d8f8936d04c47c1b019189cfdf5964a296a8ccaceed6ad776402e657f596d186dc9b1859759ac2ccbabfdeb3ee6c520afd970ccded1168469da6d6879239ec4ba173ec1c75b3b679b1d685f62ac4adb6599b94a8fbb302fa93629041dfad576b3169c949365987b45707499edf80becd00d0cc220cf62cc2e88398b0fe5eb11013a1c387664e3bd5b247eca1b399d31e7a1b610f4d1b06a2516e8fb2a075ba55c98f34024f2d6d4d72b2ed4ba7c6b49d69636f9355acf1887185f2b674d29394abea3465adbbd1763387b19a05ed467be4da5c9da629b8647ab4aca6bd4277caee64166138e1de6616ed2e0bf76534d3a7195c4b960b65df9b6d0454fe9b64cd82ea74937b23c4f688b1055d1d47792e13e16ad65f541db8f87bf15651a38a1a28b72a655431439533d6b8e8f684b1c387de0315ed65db1f3b2b706d0f185d68b56883a1066d2861f06720dd1e30b8d09b6b676767e74610d59210e51b54fce67989fa3cde43fb3d8eb89aa23506b9aa888ac0a042fb3c4647ac88cfb4a8fa7ced5beed2ecb471410963f94f9885a8b6475d2e47fce0aa7f4093982261066577a2497d7eb323c16ad88b8b67cf518f18cfd56c46ac866fd883c0ad293dc1056f18430c6ed8c9811c6ed8afadd9358cf00430ec10418a16326ed8455bd38025fc404b110061842928e186fd5bb3801d3d84018c30724006196ed8b9d8a0da23ae49d689e3900927140a39abc5aa4ad85628749bee7fbe9b047ca5ce87a940150874484173c608e8d741bfa658e41548e64cdc1548ce1401fdfa55a22099133a48ceb82fcd092db5aa53b761546dd29aa6e9969c7026ea4e5686a7983a22168b3855252b3b83d3597335c7bd7afbc25961f5f78ab9b2aacab20ea935678c5807dd3a62bd7ac5621110e84740b76605bd459c23d741b35eaf986549d03be25807c91c784be644eb1b714020799d238ef590647ac91c7890cc71d64172690807749b06491c784be2b8571f5921dd2a4e8e1f58c18a5ff17456bd6269bd9247f8d6ac39eead9239d3997bfbb8e734ab924c597467f78afa4cd494e911ff49c7e4c5961442ad6ba0c0b3e0377086d17d97d34dee98a65c7d9cd6d87b156ade913b01ed337be7c8443b2f90c6287bd5acee9e4cde7520e5fdd1beddbaf136069a3ecd258cbeb9fba3b1f9844baf9995f75c3b99eb726e69f761087c588366631148675562e50c3aa2ad390d5a75fa95db088112cf490617a4eddb63c50cca36cca6790b06d25128dd0665cda9583b944b2b67b9b3ac9c44367d80269d3d0812d08afbc646e5268c2a1a15da72b0cf132ef574230b8c31c61873ad3526c335530203e9f7b707f342b5cbdc4e9d483bf5126d259aa4a46c323244da7b59db6ecd0daa25c6dddcdd96c8f4eeee04fc746901f731ef8f7d89b248c43519e7aa1e3c785091081339f1ee3e8157bdf7b92e086124c2d88b383de94e914d22b1487fa15464fdf69e3b45226cf27bdf27b25324c2748a4328da2c0e69daaf4216b33e14ecc78d02d512edd94a8c7d5850cd1461b71aa3c2a8d03d3333334f0072e142f7dddddd1398fa0ae53d638cb109bc2e5de8beb5d626e0c8a0bc77ce4da0bdf7e204d87e9ae204faa6bd0ab51757bd28c33801be691f68a5d9dcd93dfda19a51626987668af0f744f8fb12ddd868303b83eedf8c04a6bf3be1de3e81bd81a2c5c47f5ce85e8b3697d154b6852e11ee7724e2d845a435d82211a6c4d2751167e72483abd1cabe40f9957d81ee5d24129a29424bb49a5e63cdee816a89b29e4ccb645af6c7c6d940b8f8492b75b3204466fd282f9a068c0ed15c710f5d07c11c146a0f5d72194dc89dc58e528b963ecd17345fd07c41f34583ba6901445385c60b9a2b345ed08031bdd25c79efb5a6450bd5af2e0613dfb3ea80aaaa021d0654815e5d5309d3120a81aaaa9af5332bcd17a28b392254a1a942e305cd95cf36c6584de8d5882ed5082f94cd3abdf5d452bdb1598df012d9645ab48040538b25199b3a8d4e9fb33749b9aaa98469a1d3e7d3f8143b639a2f68bea0f962fab4c68569a1576b345568bca001a3d15ca1b942f305cd1734559ae445a301a3c5c4cc4a738582dee83bf5189843562373985963a6f6aad31ec3184dccac3acd882e5a2e2d4dcb25b56869a7f982e60b9a2f68be605a42ed563071e19206538372f579655bb450551ac86210b47a70e550538f0faecab8b09aa98771997a28e362f534291e666912c80c2dd319d3164bce5aa2f122d254a1f982a6ca34c684652263c2328d3191518507ac0bf342f3050d187022a37b70f1804d58581a4c0d468726ed8175615e68be602091e60a84ac4b93ead433f54c65302e2c0db6079a2f18c8a3f182a2a95219179a2f1a85af3a8d5a1fb96c569d468de842b55038b568d1c2b8d07c31719958b58599c5e7e34abc0f30a21541a72850f5dc59ac5ea10f311e6d3b4c8deaf9b8721f603c1f603c1f63bce703cb7b530c2ef83e7faf4a1855b1cf54c2bc4c930f3144579bbad07e3eaef80083bdea034b63930c6be6a5c64009f3c258655e5e95302f2ca7c5a09db10f317c88d1250a6dc7c7151f604c970f2c3eb0f810c387183eae5cf701c6e5638c0b0666561f5828e8dd519fe0a7cb3ae83ec4f021860f317c88d1767c8085b2332f4d6a676b50e679411d34ebc316d539b872209cd25d5cac064e6134ec105e3c1f38057201a9c02e6015e805bc429df20106f471054e1f62f8b802a1c09d49421eb803a1409eaa75c06ca9b42a3ec4f0310605799a54b97370e1e09aceb4369e9d16a54d695c34a98b56c587183eb05054e369528553e014c8459378d85b14d6850f3118880f30a08f2bb5f1f8104309f3426b9312f342f9ccbc509e5509f342a7da787c8801b1bc000b67582c041ed6fe9b5391be7b6f376bbf31c64c83e5e262e7e2ca41b7070b44a0ddcf71cd411953a9b6492c97b2d6de6fcd9ca56b80851ef4ce0aa5492ba2ee3dde4168076912af71802629115146825a99ee9e88dc9b3b7743a1106e8f46834ccdfb5ec4edcfb94f7f723215dab8a940592d7b052e6c2283cd3d0a0d5aa7e7de999cfea636678eb019b11a08af2a623d5cbb5a9c12f6c0567802ad425d85720b2ede3be790b01092cb7cfa346fdcddf815674541493d5267d334bd166fb453956b1375f828650530e8f658a10b8a04dd9e32d2a016193d724f6858e828592ece8b1e39984f52894521d4f1723197e7e0e433fa70751cd294b7f4a8312faaf468cb8e96723132188457ccabc8312a3d72675ba83be89551a1ee6c0b43837169527537458fdc5d70b1bb8d5f8144c64d7e13ac8651992657191a239934185965181556c35966880a6590acb4d0ca5d50f7a142dd2dc9595885fc8a9ad496c69ab5695013938e1a0303719fce60934d373a6a0bfdf0509bae2676d8d83419971e31ebd223665b181a5d2e7677a6c2b6506e7792bbe02a74db0517539e39d30d063da1fa7c7b54b743fb95b3203cc780795a04bdd9a6f6d8c4a82d4d9ade22ce248a61ec15b4a27cbfe4d2e94cd659e7560a0daa59d4182a46ab335555af318a992b669389f746451c3629c82834c6c042e0a7f72ae655ccac4d1fb5854e90559f4230acc54c23d31b648cbd4da7ce6021edd3646a0bb585f25d4cf529861996764ac6c69b66cc5dbb0c353ddaa062a8eac30325d3f7de7b5056b4a2884c77ebe549ea0c06d24e49160f2341b7241f5aaeb370a1fd4b327d8795c52808e7fb04a191e9af5199e60cd53dbd85b82ab1381261cf8193b24f0fcddaa8b4a681169bb5093fc618a3a831b090cab551d934360dd8dea8d04785d1f4df649ffe4e4d23d3dfa89c0a6d6a0c0c248d85cc594ee6ca9429ec3016dade2ab8dea7d7cda2047b830dcaed516b29237a85b6f3e1b94a7bf57677c29dab8e588dd534edadbd06a1ad22415b3be7e1aa9b85b657a642f7157edebe44134d826f55839f754782ee833469832ca319d1fd36023acab56fc7f2844bcc5a19ba70e9d2c3856e8f14d2e81e2a98c13eda1e355693c5fb4e870037dbd5a4bd584d167c031d479c0a698325bab1cd4ec175d1ed71431ab436cffee0776b8684aa8c335afbd5249fb115a5471384d2e26120d319db78c49a1793b0474328ebaea3759b76324d5ada44b4551eb49d92737b243f9f0fa8aa4055f5393f56acaa1a28cecf23fb444699973537103c94eed39db45c3549467ba2a0250a60d08e4c50d37a35c58999c8a7083b3b75a6960dabb6196f03f19f25aa185ea91e17da67d2391b366c4cb292914b6dbafdc6acee4de64cba3779e315b398638d796e34e76ec85cc6c6b6cf6c5900717d5eb18803f38afd70ed6859de43c68a17d4c60d1bd38ad223877383f5c00bda97915dc58b2b8c06cb55c58a624d91619ea66e30322ccbe29191b1b6705b1c1a32d2b52cec86ab760f68bf3232287b02eb6164585b585b5c313d60cf72950523ccabb884c8529913596ac3464ccb62c3860d1baf5a9698b661c3c6accc85153910d78d2bb1a8cc5b96267d4e8279bf69691265e3950d6943b628734356376464260b3217376cc8d8909179479c1bd3ea918ccc6dcc1b32af6e48771bb2f2141b3c85b2cbdc9895b990b964ce64b528b3c1224ecc2b1bd2ddb88c8c242273991b3232737bc46cdca66d5c6730b299d1b4f4e80a313268c7ae2243b300e2ead7465da6dfb654a9e245cbd2cc68684c1042e8183bd55c63cc3d2e5c9a180e3bc0d0eda1021a3d659441590c747ba850075a85262dee46894298db745f30f2868cdcdde9e24bd6fd1d5bd7dc57b23beb0f57856b6ca192ae15d650420b7aae257ad4448f6c7af4801ef5c49863d52759199c1863cc31c7d821921ef5150c34693a6c56289edf505b9a32992fcc65669cd223f73d8b3830b3e1b03ffa365d8aafbca5d5683af41ebcf4a84fc95e433228a47612bb1ab4231738d741a13b379f16dad4fb8281cd9d92db346ed6461d9c5586bab7bb5fec95f1b2f4a85f4f8ffaee0acbe1aa0d07daaf6d4ae3824a9366dc97d6529bd2a4288581b033c7dae1b0496c9fd1bda51b8d6d2dad85f6778b1bbc705645592fde5877f61d979b0be59ae608fadb237637ab0e65b3b2b788e3ded84e1032e8aef42f08a5fb75c119798d4bc65d6135239878a4699b4c70da716464a48c94e9d16ef5ac296e8fd87d291818ea9a568f1accaf4bbac3482e28bba6bb63730c2c57ee70b1b31a1b23566363ba2b8ca61f33cd0a61263597d1c059af6b86da942aa25156c643fb96acb0da2d32f4ca1faee9fd8bd550f05d6568755768df91d1a4da6ab41a4d87265d7160b827f4941e4d6fb594c515ec1b59dbb05312ceeade9b88594c347127d9ae139316f8844b931361e951e114ca5e4dad359184157f3effdca2ac54a798b2527da3553dc7c571699295eaec2e0d4659edb5d7de7b9f4f568b4460053f1735189970b4ddd1a97d92b0479fbbe79c7b93d5a3cf3f77b21d7edadd931c87b4e785c5f6a14df21a978e451b35ed34c93a9b261e991ef1eb14055e136c147caf355989debbd5a6bbd64497e3c268606db44d8f0babb1a04599e3d2e29418711a7c4d85ddbae342bd35f8471d766f3c029ab5698bb04daff11144456abaa691f637c196251ef406e70c75ebee559bb5c87b3bf2dee0e174cd72a2b799d37e1d8adc0d8645c74171b65b3b44139c95df0e8b6181f03a1816384513c4b0b4472bd443ab36b569928d52210bfec5282ca43d0b148f506f964e5778fdc91aa75ccd59efbd75cdf33299985e935ea809e735a34dbb48043e84e3b571a1ec2d0bab692a4dc30e73cc0a655a16ca3ec9188581b45bf2d9388cc421abcc0d5965688861e18261a1ecd7e16dfac1f7de7b73faf560a6916bc6cf8373e67abbabd254b8785e584d53b99a0a65cf0b7cfb5ce6b5a35017f3f79c0fccfb0e9969433695cfd9e7b5af50f669ecc1dc85a44be3d14b329d1e7d4b6194c2423e0f36f806adab6baac3a9643a749f5e73334a61206d3e2ff2ad61c9698792131439f1301af65745eb236b477187135483b23b4707c7a54777b8eaf3425f1d17ca1ea580e214188532f7094a935c9d78287b057a6fda6952737f7f5ede1a4d02c1294fb804d93c039f9931ee4f1da62d87df181bb684f80be562ba978943da755aa647ef36bdaf76e756d69b3a4d712c86d3a769857ac51d3be23c2b2c816babc0842c74d7a05b0532cca0a22659a1eecec34d96fb7b8f71de9b9fd52211fe74c1336a3e11dd84319d0947dfd951085dbb58841f89f03bcbea63b1dce95595b5d3f5ab966dbdf79fe35263900bd51e714d3bd4bd5770b5b32f21d2d5bd9a2407e2a215feed3c288fa7492e3e4e5186ee249aa6e57698dbf9bc6a9ad80d087a5555563ca49e3525ca1a8f589fe2a9cf048254fc7c20845443083fa0e94d2640ff54a1f81e27e601bd0f1589840ead69ba15e58a38d3831f49dd5a8b67b2de27ebafbb7e6cdcb040bf719bfe48ebad6b646ecd6a816e4c23705a13f578e6a6e9d3f4a6bf69c5290a154f4522373ecd9ce99fc31b9182ef39704cefc65f0eea3d1c14bc41c5584fa0d5241db5aca951eb43dd451ca63b7640b7613624cc6564cc2f191f0acdb6d36d87ba4f6f62201008648142d388059233d53f8f673bd4591f908d787124027a8e3543a0db9831b2358d35b2ae591b687ac8dac2599365599facc97a3b5535abce749b869fbb1dea5edf0e75df06a7f5c902c569643a087ea6595596845112897fe7f7fe1ee75ad3e7b7b6f8bcfaccbdac28d567b6f7779ede9c7670ecc1dae20a55bf09273609f67d19d472627ff027d9448ff8665fb197abae16770e54011064b0974b498fb63fcdf6aa319d1c6df2f349be3309df1eaba9de9f15d22b9a867acf2e7cb8a623e951e34c538a1e35abd92994f4472a41d2af38d0a466d1e5612de230268dd6e7e893eda2eda015f2a006eff4a8ffe56277a239002b2662f339a15a9499f2abde025c5bc6162d747ba8f004ea83ee1556e0060a9b64450f5df4e0055a397e5375de6ab22aebaa1af54a5a81ff50f3ddc521ef3d9d45d86f77f4fdd149362ed2b4ef240425bab467edbb6d7fd2b5e6986b41b51eb8b60a6ee8d233851ecaef1d4c88f4db796ed59ac4a45b63214c986e6b9bc426c128fb36e9a85bd29e71a920e4f798fbbb0f31f3c3a89c55bdb2ac38b9e622cacaee6c59df584dce8a9665cd4f6baf4a44550913a0b7dab088333eb68874dd024deb7ca4a26ef627127977c7a2ef65f91de5fb96d2539ac4b71c8b588d12a2e3f8364906f4cadd7a47612120abb9a0d5dd7d7e04827a0a7532d5a2d45bc79c9aa03375cab2690a0b5613e4c63f360ecf6ece509f1eaf04ab4192e3a259a1e86d5a967b4799b1a7d49e42e3df734d9463caf14bc248c47a4e352b4f96fbe5727ca6754dac7b4020100844b529088e59e18d29336dcc7a5110fc24f97a484656037325580dcc449285cdcd42fb20cb7a75fe9c41ff4c9be639f341c26ab06034fdd0ac97172eb4df52605522aa8d56cf0151d5b16035ad6940ef1d0aea5f3254cdda24c6f8914cadaabaa355f5b1ac96c242e0b3aeae61d3795639d52dbe11eb71da34436b4228ad57a150c4b1c2e2595a16e811f4182591cfe35b34f2793c47d0e7f19fc7d9314e223182e2dddd638c6cbdba0d6b290c049ea50d83df9642c1b9574fa1155bd43a09ad29d3132e451c2e60be1ab3e08a20bc508b860eaf0645005d2b0802cb1a6ad08a7e5e458b3a6c13f23c329da93707df209c947367e27317620a297e3511f6ac5c7d221108cfbf220e37157160fbe753ede95de9747533346b770de86e4e9fc357773879562767a6b722f07c78ee734f8a5fb9bd72144a7d2291d079e6f0dda95083a1d0ac8d08fc04e16b31118762e93e9fcf877e62918abaf68fe417719836c9ef20195f498af1077e7a3432cd6a56e63953dd9de2bbaac47a51b6a679933fcfb1e6f499b509758a7a28e2504b1fad2453286b09e8f47a023af11147a7bb2d5888838710f229231fcad33948519208f5a6ded4fb7d6a42c86e790bf7e7b675899f74a962a12254db2436b1b37b2576515a6be9dcdb5bb66bd624f330e7bab176dd5fa8aa0cdd76d8a457d37dc9756fe798ec29ac967a8a9b5589e8c933a633d95218c8bb3b93af9ac566da7b0aed1e6ad395931d8581b0f66291963261e38b7af498a1a13a7743b86fc96fbc5b75baea7eefec98a3506ee95a73294a8fb8b9c44fb8f418e3c14a68d33b6b16b45a15d2aae47cf539e22811513ebbaeb67db68f327fc142f94cb295edec87cb4de91173f102ac2da894ea144c94414c3ac6d0cccc8c20001473140030381c140a06e43199ae2c3f14800ea9bc52669d895910c31442c818438c2222000000004010040011f6a0b007d7a5f584f129f03d04f8ce2d4d3d42f33068039bac02b45d4725b8b1203658d25723e68db392f8a47f05b7c6a3c1c8aa0a18e8493d1b1a8c14450a520e47e9758a8355452eafe91c003718f978a17be60c0f1c787c74563cb5727e28c5d1d2a5864b4859f221bdc182fe95209c135e556ec29fe0a420ce99ce866cf842131bcbfee74c9970b4c8c6b6b965e7a61d548481702da302778c830cf9edbb47bd9bff8945e364ea887b64df317c8451c292381d3f2ff7f94976641c764be84e6604be3354acb53579abb45111de9089a9cf0a993a1c9fb6f4ac4f8eb47bd5096910d5210d7776b7359e7da3841f0025def2e8f0ad4035a1adb0f447452aa752d8c77572fd08141b88ca785720ca18e9b64ba2e9c41db93aa56fec6badba43a738b2ea4dda89da1b6fb4434e3627798c18cf7402958c594be7e570c407b2c6add3407ae901971ca69fa44540881144a4c33464a09ee073a7d7d9c548194a84264496417e16abac241844305fb14f7231b79f46664db83cc02248f951f37f317aec7c660a1273fbfc2b75db7dfd444dec04267c4211ad9ed256d111e7a230a11332f1099a8dccba1931122a548ca7e030ab5b9d35fac36ed7a95b23b443adc0da2a3da8956709d9cfde83100e6d5d2612d1077a83477ac4c25247cd5e27d7e1005552dae57a33badcaa742e5074fb05a75a9bcada6f803885f3800bdd36687e5af11cb319d5ac8a3002b4be4016fe4a063b2d1600593717a796724541e0580e38de5fb1c1a9838a41cdebeaaf7b8806dbb1d2a061d710cd34ebe4f3465922220b03a3da2d3791136b344c0a85f95e61813fc6aa97f8dbab785d6715b2d1a3e6d074eebdbd42ec3dcce03428dad057fe22b616ebe6e1b83aa4e038851e52d15521b1f7338b206fb6c4639dafc510fcc626062449d93a644a0ac7ce3d53ab38ebdb39bc957da3c20fde153dec060e46b0a5220b98e46f9da3044f6fccb4fe7dae7fbfc2eb7a58955e3e819914ac842aafa51c5b45cdf0b1ca34f1d6c79ed29c840f98dc4cf871a8ad48485738d11fc1b9aa88fdf17186344f26520a1e8e9ed7477a527240ba7525629cbdc86277f82fab523570279807fda0115c0f06ef9060e7b1bf6201cafbaf18a48c2f9ee911eceef0e932022e10320383bd81faca832c09282edc87c2468797c3b818891147053688b4e391bb686a4339d7893ad9242e428fa89d2f53b8f567c2e0a4b2e54c3e09ced8730f543a44b15bfb2cf15c591bea4bd901403efe31718e417ea44ebec79a2a512efe5e379981ebb9d43cceb10536101a5b6fc5066bf8a17440b2531b1af904111fd65548458ab534084370ce9dd42ba76ae040fbcc2e85c1f44677ca93e0ab2e60265e1a45be2be9b624a00cf709769d288422057a5b91391cd1f4bc1d038234fd6dd9fc5603f64783bbc81ea8b794a1a7e8b624a8cd54fa23e38e55fb784eb5b159deb1144816500e744f63f8a91eae07e0db8eafcebb10a7c833c5aaf6c6f5934c14901bb55fc24fdfba0de8e53fb764828c39e4368b731fce55ba811d08df12d9fcecc3f96c7ad8b4946fae96a6bd0cf7e69a591ee4605bb4cd522dcae57b4b48283ecbd6915ac724da5fbd8a2bd54e08dd6ca385905d10d6ad2da8478836cf85ad9a4d55efecb7f43df7cf7ac8a7172e248997e836098ded6c37249a736b71efacac7765ece49ba96badbac5eddce9c41f916fc59eb06c42c4cbf6acbf76e516e54c90ae3a3d064b0a6d99dfd9d3eba21ba028296d6c03b0d419fac867d89d91ad2b4a1e6ce2496a6c86fe51d22465f7a754ce84e696aa9c7e7f57047355908f3cb5e8cbff045eee8d76f7f0ca7f609a0a1531483749ba860499f62db82de841a3b2e81658c03445a6643dde343910cc0537694a535ecc7cc08d2537b2774b9f3465c4e7631cab8b99834953dd95637e9dbcc3500ad6b8b26569bae23b9cfa2d7463fda4037462071eebd905c52158e8a18c7ddb32bf4f2b0f531226ee8a731f645315afe32c58bdb67f1474899f4b5508bb4c5114e7c3c7b40be0e88842443c9d628097c525d5057423f90b21240cd2d91a75bd5613b4afa956fe24814c97a04a5cedaf7b569cd104ae652d1dc6e97a9837eaacd4706cfab4fee8c3053ec331f7824d6f4f570950d722ceda7deb395239b5d450fd42362d9304d7b8a00518cc7415dcc598eda1e0048a1f5ebaca03da5705e5b7c981b70e329700bd9e51c2cb52b0ce2df2dd510addb0fa6359c2721997e723ece818c300e4d999a41e4188f2f6cd636e283b9b9064381453f26330ce5113d673ed5e5a0c941f6d6b0a2bd5c3f9a6fbbf0b61d5f5ca6c5f3168362bfb1cf58b8f3790b3f5a8e416c2ad6fc2e25c1cac09be8c2f9969d8a138748883b564fe39475ebc602566077e9dc2b8b1715d508a162c38e6208978d66fd964f4579496eb88a91901a06a14f82c755789ff223431776cf2d80053e4f6d8ebe8f7f36b8030d92877fb4f7434defffc6e01fa85f4ab49f799c9f9f1a568e286700a9bb4ad1f000e113619e6a3f46676cf5631700dede6fe3eda5704826003b1eb367997ec7231ac1a35193e7e5ecd1dcb3f8478cbc7eaac1ba328a6c82eb4cc0eccd19622e6c64e89c37f22b3d0fafeff243f277731c87877e030364f6146b10cc990ac2319a4afbf5a8e78419c1ac967de9537bd15016c97c1da497cbee796ac5bd102ae886d2b57c21a885d741a2f0913da6976a2812d22e45a087f6ca9aff689b171ee3721f8f468b35cfd5e11539fc8c4209588103b0b2d36555d96554b7c3027f3d590cf1f02aa703c70aba001d599436f66a108876e4b854f8309fa068a90fd7e84430800279fbc1c986c1eb74b69f5435d1399566f2f8881ede5c4d512656b20c71440c0acd6da95b20728e47be0a966ac5c636dbde7b2aeb5ab96af78d1365065dc88a82d4b8094e0570ae805a5467a20b5920bd103c2aa541ffe2501060d3c8ef39d54a425ab63bda8312ae67fade4d48333212a0cd6fcd959a3df97e17ad7d754657515267127a37eb9a74c4b2200862339df1520fe6f497d1b89ff18dbd9cd4efbba922de9983f4d0a0b2988a31acc49ae5edcc8c617869cbe5d55aa2fa0e72b4ca8be09ad00d86f4241caf618a82cd90a12bd5a692383aeea808e40d3b938b0369c228860b8ab6d886b0fae294c050d4b184de7529f746c534dd5a0fe8936551ac39dafda0542de7e42b9de5aa32f8226b5db0e414dc73a9809ae2a3f60599ed433b20975ec46db3e7bfd63a53795483204d42d2686d0d24e015a41331debe6db5fdc0f3a8bcadd28b21c711365676e1a359ef114db61692cfc37695086d4fd237daf7a98d8b338bc16aad895591a1ab9f497bee61dae4afb2d0e1c29e6e05758231961d7a15ddcc8cfb5e6f7d5bb72c27aced0e41a92b7208908c647b6338a5f6ed358248c1062e5fabf45d250aa4039fec458cb49e17e720cc5244d627f27b10f763564d4280089a40ae177ed64f4286af9e547168ff79bedccbcf934928a39e408874b90b00a6f258d2cf6f201054adad01828ea50a96ee0f7502f606e3a654f09b12369af0e76dfb47580d4e42c7eea48b569384262971cabc1762373a0e37336aa394180684340a3a332e94df2c4363f1065f69e696588337d4237968fd2c858b5e5e981338f06df7205017e181ed494e2a51f054ada325f1c429587e7fcb9a03b813643308e571a06d3b057ffc1a28c44f0ba0d7befa88ffdaaac2ca91e51f80fe8317f374c5c3573c63e7fc287cf8ee4bb68a133c33a6e2741674eed94a67c60006e539e18104acf46636a8dd9d0dabad5faa610d90d517e1c20ad301c81df01eeb546b8d40e7c76359b76b0f8ff00e7f3154e919b38e5d8b54b311ee1211ca786a24c3818525408d212aecd79e8782aec35cb9ca02b370267455801ba2a6171ae05462ba7ff8360f39ea42921b7dad82eddd605517ac6a5adff30c35007fe6bbd8cdc6e6c9218776cb7b8198a21dc0ac462a2000c8ea0db99c6e9b348ce69d752b3bdf42ce207a7f7514fa5e7bd9edbe1aa0e95ff5493709c13900340122fc61ded717165b9a40af711de45dd5c1f7da72719045953826d991066593a9110fb0b4da376c31a89a123d3d89ede7d690ecf6bfd3523c14696bfd9ede354c5250474dc3779cf4d1b57d589cd07e05c2efed52d32abffc76d5f56154a438260606571951a6c9d84e77b31470411872619b43a0f083d6eca38b0660c25dee6e020e219aa38b14319f808556e1c10aa6ebb62e9fca3f0e839fee20f735d3dbab2fff41c5b83011742324dbe217dd016e87410b2793bea6f1018aa23f6013ac0b91d3c232fd4a0b883d4ace0a5461203c0b4e779e20c0ff7dfed26bb6960faac0c7c033dccd26237e4e2511644699e9305c7c65b67eb8a5a18b49b9f132a3f2adcef2df24f5844b3756e61d7836a193d55c5fd76bbb59e85ae979028b38fba24f2acd3799b28bcc8141f18350447bc9f5dab3719b1021e6250f3b38c11effca73130dcde18e3c766200b26c3e1f19894adaec6a11477994179c60c7588c0159952088cadad89411aea2516e223a2ca4a74bf44961030dff2e93d512efa43cb8b42437f7b110f0d18ef2a4cf49382e269e3cbc34d090c13426fb2f85de52a2c5df436386f61baa03e17b6cea5797a2e52038319d6f9e8e2c791bcd2ed8c99d147dd77d97ef6a040e28650f4ebadefa57acae935f7b98307ceccd109e99dfa448c62f70e19487c163d02aafbea5cf259dd88bcaf908b7d1d3b49f4b6b72b22032d0f0afab8a35562366f10d1d5a329aba3983513b1dcfa639fead64731c52cda7398a69cae8a9e2bf8c6901c0c0a351d80af0c584fdb7da455426a7c71da0712d7be79262ceead040c1ce4ff51f51495279e23bc8addc02ecbec0f7d925d500dcb3bcfc4cab046edad28e86495d6b9af3d11fac6593779e6efe6722fa0e181929d7b11c06434f1c91df5dcbcee32d938cb95e641e5a390f6581dc026510d64a78f42aa7432aef6c1f803caa4273790a857a544b787a6daaa15b1fa66f78c12a4eac6aa770c0e65bace2df3d03d776c6765ab4c7d88ca09e184083cd4d9b4438e8a8623a97f0b55ddab7964183e759558dbd4857f52ae1f058560b2c7c0f719288047cfbfab01d41362fa8e7f2730614f73148f52fa4c5c19c4348db7106944b3108dc2cbf8700ac95612719c7fb090b0e8538a0df2bc14f6daa3d426f467a6d89860cc66dbe827aef5d46403ac47e8cb7942ffe28706d2db5cefb7a760cc48a336ad8b5a2053dd48fa1d1965a4cf80cea8bdab83e88aeb146ad76dae2546d47148dd3826d67a69fb0d0cfeca7dc19bc7158b5a14b400f1ee8a792c399cc6c19f52ee09d3e1f460d927abbfc51320289c4191fa1177b8704518aa04423daa496c851e81e67eef58b86186218082b887d310479a887cc6e05ce4852c8a91e5a5e8df6c3c9055c440074290ac0b185fbc5cc1ffd236a24df4e41a549e6dd5139b2d5141f829b874f015067152ab509c12c6ac5b340dd5d6165f06cb17f02127e1ca25559495b4838a402cb0828c6850e500deacdedbf69b3f51faca34219f6408d4f570299f7e6e8e988444ca1decb2fc188b28b9e9795a28a25138b0d399436eda81db864b737d4630a2ae6a54d5d54f1f21a2b7925c2ce5343d925894dd730537e0797ff173f6b06238bd36b410403812fe948bf885b0d3870a94194a5234bfd613b9c68ba8527fe15f76a8407c8ac72eb764ebffff7b3c220a6b6894d27783e2a789f914054ecad4348f5feb8158742d8b5ea16134acabaa12884e7946d2486345bd3ad3d879b0419f37cea8bd720a8e9ae816578c9f4d25fe023637931ff6eda4a8beb1509e4e654dd400b27241e57bc71e85980c4f6eceb8f0f4165cea101d8689144517a8ba7addeeb876b61a1d2ae121045e6e5fc7160eaf870cdaeeed927351fe73971961a4a33297291bbcd4f4b27499a54e3f7b7ee5732f337f92db441b9e602fe5e3941127779eb35219d021b838d4bb41b1da26123d92ab32ca76ba6d62a80ef714f210e5f5ea3a80919daadc7a0c94efb3587138c88ef390bb3cf067ec854bfd9109d2531f5a611a0be7bc12df71db3563d0575a0a63c65c7a9e27aa454d6b6667cbe9d99948b0db047510f12d98b8554a0ba28d942317942afe054560df17d7c788ea7f735136c7322e9483b9e9c07c8ffa2ce37ce3fe905e2417c0ce3df71d11e3e25e8d61de413917984e9f39628cd959f537c6ae9f10ffa0d03e52a5187009f87da338e80ac163ac3a0a11865eda38a799c2054eeb648e5165bf17c64dce3ccabc159efaf51038d8086248db5f08363932bbd8c0c0fc55aff1a1eb8bb9f2c4aef8301cf40b17dff2a5f79ce79ec4d5e0a905f890a107e51e37046b1b1706419705d8b17f2faf2ae3b7ef8d1b767c5f9be6304fb2dbeb481fb8192a7988e66d406e8be44e62679bdac462fe08d2dca1737918ab74ab8ea09c9ce4220213b10b079703748e146922af26b69d1a2656594ad85d65ad918a8bdf821a04d4e58ba8697fe630716339b1c72066a8208b050971984cef4e4ffe92b8616802531b3b8f27a496c964d4dc8fa3f752bf57d81001d25a8da5df0119b67acb559ea5422e1f2cd4f729491e05345f02cd41610bd9662ef54b33c6b3844923874af8c645abf20d2499306ea78be41d9fabdc1004b8a7cb45b7b3013d0deac7b6dd5be327827a2bb8e80813a7a74d5f9f2ee30696dac44af6384df99894fd9fb7a1176d3e3dd0bbc42c2fa2049a7dc301e4fc3d5a82c2336feb0901817ba62bab9333072ddc9a29cd17f70ea34e72e015a49df91920db2639a67792c8b4f0af56738ff9192b4a1916bba29915b0197ecb1920abc8eb5dff16b057af41369cb3c5543b534db7f5d341f13cd6aa2ff15ee0eafe2de479156c2562e9465ce909b0d1a89582babacded1c09b77f4d2b2af638027b1ce848057f16ac6295a3a17a53802f4ec86e25cdb847d2a1be044814910549232a78489baa50364e256ecc0d77cbd6ef3adcec0adf2fac9c392d762bd74466793bcefe43d47fddb20458409b4ecece2b30438ef2b36ccb5cbd8552df1fda3c97d6442c8e12c980f20e049bce18b8dcf60925c8c388b6ad684f5ae9423d15c2168e2da5152389c2a3ad50803a349187df244f72101db2caf92f99c7c21b29794bdf47b94feb5863d62b5cb745d32b06de7f3659c6859097491f660d49a6839d74246840cfdb0b3c9e77ed67209807a824488696cb9d8ad5c0d6322d71985da2ac83cf641ac6bc661d5655665f78f96459c2584acba16fc4ceff89f918fc249e4f1d808793ff3196bced3ce179516b8a73f2c6021525aaeeb0223e150393463f2a125c421c414a3e36622d1741e80cbf254d4596d9777bcc3fad2727909a40738215190f17dc358a7e7023fa4a130884bc55c682fecbf37fd171244dac820911e1ef95a9cbfad6ced5b6a09cf8ae13aade0518178c89eacc40b0ed0157133bd8186f9cf8105cbf6c7d14a81baa03eaf5c04c2f047aa414d84b77250d1d0f9571432d97279e2cf7eb1ae99db099f30cd07c462a9400383b7dd5de8ffe2d7d383d2b21ad94eb0fd0755e4029966ffba0973b7ca8a6e348bef76f203f7d6e06d3d4338ce631211f87648c7bed5ce716c98ef68cf72f99e65f78094df2f417523992034d5e0df069a4f93998d1e02a5721003dfaeabe91c6def0f5076529c16181340a0e5303e08f1c54df09d2614084f0ebd889d3c19cbbd82a0672b9770b56bc1884ff27375ef41360da33c5fa1b913e8a51635122fe452c287059fe473176707eec1c80bad9a301b042f0af7163e50c5dd36b12400b700961994c4e4896646d7cc898615f7aab39e67fe90605a64acc7be386fb9819cdfc56e6d107c73ef55a06b3b8604a04cc9dfd80640ca1ef6c49bc4ae98ad390a43895aafc0001c3e23f2682f02145f5a9c8de62835fe44c84e85b18cde92ec51fc28a3090c1733f841c630085b940ecaa74a446cc67306fa68212d1dad5336b13873876182aa3742eaf88b4734c584eea318adc38584ddfbd0a4b007cecf84266b82c32e22e968c1a27430c10531debe6daa0b219605868f984c033291353c47e7c9a218640e9706369af061fd2af3f72820874af162dc5a370f4a782d497902b24d67c748ac227be7925f81fcd63682e15add49b4824009081b28a0e61c1b53b4366bc0209eda92df602ca8cd362d2c1a30b695dd8cea5226a0c9a1c4ea162bed283d406b38d9cfa958f15f5e82326d7275d5c9314dfa68a55047b835ebfd0c62ccd824ac4d8e88e8926361c83813d7073caa07d2e3c5a79431f8f7c624b5f2f6b344a2b2da45628961777e6c16568788e49cbdeb40d241fe0410748b6942fcab25d0011e65be06a737bf24318d8c1714c15c1b99e6a3f1fbb5d87dbfc581ade8494b64f6d76ee14363bc663dabbc7fae507647e403b1275e48c78312a59b8ff2a863bc13859c2d698fcd1f2d78f53f32e70fb710834dda860b5df8d7b83ba06d9ca4544e8996044b5e41bde2695386f2a2193e530d35e8fc743b3e8b839cc65f3c1e11c0f90f2efc0913081dd0943bc958ad30494f0c1c53dca605a2ccf112ea02d60181df93f0316fcbc2c441cc597c7fff4e34288360943f5a54cf6d63803af68bef447a3c949dd8ca4ea0c3888a8b149a9022c0540a752703c197a7363b3a752bc3b4de8c471d12de7f929a439913983595c9c1a70ac4549e1d21900931b8d0c492d39acc421eee8b4944b3d3bb2d13aa27f173c47559d8e43f0d2b2c21ad0ad95592ac88653cb18592b36798f68ccc1df97ca82e1a2bf485689d418539cccd2dead1ba050a3335406c231fbd3602aef06b3160e9144741ebf073bfd828cf2b7509c37c42a28ce02320740528d90350dee2175841b689c541450da2729ea93af34817b58cf4f946ac559bc90ad4246eebfc33f89dcf7027f40eefab057977dda93cf6de024759831783755d1d020da26af630267424b2c535de2b1a4f974d3848ad5f039762300708530c94b48ab9f364e0da54ce57ecadd04d3713e0eaa125046e56d972b35530399bf0c6e7d940fa0413f603332427f8ab4cd49035530aabe5c79413a48be0eccf15d9880590440d52e26c391ede2a7da2ac8dc07485588d8b4b2c50085c25774af179a8a6cadaf72b23fbb04920122a78b93fcc62f05696910b1b28828607a86ee6b1fd5a02bc45d84b2be70d968ec9431a020261ea31fa547c8fa607fdc13576774623d461d85e22c8d962b9bb2c75f56278337434621c127c7cb9bc9eb6cebec6489c95c9f324f388778b7a5e5805c45d4162b7e4047ac82b3463a74c2af3e3843360bcc35f283efa6cc59beae4af7d2d00e2aa31c0c07e9b6fd425f2f858d0d5eed48aaa19003dc4c9f2f368734010200983e899f69fc0d40439582f073733683640980e4a1f6d55e9208807957cbcd05868f94979190083289d61d4c9055a8bf7468fb6ab6e495c3e6ba9954bc08988e633a9889e0305779110bdfa49d92f27c39ec835cea9a3af1958ea170191e54ea6493ad80b85c5090531b6908974049211df29ad88c60f706babeb98a80ab1ccb99e2a2f6a203b1a66fcb056a6966c83293e0b111a67a6efbec87d0ee11052a4fab310222433e537a920a44db48fe52f899b99b9a4386ae888419e69b2ad3f306aa3018ea120e85379857e3811820c0af0b61837d14bbabbd7f98e046d70af789c8e6c55d913031415fc3256e8ee9e716363af3d6afd3eb24d8f74cab226713578369f8d2ff84e1681364529d166cafa8dcc484372212ddedca55b8bb73ed3f601bd6db4fe8cee2490bac02a6dfd3ed4ea7142f5265d028f250f3136e1e8f8090e381c28b03b3d1f75757dfd0541133ef1e29f2634f1c66154c6686e1167a099ec59f41e7a60c2f5caafc59d91b4d88d53be40800c6b4b3ad17689fd553af4201042dac6c3fa14553984878dd0feb07fb59c34baeb4c6450b669ff46c325a6fa460a6f1552df5d03e31d4d62bbec9d79ed63a1447efca9391aabd8260d150c2dbe9238cfe6498259e6e34dc331c9ddfb05e839e0d53f4f992712b6b3d7d5d8820c252dc77705ea84b33699affdb9fd1095065095fb2ca7c5edc3347dc62048d9869fa938f0a8388d1bd39a9509020f298c5b09f0f596df6d66c173bde9f3a455406553edd04e4814f9cad5dcde8175c1766078f8c9158c208caba4f9d1ba9d3d1ea3dabcc21f6c1ee2770bd34396ee8ad0e4f06a46e1fc29c8d7e9a266c5a3041bff1280819349831828ace045b57fb05a4dd39a743b7af5f60e5b879bc6890df62b0dedc0fcf63325a44dec917c7e7172e94bd479af97ef14824b6a3bb9bef8b5359ef0aab3071c7872320a5cac169a097e31378dcd77e227b18c7c4baff271cb9b6f00084f904f82b06f95f272ca129fd22827c1e8dcaea3360d16541f105fc830f546686b914b18d25a36008b25b26b8def7b5b72808dd5dc7986cfc188106db63b64c06a231831e86a265f8338fb90bd6e40ed859c838e7c851493f588e2e612cacc0c180c5e8e3f4cdcd6ba3ccfca87af7109b42b780a96d24138e333e74dd6cbd5be5046af16e02620f94ccb61b0fe325920f082080a9931404c2f8fcb6e59545849d883423ad92d7c73e985e0cc181e4726a2c021a80f53a187288d832cca7766cdac9e341c6b775b14a18ee5e491e9ab73de94678bd13690d05e7995403344ac4f2d2f7fa8ee76270a10629ceaa047dbc9c290121c15dabf9846452b4051e576868d6bfd48dad020b78e58ca21485c01defa2fbe806708c345584aeab367e431bd9a7b139fd30ad87b8a9cd554a55c665dccbe2377311423d4e2b7343b7c8bc24c599f46c0c4aa338aab73f6120766dd0e3943011112a9619f90094b1e8cc22dd41bc2d43196cfdc14b690d7b67e4fa32801c24dcc6014c7c2ef3181223ebe64ef0b23d850831508fb7069be81ed900288bf2f581aab85e05e12e02ee0a78c396b7e9209d586dde3981385f7aee9fa5e4e4f9deb608cbf32d0149a36dbc3a76c0369da71044096f70766ed9e32e02f037498013405cea80c79dee249221cf5592a682c8c343e089edc2d6c2091bff0907f16b6a8d35e3d863d56c93c8478aa063ef42bbf01c7290bb864c3c1829e787788a813032d918c0f57c288819c57242faef40685b67ad4a6668886bacef7accbc79d7f8d55f1b008dfe4797d9e910036417f5a1f0301d0c9c62d836045d31b86807d8b736c0c0d9c3abffb0e1deb0ede685b61361caef470049b6e98acad718615e632932eb031d00702addb692811e6c831ffe52fa7f6221c37979dceaa24d14d4386fe762d2d6c0e016ff516ff09595ba933b54af131d01cccaf0f935c0a1955e55e859c4fb5573f0aac9b76c1019a53d6f65667cfb10fbc3cffbcf4ec8a24defa010e63443e1ba7f1f6f976d0d0ef72d1648db26a2766cb271fe797f50f4e2c7fa25773008838ecfe14b0f98e48cbfecfa3b06216c5f452481593d1af96de3a4f29c964dae17223b30511c403c57bbc24cc1bafea9f3605802ecdaaff7d8d57945acb3292550d79ef9983ce96297687a67485f18fd56f7e5e92ef1bbab8d76c34b520b68c45ad3993ae424da8da3af7ef4c65841bad8dc840b45eab18c17d67ec88c97a24907794c5b13fb8e54bd0ce2b6f3cba894ec5b3f23a794a7ac4d4078e16755e57d2f007824cb756ad17aa6d9118fe4ca4338bacc23f033f0db23f95d2b1c1998e56d9b36babe03939715b4d74cef3149bbf1a26ef4cf2cab122bc9d32a00ce32daea70b9b02ce0e94befe7ad4496ff1f3226bd003201fb42f6d4471650774052a35636575e973a3db62331ec42bf9ae08751760b261720805b30e29df323f89a3962f117893ccd9b4af3f070df3a6a2e4f44a4cc3611aa677ca784d9e5f94914c0141ed936c3e7fe4878d39f95d7b8217281ed6825d489a7e2db3009a35680130a1d5d753cb7ac6d2e5be360419fa59e32e03e3d1a85b24b2ffa9c269ce264147c74052754fc03d5f890c884b98bc143e616362138a40df5e4f34f11ed291c92a2063385e86147305d9d65f5618a0a8f52849a9a2c8a07a17775364a95e44510e024db386041ddcb66f4c515d3ac0fda64e45bd5bfd1eeac02ef393dae5cfa68e002a9db2d7b40b52f5b09c025cc95abed882450ee31a6d1f3462f1fdaf699cbe23c7150658a904125a344b7d16bde948596a9c004638d8eb203404efcbaabbc0fe6b940e70acd7124d6b9d1a578ed97e3e6417c57b73401571142043d09d4132bf080ceb6db1b0a0c578e2b91412c930b757e3390756570225696c0df15d16781a25e43cefcff71947b3e002051b496a506add39cc954479b330ae993569e92b9eae9ce46d66650d72b8504f1fb097a4d8fa2ce11f38773e30da8499e88129e2de305076b98090cccf8e7edb3a32f0d79ec20a923bf573eacf0fa9795d52c84181443e67697824f6a8d7974a1640aa00fc014a5b92d96dc4cffc6d8dae1e7a77888500660b1e603c517ebfc123fa4b5bf1ac9b5c450d6eb81229c7b138ed2e65fb84f026a739e194571ae5436266e4967b7c5409212e14c4ef92a93c5562451f0f0e7d74e272657b46ad2e00ce7f1d5a7c795ab063c3e5700a454488f6e30a6a7c60ae782f368eab967087f559043823274f2488403d0ebff369bbad0545c4b5055530886353a7789842e9f61aeb18929b27ceffaf5d06f684ef7fc4f8a9121803b2be91246b3efd23f5351fa7190d3b9c2ef13689e94d1de07c8ff176346f9ff87e0fb1a281c2419af0e7551373f33e1c4fe6b866fb15584e5cea602fafe10fdbdae5f7d03a1abb8e79b9b568468c76724191e4726d85471bb81a5c1f7ebd80b02d53bce52501b24c24c8bfa7a058cf12fef13f07ea420c42d6f3e419d2a674a609001bcc8d80218103960d2537c665509fbb5bed148e510d37b79a24caddcfa96c079b3725ae24674792e4b378c185b2d06c9776dc702215a607d81bef943a4308c320bc1be38f5ec55aea7c558325aed6ef77e159af54abea56fee29b3ee64c48c47edab0aa3ec6f33b122a476db148aa6aa110845cc4841d7f9722fbe867d7fc61bf7e241b9f899bdaf330ead82c4d12a18de506761399624798d95012f0137f228cb462d1b5a87f75f1dfab24f2bbef69da3f8dc504194a303ca7185dc56a2d6b8069d6a3ad3aa7fc6c59d802d491cec2b99b75cc6934d34e1da10fa2504122e05e994852777e236c3e86e36a61f3e30c5ccc900092196dd0bfc716238a5a9086ff49a7dcff7e5fbd1faec349942e3e1c92d79eccb72c222f29c9be87519157f29692bfb6f3c98e8c608ef07a9ef64d2a6620db4314413e129114e29131fa13cf4298160e966a7503047b0c11892d51115aaf718cd131c5edb12d9ee6f077c845a4f1c7d91353e68c375e62581bcceca525cbf594525e52a47bb945e5de5936bc94bcd7bb6ec5a8f3a47c3d9e01f61108de7174fe84b9b7087e8d03621b8dc11905ec8a18de88eca3539da1464b020fa4c65f862c0ea50f5d8f4c0862e8d025b6a691db3b66a09826550ec7c0a05f692f499a4a493731cd503ccd5b0d3b06a98d5f7db71f1d6d3ffed9f977f1ede131a1f08f3f95b4762f661c09c8d4dacdb6a4c0f66c12d967b89be38bbd8081dff394035dbd16abe033b7ff79adf37b9879e9eaae887e52fbdde35c98e6022309fe7c4635c2a874816ea995873db06bcbc19480685d43cc018f73a40d7479d0ba6147f74da949d64d52bdd16c1e0a910bec99b3a2a8679362e169185a323d79a81893e748e0f8973d0729f629663313025fb738ca91acc0a9e463d7b89b719dfef2b35d0e6aa064352fa560e8e3d96da2f408abb37b5ed883721b34cffa3d9c3b8f575bd9d939bf92006625615e19bc630435295a0b27e45fe9a5b6fb2708e5b407575dfaa99b629d010ae3303e4c126827172ad89a40b661b3e5562daf17cd25f771f88c8abd548b43543e7b39168d3c2ddd89a140c68cfefc6dbbd152857702077513f296ef2b44a23e89aa674155f02eb0ac6b5c47c28db87de6f5057646881531f3459849928a8795ee09ae1e5912dd588587904852701d87d8d61f4812a131d9010fdd0f037668b25243e8172185fc73757a5b373880f50614db13d7ff0f63dc9784d3b24b4ad57e411b9bc22392c166919a6b2da7592be2b8b384a71b7493c493063220f00760d04765576047c65fd0510397040b164d08cc4b69a2bbce7115d8c5c915d69896a9ae814428ffac220d1c515b1cca38b4d6672ca935fcb0a8cefb8776871692cecc412e20aaa55f4b209a299a51f0bd56f8223dd3ce6dcd8f3fcd1f0a8d369c536de734bd2e21f57e811be1e565746e231a0158ffb7180545ab4f2ddf4c62eb43a88dfe738b986e2ccaabef5986f708152f65b665849d576bee04e44afba3068fa3165e814e8edcae5596c497ae8ec28c1b7c14aa91469c5a67e8036d1ff2660b9781bcfa93cc263122618e5435ec888da88e9521813c015042c24c51dc7f57dd36449c47822486bd23016869a766447eac3ec1f034d3e1101a226fc01cb8f84e7d29cc10c8b967852eb4a2d76b429e4b2f600d5becc61b476c94875f52dfa29ebb3abc1708ca76a8722baa092a39e5d4f17d1caf576179a8005fbbb685c4363a235955abfb110ba1b901830d619b38c61f2cb50fc976bc911f5aa421081791997e9eb23d63926504f1d6bc72e000093c97971643dcbabceb9f91f330d88255d26936278c53100d484ed43e4f94bc42b118971a74393cbdcc06f3dd075e0e6427d5a065ac60cf09126527ba98174b6768aed476d2d0516a579a51c351b362a98536247649e176b066f9790f4e0a4393d93d3f22524a11d5fe359c136205a09b2a68c5231263425276783bb78564c77a5d6d832fde4547df8163c63b492b707862f4867df0c22ee2e031bd17bb83d19bce3f2ac4fc6c59b8fa39aab4417765f4d1695b04d106380fb0a41677415faa287047bc61a443bd1c478e2af48c5a996f7322c00039b437bf60e706e506259bb68376b827c04de157a4d12201aad87ef2a4ec19bd72ada3542c69c89fab12f9886e59325df65036e5685709c2f72b901158d9b32ad23b9de88a11a32ea66e8730feef5bb534496fcdda1d1abad4536a45da8a15423637f1f64221ff535a5ac069e5e9053c9c2dccc2786b2bd8a202ede446793c04553b26b0b4a44553e38ec3ea73c640a2cda43f804f0f0b7e4006d73946bca28b85819e70b79aa54266031ea8db1d3e5cd1e1e1adb31f368aac28583e036def1602a5ac1776a705bc1d4aee3de3059fb5dc9245bc215a98447a00a6c411c574660a17c8b46b2e35bf2d21ca94b967d11eb5105fbbb6266f9b4d5e6db67a8c8ca30348cd0809257c444c3edfdf746bc4586003588763c099c2d48f3512e05d3e0378cc2cdf43ad9217ebbe22479d3ce1f32a0991832a2655e4ea90007a40daba08e818bb3f20885420d271974c81820496fc721c8c5174d125a90a781d72485ec1eb49aa42fb46fe4bd06a0c5b99444297ce8f5faefb131bb11685f036c3f66aa58013bd34f185e10b8a4776ab3afd1e2e7f91d6e469807ee11c06702b2c22ef40c53444320deceffe87ac6d8c768b7aca98f1fdc0a053a3568cb6916226895cf3487ce25d8a2a2b5faa548bc01592c9c8fd95392678f18e6138b1184f66c9d2dc58a98ece9d04bf6c7fdadfbc1ed252108162b0b5f527993e17b36a6e26b3f4c59b48c0df39e14a5488a13b35116290fe4e4136f04142b555a29f4f29d338c28b8dc55490c31980a7e91e772c3ff65ad08932e5c20416054fbda111a4092cbf6f0e2bfb14c4472dd66d6fff72fc1fd4d8477706251f0c2002bccb71b204308dccb6d3d636baeb7dd61742b742092133514b183603c6006b2899be95be278240239785d904a3d1110f3fbca6212790af8ba62a270118c5eb23a16887fb141284049ac9741020d4430c158b1a74dcfeaf511cbbb836fa26736e37777f0b3139e5f5ae3990b8b77a570bbc3adb23bc4299a753b2f1aac897bc44bd644d97c1d6477006aecfc1c4bdef9784cd6c1696503f8d755f7ee47c5606b852380c22231097de8a6e999e686a314611d7aa670655b09cc108e19bc9683195ba57c5e07ed45790649ee47d36c01b65a870afa3774ba6738c3df1609f19e0506c92c98e7eb2c35a4bb633f45e9864dd13a282db18110ba374e9975a0bda7744e54b2f6138b5ab941beb5571b64ae3d897f1110d800908b58306e39fe530fe22f2e26994ef1243154cb7ec01d0ae8e30724d057cbc1b276ef91d5fb2fb0495f811f03851c5927ad414921e84dec753b8642488354392ce73188ca589a9fffa3983af15bd567700ccaabca84ec3114102733fd8683203096f914620ca89fbb86303ac5242838d56fdab2ff1498bd6ce27b1835fba0007a599c500af096d28ee16ec99b5217815996e25d33dcef8e076917c6e24f06cf1e6e5ec36217e40db85f054f84660d73c61942b6882d96354d3068c3a1a1bdc0a0ae2d5a0369264fa8491d8bf0e437fe575b8cf9407c9938042d13183bc72a42fa11cbc351f809cdbc7cfdcc8f29f0c80a849acd2edc756c8f17894472a8ac5cc6d79c79ddccb8d47e444ae4f7b4971bfcbd40d7066fcfbf371cdcd3508cde4b263244b860235e6892324691d110cc8d3b2fc85f3ac719f35d492acb5293a662665b9d89e672b5ea4229633aae1acee088393fc21f0c881649a19745053b020c8967de20b0f8324c11c9c92c59738b3dc193505dcd10751724ff7861299069c0546f640c70110d09b659bad4605b2dfa7d968613c7f139b13d41ed74acf0802d3d22670535e066c5c0daae65ec0690337c1156927e031ecbd3cf594f6fa31051db3b5a3ad0cb437fe20b9a12679a5698f19626f29614c54c13877fdc7b8eb8b30d95605517ec10511231e42ef8af611ee2cfc01c334f5c27ece2c44ea02a3b4f3071c80ac5a13ce5e0b83c8f0a19da3d8e4b0613b9e67cb809103733638aa92b393bd90ac633570afaf8d146547965cb1702abbb744f1217aabec2adf4023633da1bf3e1ab490d581ad1652956f7be8c276f1cbd34a7cf2b0a634cb4abb418ce2577fe2c931e76c8c206aa8141ec4a8edcf545120bac6bcaf4319169cdd2146f416c5a731555c449596f97dc55d6369da076909f64cb19bf8c167b93c5642cf5b0cf18dd233bfdb3b581c600c4cd9c7789e381dd122fecb5173ab221a444ceab4d36bdd0a5cda657aa362cab56d8c6e9a6bf67106600678c4d5a60cae2e4909f102224959883b11ea6e90e38e0b41464dd849d079ad0e00ee9655c58fe0bd8ea59025ee7a88c1867935919ef6582484ddc441fcf7740d0c0c76a918023d09788a6569ddf4e219696b6c47a6b3b15f00f1860e8956065a0a0f5489e703372395e9574932417f96862f92ccc0cd0a99d740b80560610f4f0926e34f6e82f7e61409732bb919954288da50e8e305fd99d517f7b8f41f2daaf17a1d08ba19f8487559c445031a7f0135e3cc22ef4e7128d3eabb8e9508e2a9110ec283a0ff0bd837118308a07fc395e92d6436035048134c1a049ffe1aa2321d8302f9d0c90af80d00eb5d091286941400e29e337a98d49ba231c8571e76d6a0bb538417c05dfd5f77afe8dd3571714e4b44fd377c7f80dd738d8707cbb8c8d62c2bc497b6b819ad0727f4e0cead4aa132049c8e080e40063211fd209453300e75cc356033691009c4c3957b27aa3fc841db5d69077e3ba3428b8f2b4ae38b92d2bd1b936974be7383547acc9eab0d34b4aed4630cffcc5c6a5d2ac4c65ec7f2ccf7deef66eb54e77fef14db5e5ac74f8ad8c8e2af431eabb57e659abd89abdfad7a01eeda580ac3aaf2f7e3cb24babe136591598f19b0f21a7d017a8a5a4b219f77f7c25c02f012f84669ccfbf72269ca56142bb01950f668072ab2b5a867e78a7402443535f701ca3ae70f6b48d5b6df375550e14c587df669ea3c9b749d28aba07410ca9fb30c0980283fb057d1f0b6292c38cc70301c1a6b306d96a79bda0524f683d7ee2b0d027498508edc0faf8393620586ede519ca92766682cb5b63be4bc97351a42f580b6477f04749457e938f7a1fda4b2b9984f397d397a8f3a655f4e948745953ebcf7bd74af27b75a32ed355c3e7bed3e7ab4d25032e96567991c280fe974c2f400a3eae9f30c946c1f996728200d52698163604c49ebd1165793fa13032f733fa743b3f4e9b46d620f36015a2d97a21625e93a66ddadcaadd7a6f28bfd200201159c1cd61b907b4e8d35b3d4e8efa7ed4b161d973837476e4518793021610450399726d505c306635410263e41bdc27d6664ebbf7de945c1c9e2446afa554a523ce3b6c2e15a248d842171416ea61fa96d418469d20931a62c11962337682d8d91579db2d102cf80372630539d54f22972b37606fa3bb780078564ed67789018834c136b84f842a71a3bbca23af1f8f678278fc4c0b336608cfbf515eab9b17bca5d38c4e5bac840d3f406418846fa4246a340ca8ed79c9137982681f778a389af1ada7ea5a07a425e4220ef88417515720c3b04ca4b20ca03e0e4d1eb4d6f7ec6cfdc5637212193a7786704795b305bc305d294e7880ca446819a63be0c3c016e00871de0c63b2af7b977dcdfb1498aa1e370adee83e52b326551941310aae3ecb292b10d9fe81b8b0fb1895907d624f1a7ba1ce95ade78ed7818513d0d82e66087cbb7b0d0fdda6779889a7a0a4ab390a6149362ebab819b6c04b770df7e69417f9e9d405b83b5498227fe51793695afb8c272752c9c1bf47ee6192c139a9ee311e031a199ccda1fafb885293ca84be3149a8e31eb0940c53fe39a482c38c0e410f4b278ec8c00084b5b422098b9cedae8b9812384cc18f589a62eb83cce7c95f4888fbd73fff6401fa39cb2f765ef2c259f66171cc753065bb08aa3c08d3340a8c06ed0b2ed51221bfe2e565080ed6c76803295e862f9a22d10b5e76cbdda7a2777a62f5be3e2ca4b7bbe164fd2afea55e1d8e14812a3d22889acfae6d438c1169bb727015bb1607b99a30ea34eb2228e038d509c033a6ac35328bf11bebfbcaaee5d68c8aac10b5d189b17e09ea81135cdd9e3447b971dcd9b59b8a6699e1e33719f0af0f37f15e852fe96015f699704ecf57b2dfcf7ffc8fc9ddfa7616e98ae823addb90a70876aede1bd9fbda577d7bc84bcbb387a602dd693e153997f09df24de3dfc22f7b4eceaa7d399c2c1f9e622f88b35b43f73a57c4ee96701a995433aa1b9b86cb67d40b07aad09fb97b1261a94b260854b34da9cec8745b7955949f74aefcc10933fa9c264267bd4a898143940e194f962da7949f3fbedb934f565f8493ad19228ba7589c050d4055573ce2d0dd4cd2a3d4850b7b2fb6976f87de6d3eaedb5be6aedfe89ae660d1f702f2f02366f00e5e8fc39b8417978da72fdb92cda73129cb82293e8b9c456ea16362e4fa25c7679cf6e79dc2ca3fda1bc892f841b88a4f99b47ff8636705e2c6206890d85dec7d832d2e6c37c2325169bc0eb3940e74bc49ce599ff9585e5ffb65f68ddee3da65ffff6c7dc5a6148c73a01615192b90656e95a9e766dc416989372c930e48cd1892d3b69e05173b1c31134cd293bbdd86877d3025915975b952f3fdd1e201c6c21e46fe117c281f82438c86ab3d91808009f1711bdfaa6594a0d14091a0c804ff2ee94d7c1028cd93635bbfda17e05bb1d4463d90e529330dc49ec94f7c5e615f5872ae793eaf59594515b85c11c565ebbc6c072b0b150b820392b8283cc0e92f496f13999c6d1d49957423007b3c0e7b2a7859b937187b1defd635329aa98066d751f94ba138c92a80d73f6b6d1a08ffb04ef64312ff461ce89b64ef85ae82f66e3f2ca57272ecb7dbadc236675bfb138c4e70957aabbea15c4d942212c2f5d73dc4dc887e9b3db96d337bdd06809601c27b6efbcc31f60c2236c153b5060a2197bd017c68842c28ed270e7b9f8800296875c8bc494074aec084dcd5fd92573987e4ee5169453966eee501da6391d7cad698f88b25de0c8223ece6665105b0d034a73dc166116a270ebe43dc938086394a2c502884044f2c220d780388541364c15d8df3a5f98d21a75bac666b3a4a16944f360e37e81eafde2ba29d63cbed5e8466d7163fd07ecebf556b0f887c4df99dfd07f46e9f272bdf53e502faaf5a80f2ac1de77c1156557bd32abe7d003fc08fca83dcd985cbe3cb1b6f6ed46e88a28980ea521174153b4175fd7bc804f717b6f4877649a88a34f31012c9151f29825462ef57f8f295e139236ac816db6577f33d0ce9b88a973808bf43616f8d8e85b68ffc320daae39943f435d1be545336ab375fbfe3968874f44b9327f870e98c3de8708c61ac9d8883774a9c58e23e07b99d5a8f87e261f0fdc198303445c8632e1a8e30556e9e90758644236cf79f9a66934277cedde7a21bbf3e6637c40661b4b72072adcc1a46d56ac313edc51d18f8b9cfa446d9cc12c1cef08c0f37950a5ef042467b3f0eec8f829aad331a65a1b20ea0964e2c979b84c88dbfd7275a60a094f0925a1ef0a8a32b7c9391c1043840d8881299122f9a53c1589124e6f71d3e4a7f63ebdeb04f9f34a85bb70a3c2dcf7269d948979691200dc516abbb9bf14af10ca70f1055e12bdd5df7f14188d098e68539d03749607fc5dee6cdb09989fef1d307e47ab09b25c6732f504cbb5f6fb6d4351f6e081417ccaa578ce95305d2e1815d330069fd1a48992d17d0c9b119c36e0c369e221698cb44735b3f2cac2714b4489de786bfd5cbfd2133fc394dbcd882d3d7e6ec7dd882b51e9ba4b8683a414737f81168851593ef2bb6c7cfd777ecf14e200e21b9a4d814533bfc544b7c9ad916e8784144d501df9a7ac7effe88ee841fbb6d40a99fe0cc6390b00e1a1987024520b1fe109ba467488262bf50940b2e0c100b72aaa6a4e47ecfa80b9b8eb8518baaa60c7ab29042993bcaacfda8c6fa76b61057a5821973bae5201a0f9a0358902e9764220da23ffd24ccae2a1b1d55105c5d9bc20e944dfb5305af6a0aea2618ba0a329dc5c0acfe6568dffc8b9de750d98e9ccdac7301c1458b04cfd20d47ae94ee46c714267c5554907b2f29832663fc2a61d15f099fc4ad3a65467456f598005f69b098f10886049b7c54c9b3f9469898db830796d6cfc213615d4e6cf0b7bea3f1a37fe7a11e06ca28e34c9ecb388e4e036a3ef26bc8bfd5e628edb45a3ba62b40a27409921936341c580aae770a61994638e4c8eba030b2963f05453ee327b34a24cbe6586ea6c4c1f558b52a07f45a9b6336f84b1c676ebd36706a8a1829b4b29ae5df5a9d80c9cafabb7dc6e2f6ce128e8a6405783e64148a30a4a36939b050e233e50fa44ff2ad6ab4ee7d23007aec87ff89e2e8857313584b6f6adb04f3fa7abcbece3f013ab65609cd1a51379375a399486772b2af0ba9f8117eabf9a7d20b8e42785cd1e894b7c77623c8df3c0e529e206752854349b746312879fecc093268e72f68d253873efa4bb5a55394c855807385a919c1f557e62c2d9436751e1497c9cdff0964f88e1f904f4c061dcaa7fab990c11d7762b261b33f568816ad819ca62d1fa4e630c76aa1e5e868c618ea6574b15d9c7e1d3b4f90eddd5f5354dd34983eef3b6c2aa44af134e7872ea07367190ae1f611482cbc08820b93670727741d3dda0e417cde09c6728bf49b6fbe0adb4c67d998f6755ec7c02a40e9759fe89108830dabfc5a84b556d5143db5f22857f0f7a3ed8021fb4ed1c561c2c7e5887c1ff3d37cc4e98fa8f3a111a6286d9fa5bb7014feda3e618c3f2205a7840cd77e8b441667ce8846daea8438c6bdc7786e50922b6d74e67a3e0d50408d12fd43d8de485b394216f91ffb5619d4227a50c3903d7d1d778724bf548e46ebc178d0ed5a093f9d85792160f53caf39e2487d67757978ffbd4a1da32d253c7207b39a9ce936d2551885861696ed8338068955e551060dd2701baecfb7d45096a714a0d832beeebc0a42a3074b3eaf889d000d169a61ad5e8ad52d48a54d382215e42e20161172b790b13a556f5a5a57720aed72922035c39cc64bc00413b45c244f06fbf7376047800b685db48c61111485b5ab986823f6543915d5fc3e69646d3afa78c2f309c5f56f7f0e195fc983bb8a698c42f3e04ce64e7ecd18d65cc2fe0ba47a89476579aeb4dbd025cc5ad44f703b4d4690a264751140b82903a20b0d91a8380206923fe83bd808e6fb787a6232ce26ba13538b8ecb2ab264e8b44b4e601d5f9ffa0fa20c48ce5d6badffd020fe5ae7943727135ca8fa91bc8fd7bfd544831892d20f550d7e33a5ab8e2026f7afde60578bb6d5e15205838b7ac125c1d09121b55bd8c515876668f4c5672ea6cd4fe0baa6b07adabb2107a4f57d02e51412c2f6b9dfb2994e7e686e6d0074d2693ae19e61c6e087eee8e74a37fab6298a51b717fbebceb22a409fced7ec48f8f9c90d19ad4c2276d6d37851b44a1e4f1578c1a9e5cd7f69aac87e7c87576c5ad83ff472794f788487237ae2f90028166ff18e94f860d996b5d3f4b8b5749e5263d31256376c29cb2a64e13dab2e4935401ead8d0d7beb804e880ca9b48e7fd92dcf5823752871b0facbfa69c8d615f2ada8a7cf21c7317be40fc31a4b47efa61cbd0df25d8d461a4903d4c713494e801dc8b04ed638865354cf04cbeecb9e3e110d9d126f1ee69a77318c91669c68156c1f6f67612b2410bd40ea5e1ca0462c49669b7753a6c8580dd63654defc0b15a366b28d906242ae30c4b6c81e3e90711fd2e49843819a033ce0789cca3fa0fceaf74820056ba2fafab2909129419b62793ecc727a3f613fde450c4bd753e2de3f4885591ee55062b36ed1dde59792e8fd0b367347af18964b495ee710a7c8a2f45e510bc0c3092370bd256202fc7c81ec9d4014aa45ab1f7eaa104dd28e7573e3d1af039ec6d59371f61d2eb0c5fa3ece425021aa949ab4e03b5f988c37255fb090c2ccf24bdda7622ff6f6723861c3f814cc0b2deff6f58c0d36e7f1524c91e647e7ad8c4a80fd26d328f1a3a54b7f02d0e490ba1e080e5f780c299c4680b08905b39029196db6542b67bf58fdafaf1d3ebe1fbf06e988282afd1e8367e28645cd520d427775347e6a9fd46fafe5d482fa83b8df3c7c0d0b6e4c59046cadeab76860d682bcb3f37f55f67961cddae90adbfe99f10017ceb680f32f9a032487b759a907516170da774e6858d92e022f6023d5f90e32e9b7797289b65921d99a3951574bc17192bba952937f14440822d5e61c59f09cbd566252b97fd5a1cce4d5e0ee48f9a2c1d38686900c225ccf81ad1d22d7dc9a7d8ae8f80f450e8b1750ddaa333c895680e8388fd4131c69490ff701ce9ac1d26459b8cea227eec163533ef5b4be4837d587e99c38c0924dbf594e7701438678c88e37b42a38543989a116160558fbfb55ff004964e6ceb97b3de9ca0b322e742f97411c18bbaf0f8d09d669cafc14893922c26c6da0dc31010b41d53646644376aa8c3b1abda33879c36063c0aeabb08a7e094190f36d4665cc448bf37e7351982f50e5bfb90d6e68202c7e76d03c33c1c00b344997478234e125111b170acf879adbf12e07ca533c31e11d523461343cccdfe12d747d000029304bb5ac2fc754fa8f9836eb1e0cb186a2d0b159f72bdd8564b45024a8d0a8da59ffbc1b306b2b4f4a70a1ce903ccffede4947a06048e2ec6a5fc97414577531731847dc4a69f125749a3e7cbdd36b1f9c3e79c68cc52a3c9da7f2223cc6dd688904750156ce86f8071cfd66a7372090fc53cb3531da0296ab010c8cfc7293abeba0c74a02aec4abc99d10783634ff23f19273bc99b314049157679bbe7962e66de61755e58350bc4035bb577998a98a28295a63da7508439b86bfa3242020f76fbf947af888b98f91902d1febe5c5a9c476d704a164f2fb5a009718ec58234707fa9408720a73369c57dca43f07871e3f1e865c2ff219796e0c58328cb7862b6df53cff7ff9b1e17735466a3fd75103753a807b9df3d1015d924501445b1329e12fd7fbd0a120eec841fbcf244e96b645b5092694b7ab8a0dcb8482cfc538357518a86525be921b8c28c9b5b7e385c3e94170f319439ac1bba17d5a439fa62fe146a1e934f63514fde18a5f4cc9421a8e64c71056d31ff59edcd85c1f467f535dac7c77dc397cea9fe8675bfb8381b07c077f7c9a01a82fe00068598da56d93e68f53c4750e0d25dfc53984c8d36e60128723805e0ffc79a55e5d7c21c744056daedbcb665f70ae30fc0f7e6f3755948ca8d475da867be0b63b3c6ca80ed9891b7c1dbe921e9213f9832e12901536167dede218b22a83ede367bb748e2f85f71788429ee5fc4c9ec837552864d2e583fc7b8a3c4a00393944fe5849b05023683ef28a99e5a62c23ff52e7e75abc1b156b96aef1be7fdf2d0ab83e682e91146193cbe1d6a01924b3303778e42fdcc4bea64945622450e0fcdc0e5a4197a0d90f3d040ae6bb8dba422f81bb2cc2da49f72d7d6017631a03ef64f9a11a59b4b5c24a2baf54b056cb0310b58d8b3ff56f5fa7e41b69e6bb435923c126cd2d62f3b63ab6546a21da5c4339fc3cfe80c13f46e616e77defc4c9673dbfd487cb62184272335ead293e50f85b999123cf76d99b5f039ef1d121409eef8e5f13d1911b44dfba196c824041d7495fe04adebb0155441efb06db8d14794147258f0e945063d3cc22c77f164e2c63855f68f373c8a9f043ae0fd44747b04724c23b479781057133fd2cf32649739ab3de001b8fd74df480c975580459b8e183554701ee8f1a15445c84fb3837e7771e94587c10d8265ff799f3f28a603407ca5d0ad479d8313aaa30763d2932d102cf74abc874229736620e709ded4a9a44b87876df2c0762ad17128ca46c1d0740c006be21785f3f061662f72d9c58330caa0f720810f38a50aa2ef865e79b6ae44b8c9556693fbc8e9088f256898c5edb74d4f75d90db23c879decf9405c1c54b8cd11681d5c1a1c7c1069482bdf674fb07b0b99b1abb91722c39c4cde3877c416d0110f117d753ff5fc4ff0ab1471143e547db38bd24e25f357b3442bf306d520619928ed82700644b5999fc0c13a29182694790d8db9a0fe6afe49dc0ba5911af08599e8e80a812943b8f028d3ca5cb32b9070c31753449c2787f0b343946e5468871a470571a1ba27ba08e3fe00a6295fbf644819d93b45e582b527630e35d04ab329d3a7890261434aae5171768fdea49c1f8c24804ea215b44c677674197dfe63085f5067fb8c5b36f21fe1c838796059d522685509e0298f7858e8ed70f138543be14d8dd2d93185ea7b316e6ea7b48d3fc93e6247466e0941528e55cd85d233a01db23aaee24cbdb71b7b3ec498c646b4c1911081f3392961b15201ef94e0ec38628fcb91e9177401c4e18a85462b5b47f0e650c968c4afab2f457510b34ade9316577b09865f94914e213a2021b6105d140df46858cde15b1355bf06e08ac62d8a0be1021aa96631da085d14f2fdc1b58938d28b07f58fe238b8a8c466f992a21b93d447ec3df4a7b8e0516593122db49413cea26414a1bba1d42450b3df0456cab9dd076a23d471fd31d23791d60bcd6eb053be6e3ab8b290be9c3d54ac432f2d82a1aa9093797278de366bfdfdb8b7c866f551ed940524d1178fcbf67b1079dbe57a4775c7a544d21836babc48c00c4ad723b2db8f0a854edfe9831085527cb64261d96145510d3f06485775f2f804e2fca4cb86151dc60ca89526b2f9411608d07821d532c7aa96d2cf34485386d8b5e5b95765017587a3787164624362b7bbd82cfd534dbe4491b0cdea7504c0100fc9bc0ebcb4e028131ad3dc842385ee6d008283d670fe1dc73393f8be051bd599361901729d76b8573e36911d8821327d330d3214a6fab2669272bc2566383e1c7f160dede682401b45aff2411c78eb7adc9437127727ce75fe39d03cd7ebcc440b0b0b9b0f04111d7fef480bf7c13fc8b0b413cce16f0c557f6bbf6735c87feb965e82e11f66dddebafc201cf80b7002e100955cb1f3cd9402097e95a862c9bb11395d9b54ca33c0ca4215c8191e050cf4c2538a3a98e0de9657029766f41d8c2c7ae6a050edea5af6d31fc2f82366a48a44406ec415a944bd098c7306266ef88e1fac2728c058387c2faceba24571600c100c8d9e522adc1f5d560a2c84deb2182b8e2533f84b41e649dd11440785b4c366fa9036487033e82552dac1843398c4c8027dad34bfa4c978d1be7f7e2c09d74cb5a1594b373eead4439ef046c8bd0c574153f2f8aec78a1765b8c7a54635936e05ca5b40df6478da99a475b9b15a421cf933cf9b6de268f277d19b198d33c7fce2311817216ceca58af58f732722a7eab26b51e0f08a610dd3fd56d106d7477ccce216f4d437c7f43d4eff504bf7631e2a12e60797e87acc4345627ee0165dc774a048cc0fdcd1fd982de02592e41f68e91ee7fdfb9b8ff88bc6808985a469cd81ce7d50f6a5a4c505166791c6a10ab78f6e19c4debb1e3eb2042f70a750040fdc211c2d6604706514ced801c1816e3cae1b50f20673e1fafb32119870a5947b5384a71e9b26ec7599c64a55b2e79cb19a88760323ee8acc9b6b7ce47c42f0d5e0960682444448450738d972a53763ef09611f178e2e061629f512f78065b19474cee46bb17693f6c595902ad6961d357e19fd96fab8a3cea9f4b12dd9f98704ce9e87e35d84134c86d281891afb7c00f1f794e43a3aaa51e32599fac336d068001e442d1014749fe9e84fcd9dff182086ec36759a534c9be20e1245ca3ea43f017a87dcf71c54926490ef2e444a04dad6f220567c5c9e5f6823a31153386f3c921a6e2a78667f3623132b803495e7bdcde16325e110ba7f8a177693802650d60b9080998ef0af4cc8688416f3d6191438cb82c7ad426c6c377f038417709c8c80fda86242dfb82b639ebbc5b2df5f2976052171c3090c68123d33e9f51373149b3099ce4dcb7582edf91c2ec88a63a637c742d861a0c3cb670c411ef733df5a7c44820b0ee9a4c6e9a915d6a050b72e4f83208f9cdea0efd90363153f510422ac52930310ab86d18833201ac0812deeb3b2a65cb8b2351f0108a9654dcd1fe3051af1ffd698ead3acb69f96cf09adc7c501d518390724f7946f115fe0450c856ad1629dc1901ba442315f231974a28cc63432335986bb80dc5627e6877040461d24e33c5518ceb4693379c32750feb9590c01cdab09bb4dea21cc7fe065f4005be5c2fa0f40159ee586e3865b861ee112e3980b02a9cbb004ee01ddc582d41c8c5a0027b19052bc055311423988822585a1e505fa114b9346ea80e41f446a27e8dc7fbaf3c1aca6f28008a46ec912391e5a63f12f7e47730db2e77caac08c0157ba1a047675871d822d82f7d3310d1568a70f06200c032821a2ebbe22315f36b7769ff40a8d30cde46ec301e1d96432f6937809d26b03609b525ccfe1408f9fd7f5c84b29917df49d10405cc80401d48aab3968268f9d9a819aa10f9283956858c737afa09a84b3b3ebf753d0eea63ef5d9610a91107ad76f428e355c10b8dd2cc38d24a1e2f1dd3500ec954114bf00f79d8852ddf560bea79c3c5ebb87d0f52afa01538bc6d9516056609639d617d8ab9ebcebbdcb217c744c0e13c479e07f88c2ae6d7d20bd2345d28b10a852bd1731eb6691e608847590407435b324044b61cd8b3fbc4dec198d5d33bc8af5d26837bebd82ee4c3be9880b53fa89cc5bdbaabd680a5bf906be88eee3f77b65212aadf1b6cbd6373b5fbbfac30f5bbf8fd5bf23c76685c0a90294a2551c1eb0061e5d59e6f1827e389d656c064301aec454a52ec60b6d9c8dbc7a2e02978fff5e4050032d0d878a5a1fe2aab2547c8dfd0f7c70db411404dee56b37e3791fb7d7575326f9c3fd859b38106a138ab24c6e7e257cbd16cc8ae4df98b489939c9159d7c9a5cbc02d67fd67bb27a0704b331cf3ee6f27c702b1b9473dc0fd69657118c469756d68d861bd803016205f1115bc7bafe239622932e1e31ec40e18e99dd343fe488e1f698b6d42ee33135d9d33d74a49829b8d8713feafa880fc0cebe94af8c77d8ff94fbdf4f2838edbfe125ca731c0711ef99ddd7d467748b413ee6839ebd08cc790957169fabb63619a9577c9d1aa439607043dcd0397cb6f378b58c32f4e8ee1131a2485a25ac1a88d42c229be92b831ffc5412b26c9655cf5871202fb8e504e1204b89f638527327f480ea35d4b82ebbf0e95c918603258953da50453d918103fbb0b2e9647026c0f653c3f13c1fb03c4c48d21c268234ae3884e7d1385968530fae07f615325e1b880dda565eb1183b377bdb275c0a4ea32e181517808982d0e541ce75e267f275108840ba1d7a184a0b79d6f430dd243705cb4ea5300dfc47940d32838f4b86a8820cf01f9077a85b7448d11ac488f1c8c4357ad790c8e495964b2743e498a72d2358328f036023da9d6c0535e96302d678e41f5083c977f5fa3ff10b926b7aa27497b6d32fbf19778c2931245d8a15e27016c0ad5000abdb00d8ba8b0ac527d56692be1a1be57cd906816f550b2a74d597dc43bcca5f90dea23d334e4570aff229c342b3114aa45ce524c84788cf4d1686bcc79052958c1b86deaa27e76608f03ded81da91522fae2524c4c3e3d17f991f27fe04fc388c6761fb42b319340319a574caf7083475d8ace21212f2b107a7283d4effaf1ca8d0fd95d1e4e1f636c8c1f28b08803d95b673377b165ebdd09628c596e2c594c0b0ee1efe3732baad94d87c8036148300dda3148680c6488c9f21cbdeb93e5b163a486712906bd858f4aca4a67402a5ced4f6774e9d2fc130ee562209fdb1b425bbe60047e41b3c72eae1fb85dc59e166fd2c6fd7a098a775a8fc1c4f926e93096cc4e6a178527e87557d924d3b14a3001cfd717ca33b4989a41d2e961f83758d22b990122ef9d7c08fecd1c74c1021442d7295ef92ff9ecfb6326bebaf34255c9a2dcbfbe40ee25fc4e0b8e86b13f99aca491fd58ac48db23cda7cc98eaa82443585264e389e0aa7835c0f06305d003c5a02a89e52653afd8b2e3dbaf8b4f62d885fab36289d4ff6869ccf5f45cc5a2b2161796ad7da2728845041a70e19649303c4e39c38965516088bc43306f3fab21162f9c383f163147a6124ec28f84fbfa7e7891289228c5585aa19862c0f779ad97d8aca1145e13e21b79a24f57508f076e2d280747ed98c9c05404713feb91dcfd65e4e394021a1a763d5ec3ccf65f379eefffff02aea1ec7ed7cb82e9e6a9b3ef2061ea689d45b08156d44ecb89a43aa056e7a19653856be0f1290838bb6131b60f497fc7a1ff16151f18fdab138762cc8eb2a6f144fbe0e0f4a55820a4eb7b646ebf48bb0a4f87ef2b182069a7d51cb7ed247c32142cfe4c1109362b03a5493ce210b35c074652f3cf61b741f6fb73c456837914057d709b8922f741b0daa2eb07ce48e30f03af28dcfd561e76a97d7471e9d4d192ca75c8d4dbc640a3531ea660b8b4266e998b9e55882166b68e99ed3771eb9dfcd4b5b151c72d7ac07f2dc79c6d3719412d8f40eeba3b0f079a52e027a1fa67940a6384c1b37db15f37561c8712fecddde97f57a9d94c1f04c1de1517489be50e3ef1c6ba7e51f83aa24712ee547494d71c788395bb597482bd2f8f8c9c34a5d27d65e288b1c01c5ced6ad9467012432c02f24b2bc05f659e010afe9ac80332f9154aa29afe47b50474c4a34f05cd69caee01d2405764b31ae1dd9b3626d391b72b6cf747f84cab9088b5d326506d825c9eb8a24f0c9ae1808d05cef370a4870ec3ec3654e4c5ebe54205a09a743ac4a8ad76618b9c161ae5e85ad7fe9a7ab8a62271d85be8cd0111ca61cd8fc2b0248ce9c000017b0f9e521a671c370dce2e07e979eb0dddab1247b162cf0c59896d168c1ef0a62849d5386ce81ba1c661da2373b33f5c64617107c2132a54109b67ea484a6e5bc2c80124b75dcaea3c4dc703b46985c0301933ecb45879f23cea7aefd0bf133886d906b8a73709b4f1ca2f70a52d458769898a40e27235d36336e2d8b2a694d8f5a1e2bdc854a94ab31bcce55e12dc7d6bffe47296d00cd3ea31b247bc570ff10505c9f011d1652257b4bd327c10303904f1f4c27aafb61ae50342578ed9f9c7c065e380b41411353b4041186792d2a15c7f8031946fe36cec07b106ea45a370972e4b4e30fc42f297dd29da4ff07fa7a1629bd722fecdf5cbfbf380e0878d2f803589440015f5d8b565a29f1d3a959f8104417fcea5c4d63fbd7f99b8e0ad0e9969cfb22794121d2b217eeb19e035fc5ccbfd7b0d9a0f63b19ace23b4af0bcbcec2d198470068c0c400993da1f83d3b3c1cd7adc947fdc1f4ae87e1fe75313013b14bc1346812f1e4ef71be208036aa1c4dcad8bcfda6e7bcc7a20c4b2b108718885a44ee62ee659e53ef633f965c8d3bcea7596ec3951303b546c1b5a1fe4b89993b2c7c5f967d605eca2f620458a6e95a51ac89d95fd071b4a90d8348c604be10c63dba91f28655850dba76ff5b0a594836ff1bba537e38fd6366ef173382c8b0b137bf410a323b3d091e8c90af40bb17d294f13075109a81c1665e700f27724ad2c795765bce6392bd335b728807e7d70bb2715ec67208d99588da9aa9cc023f0d41b34f7f00c191879806050033d3f340d202ae2d17b286e6889f85e7199d9c164f1f023b79bc98d15998fdfc448fff0384de0f08bd737b9a71e8b8e00d39e43e1c853a9779408cd7b1927626ac5faf7f19bfef4d822710c626491453213045b2be921813c7551461ee8684a9af28cb95504cd035dcb0094079bdca103eed76049b91938175e1818d6940c52fa893ee955c6037b53b5e766cbb8c3dce5fb8d3d9e483a25c6bba0d9e1febec65d86e311e8f7e32960467762e174e493c423c7637e756c2f70aecbd9412536951201c0a4de80dbd958b491c290bccecc6b393a24a969ad448a7a502a39818941dca37d1dd65d3104a6e2a988439d7878ee7ad526f1ec8a0175eec820f91172d3091d02b33f45e9118099f1720ca7a250978416d718d093b1154a769b514deba9a57de73659920f95f456a1550d183a21b9faec2763f56dd46a245419a20e39269228c45b798bba57f2bc1ae2c3744902c352fb690bf81d34fa2013dd17145b128703d94505d4dc56bc1a73b35cf867782fb8c9c815975f6b5d40ef7455908f4cf1d59cdd598b9a3cf1ec1e4c89acdf378f280cd24ccd294ae74f1c7e7dbef081cff10351714a7ae8ac8468b5ed6ce4067bcf4de7dbe570cac6aed63a554059a33574400b93ae4fdd3f9b69e8aea4d9b6a0f218617e45be815773148f16a9096b6e858893888dd955aadcfac8b4fbbe83ad80d3adc58553c0a17da05734ffe05410a74d58439ebab7f400d7c32b4792ff46d2943c8e409b0dcd5a7a5801d3124bec8610d74aa09cff25cae40d120569150ba88b77a8d4e82e5d5fa42371ea9e25b7f93167f68a0657a7042469bf55b97f30fc2bb257f95c0419595a5d2414ed7401ba549796cfc42813b9e0c8a4a95c72220bcc8e287bf7fd4bbb63ef9421d8fab946dc96a5307acbd5afbdfb5c8e8bccc028703f9703fd880b28166da77b130561a22e15d8804579a2678ad21c7d00f87d3f22a7f4a3064bdfc245ab06740f3b732b0ddc90b5cc20eeeb14be48599cfd978671deddb7b6517a782bed252251ff090e5ac4f2db61bb4bf1dd4b18b92520caacb5202f5dee1a5088d681532fdad2b99a9d5fc72674d83228a41bc2f811171dd9aa452782f71b445620f20031057438880f32b5a40abf5d6201f16c5a7c69aaa2e5aa4df894860b37c377fa1607c30486aae339a178e1d5610e7c96e7c62afe8127869aabc3f3ac5c642f67ad9064b064b7c9601a20b8c54779c10bda69292c518694808ef58409fd9e5d8060691c656f40d56c1df5da0bf219c07a358151f749fb9ea40b149d8ea30e1fa0412db86e79027f6e260501367fc9e76516309c6858bb1876993d127ef0306b4474b0d4c9505a2037ea754e521e00c48c34655c1b848bf820f8548208393e05e9f0a97772c498af2aa2529937402af6b800927ffaf32510f2ca9af5926f1219162a62a16e2d0e42628676ef6355d53eb9125fb97d66dfaea1d299a26ce25e63b9e829e44acfd129cf0d5945e3255881c5c943075d971a2ad446cfe39d8e4fbf5f1fac3b8d422080f12bee2449fd0171c3041bde9f1c979ce1556a4031a2471d324ccd41eb71c1df0ef42a51c8625c5284253dba47b274c9815fd88c27d6ac4f829f4b328387c6d98d3c180f6912efdf79c91d6542187791a90a451fc2f2acb10c333895122c1da2923f1900a996a5d698b11b9217c546026c3c2377fc5da1d59cf00b36c245ea118217ff8acae1bd9a7b3ee38c90cdb447c698c4e3a84aab87649c145663ed8fdcf230af883ca0464c3767871c208efee5f832d6bfaa44a844d411a4b638f50e1c6a54a0b179b895db784118404131014ceb6ec58db28f47608ae27223c33a1363802c5435918e582203d334c321c923a7f7be4b9a215405b21ac33663945c25460337bfe3116bc61606447e2f216413e227d1b175327991cd62b4850aa7743ff8c44b1d6b0f57516c657d03c10c99f3ccba12f4aa920f8a2b6f085dd472167eccb5bf41a9dd87b714500ec89dd086a5962605aeddbe84b91145fc430e6581e5ec0dc0a180b26adccaca0d54741267a56c34bfe1862a5d298e629fc55811c6a5f1fe678bd3af7e73ceefa1ffafe2ea435ba1bf52d8bfabe495bbffb15acf9988fc88957f76e8a5c4ee83a904f3ddc09cabadb5b2217b3ef4b265f6f9d3c63cdf38fa4d3bd2a7be883d76a0018b8e877834fdf206bbb0ff27b00a44596203f63ce65be62efc5578b70f62cb23c7bd693efa7fcb6f1253e7f26cc987a2f6bcaeff47c77cb7d1628fe7cbbc7dc6fa6f27b5a6b248ed51d00f00148da52821f473ed96a4fae295631db6e1363650b8097e4b2c6459b5c4c6cb931e8c682b594699f0003d07dcbc54b75cd1a03203e181a46db17190c8394bb14e9030badec5117f2aed4a34839e836eab59438a6c914831243eb95f0a265ba49442a09d732aa8fe1eb790bb80db8e954def48bc52d7fda33b855acfe89bbfb22ffb554bfcd9a358bc056bdcf660f9f46a0364d25dbe0777a87492816a392fb762d510b10549c7c98bf0445e1913fd3b70e0819f40931e3a37ea9414e70b90e04321a8cc0dd15ff02aca31bd86de90f9c4d1440b477b709f62a44dd039692af86769b4ed193b7ea49501b7b76b4aab331d1e2d68be5f466f4b4f0eebca848027f6d50bcafae656ba3de2438c84bbcf4098610cc64890e932be5eb41a50b2005c17ef0cedd742a2d2fc3abd19b4aa09374d6ff70f63a2bd2d4acc335994504455f1bee16db0346e7a6910255f012a88f6d62966357d8c6da7695fe0193b2ed263402eec42683d7fdc418eafc802a21a726543e7d17438665811ab7f5145ccb002644ed1f420d67d8574d49c447d957480b049d83d7f0491f4706f2d95a1f987fe4630eab306ea18c798de37090e11118d1e6d0baf61db439437ede8411c1be0a8bcfb1693583969de283264900c71cae4108b344ee2b66237923ea75f326fd034d7b251b091830b9b51dc432558c390d38da5a17d25feaf279732a161df98650be669adb4d139c738746e56343ce0765df27fc8c4bf5eec5576bbb50438d13dfd244d3a1b5ab218ec2f03921c95a05355fcb9b0a1087654c83373f592df7c43ea247790bc72ac1d54401d43d9cf38ee20cf279127c250340e064d519c364b9fea6f2da3410485d590fbde4cc99acaf5147b3b3b0f946c967bda5f09fe82f6407fdc40176ec1ea30ecee107739c1a7a68c948904e3d3aeead629e5f2f62bb0d7bf536192c245acc0fa18440cd4885431c8316164402e8f782b01c95308c18a1caff175fd64de9c34ede1c818a117dd3ab751f0cc19b50acc66b1314c029015a6a632dd5f855a33f6e2c1c9c1f116268c67f9a586f2411f53adbbee0989c49d573c8cd2daa9fdbffb57bed43ccb8dbc4142eaf9df3d71ac87d108ed84f1c21398b0b49d3fd4a203ef410c081f3c61f4ca167693bce572bb0edce2904ead4ce3171fd742dfa6dd5cc82f6a0ca7736c5190e259ab0d11ecccc6b00a3f6a4c9cfc143a86a14a244105e3cebd2b3ecd1f400928d2a37e63d5b0fb01f22f059428f8eb31fc4cd326ec0201a0daa0546062bafb37a94f2ba0804e9c51a1e8459bd4c2359a05a836db8b7f40ef442c51ed546da8b0fb4845fcd6a4d19d23c9e137c8c3fe649d71690168dfad18fd59b084702d4081d95ebb432cdf04bd9dbedbc7c6042da8b0ba5a28c03d5cee4b83be429fafd153a425017841939303c0f3b67d3124ea5b3311a4d7d444ef911f2485d4461d01ad501440c2de998d4274ca6c24acbb163a3dfc348635479b5ae40c7b1f8b157da2fd8cad86f9af4cd00751ce1a553793ccfd538f21b9a043d31166e28a78d2aad1214d6d54bb0f9efd00fa162c34e1d87ce9be47627cde19c6206201865a4f33f846373159778e7c4bb5751cadca11a2a711d27566a5c0e9c4a069e2bcd00331adfcafd672a039e6eddc76862257aac0be4cd7e07e9a6f479a028a2226975b643d5c443eaf82eca0b85342ac7e3f654edea6d704e04967999c47473e1b6a8df29210a426f8331fffd10148fe86f3c804a2c594a993c5c427c61e9213a407a7b1a1cbf516d93b3c40b3c8348d70c229d1df93629ae1d2ef0a4819a9ad770f2f29c650e6ae506d4e8eb2f2249e69341385874c7c294826222c53ea145732b6fa77c5db63c4e810ab499f9daf92593169a5f3f6ca42282bf9fa04691eaf9c53ffc294276b01449fa5622312eace8a5991450b7344a4d896159b7f86f69c353e3eb599c6759fb6d317ef774e166421436fc887880fb5312fd4178a3a5a08ff0a7625243664426b698e75f0293f93f189aaf26b0768294356dcf8d54452b08178719fd4fc1d57146fe1d255e76826a9556fca0057da7d13d1de080d9006d60ea815a32c5e0ccb373680b9794bc7769c8c45aec20fed1b8b68c2493fa58149f053ce35aa53c1cb6ec672d97377513ebe3fa35e16e4cc0aafbfe087042553ea3f57e3e34fb2d3284fb6d575f83f086819d245aa7f752a8c5d4886c9e0238beea66f40660160217f96a51f8e6599e330b7c6a7ca74c9507cc4d7fbe64b7f3e93443b4d8837bee4aaf552bc5d9fa3f6a7b41613f86e861bed41fb84c30032c71a647a4bad6cce1298bc67308acb5250638130462e6c542992a343d96261a5280f5282264de5f032c511c203eefacd3a2316fc990c69ae9d7a4b6b2dc43857f52b014abccadaa897c86d6796de8f7baa94c6121c86be432620cba959354bd177eaab3b5f17ad84de6f17a0c437c411419808186178e306c1616353f2cfc50bc59bb0e3f3245f46e348f359c90df42c7b642d5d9c5fa2a8f2c1fc48807f531f319166770d27028abb1f2ec8b55e9e509b7a46113cec874099c5e1c4185b0cfcc010180344313044553b0a34d05e325df49d32f4d975af4ebc698c9c811d97473d77d2cbd19fc3efd1aec54c1832008bbb306cb130eb696135923bd7b83ceef6fb8a2089dc8f75672436ca8f92bc40d7904e19594db67ed7bfd533bf34074138487e3c54bc6c718a8d11b447f039a11979c59405cd1aa03c968b274a875a0e2a85b9d072b7e45d0a18f0a689ff994d675d6a05a0333b931a210919ca7b12bc387ec12ec83b483db2c4f301fe1de54308b00000a0e21561b54f726751b52d7b5966db7dcdb5f6e29659252067b099d09a4094c7cc6395348120fb4e829c234d5f7881e28264afd4e24bd4c9212138514fbc1aedfd9414d2469091dbb3ed8a228ce48b241538a407ac213ab2b739aec489278ecfade5b92abae78a37d8dbd0c0d2d126137f716bf357123b6f65fab36d66eac7f897e61375ae53efeeb1776a4435ed3984aaf15f50bbb297ed148b5fd2a7e5ab4349661300aabf65df7503dfc9e0d9f167d9722ae4d5d2e92ab9a6c7c26c576fd4f4382edba49ae89d2053ce231ecfa3e7e6108b6eafe448d28c48dbab05e2865596bc2bd7c9f113d116c398b27766d14856f34a57e0dfdda284093c02ca47f3db11cf84651241ccc94fa4f7862a41dbbea60a2d4c7f8e6e26e1f49ae8952df76017ba5d382d886fc9e07c3c4fe04b63f15499330535aab56d94aa7bd304cb65bb7237dfa9ca855f759b2b5183b09b6f6df3c2c04df700c896ff3b69df34e7cc9dddfbfdf9de817fed79d045bbbbe6b956d8b24920d1741de564710f36643ade2b8ff79c3f386c71f1c303339a90af0538b2742fad64f3c007cb3aed0f7a7627703003a2637f070836e317d37e897fc198bafbf89e3ecdfe079b4cada13930e261ff9a4555608377c1f8db98d8356d9bff9e69f75e585f5a94fa30937c69e1f9e9847564d95e4ca3ce921d9a82b30422417a9ac2b96e4baf971c6ff2293c1e1e6bfa397c387a255fabdaa3bb003477ffcdd93b4aaeb50e628544df5e51b6b7c4f824f7da30e47d12aaffbdb8d199144ab329900e0a05ff868524d38e837691fb2a82388d0f60b72bb6fd00ba0b16fd0790c2234e6504df503e08364a39eeae3a05dd46d47920b0d217d92e4da55bc39e03072caa193830e458b92034900503e149d7d6723b6cf9315807e913715ebce22fd14ade2f03be5b07d01e817948ea8a539d04fd12fe84dd1d34748bfd2ada21be040ae400204dbda69ba2afa85dd4e07d081f84fb44a7f5e97c91cd65a03e27747b97a9c279d194ea3521a98a32b3082374dc8cf6cfb7b217ed72a18ae5539b6ed73dcd726428ecb58bbe0b8d8b65d7e2c7e7e7c621fd9ea7bf2135bd5606956dc97f328f2217ff779242947723fb27e62679ee47eac9808e9b7704eb3aa752463b16dab697e664bf03c6f4eae160557bb1192e1a634db2f54abbb8730ec0d8fb91f0d43d5f480cdb680605be1d71c7e239cdfc2ad683d0e9c74ac306c8be633805edb2b5733c2c5d5a2a85c8da4201b2017a8ac2607b9629a1f1a996b624e725770e16dcf0a3b3fc95d41139b28fef58726b69d6e5213e36a5c8dabbdaa5b1678d384f4fc62eef36e342ea6b6b2ed79e36c33ce3651c270bffcd51c61c667dc77620b6eca5a5a6a26a355b3ae6466b3d976c044b96108e99393b39c0e9c56c111d6f07ea755f4bd1cf2939f5e423f892fdc586142fa385f9c03aedec77d784febaa9c6dd7cad9fc54399b06ef97f9b827c1a7b85187bff5c7d8bf1badfdba4cfec0fb75e5dbdeadba096f3a8b0efcdccf2b01968e215a3610317ce7376d1a29eebd21e81a6a704f021d43b4ec183e007fab7ba0b12b4e5d716e5b7de0ecfb035dad56ab536603bb7edefe436a076b2dadb5ce0be6b188baaf0e7dadb53aeeb5167f4ea73b88f1b5d526e12e7bbe47dbf3ab6bcfb7edf9f4b5e7572c8458c819bc8166dbab1e490fd8b6b62d2080b6be7d50b4adad47426f553e22211494e0743c1a120fd39a8dd4d48080efcfa1d5955a5dc91c1ab8d9706f1f04411567b1a59ffcf36724b3884aa8c20428284151d9065e3a4b76b94a57e92a634cb001457d30b0d7237e349dc656d3d44844911f11371f1241cf11438dcbf35c9ecb73913956f3d30e9a4828a20935a1260469424db8d1d06a34dac6e2dd1139403c22a746a3d5681b4dad2a91ff7c5ab55aadba7be673f7aeeb624ca0c5ea0aa746c31cc76995c87f3ead5aad566bd56a1a2b3ea2c6168e9a5a2d1411d16834e16b36ef11ed774491e788e16bf29339b6193934119103a4168e1c1a8d136a34a1a682737f359203dbfe5d6c7ba66dafd5b666fef5f0665db156a4a64bb1c574a658fa4eefd77d67ecfa94c3f7453ad621789e868673fa6ccfaf39c29a230c6735d51c21d62a2fe79c3d705613bda2be8785d0fb40da7d60b8e97c150b617d8fd6889068443825118ec8b1c1e403c0c8e84fbe8a85d0c36100b9d6aaede6acb22ccbb22c8550b9996c5f0bd15adce5a5bf1ce63177f9921269d4d2d2d2d2d2229a23c9003e2700e7ca65f80ac13e6692a9d499ad2ccbb22c4b215a5a5a5a5a5a6acd768bf195b32aad8a48cab22ccb7224d4d2d2d2d2d202c23ae05b4cabd56ab55aadb22ccbb22c85b8cd5b2d2bacc6aaacce2ee853966559961e21e66ddee66ddee6ad93d9e1be322c8c85643f33d166b51aad95655996252d6f31755559d5a5b6a82db7c696773865599665597ff3ad7cd3596c8aae288bbad056abd56ab55a2d5af353fd1c86a1d0bf89c2688ccae88cd2688dbebc56abd56ab536b4466bb4466bb4466bb4a661f9a6b3784ae566b27d2d440b67e494d5592baf4256c8e55b26172d636a9ecd660fb6728babadd66dd996b758be8a85b0e59bce525375e6a7fadeef6972159fe4a4edf9e4acf9b4cddb9eacd8aeb3fc8d64e88d64d88d6428f48f47d264b2ce2255b6488b5780cf5dc23014fa379954c896ed2c3fd56e3b6ba23021a4ef15e09b9e331c9e19f0bef54c6a6afa8098374dc86fb5ebe3690aadfdaefb7a23ecf0b7a8557f57bbe83c23927567bcc7ef71621058f4845453f56ed554ff13bd18ef163324afea4ade35e6e5fe47bbaa5d7cdb13b2f393b60617b344489fe4623217b3eb7b36088ff118f798ede3376bfd56ee760748a59adcb6747885a4ca76d72a2a7efa6f6c992c2dfce44ffa6d4efb9635593e6fdfba4c16cfdb3a51d6093b5744de7e9e2b9bb7ffcd15cedb0f27cb7d6b9f4e16a0b723a9a211a2b9716c239c207505866d716c75458573ab2bd93622be846fc518be55e1b6236f7f648c4137d6616ca92667b1303ff9675b852d6c7feb0445e52568cad5f62dcc59f2cb4ffe3987e10bb6fdf31214f5294153dcd2cb11f16f444ddd52ec4cce516f84a4e60612f17fc4f03d62e74544cdedfcf29cc3b0cbafed5d5173f393ff86337b10e6504dfe261c212842620014c389120ad111f33c61f033389246e46d6396c0dfc5a088f786c3e9076452b50cc5f7933fa75f427ef2aa23a44f866aad5c27acee9ef9b2775df77da4adc2f6f77c5f31cfea0ae6d8388ed32acde39a2324bf72fb7b9ed6dc7810de5438422adbe4576a6e9a9b46882686d3dc3c10d42a181eb3350f6a95e66d66d51be17344fb1b51f322a27e50a43b367b4026158e1c9b9f4a8dc809c2b969951e39b69790bee7c91cbe954ecfa0feb9278a1ded8de4c8b67f9e6dff2c9296e3d8b607f7e26bad0ecfb96bb175f78bedc7c8db1d5b8baf14303030303030303030303030303030303030303030303030303030303030303030303030f87a14ee313772ce04c1dd63a68f1b08046d7d10e472e6b2fdcc715ee7755e178a7cdff7690f8726049a8f50e4435036220c028f1e4fc07cf4e001f3d183070f1e301f3d78647af010798de6ed8b8873a2841acbcdad3fafcbd8d667069ea7b1b56c4ed836fd3ae99cd97eb5badb7b6f4c3aa3f09cb0396848e9bb5b7b6f08c3763c60b32d20d8169d32581e73c3636ce6b839517208a68582da988de5528ad1348306664afd6b63317b31973befd31a111191c9a2b3b9f4f73cdac719ba6d73813e11d4c672f9030f8d907c9909488056010ad46058a09aeadb48449fcd33d1ac2b4e391e5aaaa97e4b025ae0980b50008e29cb9c503953ea9322365659c29de1383aa874456cff79b2cfd12ff2aedbebd0591dbcdfa2d61922de57738424dac672b031536c3f2093b2b1d2feb0321b2b954a25d657eccde5cea59feafee664e193253f99c39ca39eea7d4e7c3f89e897ff2f75c250238ae2d72a4243ff51ab46adb22f83556f84fe53f4469d4b1e84b9ac35e778a97ccce54be979e0fdc9c2db9fcb9e365cf7e0c09bb94d46cb6d4eb8adf37e78314fc6d1bc1847e38070358e46ba183ae7828b81a3fd80a37134b7b9cd6dde2c0a2742d269619eb2fd226f72c6aea3a771cf93535523ea73b15ce9ac34c5e630040254b0690804dc8b31c7e59cc90cd9f3bd39bbd14f207bfef7b5f0a083d620a8d184a137a788c866c3e1743a1d9527fc7c740f15f481bc2e030281e8fc4c9419aa9a08b96c85909c5428400a4abf56af2299770c3be3a19a260fb5a3b3b3204963db899273c69bb3ebb4aad343fdf6cca8ea4869a5f46badb5d65a6b8541ebb7a8f3663befd3aa2fc6d7d15a0523a4aa947eadb5d60a6a42adbad6452a159922192f739e373f100e6f9a90271eb5c0f6d047edbb082364bfb033a37aa2bacf1ff69e54e13233464e9a08865154375e5b686241c73951c056c85ff27b1f18df06fdd42ad0c87b74349a5a457aeffb60406054ecf90398a85b05024c169e9f529053067a72fef83c39633cb40480cc61cf479954bc359a82a7d8f327455d2b46dd9325f9866c98a88b8593c902fcf90098a5c92283c2339a3259d019459db8cc14581528ea04074da951d4498e9325684a3d79d114d5e64f7050d409133928ea64c7121475e2c48ba24e6074bc9c7b47fe8a31ec26118d9865855024ce2d4ed1e37cd445cb9b9ffe49ea223e4957244fd21a7bfe0766c993730da127e710969f4aa42767cce8c93973c938a02727ed33f2e4ac65268bcecfef260bd13bbedceb003e093ea5433fd9223251f48b08377d92b3e7ff288eb806cb5930cce52c785632d6208d64581a59a3d155c33593885695dea3df46ab4ade03e508494f6c0aa1bf27fa9c2bf14dac3be74bad40b9da26b92c11d40896f4c86c9b045bde26b988f0804c8ae4ea416705f1db51447d44fa64de12a412c96537c94553b6502af9a614324f2c04212df1eafd0bfa849b9f5a45f2f3bdcc97f5fd0c68dfd8855dd88565a8c8e83b9bed8cbedf7dc05907d4ddddd1e9fbba2fd0e7113ddecde1e95bded2d3f7bf91efba5cd6655dd6ae0fea8ed8d9dfb5f1e9ebba2e8fc8d97807ecc4e564e5a71dbb86a3f7bc27125152498449a5ef749e24ce8952fa447bd3589b4a34da6aeabc589b25e99c28b1ebdf908b64439cd544329279a43392a41cf8c4c565d7e7469e93d5c96ad7d7b786d67775571e71b3ad68ad00b5add99a4714d9dd5f9148b7f74d5a41fda2cccd745a756fe6cb78fac5fdcc7b19110e9f14dea7ad46abba2e14e1a0a142a3edccce2c108db6344bf388e1b6a20db58d555315f968987911adc29ca7d999cc6baac7f98da07e0fd423f7b69abc2f6915c70960e6e83c5bbee4f196aacc7deff17dce1ba7b7f96878397c49d7ef7d11fde28e76c728a2edcbbeec1322dac22c6cf389e8fb1b707fc417cd73c497ef47c6e92710c9e5a78a61ce02836d6c5897cb236a4e121c6d5badff3ce28744475b1797cf237adb8af608cbb22c8fd87d6c0dbbb2367c1e31b36ba0211e1313fa40fa7e089cdd7b00f83ee2cbf71cf145f32320cde3d9cd796b44af7d34cf7768a0064fbaf374baf1da424242da6fb7912fa4ef8f00e0f3885c0c06838d5031a27d3623f946f47d921b3e8f885ddef216c90e12edaffb22d3e711afaf626262448e8448bb8bbb8c3e91be3fb25dadd1c0d7955669bb3ea8f1ed464246bade4e9fa788bcfdaf589f805558fd118b55296455460549d759003e8f586bd5554bce7f7ea45f6aab3469053ddf01bbf78873a270c49156e9aeb4a3a4ebabbe4abe92be5f92c3e779f95e8be39c2710d79cc513abb5dd09b1c1ef323b888811ee0d76f89620514dd5a5bef71f4f87b3110935a0febc0e04e27f6b85d0effb7b367c2a2696efc9d73c19727b6dcea219f1cd4ff5ab2d8fd34fb69bddafd12a4c39ce878c1d2cddf18d5be118ee25bfbdf6bec822f7ba7d2eb62d133e64e73a9fe751f192469a12d211245d59aceae20b2b94fafe6281a2aca0a81945812d9a52df7fe66343e139c23cd5bfa207669a0cf07d7d8fcc59f2d7f7cc286ac79e62b2a0ef81c2c1d637926c54ea4427845d3f13845d3f04845dffbebd947b92bef725da057d4c63bbe725d67ec98a6895bb58a25fd0b1d6b8b644d7555d7df8863f9abe4854d1c71eab9a6c7893291a4921b6e8a948869bcaf0d18bc418d6239b5a351a3db16af242f89ed8b65159beaf6f2292749bfc47abc4d1a8a4e4bfd1471abdf8de27ea28c2eed28b9ed2f8a50390c0a6342f8ec617e397bef4e3e86fd02f465f1a7d3f1a5f34638b0ad22ad2a8f4a32791de0b7d3424954a23d27fb48a440200a83402693a9b3dc8a37dc8ff893a46233b128d221f4a5ef4a2929102a9a6fa1f4d69b4d2e8457f52fa8c4c4422dd2497b38036804954ec026196c806915aa169ada61a113d7d116924e9263dc98f4432dca39f9545f464dea59f75e5c52f8de4c87b1cb1642cc2ee922f899c1fd994947c2986dd9c91e794c4187697bea4f443cc52e9ed2e8d221f4a25630cba397fa25f70bef41efd4a22e94b44ce4fed82f3a4915689a21fbf24fa922fbd28722a08453f8eb39a4a2fbe47fa6828fed40d107dc9b7a85e8928fab945719ca1481489461aa49aea9794469ada4a5e547ad1bf38a7a9649cd524fa917e617769b4d52422211189441bad1a1967287ad118c36ece28f281e439cf198bb024231d11ed26697afb80ca5dbf74c204459df4d84151274f3841512742805114ae71d283a2f00e9a72f204459d287122048ac2359a5283a24e5634a5fe87f3d6f419a7f83dd50db09b83775094fdfa274a5014e8ebe31a457dbefec98aa2385f1fbb28ca8ef3318ba240e3a429242942aa4562fb836414e531201945f9109ae2ef6a9828fe9cdbcd074d6cff7cdbfe2e4484a30a11e960fbfb0eb6fb108a1225415d0d9385c80613c5dfff8aa21b4c51abae7c27d2b1fd45495094779b221b50166f0cf3e48ffa5430537aac7c27982627be102cb1fd2765c98cde19e6c99f1429b15d48353967e4dcaac9bb793722ec2645ad70939cdbf6e7dc38422acb26e58f375bd4aa2b93084350c2f6173d4151ddfb8b92a82cfafd4536b693a21c2c9927453bf4289a013df97f39d8fee47b9b4d8a5af4448a98d89eedcbbe2a4da1cf891ec77d54f7c0c53627f3938b7e1865789f791a29cf134511f0fefb6f04792327e6279a02cdfc248590e4902019878b555a487a9cd87e79b7bae27ae7716ed7aa21e81a3611f4f3e3cf5818b85291966ed5e4dcb7a8a2d66441c992902536f9b560fb9322288810fa208b5a9a1f22194c147f2ad298d5f4512a9241c6417863fbfb60fb4f118fd1bb4d14d7c488a0bb46212443dbdd6993a6d0b761e577858a25c8acb022b604d813c2d0c894834a0deb2c2f262ba7ecbb5883042d29fba19010fbde772008100a8542a1d012cac9857dc717110466cabe8c194b71c09f03f6abe88e0ed8e354a1ee4f787301e18c2941c82633f9a3053be684a20bb6af4e08ab128290a19103fcbde92cfeaa17f3ed28b272ca9f07ff6a84ad0f4411beed732c11b5d2cf93458cba5f5c0940f6ca9e3125e860bb66c00ddb8e2f1cf0affa07bb5a51fd035dad521e4b79ad56b8bb7b85e17bad4d7df613adc5d75a8b331b3859ec013a77b038534bb95cf15b8b2f0d9a0eee535efd440ff8be7b097c63f71298cf99008818be333f6d9b468a46aada1f6be40ffd54bf136b743ffde4c5ec18bef1cf148deda92cce9487c9ba676cf781001b7f37ce79ba1eded3bdfeefe1affb2195473a77f0a7d5a9bb4f0d66c622eac66e9fd351b92ceaa0f846e1d5d0319f0439a5a3d24f428d2dda3386042eec973b663fd16f51e96bea57d03fa0e73759d09f29fad384d61b1e8a3eb9d9339379655213f9d9f5496f77767dbaab47334d14c6f6a764c9ae2fc2295d20dc9082d0888c3000862221b48664880f1c21c2d3a10c741f2846c6fb6820779e22b84c670338738cb8dc8603168b7460d70fb707aa4686effae007b2a61a8aff9b2cee5bbaeb08c47b54f04648a2d07df2d311d16cc8ce13b989c33481bb929e5d1f871139924d0f04f7b987b9ef5bd3f4135096bb7f75afee3cbe3d41307f9f75eae1fd350104298a08bab5a6934e4ae9fd29dee9799ee779dea61ec3f77c2484730cab69bee7799e256d67d39f8fc39ba6f0894d7f8adeb82729ee693d5bebdbff292b84317f6cead662ea6e84ce0745683f1b9feb8a286a13a1deb39ab8d99e1c153bb4f65e5a5f211db91274569feb737daecff5b93ed7e7cadcac7254ecf9b9c8707faecff5b93e1b9def7329f1b93e1b5ff9b93e57673502aec6d5a2c8192368629a58ad56fbfa0a3f151daac95f6b0ec41ce538d72f388e039d037197e140dc6538107719cc81d8f33cef038be083e370077338c45c1038ccf1e8516be53a6175778ecbb87bd7753c401e20c7c17cf4e0401e20e638f0399c6fe0c8b1d9408c41ccdd64339badfe1db9f9f181bd6eafdbebf6bac5d47e66b3d9783ed6da0fb5ca7a2e7df6f07c403e343e401fa0908fd0880f8d0fd0c78847e30ca6a2da000aa2f405bd5e7d522fa4b3bae640301fb887fd61632291c87d64aff7b8ce6344baae9f209148a24e187aa55289f465cba344ab4ab4eababb97c07c5cb73cf07f4a6072db55e3cb65acb77abd56bae630f147570ad19d914a23d7e6f984401d4b6f86f33a0d723618e77ca5a0a83b84a6d4d6902bc59dadee6ca42c5938c3740d46effde1c2f2981dd972a61bd9ac8ece1bdd46b6918da668c1fb46365d63d5607d190efc4a55aeb9b79c0df809794622cd7d06edfb62b55e65cbe5ba5c979c71709ff970ca1688371cf00816e7eb889eaec3a1396bb3355b1bd93a7b888db1311d91b3ef108a320962423391dd21afd56be43bb844a21385f456ab4a7089543296c4395148a395f929b4b151109320264144a36d1424041232f1c684467371f7c806349199c82c104ba375c4cdbea27dc2c2aaa9c23aa2c8c6e06b8e6e36e6e844c1df69d5e6e966b498d39a64e4d9d0d6a5024192119803d4b62c77bc5e1d31dc5783437fa855994eb3b57ed0821cee3ab0f3485ae57925b3865d65f0571ca15669cb3d7d8d47d871097fa85fe0d11ec1b1421ca1e65e04dc210fe833b2f9a9ce95c8108f89e9885a88df6e1df1db57f4206e735b47f4f615dd0aaf79ad23761e204ea37d1d31b3cb920a9fcd3e9a7b106703be377e210fe8d372160fab6ced0eec7bbdc0201bfb1e16aec1f2744643a490b92c141abf8ec879cb5ddc2594c3cb92fb111bbe8e88636eb79b1fc1c2c1e29ea4235eda6c360b526d38aa8d7b91b5250ce3d7e80a9114225d65b293af5344ae48b8b8d4245a2d1baeeaca51e22801f075c4ba391b564963569be7bc48bfd0db8d0472c45117664afd8d287a523da29a2a8eca2269ee4b1d91ee4d1671e92c1e16587a1d1e5d31ea82e558abb11484da70505b89c637a4f8be60b017ec05a31aada294e35cdff028db317cf1c522f7de918db246360fabc6408d143360695daa11a156504d6b358af1ca4ff5718ba24c6834a53e5d39cb7df9a97ec62319d6bf2f67d1af7b5f370af354df84460df0fd9d829ad0767ded053a825d9ff4855df110266de653b3490cd31af24e61140436d6182b89bfdbd6ed486217f8bd0f74239b638eeb173e52208e632464d7f7195cfdc26eef3dec8d1a7cef572d5a2acbb1188ddd8cf5362f91b2a4e5c8564d4138d6c8b61ad9264a8f5ddfc3300c612fba8a310226a695a90b75b91ccb79195d73160feb45511896d135ab6bdccb02350a8c82dc918d351202a3a8511758a321bbbe658daee060235b90d0e27befc596c3715db3163f816158c4310cb31883304bd7aef7a48735b28d825c61ed66c38d34918d0314a043b6b91c07773a9f4e023c1fadb21cf7d1aa4ce6a35518873e3c7c3248abf038b2d9218c409a7bef8e6815fe0cc7711c873d47b03c2e231bf8a487350a32b28d6e231bc86d6e14bd00c11287f5083b2dd1aaae134d9e4e9256715cc93465bc9056614c429299a30e2a3854ee28483dd51fd12eeac6e3c83624a44f8e6c978464443222d1212b1291441d910eaba9beef5be7e9fe48bfc87c54ac9ba455967aa412d247c2e19530ee409da6fb25afa4ab33365ac551935b48040962b158135f8ec562b16a6bd99cc8394304b72d8156cbe5cccd7b643a2f939969957fd8fd76efcdd65e6c39cb7d9f56b9ce78d7657c862dcee3c457857126a3414e83a7e66ab0cb5abf704b75a809a7f7c22dd5886c381dfc15cc61afb5552469cc019034b6bb5f9bd9c0c96f6a07bfd6bafb0d242edbbf4575ceaade7a496c10c22093b890b480640912255adc5a11ce5524f1c1446182a48989e29f45921dd5e4df89b0ed4f495edb3feb07d414494b4380a648a8c8ed0a243c29451a45cdaec5b727d29ce574639efc298ff013694e8a3432b44fe544f1b75508498d6bdeafbee78f5510e848e62842bb271450986d52a4cd94e7ab71b9080f4059a69f28ea8483055d39e538c94e2513a8e5b418b25420338df479904c2b7d150ab69ee8bb57f2591984e4a9fc8f124613f465b40af49e17faa806c78c2823fcbce7f14886ef65c41a3a82f836e845108a2210910612c51ae8434f8aa71c75257cffd3abaed8538943e2cbc88346c6191fe8ed068da217a1073de8431fe825f378bc974e13fe8f78ca514fb9c371f0e68ad81ef81255870bba270bcfbb6744abee8bb4c9627644f2d4c48909f2e4038f56819f117504f16dfc5e48abc210e3f125f3192df2010ce2db77e4c192e889c918fbbebf46b4d38447f27b30bbb07b0819fb3e0910df83dff77d2fd22fbef113e9dcfd0744f7e237b674a10e77dd8ff48b6eec8c3c5493ff4887d544b6b4f040d2aa7424a14808bdcf4f92b8683d7e94f0917d9480fac8ea4acb34f99f7254938bb8609d5e5a58c2a6ac90c4c5592c4b4ef987f2a69ab30145434a51d3d45251242e999a8856d8242ed8fee4688bb479f2277199267f15caea549e6e9c4a8c52a37bf234451376080944d83c4e37260ac618e3d38deb031e444002a7e3f98042938a174e7cb1e3ed4472f4c64a85b0ac2b19294ea56c8b4042fb5c6d5fb1b6fd459ab364ec14209049653ec3656173b569f237f99e05b8e78f9305fd274d76dd56a4af1c21996b2149e2b2fdad5883be56abd50ac8aeb590cc2166fb9f5e74ecc1dba7b29a7c42e185266cd8aedac5c816691a578b5a6f21792ac91c625056be41616de7ac4e394e3c982c4eb06f4c54669dcac9e2beb7b8dfd872ded8b66716f5ccdade6dd76afbccf849dff429fd9256d1a91d609fc485c4855423719928fe9c48824435695cdb5fe3fac86adbf3263fb2ed6f45912685903c95db9f1469db4fa58d6c2171896dfa2d67b14f4732e48fdd5ecce54c17d2aa07e092a15133b40cab5a49cb172c269bd96e312b964b7595ad56abd56ab5cab22ccbb2b4b5ca578685b190ec67269a4a2d26874f5fadd96cd66ab55aad562b46e566b27d2d449be59973188642ff2693ca8ce5300c85de6452c9a996ab7cc162b45c0b6da1dbc7cc5cb6ad46b6e44d672686c3902aae50aba28a2aaaa8a20acf05242439d9e4644d84d45a6bad9d28b56ef2a71dddb5a2b35d452e2a674b71b694d3b055845ea56150220d33a7ad3224e166a90c8680604599a84104da14557c810b20a002ac09b1d5cd0931e0011557448155051248cc4c9d735e29c7d5eea948869914027b32bc7b1a29215cf4a791f2ed788c61b7c73dc64f454a0bb1f75a2c026fb2c58e8177f79ce8799fd5d47b17678aea1e48189f5884a53f684cb6338d9139c7b09b73c1fd10730d6bf0a17beebbe7c6227c77ff8d45d84d5fabbc18767762de19dd43f71d7d4b976082072c3503e788a5ae7d1f65d45512c6304bcd0883b852fed60211c32b35e302a14c7917ba70065b6ac67da1a55c874d9f868a2802fef77d9441ad3002172d2563c60dac94fd1922347049f9df511481fbf9ef2863ce5c46004bc9b83f234751134520f319871672d04ac9980182a5eccfb04cc452fe799431bd208217bc5232ee3883b3a56c0e9bfe0c17b24af94863094cc4523efa28035f810a9abf7d1a291baba61fd554657587fa1e8690a4311aa3740c4d5b9f7004165cf015685d68a5b829b2e002da143c72b864ac10c52bd5b9c85e1e153d9690a566dcc0fa6a2d1394a9a96b437ed052330e104bcdba0378842734516a9ed0822ddcc2238e88891ca1062bd926660430ce8cc2ed05b38e0b0e5610f398c05603d9a7bac00056825ab06315a229c8e105dbc88cfb3e8a7eb0efeffe7614fd90674c2bf4a0c62a653f8fa21f64c8a02b20811156a93cfacb9801bae20aab947d1933e80a56b4d41d67dd41c60cef08ab58ca8e3a443e7040e0e7c6b967804538022ce5a30e4c83c4086880428c688a2648a104611413563315ee731993092e299f2ce8cf89420b3903d488d19a6a51f30422052a684ac8b6109b534ca1c62c35af8021c26cdaaf764b38018e59f52784de6761be604bcde06c535f1450e1a603135e291f75885ed0d8149c5614a1959231c37fc6c804b5948fce3223250d3b8849cdba437853410d9a883b8bca13be704bd12950604b398b0c1d11a060f8411256a910bc8c19abd51d6784c0815c81c42a659fa2a6df08eb0e1992c6febc4e8374b6a70d34ec8c4aa3ce701af4967478d384e456bbbe4f6fb9cb4b58cc6bd916de7e6562d14a572d872ea1d6bb4ca5ca6bcb72480bd56ca69b4a8ca9e555589f73487f52147eb2eee9736a1fe89e5513ad3bbba0dba63222ddd3593ce7300c85fe3de6b1183fd5cf390c43a1ff9818fbb22ffbb22ffbb22f9b73188642ffd6666df7d2fc543fe7300c85fe4da6ebaae51c86a1d0ffa55d1a7651513199fe43a130e7300c85de6452c922b7efb6db7716ebc6dc97c5bcbd15abe56dc35c747569d865d7af5508b16c66c017fb9c7d67390b964d9a42562cf30f9d4e14eaab3a62066f9a9036acb6bf4706efe69161aed060fbbba835a7277aaf4394445de19ecc07f0de59c21c02dd6a45420d5a2a53a91092a2160c60291d16df5b2d905837bdfccdf732e24ccdb922a281a8554d2ea2c15cf1498a2c5e46a42951cb4fce716e7b195d1252ac5232323f83bea86096d201fe0e2a84787b0fdc7b0ea49ae6f6f76ecee28dde4db3493b929a4d7ab70f78bfd9c8a8427fe6f538021aa9ef3352985770716c2fdbdff32c2763064d0caf94f732bea91f4053a2087caf5f8f9cd9c879f9c9392f999ffca5802b9090e480627525bf836479741b480a900c34ab2b0f924d16530839df79af7e2019080993457e0f8566be91a18673cbf9853315c3bfa2fdfc9e18e3891dbc521971a6304846844844dd64c8885808927484c1c536f8e289caedb674dbded1e09f9da52f92c164b1af897f4e0de73b3d5ece2292c13cf977c6996624453eb0b2d18ea48d7937be64de133503e8de8c6eaba624ea8a0bbaebf6cf94ee3a8590cc53d49a2ce6dca2195016cecd4f32982ce8b398c0c189d9fe9c9bb390d093ffc88909c06a3b3d911dd6f63932514213c53b11172c21d534c1e92c334553996ffa9c2cf606f3e4e2f47f4e13d3e4237385f3aa267fefed0d260be708f3e4cf89f9e9d5c45cf169f2cf4f43ee33a2a8fef734521e155db63fe708b3d3da9d233627e62c1d1698609afc2140539c9b9f9ca6aaf843e6bf51c6017020c1961245a0b302c940324e0c87b42f8fe3debb4d619fb449d86e774c16f3ed0fe6ca6582a2ec112f8aaaabf0498b04cd93168a0d3e697dac8e5084ed35624f6c67591e7b09bba228eb5283a22c122c8a02c9688a5314e74653fcc395a646b547bc646ab5512785220a4f78e24cd190fb5a45c8554a6935d19a57d5e416f6cadfa27659f3a39a9c5a178af25b4682a23ca237a8246c982b8a1e64884604000000008316000028180c0805a36998c5b9ea03148011729a42665e3c9486a22886511885144206110200180032202333a31500a394a0474da755af79e40d5556975a0b17ae8a0d64bd6e727ab886bad48367f474319b5804d3ee03aec786d9f2bc652ce61a24e8d71fc24a0e7e00718e189142de965596d50b9e38421748b1d447eb2b0d4307edd0ca2bc7a3c02e5de139b5bcf3ad5ed5f4bb30270b60246fb8de7c724900a4893604810bd76ab815ecfdb43817ca4b3444623770dc76c3c94df7d0b5e60e70837947c80f8ce0b89c7d73fcfd79d172911791dfdc99edf3653fe8fda92d8badf14db98cddece119efe9acfdb6c5de74fa3f415459d3b5a7c493797162a68fd66c2f17ca7c9b3075a97d63f3e7a2a170c5b44e3f019aa8ad7888b8d6563c7476d599d59dab693b573cd0b88edb73cdce3ec42f2726a227a2d815db42dd208d2228e5a5a0688e62ad7dd5127bb7b09edf0e2a110361223973ca628a75febc38bb630188826744cf9b315831bc22cfcb0ef7111e9cb41fc03b3953273f523b653bfa99024e4262efdb4bdf433c7e0615fc57c4722005285ccc63c172f41f63a156d90e1d79a96938c8eda14f5fbcda61a46f5d3eaae40dc30329882767f52a9a25e628286162ab45577dd94895a1a6fb51b0c6cf48315db07e91ec4991363c7da7cc352eb5656e9e27f23b356a6e166728a534d1c366f117e56459949771ca3a7e208f22a9536e6a9a9425b09e33b9eceb353d5570b0cf26a557d094398322fa8f9a534748e5a8a72e22aa30592856b30c66f3d72c56dca17c089b53541550d3e69f103ecb673e172d1ff8d357ecd052a5159d6a9def514cd0efc624c96b99200fcbd6b3d1b4659325491f09c5ac0462b8d96463dd80f4f9413ede7951345fc1595e4fa38fc980498e9bc2979950d9cc3746d8281c630aed3dcf79f818bb081530f51085db6f0c272dfc23e777ab608efcabaeebd323d20a10679f079815044cd3e052cb8dfa31cba56531a06ac6806cbc1b7b14b6e47761d3c8efd1a63b8761d31da4e37f8164bd4499a2a461061d73e80a82f09720aace620164ded2abbfd9605c8dc097f9175615989dfb13804489dd0836f40c9ea5aaca067b5796a74e176193aa4a89bc4d84ca4587d0d03e2c2864001b67d9e2028c43fe149adf8a28b23e189dbe156f56fa7a55c0118e2e847ca74fd01bc0489cceef0f777eb993513cd65d05879b789b4c4fc307e375927f0b590b6a499446321aec4682fb88d91a7fd5ebbb27b2e8cbd974d783dcb225f2b6326829e72c18f5c9e682de90f22b9e1676b78bb8f5f7298c3ca3c7388fd3af2ab56ce65eafa846237dfa4d289df92bf2c1d0339616fc10bb1c06e0e33f60962224c41ec16de0b9c16dc003527df7c60d88d798c3f83f16d849c41aa4017dd22ef0b5904c94ee99565db886d41d814d0c268466be41996c7e93ed2e4c91fe36bda85ab306a55ec3ded1822e308a957d3e79b7d14b73650d910bd255183a5095fab8f22810e5bef191b30c54171fe609b21cfa948588c1b51228f43ad9f4f077123d15430317eed1b4b2e12abd124b36f1c17dd3c91238ba99727bf409de01e08dde8ce45721b5aec949d30787be72358340b353be56013670c177e06f4c8e74e4a87b5cd344120c56025de04fcc7e1d52344257628acd2e2dd51b88ea67345fe83b55fb80f64e980b9b88212fcf06af6ad4f23f16cc0ec932ab1341873ebc1ea230889ffec920b45f11abc71447795800e18da1e085f71528244ef2b7cb4c177c4c60a4ff0c3e41232400d6e87078bc279fe265774eae6c76e6c9e8dd172abe196a236b33a92d9e70cedf56ba4f9376de664d03d5aa2b2d16d170b919dfbe75ec4b86d062bcc373717e072a70b70fe5310c0a752262fb18f5ea2f469df3e0cac3b1bba94df48d659ced68ce1fedd83beaa74d2af8e92644afe8e5dd4cad4cbc16de4aaa3a7cc162175f589cc7971566f265e554be5c399b2f779c57ccf00eb2e3717628d2174acded0ec4ce1f76d3f2b677386c95de3e7e34f027670f9532abb4d061f4c11166cfae1ded3b67f60de484ea8389952c56050ade9f2dc187b0225b7bd15d8bd26c8177c67658a03715e878c50a08dbc8a132e1385f2fd7355a01472d56f9d7a56d1781923183c2e0c07b80cd05aed7a87896e4c4be3209a5e311e67848ec96625ee41d6da0cfc36ea0cff36fa0e7f970a0e7f971a0e77268e72a6ee3bd9cb7d61d3714ab41926baffe5ee029bc61801b9f09c3f419840180745ef41bb485e337df4c1a5bcbe44dc870a4a9908907ab6d816396869924a84c48ac749a476c0eb5018fdbb95ab392301b19a09919e8296016de4ae1851d3a7e53273c1467753d8e64dbe465d0d35d863eb356296bb9a1afe3b2b2c2a5889e9f2b4556e965f11f13caba5c38893418bb95711c6321260d0697b20cb727dbf3f17f7bdc7733a277453b0b71ad7faf697e75034a9859a4cad722b78c4e3b6eb7511408b5526fd49318a3b8a409f185b66a8fd702fad9dba1b211cfa361831b756f48910c3f9955f1155c6071c35bb41b3c716c2b10da65788de233665b95e7e1d719519ccc329cd7e7eb177e595a3cfbd25695e08aae47a02f2e3d62bc6fadac45b68f2148df02895fbca9594f291501cff8981075dc227fabb6f4636912df43881317e7067433e5407605087d8c4215229a6e2bd11dddd685596755dc119dbf1476e93c5778041335a9504f4c2f77fa5a1b600f263c030868043f7a1bc0220152dd41132bfb81032dab914c6e70f24fb40ff429a2abb064f1514a99ed8543b34f4a36498ba983a7a1a08099d87d578b930ba150c7934a931b8289e5ede405c73ab6d66c8bc7bd37e2e3ad0f62a1ed5cc13b56f03b1a1b5f1a947a1be38442bb5cdf83773c0f9be80d6778195bca4e0989d0f23685fd3b1f8df5facec643a0603160d2192498dbcba54c3fb8346c9c9fd4ce929d562fb1cf27df81b9f757222f9116c5c0a1d99d90b49ab437ee27b1218dffe0c081d04d3a1a74e19576d7187bbb55cbc0106f1a5ceb98cb59ba557a3413221f4e1086a62c2a8de8bd98bcc70dd92bb0a270ab64d4a34e248ab9fc3d601625a2a09593f934de7e9102805046523a56bc4c81ab2eaa5e6b2ece1d783507f1191ac9b2e7de74134fd6ce5cda7a189cb4f50d19d098d83d6ea45b68e051babf5bb450bad061d8fe4242adcb8cd82104ed5dc0cc99c30ca65d14ac312d7552dde12d13db972ba444daa1177d4b0065f1bfa4c17a1ccc86dc553e174d6cff7210442c9f86e80115a05bfc530037ad561d0f7b64bae9e59dc277499d79c72f7fe82051e35e58a80410a0c798f775a7685da2de96b84bc28286b12e01fded58d1b88896e8290e13bdb1d3931fa3eacfd7e90254114b16b6b5fa56fdac5a360434a9e550733bac5dc2150a32e8cbeed7e6cbe8133b1425f952fef2d78f881acac209258b5563c3b40e0b741652a378dc3e9827468dccdd0cc8ba9544756887eb008a51a89abb2cb3cfc2e033651bce6d9fe8105e95d2adbb4f32a9aaaac229d786452a462af2ea605324646ce1c79dbbc091196406f5cfec2fb3f3705350039ae29184d2c9372cf1456719b0aaa9ea74435b2aa43fa9c75320f06f3e78e84976af57d9d911caf593f456bc41f8e60cec0e4df3c62b771a2c745df99983301f452e1243c410afdecefeed97b459192a8837382cc3882486ba43cf0de23613d7dfcbb8e93761721e8a7dc55f8b3aa2878e9d72ca131b8a7c5c21e6390c8ff6e10ffdd02b0415731931e558f8f60edf3a6d083f6817ac330f60c66b90306ba00950e6834667e1e8e76c46617d692134cdaa795566ce97f3f7d1d7a87a45b6228c3ddf52b5d7bcad04da53809966560c7de8cc37c5899ee97b60ca20363585904095f04c54ee7be0507774ef86bcfa231e885e88a1422c1ea15ea5d0f2a158320ebb639e813ba37ac4ef251f69ba23648ed9a2d525146370ee593545cae780b20811d7149ecfecb05f9825968d6d167ff4d2d1a5d1e13a8986a433096c57982b2444019a1c1b3c1f6fd49c26e1521b28fc504b0b064ae3486a400cae479417b1e9758beeed0ecc3bbf8e9f9be9a98bf856f6c8e01fe6e8a59a8e7e9084f9978e429290944c91d503c7668a4a8c043445768aa99a621be3c6a608d2e0af5fcfaa3ff23b3f9fec9644081af5beea868208207902d5b41d9f6f0826eb5c88607a64c3e108f1a5c4da8a2467442597e2d450eaa44aa12fa9a342cfda6e4624704eb5a4f731333698c0a21c5526cc052597ee31bb89cd3b30edb21a363662317003376fd4a6c8b9d84980a3fc906fe4dd635d4c5c1cc5191d36d70bb865a17df0e4ff681fcdafe0b80364fedf22e9f4c7425f127439ffb623a8d78eca6315835f28cd74d506c2c981052d47bf7c793b93c083115841d0528f44e940386876affa0625cba23f0a174e901df9d5ea44f31582a48db0c3556e1f8c254c1aaf63dd6a3d7f887fc30feed7f8d4636fc9be8e0cfc4516315a438ee930e8608d2c77aebdddc6beeb97145323751255d86a758871a4ad90dff506537c6c5546ec4a1df591e659a9005a78219af8c59e71e9be607e30c2c97ecc01e5610aaad45a0c98c807779dbf0aac9a413b50508c6c355763a62dfbaeb9a160b611aa756ef1b99ad8e93a480003b8531b73feb5db7fa7d5eed50e42b8c135b50bdcd84bc0f43c30f047bd08bd64008330e965a0d943d82254b8e45d8105402e66eb9920cceb673df85fcf58f7f31320cf5ca9027685d5224aac8fed07056ad992840aeb7a0df014f8730bc6790f865c3152d4b1897c1a2373b21e7d5f9a8b41935c863c317d2c79dadf8f51fd13e5839ca888d08b923244d5de3a24907a6d50939ca438eb87807fa4dfd19ddd508cb4e861c1898089f49c1c46dc129f64e9277a0c276cd42db9caeb955ea136bdeacc633be7dc4e7c3f41f0525cfb71ab42bfc3342b3e4a22a0361dc0bb5505d3af83e0f7fdf44c2e55115d4e96d1fa13e7508817d64c99da4c335ffca65b32f93c46c605e09c860ddc89805545e39e4113aa547bfb5749dc4f4b36000f85ab48d012ec4f91f204cf03a12003fdd70daedd8faeaeba94170f70f70dbbc677a9953c886ed7d5d512e3a6080e4c20aa165a99e1809b7ce7871b26bc1478b3511e6470acd2cef5e01809587eb11001f5363c88a0e248cd71963bae04d6f4f42ac2ebf13fbe7b0fcf371f46e916d5e29e574ee0cefdb4b74ddd7febfcd6d1f35065757b761e916ac09115c0865649f545316ff56d9208f70150dd395d49a765e03eead383e94031851b808efc2034fac0786c488c07e158fd5dbdf25d6f4a682a60a18184ce43e0f411ff4d43c80683f730712e7dae5af228545d67bb03b08af61da9619f60bf42cb77970dd82055700f42dc062785b53e066d26323c8216f4e5e2535a2c4959f3056a8de0bad880b4f597a0dd170655a987479430752e836c6d1cd3b526ffa46544e9e9627cb7a304631d8697069559ed02c79c00aa8c22fc995865cd4dfcd866aad2b1b81346b74de6a19e4799883c04a38fbb4a55a0b3f2850bca65bc6dbd5a898c6ed056c79fb38aab00e441bef0549cac22ea576b181ab83aa40d3ca30a38e9c66943dd2cbf017aa23985af4884dbea709ab9530f5ffcb6f843a58d59fa727bd72399c57a280132651039e3ef187f7a2e1e491c6e77c8bd3219c6a5d13eaaba3f4dc8ef9d5e6f330df9f5423a1009c3f76fd6e85e4627da3eb8d0e69b84a5e8e19ff7d0dde0cf717ccc65532b5f2ea282ffba239f68cc6f946a6bd6db0a616205490ba79919006d6310e1f9a095a11023ca3923c69c6f078309c830601cae312d54653b120976056c0cdf2b543956fee51a1403ea705b9d4d75e787f834fc20d76faf421a0751f2ed56e6dc4b79636247db93063b2b435da7309a1e13a93e3a139a1761a10ce9de136bb6950acda5156cbcc645f47ebfe4f5dd1dd867f11d5c3fececbc898b8d23cab92e8ab6f86b9ba64305992a508351a0fee74040e1d94979d1f190357a3afe18efb274e48c374a848bdae6a5b28e03c705d9ef4ef848a3bb0975edd308a5a7f24ab18d9306776a0cafebbdeadd665f613e87c86032ece7547d3afad951a6bc3e5ca58019bc475543baa0edb5d3529b4cba64ca6606a4f8b080e73bb5be50fdcc0953488a9ad7d02daa16f2f2b7809dde9ae716800f9f8c78e2a1ca0ce985c9764b3fe830194b84d65e8a5d6f04200f53c1d31921377daf0efe91668659359806d62749d865794a3dfe34fd9db82129ad5b21b1cd8a4b59a2efd8b5230b5748ce7d2577bc2b1a161e9294a807f9ab8825832e048f6503eedf29d5c7bdcf1db9d8d54bd78712efcc36320f4e009670fcf50d3e29937760932a2f24da0b71ff7d87511eae630aae3879f9082e4343fd296acdde46be0311cf86f5c78a2fee5439d7506ded9f8003c626189477f5d5498c3fa709f1b22ef126377c7e49ef27c858ff0c83eb627652fbcb5b658e5cf361f1a47ceb4fe69110259196413a40ca29d6729f7db22eabd1ffeca0101c2d72f953612426a657e8a5404a2f225fb92d05113b8403682688e058c568f0c163b52d407f1c9715eaa2c6a0b8f9cbaa125f8cd0a0e7e4a8fad031b7bc63e7598f2fb8dc5737938269602ec6d2a46706a6232e605d1a03e3bdcd1747cb9b15c624c287a054a1617bc5901c54bb8e09b4abeb387ded78e816655fde237cea794d63ccacf9706e1052ce583d86bb96c9899f20893d2cbd9e7a7d05b6d3b4900707555ead8699fbe43717121a7779aab40b68ac38b5c64fa3c6b3100219e64c5a3e32a73909cab9895dbe8f7114c2af675b614b8277ca39ab8866a7b90778651e5c4eb8dd3c32e7ecc774624f2cb59c03241b8fc24bcebe0f9375b34ea32cc43a62b6cd7fa561285dc25c97cb7df5fd50b8179fa7106e435980176d792ef9141117c52aec59677b22bf740cfd0b2509d82c08e2b93996a5e0dc0752e721e02ad37eb275e0e6e55a6622d11b5dee4a3515f68a85c0dee2bd5540a4262c6dbf550f9c1dfc99c677334b54baf1e995067245b6de8a6c5f60b9a1de641c2dfc1f9799fecb42583d0019bfac914dc9ea062568b9070ae8062a5fd319ee62f16e68d5a5a3bfff38fac67e81c74b873e8feb9b2fc96a65db076a1b7fce4b63d3351f1d3abff0ea9ebfe2b25acb4127319464d03159b29c42ad6e9f24d65bb37eb880089d36ed801c626b8dc6b93061af40397534e588f6444691bf66c25b50565bd2d1d61e090d25191595bbd1ef4d1b09058b1eb8b653efabcb2e521d8f9a30e832953c665817bd19f55c944997198506287132e702de37324761c6059debd17121205b67ed13fa9948972228b2aa976847e7c4deea4df39eb7c9fb082e4f91d57868b6fc04b91982252dd4ced2ef66494dbed35698e21ae31f5ae14ef20dc64b1bf5767bc025aa563b910e4416a5c833bf5e956bc0c25e50cde55122639b55a4d4479428afde4ded1c0f73b775406b1008a512f5f82a41a86216c4e02873dc307ac63506ae0406719c01c106c2dba5506035635a9daff97a4514e222fa7b563cc76262c80d4c35ea9a66c3c68cb431b4caf0627fe47314da54b9426fc4006d6956415fe7b3b8069bbc226c36142ce1e1cd8c14d3b1b1e0d43b1c5a8253f88d0f78eedc42dfa9942d088ef2fa1e62945931ec95dde21228517995776aa92b8870fa5c00d9e65162f52aa7bb9f243fd69690a4cc471965711f3015f1ef7f5de00acb9a7cb7452d174fca503ad4d45bbead10c38593a2388d1a85816f4ba4757102014c537d69f1a30db7bd3e4902d2505b38f9b4c01817dfc9d69813238431cf5dd2f2ba5328451c5987f08bf688ac42eb895d89ef10b1cc6f53723cee2ae634e86f78c6ed336b51c273ff3a8944bcafb0a3add8f72186a002ed73a4360b97901bf3658cbd62c04ac35559251a3c2b2411e957c28755ec6cb29853610c57962fb576546131c7025d0355e6bb7cde7e8dc35a0c11e7f1fc49ac6c80e5a606bdacfae69bec45b3bb5486d2d7db3916f8664d281b8e03b3cd971d30c30496c3c9afc9b11307ceb6099c160f73ad1bfb12342761fa69998152d7e340f247171149a6704b17224445871a79c296f7fd7251c0ec5d44b4b44b14352b66127fc2a92389b4f33d26fc7e458a9d93f17099aa819766c0576d535fb93deb17b51c1075141f287ad0d2798bcc55c908a07e158c3793743e10b95b0f674ca5ee02e8b1461c8fa05609efb674fd992b0bfe1682177b137fcd2e9e7de18b4cea77038ab2ff87641835aace1ea02e519148aa7ec6814a95e9f5c352c1e4d4690bd0e14fbb33177134bec4ebaac2ee4faa0d2e7302cf53636729a69d0099d041a5b44965248c802b3e963f4092cbcd029abc4261d8a3fdf9dd2721d7b07d580ed106ade02605429ec341f910a8a4e8493b0e03f2cd5316c1f2342260ec5881e9af0a7b73fdd4792b387a2261ecaf3a60fa80af1b553b1d66db581ebbeacdd74610ef14fa7081128d2ba301fb0b4091fc8e080320eeff0f22f67e30b168250d8c3c5fb1091a16b5e7bab3c56081ff079327d8aa7a1a67ed2f348841493c126207664b439db96e7a927313ff1596ddd3b815ad23aabe6303bece5245ead2d658615d02fca16a107b319da51e403279f1ee612a93119ef696cdb942ccb26526168acfe5512a9df6028f3d0d661513a37f70d5097fd4d24fa94265859035234820d345e00ed9cd040e4dea7294239145230b16dc2d4407c8d6d7751a66aab3338229d29148b7b47803b718fee383f4fedb4bcdde17765f500fd2b13f7ba58c9dd55b94a63211471d8f72aacb8e70228b7a7b3ec576751b6eb5dfa49ce2bc155504748af071de104cd653b1a8f7d16a082f87e25a537e6ee2cc53ab3cf2a320c013f50994a10c9af9342b1ee81f9b7e646853a67037988a6409487bcb66b420a41430660cd6f93256ac686f9ea2720c404e15e6630694f2cde3b037dd87746f54021407f81320ffa6a618f00ad556eae4ba6dccbf0815e92f58c5eddfb5650a92fa749e658ec079bb373f76809cefcf82442dcf270551fae36db83b0d0449e2a3b1125a89c77f0b5d89ef65c5440e25112075bea3f7c6b7b3721ac251723925aaf0c3d800cb76bdfa85212282563899705b40281140fa08e7bfc04b75957689180af81fb14431738937a24422dc1294ad6ffc2855ed54a5e54e6812f54bd2d29c32f81c27f5f10567255f67e3720a9633ccf7920afdccdeb55cf589689d636aeabb811b4a44f89e3fdbc1e340095604aae8f2c10ec1b654896175367887a33fcc5d2de16bfc885b89da59514907dff51be032612ee109e35634fc0733082f6129155d6d35666cb43e4a518e4c33351d1fd96a0c2cb5e701de233cfa6509176da8ba68836a88580aa6c19137edf733c9834a213907d733125511d47a5f117d4a1373168e02ea0749b47e45fa0aa6fce0efbc8522d4a1b6825d4d8478f6595213fe4c9163344917d3970b47249edeb3469ca750926826f253d13ccc7726659a04ac43961f803000419ca53107879748636a43dc87567bae41dfef57b6f9708818bf84f8ab36b0fa9e509f2a66042302828759d94e5e3cea6ba68ff3901690ca35af445c2df87b5f9c2143a2a25f2367f2c15acb73e7ec01b0c67401ed86ea11fd0b3c2c02b4e7aa129e154ba5707f04dc57c6bb2264ab34ce19d1734f8c159ca38c30bb220848b99e8715e99e2be7c76d680d810e9ac8e7300dfc82a18031cf822df1db4769b9ec718a1ab425ce29804c5a8e1374c3df658e2ea1ab8669c59e1f2b620c65c6051691cc4ca2f1b3155942050e0173b2431d137a57d3b567c91926554c8186f7d788e8b284849f6f016772b80116a3917b3db97dd0e0a6df2412ed7797bf18c2401998b692d109d0f944affd8c84b587d4727061e4e7c7f23b7c21d83c30e702fab66e9d59948cbc2fe53543aa9f1197ec165ab77230bb30ea4ee31b7491cf37f8475faa6dc9889c4113a3052f4d544dcb9b519cf8d129664b7575491a359c4c37ae0a7cb91b4b6cb49e514d151b158b52e08860d73e5584828d2c085d1237315020cab8ac263642a0aff784da92ba4f877a2a2f7c75cf37f88d4efd5046f1e51d2189d805f88d7adc09813458587ccfc0e6e86af0e8d094d0cb418f6a3cfd46e1c03ace54f2749336a42e1f864574f1c0dfa887a32d2ddfc8fb766b87f0fff66f03ca9fa3c34cfe8dbe05803515b13aec9e2801b21e75a5c106cd0231178e59e98f81438bd51965ba3c9381ddf9ff46692f0ccfad6eb7c9602003372b73062cee5ded063230d1520b3536602b36eb7dde375fcb545c8f909174d9c2574894b83449d506c3dcc5d1af5386f6cb0a623af760aa981ad40ebef5096a4492f0c75c81d66f75a0f9495968819cff39a3a5798412f337e2dc092951318fe605c6f89089d6994d2e830c0c04e2e1684319ae276b67928c4e991dc19d74a52c3b59910a7871e434b2fe46873019a828a0b9d31d2c99f5a29d1022bd5cf3313f118e7b7a3eadd30883d9c2289c65a4584c7fca960e7cd5a1ac69ec1239fa8fca0fb6ff67dea44d91239fcf4f8f5c33ed9f43b86fb900b525819f394245458e9e77419b9bcae9abace8c68e5172ba882ad7f14aac0be6ec8290fc45a6df71bb76e9bb11afa731ee587362f2fe44c55d76cf642aec20ddffd9a24e28fb8f00146dbebfc389b791ea1afc7af9db7ae92f72447edd6a2636d8e1d9a9b7d7ddee6731a7ab31f06d94a96bb840e043acc0eb2a810b3659d709e3509695d56489b569830bc5c8b872b5726b65a99d876276a942acb3f6f31c54535b27cba7533a3bf71953b4ccbc1f836c599ccaa7473a9041a8348e557274e805ab3e25e1c5a136d6806ae81a499fdb3ea2600bca2ffcf2399d9d7c6d99858f9efb3d8840ecd6977502925e42b9d2db8e64f9975e670a036ee16c12463b1808f830a583023aca04128999e4b6f203b128ccc7104c28aef76ac1d70ddf982075f301d54186a8b7cd80455a6c7b8d902f5004ac97e795d8de5b2e428882d34207d323bb043067fcfbaf1185a5d15cc49656a9c6823341f1539e34d5b8fe5c1539c18ffbee5b12be46d6d92abad47486332be82e12d968249054c4f0ea5c18d45f23e50853b36781565eec79c6964f20b5505389fbefb5af9f460e0e6c1188a0268160381248722ed70951596deb32db9cc64cc4a0f4c99d743491403aa3982cc9f8ebcb38231e007151a6b85a069b9028840a9390343b58518a0b03d92672fd62439f9248b250a822a9006edea1f43315c06dc21e22f71b40efe286963a5e24069f03e93893dc7166709224dffe74ab13c68b5a3ecc37da833c9a6947cb85481b943dbcbbe245f032bc6a305d0efff1b228fd18b9269064032194ce04888684c1ee79403b25116cc45485fd812384835d9119f7c28f2c2fa4cfb4e6e30354b359756d01f2fa4b20d5d0e1d01b98941f4716256be15a314d7dd6359c40825766544cba6a88c5ccf887c10e22831c9babac8cc0080e9cbb62f48e638283e3ef6e7431433ad4702a4dbe333bdd526601d20d3044ad35a06af717c77d3f1f1352f5cace66fe583e8461ba9054fd562e5f77751c48aaf2f83817c7f89c909e20edd80e2fa8f24c4c95c6a94b2c2b442f621a6ce878828488fbfb5639aa913997c447bb5095dfd438474a4212cd0eed342f221fa04fa92cf5f3cac2e187efef108d21d564334e5062ffacbeaebf117d3bf82410abe20ff2f21dcfc412a91ce28a432552f86293b0106be0778b4a875df51d9b802ae86e6004ac9b83506e6ba044224676dd472332ca69e964afe15175a497dadba3a004496b45a4db8386335199c38fd9e36293b45b829f16b9a6340afe7b9c16bcd2ec7cd32d23e4f7d762da66c393fbf345fe2906232ed901d787f325bf49322621239d619539aa9117328f4fdaee538699cfc4a0c2f2dc0ccaf07098a442db3c8e05892eaf33b1d31a71e2781c7f429906167067f7ab4f3d2b3f2948695c47e6a550e0efcc4c0b910352f4be7c7a42ff406bb4df62f2665934c5ff8073a5a153366841a369adde46bd0d34111bc282033a739d1e26d0c144d35a2142075bb55e6c66a5c62395aa4216f4e64035d275b9c9efee010b0f80ac798eaa2dac6ec6ea16da5131c8f6a11a8796d21c7e057c019bcdfc517212c531726e011b4a225864fd78d43c92849d476d3e2df9370b952c938363ee2ceb98569c4932f044924e12cb7dd6c5b21e8ca96219810f3423e2630b20674208447713a0a64d3f3127dbb1cff2db50c6b4b9ae5f4a77a5ae82ab058b24dc9f65532b84062515367880ed3eabd23121b4a1f726a5c527549863565e212b01ecb3a608174d45c6231125b78a06795d6bf591062807a607957d9fa51d56afd56741ef86d1ac8571d696815696fee1720560aa9038c2320d8b4895858dd969f52b340b9757ebb342f649622b7017ed15e5258dc11247bf2effcdb0c7fb11dc91f559175b047d5cefa1cf8aa463e88585d455f150d7f1900325a1a50574d680c485a53d0c322fa155d28765135a6ca91c94edfc9aee2c36a6bedfb8304f16023f9c95c18a148d561ce4182a1ce25ac39b464bb10682e2d33464b42a8dd64d1ac734925f34ac60dba61aadeb3361a9e5e0b32418b261b3322520fcf9c23a6ccdbfb2f0242dea9a56ae47332d6a621674a86712fc120c9bd0d2835dec2e73e8baa8d5cfe0d5ccfede74def8425adf6ce1bb2b32c14786b528971db97ea415c90cf155966a465bad85aa3bd4d6eaa9938453caa5804fab2bdf9407db9fbf5cd81da6651e86b665111da72af6e099cfd723852d4e42515273ee68dc475a4ef5e04b7acb5638e588f42d5b3057008cadb7658b34cb4bdac25dc060d91ac0f5e7140e11e6f76cd9bac79dd6be3d4437b34e3508e0a6648574e5bda535c864645a29c16c49345573d3cac9407bccce60216c5a6f5afe5032124e04d0f0ddd60555be13368176510d7e5a2ad65322a9f54798d1af582de2586a59ba341097064bbfd542f42d32ddb7da58c6cc8d506de97dae07603b6ea9f8d80c3351c356f09a38feeb3d1846daa16a9600f08698a2e086d6bdc5ee3b7183829072284e5e0610df28f801b3298da622a0ad1703b099191f655465133c786dd921f0445b0bfefe8b26fae8b61495c05be703982c06dccabbb5fb711cbc3e7075ddea2eb752bf9769ed16c4764b944eacc518f26a6d85f4c3282941540fe54920fe5046393d596f951e9fb53e33bb70bdc494b60dc8da80a64ed6e00c61b5b688b8e1fe3c1d4dc35a02e4af12a2f113571418ab134963e6f4827519fb40fd22b030dcae640588aae3962c58a6ccbdca910dfe9f6424df782ff973f124376271df21d9ffd2a87334cbc85405c3138ecc7dc62119651b8455b5d8b9cc85b562c3c00608e07d724c6f897ea063d6d7c38b24b3dd0be90f4b79226bdb7032176d1f609403606c561c550541d4aa2ba8bb98cc0e277295904493c9a51666c32200211b01f731e26983091b52f8acf2e556b31733351e3b606fe540fff06a18bba5302ea73f14aedb98af5612b7bdd45a8c214c88fd14c8928340ff0a1bd5feca082a1206d149b1837b1498c6e25643602cc4828df518930c6b6d15c29b5834e2317f2843e912cbf3ef7ac71a6e3a100420ca3e4409b0209853f5ea19bee628061c6d7d36efd88b5ecd8946e18e0d2071ac0a886bef9f204324d08e0990818fe0a3b58e5184ae00eba04cb1535d35b9bc1c4b0749f11cd0c9605f823ec49b721961e590d7bdb2d14851014d4b8c04cdeff5b4f97b6f208a71009762f1f8a9efcde831413bfd9ee098685efeb7937d5bbdf704bdd6005c2ce7a4732874efe9b482ee19eb13d2e9ee41d893d3bbeb36f40602dc23d0d3414fd053b76760afd95e41c237d24f805ea727616fce5ed0c543a0a74387408f4e2f07e231aa4f48a7d30b677904f4e8d0b5f71aed89da9b4f4abb797ffdea6eb67d822cdb9c11ac7dfbbabe0570f517fe1d1ccf10427bc4d144d9fc903335b34240fea85cc15335f601f83075de0736ec29d447b2a70f760109d15fd357f534fe695425991a30b7a972eec8e45086a6527ed031ec49ba81aab2ca9563d6d8a886222e66759598fb88678068332100c13307e666d2263654c31a60a738f586646080c631257d72cff5afa0079d1e1c1f0da053a720e223887606cd2ea9fa934f784759e0415c4afa833fb662a5b3b1076a2b521a8d736079230fe82b52222550f289bd0b3d40a22148a01e543e57536a109325c6aea82f841ff520f501df0ad52f0f8bd0b0b4d0c81544ca271fb4daae172c43a2e95817be08af43de438a57c5a0558f6515a412393612530347ed280f82b6f0a397795656856f7c52ca3be4d372cb2cad0b6a0835b01c679f0c62c345e84cb0f7a2004c07a67b89fb4b42a650ad1a837f4ab40352ccbff0ff46075b50d2b81de506daaa78f16b744e6de68235d2e40197f9da63dbc448e4964d95d571489702f632e06f5cca750f560b43f40dc4e259e2c1c0e052d1dac4924bb86ec4e873621e6a42b7d4199c305fa30ff4134b16f00d8afda8be92ce31810fa57c23fe3475c895c76558585d8f4fed5b3fc249689f59dd721182fcd41399291182da4c1ca684f32ab41c629d87ff9fc1d7053a1a571588b99b50242db9e611784b5f0bd7b78fa639c02f901ddd7caa56bdd512d83ed4da55d7281a4067f7753c2c849d05d43666ce5f8aaf6f4805924aee66bebd49310c603662aa7be971187c16e798f7993c45664cf3b4d46d9360bc9c92e0c61d859a0097cbd4f7318c50d3653eac54ba6ad4dfb4327c97b22bcdd42fc115c44e4951baa015217c99154330e452dd3aef927340b48dfb170e470a41f3f79094e4f03fe252bae705f92a5b2671fd94ed5fbfa6b79e882791a2accbe0b1cf79dd4c6a819f6315ec37014d1577d646f5825e23bf0c7cfb09837256d359c39a1d77b961c2fd6a766fd444cc456fa6c3c076585fe07b51d17e9cb5664d2c9c7862a4df8084ba2d12c7ad4d1fe724fe3566e2e36a78f9e940d14b5ab66b3e0de964ac9b64fa051075a43b9b590406681c4f00a657b8afef360b23bedabd4524250007c7db9a1bf5bc897c21739ae9b24eff23eea384df5439730e3e81fc5d9c9368a87dcc83b811c3c0227a909f8a36366253a674baa70042d625b470e2f36d028aa5409ca0f251c7d5405d021d2b31bf67d2b2614b9d893031bfa758abd0f44b65d6d2a91a6e40fd406a396c25c98b1fe58323d513e5fbaf79344b03e7cea10220a5798b255aa0fa002a6d1686d973682413287c04b166d2996e5cdacf8074596ccb3b6f6a7c7de3e579f108563b8bf19505469c30c4f564c06feffd6e0b1045924e9276c5a63ae68d26c0a85b5a78bfa80aa113a61aae4e9d68edfca6d38abb1d8d48a9ccd2292e18baadf388f20de3a5c8d9dc02cfa03a988d044c747e539bd4a8d5f043785c218242d85810bf747f3fed4f56034fc070a2e1c4959e4bf66d4bccdd3cb578999b14ced581cf91184028300b191d9a715d1f967d0576cb0fce85316f6fe3eb4d3345d383ba446928d3599a0afaff0a06662c1e4c0a26df5044f18e68b61362c07620af8369f37a413b5c114f6c64645457a15082341e7cd82f622d6db8d6893e17a97a724ef48453d4a019a61d8adb8968c96f858869e12a4ca11a4a6e2528ee9abe79d935016d8cfe60e224912ad20f83ac714c946442778cf2b4ffd93b06f6ac2ac568f0fbe3581dda9d62a5e25122d5bbb0e0bc8bc5e91fa8e52472b1e0e18a2d24b24d60f7d1ceca3a946a4e6fd3df9574fd2db9b25559e7407f8ca9b7f92fbf69b29b6f19395f253b03fe8b8def450a23c48c6d3e8ec90cc9d8a50c6e76a4810d05681e851d575ec84c346cb7c3d9e1cff0ab9afee4705b2c35bfec9f971a2441c2a1219ccf249c5042bcffe0493763a0708c4a5c62843e9c48e637c1c5e910cb49c401521233e3b9407a55bfdae82aa14f45dd9ef29c19f0af12d4e363a6074c2b4b895a281c03965cb0002d39f98af78bbe6d672d549235ea9d3c376c3182440539c33d6a3c9701ac0e9f77e451af5aa8b13dea0451887c2838f8af5e81a3367b5111d1d47057df2228f4b1a30f18412220d780541be53dad6179eec63a2814b98d362742ee46e4c27782e8a53fa4c37370eeb5dac5fe8b4b07e65be1e233630d49d931d4cbb7451aeb66b1cbc558baffaa1814da0d4689bd2405fea7ee00f1c19e49240ad5dad7e8a8d4e0825f55a3d22631ae52312b6861905d3863239c1818b219fe34149763a326b733dc6c014976551070d05e68d623419e40360e1ba3590e7bee7234a83461100857228928a887032d5062bcd0c2a5599d5d63f7a25db9a5efe4b93cc0d5cbd12ea55d073d5299a39250428a4dda3c6afa534db5039183e2ad2b840b73aac1e50fcc84c37785b4fd746d0174fe0a093c1c2730b1aa3ee4eee5a02140e3ca33a040ec10d35352eaba3ecaad80d5a16705243457a4163d120ef4a51477504e8e444284bfb8e1650a1967a0bace017099eee3c096cb0cb2154d643534eb805606e4891c9a22c870d6c8a2dfa643e095bbc5c352b275a5b398d773c82b3a70a1483a002462f1d91e319a103ae937fad10805b555fab1d1f0990651689027c059acb07864a5ca107cf19d61c810f2663d8b0e6d89be8fbe8707b2eb0e70d0507074b3068a4aa9c1f2913c8132a0d8dc3bacd4bc53433a3b95227d5ce9bf79d17b149d882913bca45b948d4b3807f0a9d5a63ba42049eb3c272428489156fe57cbdd2b6f852aba2895847a3e33757b2b8e9f378466f4e903f319259229a6ddf44131f75669bf83e5d6946fb14e6eafe88bec8fa02f49b142fc155088162ffcae90452adbaf2302b09fc841f94a80ef89209bc6f3aeb0cb341f7c8e982833ac9260da9f3771417cd315c42a6c977d50137b71db6d814b4002b2bd1bef180bbb2104fdacbd0ce6e79324857b6c12dd41f203be4b8a45e5834ef90704c31d686f397815563668449878f58d13d6775fceb9a3d50616751416c4214cf7f915433ef8cf95345346ffe9cc9f901c0bc16c13fbcdf705885da783bd63c06ae0d7df1a8a61b38ef76e88c87616778f52d500047b170721e1480a02592af0f41be29c416a8867fa4b6843f06ef5d8b8d052676a0472b902f5afad7884b77fa879bb193020b90463e9e3ef029c4f37b53d7327af2997e19c89b753a7a7ef6aaf58d2305495f8cee22e56d6f1504be6f2bff1555eee855c71fa6758524ca5d60be144b889da71e8233938623c2d28c3a019aa118e40978fadf951b8a3158d85409dff97730699dbb576daeea385ffc6d4c84fee9344a5a2a3a4a2b4f9b5b3835c2f7f6bf874be6c11d44b7ca3f80f88514b5deb8dfc6063e5fb20435c6ec2fff35a7d150337cfd9cd0ad9fbe5a3f1c742b4b4cf4f77ac24649b724f12d35a652d554c833d33466b997cd383c5fed95114703d72a0c508d50b36935408004827fb79ec6ed39c8d2aaacf3895a3adef33ba351bee11f6e7e1852e7c25ea4b5bf1dd033ca77b4cbfe1e37fac0b59d2397430dcca007c4cf6b5e47b4bdb5417286fb1b68c6610f79e45d8b1bd0b6ff6bace18b87fc89f9f302d69336429ca1dc22a5c20cc8af444946173e9e7d828aa612770e10db55924beacb7e7b229bb474ed81b37d3f8fba7a84f5b8fe16325c53625b72420e1b42135c256c926a5fe2bef4555100ab87e193d981e19230e22a92f5446c3b68453426e27d17d8cef81d281c04fa19c9a413df39cb87db586ecad5b615d59918d6acb153576a023e994a2f40fbca87aa5212beb2d6c530be302e6c37e360ce0bfa6594d64690126cbce5e34955466c5b7df06e5b84bb2c2985bafa877d892f73bce50fba889083c29b0d44ea2888f39874fd0e82c13ced5d8504a93f42a35003194c54e765a7ac0e5c4efe294165c9ac9a63484099ccb1fefb18706c9016cf3646e802bc34a6abc19a0908ca55d6716b00b0bd26605bb9a28fcf6a97ee60352f041e22f04c236f1cefbe983818227034065df82d2b7bec8e87202ebe3f695ef934a9dac0664ac05ab65d3c3a59280a9470b551607c153f859b45f87b9c58b578ab20bef8d15a52475d0976328eae565e4eda56b7db7b169d61111d87268166b89965120ae37de306f89096bb72f90e5d7638abaa0d03ffbe3da8df53cea469f910e9ed52fbd61db3b93b9e45511b6d108ac7c61b82a3f1c2b4ce647133bcc98537a233d34cca56e51211c6c78b570487783d6f4b0dc3a50adba63eb7b9574c6d65423a732728c61900e1e8e3cfb0a18e9ecda22520f8d7a9efde877baa2da5ae1d8ca7bac9af08d2ea47e248acf0422c3e6b651be282eadad3ae4b5fbeb5becca84e2aaac7d3606382a9fafdeb23e0e63433273a81d473be957851050c1d26210b11096064a9d0a6d134c4b134ec1bc5f1ec65057ec55b0831c09004a2602b98d1b95abf4a18e79a16f1caf892d2e96e8aca8b91a693ed12fbddd0c790d2d786508a71e4c071679fe91a9651ac48203ac9d391384ac73d32619aa3c8dd581efa1d129eb1d2261188b326f32422e419a66aa704e648afc19fdba716b2e6d5c8ffb8c410a39256c5fe6fe0c3306328a9a216159068c7c1ecb1def69d3fe5dc0e28b4f902a933f4474ab659969d8cb3ce9a909a089eb2bdb5873ee9fa6609753072298ecd18efb552f734b85ec73dec475349871f250387c3ad3486231a5580fb3356a1c70d028010758c2f67481b693ab48c3dea342c3134032a7dd992d0b1698b6ddae590e389d4eee3ec6c82a2f1f0d4602a96b06668470a0117b05402b9bd6748e53a6f370250dc88f3e91cdd387f505e6cfd3f0d00c47c970c60bcf25d2670765f0098350a179b31efa579c5744949531fb0ee9c2690ede9ce5a16aa506365b239b118e9cd12493f11bd7a54f416409c562e23b89b6fb08def4e70e4baa0f685f9655960279b5f40ebb122c0f70c81985ddb5854d1cb8aef7c081194bf905e8ced9da7fb4ea7a657bb3f01890ac17a9680f6e3d886888f716a2c447cb156b094c1f13849aab3fb6af0533fd15ea180834baa0d863dcc3b8e1c23af5464e8efda032d9c9e9f52e0dc34317992582c86d0f4eb907cc46de60421c768a1ec02114c89861c7975aa33e14e2bcf9e9e24c2c15e34bbf1333c5c5b854c33b27781094b7011d0ffc478475b525d1195c9f32f7960dd50f95139ea910adc0929fea5f1827674b8d2ac5c5d8ae3fe0aec76e1b9583a66331882ba9d72820ac54d927494dd9ff6b346826235fca36bd7c5ca6e58dfd02b4a1cd82586fcb583299e3a66910384f1e2d241a78c652883f8de189f25505105578a91e3a9aee333a70f1fdc17cc45af8fa10a233853a19115b25dcd8ca0e83f36ca9ed98b83313d4272e267b627d7f7031a6afb9aef2d8652de97c552a1ef51928e32cfd146f6c8bcc07d8d80f53008d149e4d61aa15c04e8b882c4c7d1950ca0c27ad07e979bd8c43a10a1257c0a67c737f542fabee0b305c82e2d499b99e681d5ebeb9df5a88f4d7f5fddbb1bd7295dcad50db5818585b85b7e28813ec8c9da9d5af2cf8ffece1261bffffc4449229a4066b78b752be4577bb9b5b643be657db9e22db1ad2f51008c75beb9cada6b4abc66e9601c081e54d0a397cb31bd7bad769b80e81defc1eecde7c6aa0a0989615c8188954774c0cc95660fbbe25703af95af4319a7950db2e06fe23de0641001abb73848c04a09476e8d7dbf6abad9efd73cd2df51ef4fb30f4ed833d1ec5cdfc61275467e5de1755e2fcfcaeb5029ebb7b52fbda5177deb526087d8c549f3207ad387d02662947412c8118b1f31f5472575823fabc183dcebf9ddd847ae0f2d53a35bd22afd72502d49520973ba0b3227595ec2ec091aa57a97ae74d292ee0a540f792b048b48deeb0de4366656a5368f29f55236e601573d930a385db0a4295584c85c282bde4a5aa44d28a5d30e42673f3b8594d11e168829a482a27678d83c0f5043fda5a0baedde409b12a39975cc2c196a0959175f00f5795d1d0e2a9a7b67c4b91107168c5fc21b3a9b5e3982f4d4425f0dae8ac488628d620fef4221c268428a985a6a09153eb20990017d6a053d1c6feae6933130678ab1b2903949f0b38efeb88ac2d8927f2585a40659be042d71997e260a735ad755278e153bfc2fe1bb9ba8ed863511668294b17cbe516c1a47da90ce44d6fe6a9dba0e540300948e299a5a8353c31f1484013000b721de5e8dbe86d1ee156e3cca6d5cda3b83cbcc1a5e2721e89b6a10aeacb2e2de85abddc9b9a4474ca14b1a0930dbc7c688b3820d6cbaa33a57b2b68d3960fedf8bfc17c8704157836b7ae4d4b79e47357a55e0ccd070dae8b41107d83046dac198d4a11f3f2cd28b526ae9358a3106f1fc68bc23d0d22bbd1855a22f253b23348f4dd8dcc1a5e9c9c3036bf773178c610959204f3078e70d3736596d15b1fc91175d0cb00496cff36756d99e33a4dc4f3ddd71a3c18b090993109bde48025ec66d09aa89d8fe5434a06074e1c51763e16f8fc848580d965c9f89cecbe929154856b2a83b67347ff7925bb5b49d095cea26cd903d9bb6555338fb3715e1ca257aec77383a839acad3cf50c0c07ee5ce5446978b99126fa8de61158a1e9c3230e86337541caa8a6ae7cc09a5930b5421d2fd8ccb314e2fa89ac9af91d4d2cdb6e13ac8f8336d58e9b6d0630ff9560dcd54839e62660b50ac61967e689f933f7a165eb6b42dd3aa7b2335679dc471863d200faad3c88147ce7d92c6c13a5b80acb209d9c7385163a019d2672899f49e75c19be2fa41e000fab624431d21ef1af94869eeeca05d4ef00a06c6ea7b539ccb4f58ddccffc4f5b1a767ce3e05e4e69c1586b9042283eb0462791a91450fdaeb3c11711be1104770dd5e3a7245fffee3143141e2f2e00110a5267f43dcb6bfe2b019f7e0839d5f623cdc1eb05b9da0445e842d3024ed372a0ab63da4dcd79e5ea938bcd3eb0746cf793cb4c0a899b76e52bf57e2334f84dd9fd842239e9e00092dc625a323f53a0143c8e9c200bbd108193e67428f917138780d6c90fff84f3892134864176fb61fc841a72ad5ca5d624f17f4e331de5ced675c250ca5dba64ccb985b50e9f7981abb871b90abc40fb21b4f6c89f7a54fa99a474cef3ed836672001f8ee5357f7d4dc99ab35f737db3d18ccfbdf33743f13402ee69fddda40bea34accbe6e2380294aea718dba050817f46e3a8125038b2bd43bdc8962a0389a403ad858cb16bc3a6114071c5a7445f0aa01407e58030bdc940637b923e9210ff4c066dae528106255af9ccf33d207faff3efc9a62fbe371d369aa77f2a6cc47f8d7f84272a7925737b929f317e2361efab405945329330229fa658f64edf0b104662df767f2527b256e62de23adbc0a2f0ba86dd0af441c89c4700c80aff475cf9bab1f995216b383fbc9d300239212d80de579f8536347cf5cc67332de27dede6fd71183ede598e09231597612beab6672f490757b5cc4f79408abe5652bacd2e1e9e98ebcc288ce8ebbfde49c2726e7246d68f01cf0850e2077c6a684e34542ce20fa3eb314ab0d391a9d81e373e152be907935bfdcceb216bfe25595d311398fae40faabf87e399ef3c1605e253a38c6b278f54ef183db5562d99da530da31eeb050127d0d1d830a665eded8a7da40ef778eb19f9a6d18f2549892f7b608022789d21137de0cedcaae6e9743953c872c072c63811c0cafefcf1b0c0d74bcb4216977e1556ce6078f3159358c2d4c94dd28775ca6a0eb21dbb72649f0a56f599f74b4a601b478a32d430e6e0ac973a06e16197087559c41f49f34048608d6888fba992af07a0e34030ffd0bc3b2d28a4cab5f44038f0c8aaedda48cfddf3b7822069067c350f845137af846c32f58bf710a51fccfda70cbde43f1078bdba87d1e6f193f2b78a90bd196e45bdfd39d3fe0f7b4aea0ce09a521d3557ecba0000f64bbadaa15fd8a74d1b331930f5e2330f92cd1e21c42e8768b71fe28f6803232e6497840393619e55d4fe4b60c9d0d2c790fdeabaef1a8cf3ad7dfd5ba7e982b237548477901d23121533f233075a313d534d9cb0d889932835e284ea928bee4a41b0d3ccc9c7920f0e90cc7e031d81db4bf8a2fe08f27920db02d0111aeab56bfe6283c4f0d45b42d14cfc9d2a38e5c21145f0a08576376bd8d434b8b2b38782def1b0402019e47123f743d0822e02ef53105a233c87ad7e311e587d876a24d07b3997b5de24f3e9a0f2873588d1d9dd9a58ece4bc2b91aee6138d63a344aa5c4056ceb34c4e4bb853077463ad937c71b7adf376d13d01758a4cfce5aa7d531ffecf0d5881ed4fe41416c351396f1eb465c002999948216650d4a7833126c62b2777cd0a613c42b4a6d04202bc10626607760b5e2921cfb0831c298232513b81d63febf65e9688256612e29aae60a57c1a98625a603bf221096cf68c40f47db310a173f5715afaa4f7410c39fa6b6acb76a22d9f54598ed6300204f6a89a27a026106525bf115ebe2743f471e4251b655bf794609201c4f92bfb94dc35f1df96b6be399084a3295b5b201630843e13619097742af2757ecb989541938c021fde6c81fe1463751c5c726585ed0af01428387a7d8f11964c2987f78b95b5b70eb3d7e7c0339aad062241e884894c2bd77cfdef2ebc8a29ab6d7e7d035c92b662820ae8a4219991ca5661616aca72bee2b0cc5fcc5fc31579925f6bfe34666a394201db004ff0943e0ac197c7736b3119744bf445cc7f37b2c40ee95b3386f6cd370fea5f03a10b92f68d8af47d4ba3c857b2a9ebdc5eddb77aea2bbd712817535ff83d4d478b13d8a7e18360cbb65a40c97e25e1570bf8aad746b2ea9462ad43a106594db3aa3a1938adfdc6c9c310cd4b60d27e5f172e67a9edbde24c02a41256a69f2e8919d99452c84d03d37e11856a2fb439796576cb77a9961805651eeb83214f457fd47ee331c8a7ff6636bdbee81d3cbbda21fc854d5e94505ac4b7f6cbb63da48349ed9cddbb2659d7d6b36eeff6ab0e950f3869382129f2ca6c92b89a610ccb519fbdaa2c26a0b633b03af4059144adf26dbf6b4c56892cc35ab0ff2c7828a98dfa96de0d8529ed77696873b0162d644b5190f89d7cecf4d2518e3d65a8abdb88c4938ce8105db55fa8520397d2af3709fe60f1f42b324d002df6bef48b24ba1c0e0d9983fd1528facbb7c5dc3507282bf4f76d3058d92b5eec5091f69b24a54671a08aaab47f478e5f866a4cc974e0da23977e14509d2d0921aa3a64647279acd8e70aa80a8761ba1d52a48e643fa805958c6c8b9a8375a603b854ad7a2c55d61ec40eb95411493856c5c27a5c0eff806f767333902c4f790880ee6d41e975218443ca85830888233cd7e6b64df12e32f6d7229f1940371823f1892ffa91c5ea830cc579becacaed22db1022bce192c327e83bdefb29a69f4031d62d8b0dba96c7a319a73cd4cd71feac7cc10f0f4dca518d2c1315d270fef7543228bdbb9310698ca39a993f7c22e932bcc4bf028c1a5fdf762cb6d56c4bf0757bb9bebd290abb7c1a80f101eb205c7683b6ef03af7012f64bd0af79339697a2ce698280f36dd268164ebf5499eb0460a7a352d0e0f6c2c5f9f1c71f3fe086c0c960fba2eeee1ae25ef4f60661965f160a44681e0af64b2424bb8ddb894e49d0103b4c69a904f9bec0f21f13d9c60f94edc3f9e1ccf8e740c3b3da76b23a9a63160a410d6c025d6968e78c01871ad19167be45f046f7966037387477939008862b45bd97cbf7ec92f17f675ca87c2241b49d1efe168187afbfc6e7e8e47d09f34bf9fca7deb1c97f52f14a1be7ebf4e7c1615d77f91fd7d3091a3e16a73687ce5edb1d8ec23ae92a8dfe684e8ff4536f29a39e38eb50d1f25d61b0d3d059df51c00f76d8b7d30cf3015139997f27d5fbee95940bec5f1bdd03a12d81e241548c12060d037d31522190de202d10f02e0e30a03faf0a33b26f2f2f1bebd3d72903823f2aa7f9e1f7a9ab9352a147477b4399f6facfac5594f99895acb0aa58eadc074abf3b382d4bc446ab7efb40c778e2b3d99033084f35eec353c09cd925e94420f78d7edef7a6f0abb15525506a62933da1843fd62d5d7c0848e2602012faa9973cfbd68964160913d559179a4cf21f8caaabe2f8f0851f5fa28ee4232e4edeabbfacbaf28df9c3d2e8c4455dd961bf5d3becb4195f86e95eae36a32baab586c01ec8b66dab2b6fa18ae47faf78c5bfe87a5e661f6ab60b30f712a077675bf47e2720681c6aa8eba019d46b473adfc391d701239efbd7f4c70c8a9bccd3929ec4219d782f21c0af959a4e049114c37da5a146c766da73de5eea8ab085013abccad73cf2f040e214f4b8c0933b848001973377d95f878ace51a2e230d536d8bae18e424927084ca750e77662c04588e9ffa0dab60237b390abe09b9c0fdc4fd017b69ccb516b64cbc9a6ec26ff9566545cee3c0ac6c059195adf2fb70962cc11b5c0a7358d34d2d0cda7eda958223de0c5098cacd58bccf941ccde0de6d5f0f2bf5d66123c067ce79754816cecdb619f1dbbeb4bbba337cfba8544f7b0f37da7852828bfa8faacb2b5ce1b04208a235472430eff9846271c55331d030e3858f9875f885b7f36f57180b6a61c676fc0c63d1f90974c2038bc05fd32f2ba2e2a37a59e1cc998df59a00edca116d772b14c202b5a4bd2eb41d1dd5a19a8cb1d0f8653b9c73ec448ede37e7f458875f82f416edd4d7c75eadc83afe4086f5389f80b751a5743c807b48ba8c8ca1b3f6d3acf0761ddf9cf792b0f5cdec2ad2ee9d5e04d181dbee670de326b93191573d08a588e7b51e89b2db7a96372d3df4eba184b9a28fa2e855b43f30a13048365705d91074a731162ef7df22e6392640403e9a6e9579c2679a35451b26fcfdc817a4eb43c635498477566a50f819504aed4189f4df2acf6f8495a43d49e48f050925775b7b5809730c045ecb8841592b8cbf679b1c554b8928d0b2a0392f56eb560401db98a81970361f3b925775d97282199fb1d74e392e684a2f9d18bfe5ee21f337dc658aa6e150b1efa6e50b2ae56fb10af9f5a574f160c6e000d4b5ab2716016484c4b6396709ea662d54c17f55fc26c3e281e2740b0f2b1bfe002dc560d56c4e133fa2c85e066703f72174ea8e10dbf2eb2b8beab3f984f3df80718b91519af4e91127ac3db4f1aa20b8a90aac25ea06b4b5dbb88092e8a80171f06e98f3838b461bfdc17c253642225ff08f6c48f8eb5d3ab56b61a66deb880228bd9a8c90438b998bbb73ed719dabac894134a87597288837773abca00d2d1367a584dd86b2110789666cdd77c8499202d87a748f414fce7acf3e4d72b16ed30b0130c135bf177ad3697c6403f929b7ada34881d4680341d3174506b88e46afc7c2516c73eede8f87eceb08e4f051706657e5a8d4e4fbea6885e966ada056297ca2f57b6cb72c7f4fafc182c9e2a6a7a189711e23ef8b195b89a02c2d0bdc28c086288818ada9223d84a181370d262ff06d9bca8b38181ed33e2f1e3a1b306b0d6e43504ea61b2843c70386578d4a13c98bd18803f670c6bb1dbe2a959a0c52e072389e80d1d6403376aa10c775423918c732598b62371428b90540ae58a7fcb49d772512292ee756e656b260607da5eecfc15d380a800879f83575bbd5002efaf1e0fbb0fd2119575950ff38030472f6ceddfde43718206748a2ade98831f9c73392b7508ef21fa9c2703202a47a97e4227308d5a2d7a18c8a480f3c421d871412ee99140b000f71ea12aa177d3cf217995f33d70083741033be3194bf49b45c429a55abfb60bfd48d64fd2956f1f731b0189189ca3d858a09fa42bd95408d1105071fbda029346e66ec4bb6328f2c009c7951347ec5e9c09483443d96b4f7b26f2dde80f80450c03ff2b41d7234731b85b053250bbe34a05deb2d3d740d7e8094e380c599b96481be84503c2bf408bbd91218f0cffc428d89bcb22b4090bd0fcafa8c083e532c35d1fe2e431da41e1933e3b45456a47da484204a725257667e80e1f3a7b8e0bdb02b2b0635fbedf504f407f5d21b735c826ab1b4d88c549975154a5942b469ea8825c7ed67c3a09f2d85e4b4d81a35860236a05c4f5042e9744810e55205c554d3ac9f0c0334e58c629a8e28453c690162a6dd8ce6f5fe6688634de98626156adbcef89956a625c50052024472126de6bdfc8ecd37976bb2140afe5300145bf17df67702afdbf916dd288b44d08215b4a192a0e880e1b0edfb86f449036fe4d94952676945180991e62954321919fd881fd0789bd224a157b8fd8a2a1897a42223f81757c8ec3300ce35893182df1ec4163ac3fb06f970f29115cb15d2d6985060b050a94da46a074a5adf1b6a60e5fe8528dbed0a5b6172a36676ad725d6f92478ed8badd5248919056c437b07856980788270450d8840052e5cf11dd64d878f83baf053b1f9435d0fc7db193e19ba6d56b620c60b629119095dcc168c9808c0f86d536c7e42b713beee267c31cb989b7700c628a46b2c618f316218a665343613166c30820dc6986388f803089123966a3c58a35b391a4d82fd0d62191629cc0fd3ac4f766c22c234187fe30d1f76a634fca66f30fcea1bbeafc667b2690eb007138686e81a2e1374b00dcf17ee50a441c2898f66c57d52e359e8c36ab84e8668167fa56e9311f48ca05b98708b6ab74e9068564833c4019ed4be10df0d2981948e6cf7bc77351aec6cc8b76bc336a5f3b5ade1ba330d81bcdbbced7206316ffa00cd02521aa2c7107cba77dace54ae8dec608da9ad0d594bb54439c044976595df71d8ce6458e52df370a4dcedbb654c6bc8063b04c11acd82b12eaf19a641a1cb81636dde6271dffbb0363034aceebbaa7b1ed606f46167fa21ad35d846bff470465d184d8a2deffbb34d0fb601c3363ed806db0c611b3e6c8d016ab0cd106ca38f445cf54d605da21c391a0ca2c1ced1602fd13a41a2ff806eb1abb93fa4df076856a9f67304e19dbd0734124af86e2ce9379a45a28d699374ecfb8374ed3dd450d93024816ec5507bcfc0850fde320c593018606b22f021d8e6016ca3bf4516b5c3507bbb203d4e124d78246818bfbd48dd661258a56916a6d15e69b0f9e1279bc5af2d7bbaf88579b93afe6483fbd721f8bc42f842c952b749164f6ccb50e24c6c04aef510c09743645640d56d32852d6a5390439aea528fba9b8a56c3c74781e498244b53f8f85bed277cfcbda665188665180a3e7eb6bbd9c4642946d1d96294a64224c9e648dbb6fb78cc898ff3709636e1dbafc18d13d3f9f8d8b66dcd761cc90a172435941c37b9a0285e95a72a3ba96a158aa1263f3e5d565aec4f6d403ae096c9884d463fe812d4664953946f8ad30b093a0dc6271a8c8cbde3f085271fa26d5e97d109499f801a8c4b180e5f782a3a1135c84440b175e2896ff84e3b271d1e9ec874d9067bdc4f484e4fa27ce1a9e5e991d28962ab444f44936bbfe1cb7ed209bd67f4b453e2bcd3923e0175699e9ef42a4a0f87bff5144f446ef8243dfd741bbeb04878f241004625dbe0bc22b27964c857ea7a96f8dd3c2d39019d82ea89887b78023a3d216a56772a3a11959828f1e0cee7731df6f5741cc1de18d53a25ba1e297d4bf484a4bd8e9eb8f8b6734add26af9e1310770262128728d4f00444446474e4c23c22483fed3458bb0d8104c11e02b24c3ef3702411fc83b98e4bda810451391af295e09b269d9b2420419ca090b8d84e5bd4782a62c3179e80acf85aea36198a52fb2727bb6cc577aadb440911ea49e7a473d239ed74afad8b06234f83110aa3d83a01c9ef0332197d3d0dc67fe109e8e3e95e1fcfc7137bba57942da85d1815aa4c81e45028b7090e7ceaaa3c49d546f285ddabd623bd069ed8da80e22af2f7a9e13b6d4035feb401c516bb36201e9d9de95efcb07bb9bceaced854e0d06d648ecccc31c6c81c9999638c91393233c718237364668e31324766e61863648ecccc3146e6c8cc1c63648ecccc3146e6c8cc1c638ccc919939c618992333738c7123dddfc49647343c5ff837eb6047f145daf2a78141652f7c7de68e58a665dabe95740b329be16b904bd88babbf2ff5081f46bbc436f83d811a8fcdf015c32e24ab31629c444b1592d548790a5f77b73d5fcfc7dc71dfcfb089615468a38f231531b614998661f145b199b02137296412b497a15b98f0149bbd12766db3c9be15811f7b5bd1561454543b12b18169e74d0ccdadad88d9e60bdc7a5cf5cb702afeed226c839d7a3029a040545568c07f2de34a2e4cb70dba5d9cf67670dd1d5c419c1d5cb12c6659f36619c9b4ecc40b5a146d7277a7104cdee89806c38080301aac0840958d941401c38098e0225b4731c8c598f9b45bc33bc328940b8cc360a40dc62572f2c342520d517553951fa6ea1e06ac41537757fc8dddf524352f6682394518a5ee7681d1c599d558352d9b5fb752abbd24ceb43b23d5d02d4c288f8ef0ed3be6c550f1b1258b8a6212f611091f90cc913a321ee10b5dbaab0402da1ae68dd1245fb2284aa3666d0dc258d9374e8bc630ad4443f923752a7f33c969c1bd491df96a964a47ecca32a7f2134675495d26811a5cd2207f320888e60b7ab2450de593ca07875c6cb0a4f261c82740434eb26856a9f225d0928e2512631b4d381d95501acc48541661281d3a4292a7a8f2a59366f12516cdfa62d1b404ebdeb4950639bae0bb04da159f310954f99247fa54963f952f8fb8ab41b730e10f5cc380b5ebd92fa8da8c51b92324ae244b1df7ce2b65cd69d1fbbabffcd42ee254b3b941637042edb956f0a9dd49957b63a6631e8e290853a97a3060a66dad052dda48769d675a0cd5cf1175e81869706b2cc217ae7c72642cf4ba016bdae9a7b12a1f3bd6f930af6e5018b0504d277671e976713949f68094ea26a4369052edba8da2c1adf23dbdcf6633940e1d2497f74a9c875269624b9c8acacb670adb4a654b062fd49687ab2c708a46274e3db55b9c70ca8b0c5e76e81054370a759bcce1a836994351a5a9db640e41a81d4b8ed89bc6b24f3f47601ff202a807893eaee20cbef0d4c35a133a0c6919698aac75e82c69702bbf493cd032525d265798223bfd947863f6746053c58389754fb5ac3bcbbabbb3ce3479d36413d46e7ed5a5946286ed2bbe70e5d3ef267c2ccf18c80a55969e4313fdd38f25f89a6a218bd6f1d715ad10c795e836986599f6952e9650de8b7f2b2bd79e65a5a350679921ffc4127c3368f861aa921ea22a7f6ecd6e5c79e76db53821554e79f7cd0dac507d719e5f0a0d22c7cdcbce8b87395e8c7ccd4a79fc0b4fb3b0efc58bf35f7c6f8fc7f7b1b038892d8f862eb46944f2ad40a19a66d68122b563f65e64c90a7938396aca7ba2a40a7caa696a292a884135cdc5a16fc1a2c1979d979dd8e46b196a71d2604cf279a19a2646bddf74e90cd534637d7c072522f96a80e0247af1423302e3e2b1541eef4d158af17698396372919dca47959ecd70b9287d1e6f2b7b548d9ac5127304d1e400690e9ed2f093b25b2b9f5ec573c67c2ed114da1575509af5d10dac50e566f12caa2b54fb5d518371f5d318132b543abf448570ed633b3eda41e98c1a8cd818beb02baa37685cf01135a9831b6a38892611d5ea32b982911a4e22e6958fc914393063c5c4f085a79e35bd5457a8053f355cf9ac7cb8ba4dba80430d573e261a9e7e4e4035be2bad8d954a3356d3eceacd157a020eb59b5e658f4757e5cef4b96d0cdb1852d250b737c8578db19562b4ab89d54eb5bd61e3627bc336072e9ab5cd61c19aad4b13645c3bf2f9b66361f8c1eee4fc5e0d69345c7d874cd54c555e2f951786d343d55be096caeb75849d2a54786a9444aba21d7ed31d8c49ba8c89bd8b3e9b6acea3b88adfa165521993becc1925ae8ae22ac2c81103944f3408e563976a15a52b5a2715c6ca6715e65819690d83ae7c62c8178ad1897de5932335d7d53277e5135bebfa01aaaba0aee8a8c6afa2d4f8ae68e51379f06554ee489d1c9165738ca62ca3609054d57f07b87ee10b573e49a8fa5bb3cfa3d852519df8f28d86334a8c87f45523dda994a7a61ed29e1aa55cf9b8a8661205ac4b756df650d19c9cd449cf69e911e30a58570caaeac77811d711313d42b8a20eae17aa6aaa3282f418f7417a0c3a24497f48eaa437f581fde52f74488babe5304e24f5182d8711e3a93b00c65b60bce544623c752230de12e3a92301e32d8f3e5f98a3c61691243eb0ab4e84f49713c1ae7abc035e4eba0354c7a8f01149e24375ec445e4e3a11d5b1afa76a6ac4cb494742756caafa2d5f576aaafaa9afabdb61ae2b9b1cb96528b664ecf0f816a2d8fa63e80263bd243ac0dff3c7f2f670be7716801a9b2072e478798c1c2c1f155bd38f3f09615b2d4f3d3c1981e5531d99440f5d664d8eec6527ae24cfcb0e4f8e7e96713471efda73c7d68c26c147b0bfecf0bceca8621055fe8b945296f86527b6d6c5d3535f7c6afc36ff872d4e6a4e4e8ccbf8cb7372607c87ab9a3455ae8ebf4cc5dfb9ba518ddf61a8c6cb20aaf130826a7c8c95931aff32bf95cf9cebfa5c978cb9ae1de6ba62cc75c198eb7a99eb52cd75f5f4f1729e3d8624f1d1f2173a047bcb87909e7ae4c197c528be50e5a5f27a79fca9458d93886dc4954f6c499e49c4363247f2f04c22cee4316f9247f2c89c1a4f67c02c2b633511bb99859d995a4c2dcc270dc6e8e9d82ad349e4858f774e3d7115cf34a871127525c913861a3f89240fdb74456c23dee3e91e3d9c1277938745aca3896b79cbc3979efab2d342bb22f96deb98052907b7cc8dabd4f42a7f9ba14be59062454f54307658ac0bdff64e864a132a2f955737b16d671a4faf639b2665a0410d6142b0aed7c51a76455d33ad66fbea67a5640554a3b6f56a5a96650d6a5a8c4f835174374e4f2db8bf32cc359c74b029214f41e0530fb835b5b0abc883ad51e28b626b9490d5abf14e559ad8553cf6f05484aaf282256034051cbde59e443d8bd846e535bbb0354ab8d4eee1e4428d9f4fd8a6bb0a0976667e21de74377f7cac0b1fcb6ed95ab7945a0e8cae7ec0ab78262e48a87135458ddd52e5a5f2ea6252cc906264860e0c2946cdea8ae69359343f9fa83c1ca6a79ed86a71f245b6295d8aadd11ebf9a626bb6c7af86b02b232c8b7bfc2a09db923c4d6afc564fa8b1a32b21ec2a083b9364856405849df1c1da580dc108353eaeaea8918a1a5fe556c9135beb923d35c66fc6d95b9cc4d6a9a757f132a3a716275a8b93930eb64689aff6b00d3ffe04846dad7ce26907cbf21e7f3ab2acee2b22d4b8a721f0e76d5ff9c47ba157c395cfc6ccc309d1b52d6128ea5e806d586ca38fe321ef0061e321bf7e7890d8baf13d06626bbb930dca02666b6656dfcb6c0d8def79d89a1ebe079755e3fb1a333e6c0df7bd8d6575a5ef6f6c8df73d0ed6b24e35dff7365b83fa3e88ad49f95e00cb52f9bebab686e5fb026c4dcbf7420cb1352edff3d89ad4f706d89a97ef895896eafb22b606c6f73db626c6f7466ccd0edf2b605932be3f626b5e33bf47626be8f70d58d68cef21b035303531df4b606b64be9fc0b278f8be025b037e6f81adf1e1fb9202564e21596c738402d82608dbe803e034a78211edda7e04db2c81446c49a018846d84b08d3e00280de5a2a510b63975c136fa5f0e10f38bab3e8e59850f8cea56e103a21a2e17b5856c4df77eb7c9d68ec8211b13e64938e0c67fa04ca88e60d70f67d70f54a7e4ba711dcc95f3c34d205d40dc07e6ba414dd0c4c9f5c3dbb54d76d13c0362f2fe4073f67000801df37674d5707afc701a00d0b048b5f1ec3fccdd1f686c7433b37de8a2ca37a4783c36a88adea099c92bb13433b7d698928a05fb3d4cb9849de9d39852093bd35f4db96467faa01c6a9f0702541937d47e4c1b6a1f868bda9f41d350fb130db5ff33d4be0c32d4fe0e46b51f630cb50f430cb5affa42edbf78a1f65345b5efd285da7fa185da6fd1a2f659b220896a6751fb2955a87d14156aff9b02142416b5ef3da1f64b4ea89209b5cf5951fb24a126b5dfe2f120408def66584402352bec1e62358c0f2550111b542395400d76f68e23409540cd5ace385236e4d405db80604570ea42a34b6cb35d1e70a9425c2a56c20007b60edafb26c6f9231e870859e37bad98e0229996baa25bf0fb8a9a15bef0841f111114b5ff3d8151e383f2d2830a42753b6e68c3cef45972b191059f64c31a76a62fd5b0332e41282194932f52950eae4ce551e51a57f06d293fb59f823a72451574836fb05d76a6b1a0a37dc51676e442145d989c293e4144fd1015f4ad602f3dda1358562d2a11ab8c927429244e21b14a1df21ce03a50192f796cd403b16af447466583ef2be4248927c5c6d124171717171717171717978d6589f4eedc1b8ba409a4c42c80c132c14216f5abacf3f1d6946a5f4bc1149c7086da31d366a9cbbeb5146bb844ede2b3b78b179ea87d188bad441cde4009864b83dd27bd9bb193b04aa22a22e2498f2749ba01de60b834d8d1c32265a28623972aa688a2e38273c22444032794e620035344c1d70f5d2a2b09506aacd10546b7d6d5b1448605ab9022a762e7985001492d7d7bbb34c8305ef06ddd1a83be138d3f4020828f6bc8e929590d1ab0416e6b279bd0c6cd6ec287bd064da44960554856b1a08dab420a2335eca020a65a076d519cad64398e06d929d4b04825651e0e07d42cee2bf5882b21b47f94342b5225b2ca9d392159c5da092624d3c19d0304c88470c5ceb592b8e2cb4fa3e14743971dbac117f6cf4e6c199185cac7bc50f9db92a1f2b91dacc72bd7c5a6d9e00b77687b87c3b67561585ff17513be2e5beed8aef8a5acc716ad51156a27cdea846af7509bc1b2f0da3b49c315aadcb31972d75e7a58a240b477f3c7f652ca6422897c9615413aa603c80ad50e9a4215c3b01e0d5ae10b7b67689b0ca104a9ba4da6d8a2bad46d32041e542960588cba4d701084dab137b45331bad3b3db3b40f81854f9383de52974481687283d2fd7e9c3b08cc91568400ac2aa5842134c5548a1031ab854be9669a69ef892c3132f39443145a6653b395dc0a0491770904978d1c38323a11e2c49824c393a6a9203241c35c141179410e1b46d1ac7654fac81d3fe53038f084d9e58434ae57b4db217175521842e4c4755fca0a0899761439a09c94f1332503184659a9645a632f48321a1275464a1691b97492db84d73d9e1a32aa85872d4840855d042567ea66d5fc8483d42280a7282155fd8342ecbea32b90219388dfb61f23a419092376c5720431663cdce6d68d8b84ca5678789188e4a3b4cc2b085937a053490b64de3b8acabcbe40a6fe0b4a1663206278aa45001778537741cc76d9986051264730803ec0c9f9b44ec0c3fe3b26c8b3991093d4d7a8ab28deb1f273fcd5a26582041650e7bbd32233cfd02600f7b876b076d8d6b67f8cc36376ca3777ab8b80c55211bf87448c415ef10ce91d34c3937b7ecc5ab48db344ddbb02226518c8c644c2f26705801cb11932844dac65d97b4251f12b1a5d29dcf469ae59dcf3cb1b5f297a7eef217477da66f2f95a88eaea56b07d2ac25622ba77f7c1841a2592a951f24b6d695d31d4571e47b45114b9a0e27b268300c52b16cd360ec6a7b6ad6d8d5769719c4aeb6bf80a9db5b6ed4ed2c2b54b7afccd2aeb6ab4cb9e0766f620b6ebb638467a702cde21d507a449c6a28848f0ad45228a4964824ca8121b554a2076ba4fca68f9cde3176eefdd360467df48a8f7d9bdc53e60935ffcd70a3c81e0d32762cbeade0c338ae7f1aa8c10e027f307e5bf16d75adf04250d04b8c6da7b92eee1cc5c4f06dab83242d5197ba422f13ec7c0daab66fd0112515536d5447d78d7b8f6645d60a3d31f244b7548282a00c710d97a88382a014d56e28c932e1220535e41c57b845dcd47182a3a9e3045cec340f1ba9614311ab0e27b2e8219aa555fe4db362658c7650ed317cbdbb584ffbf07b348bf934b9d9016e665f2656f0a9d8b97e5c0bb5930699f913e8e183a1547e3f1194a3835ae8072b2991f26b70e507fcd34ab61a0db2e9cdca627b1c051be4f74eef1ca059af1cb42bc6ea00a5861d0472bdc3d1eee90ea3590f982187302af7956ef5882b3eb73d8c95e3ce6bb3d124847c153bf7d2bf666de7b80dc054d3b999bd46837cae6007553e77d34350a85940603aa8594e829ab51907e34ac21dab9ce91cc6cd1eb1d53bbde273ef54beb7ade0dbcebdf44e6ea50db32129b640605c9ad5b44926ec035f00cf45c55aedea276a74d160479d2fe42e7677e24ede89b2c35198fb086381930a5357c8075154ee55b94186d91c989904f61af281910ad615f2d9e28aef8aef75cf4e3e53dd20243c519b863434a4a93e4f2a0f75857c94d46eb529be90645444b4423e50543e690b2645a91c92baf079a2ee5057e8c816b5db1cdf0a1d79129288ea4eb34252119466619cc3462a9f44145b326a415f1242be4a32c3cef04964581bfc234215465da1233da85da7958ac0645bb6c94c669294913212977159d7793b68679a29bbb723db9dd98cafc828c9a808df9e9d7c2b75ab108251edd8c3d9e5efdb05ebb6e0239db4a384433ae6ed20859c61713553f69bdeb13bd334a4bb334b43ec52720e4e7cf476ece34945cd5a0ebf0a832fe45711be68e48b2ff8f85c4946cd52f5b76698d04b08242319d7c53c95dff5cee882d6e2dbdda6ddc768d71ff0a94d32da197e5cc1b7476c145bdb39e49711d1b5d1cdde533b36c33d6249741424eef908df5797b445831c5b3c825df19d706941e519d42fb6d6e5f20a56e6d7ce30e9a8417e53925183fc98e40b49469575bee55e281b74bbbbbbbbbbbbd3e76507c3b86ddbb68d725c9444a56f6c6525fa92f3f26ab02fe78bcecb0be5834282fa41f96cdd6527cfa124fa828e8c88ae8cf45012a5ecc455a37cbe273e3ecaa7768c92a86298248a9268b75f763226b848ccb227ddc2841d142396e0931d966925ec0443f5d4c3356279b85bd4bd05d6a6c7d018ea9e02cb7af17d04d6c6870396d5f23d03d60609b6d127ca82cbc3adc20376e8091556f68abac7599b9b01ac8d10ad0d4008806a7300b6d17559a8ef6b96f5fd2110a687600d1a1e6e3c4c85292a3641b08d7eccdad0cc657536375e5eac4d0ed5ac40affa5d092b793830ee6130531e9b3a5e2e8f8166c9c6beb2ad209b6ca96cb46334844127803592f669f0871ff3b07db2681610980ac3443c0413338fc81c630226e6d8636060bede0e98c7f87a3b621c26486cf1eb959304db260f4754c7668eea26b84b4593c8f3f0c5643114ab3c64d120136d948778db501e4e4c4c41a1b2949514ef4b494949699594144da5a4e2792a2a2a2ad83c22f36d1ed1c9e1523dcad01c1999150f87941d23c9ab783cb4cbab488d874661acf0c0ea1115e5a1b8c2823c865d216243a2153a12e9ed9cc5d6686fc648c7e4573c9c98f39016e7a5cc79984a48dee11d186c8b79b02b1e6c8b89b01c1489b02db66283628ba3442bb6c573d82873f8a69a3d049e37926ec9d0cba00f639581d53fc4667c7e673c8c755e66b236390b156475c6fbad33e3dacc32ed3bec4ca85dbec5d3a13d8689aea5082959e4264952520c7b9135165ff08b95a6ed32069b9138a41933fce80cf90cb53f67d84a6aff336c16d4be8c19f60d6a7f87977b1e11f21568560cba019809340bc6fb1868d6564943ee4a1e0e0c182a156502e605a66214a6e4fda41e3e9078c05016444fb22ce5c2f2a225c39e915a88210e10a423e4048bf9437b7696b89158e28a4a0aea236d35b2d3b00d47b9c136ad93836d9a2708b6e121b6d1a7098388c236412247d1619bf6e9da3c6cc33cc436bce3829d09b299a17df80b50daa781b08c8505fba5791406e6026ba1ba606bf80a3bb3c3369c05db00026fd13e1b0d990cbc85dad728bf344dcac7632449b5674596873a28958136e80a20c5168d033baafd6882efe5cd0a31a327b5cf511ce60623f1f8317e60085fc83c44bc9e11eddab80ad7a832cd1e271049d43b0d8237d2a07cb3b073518dc4271ad4e9b08dd48e30b1045f12588d5172f6a88b26a40b8cd65fb7a20650eafe48bb411704f6f8d2628b2db6d8362f471066df46df9ee3135d8e09eec29e7d88c6d1c7668f11b8b2308aab3dfab288e2f2ba0eb843c313575bc31cd565859eb8da221fa221766aff00453cb55d3a9cc8a276dd4decb8d4475ad4ad3a4ec045b336e8084fea561d4e10354b15ef04d1167537172a18b671cc7df38ad8ae7158ca99db983925456a18f76d9cf25048a408904fd1bc92940fb1ba2d91377bc495f7c81b6514783bb24b0d8a9c1e4e69e3fec5164d47ba3643ac6ec724c646c77ed35bab149142c3ee124993584a8f2e14124b1a65149436aa2a9dfb49a789ad9bb8ea6b34e4815dbb865d631db6d1be51d6348652f9de0e959493bc227a9c4483b4732b2a72a3216f2b34c42af74e85d34ee268a496b45a9a5ca594975a0a77cddbb17da74beddcc450de175b37d1c756a43412dbb68df49b4e9e240361947377b542b739e5ae78c5f426c6d565ac261021f5f537fd82c515c8982a1e32ce97b143c64f43ae5ff1f0bf9c1fceff3d145b190f349475756c45c3d46fe22757cde3d135d5431eafc7e3e5fca1b8d836b84253e7e8bc8c39df43a96f0aa3a1c44a2b7fd958104fe35766381fe94b7b457455c5948839bf1e0f971acebf702f87a13f5ece394d9cd8e3f1427fa42e73a63f52a7f4300f8194ea8fd4b1a7fe1916a97f17bbe621cc440d65acc783be391ab214b16c23641b5ea4e1ca19e62c1348a9863ff695546a6ebdac30345f0fc7c63bfe7800c287775b6588c8a2f26b08d597af5ea0a4bedc4300571a7f61c11706a94262fdb1facb4359673ef36d568df7300ffe060782d41f8fa9732b330c5257522a16192a9663e7542c944790ca9d6918a4c618aefc879f672a015c3945b7157c910ac168787045a48e51d5cab1879f6a259454b54279dcc4d40c573e43c679f23bf60c3087e03a7fd3f14c659ce6ebf19867fa639e85fea871662a04ab93620dce5c468dcff88d1962b587631e113235e83638437968b08783146bb0077a1ede1e02560fb9ae563364a2bebc8b13f38808b17305627d397b080885c4baa22111e921a0ebcbd74340a49890cad190870b89f585060d8bd4174ae33cd0f84dbf4c1a34e4fae243eafc721ede0131958895cf030e03711e8088951f19886f1e0f2080f87a3b80f8cb6fba5b2258ee43149b7ac835ca9c45e805462a4b49f38ae06aea3c7df86718a45ef3707c982b3dc8d8b895cb986191caa5e69c7365fa90a23f7c38cb6f3af378f840597e137b98e1fc0fffe4664400a9a6eec30c8b04f95a4b7cbb95fd737b25832eb1a72b42bafe3f3c4e25b8a6e80f2642e62c2cef78f0a790ae2c2cef4091ca4f71c75666111ce5d464796aab0ff300786a864c549609d470c6271582d5d4e4eac3dcca327df84df461cafc656e05626ee5610260863dea8cff30c32075c6310f8786ee67e336a8106c072bc155e6ddb210be6eebb74da678525ff3fddc858c10d597872cf4829c2a73ee5db795d6e39e9a61909afacaeadde2c862e161e53c31ec9aa723fe67af08966f83a9cf90ebcacb6f3acaf8f612b185f54ac6575e1133e88cbfd01fdc65e639cafd26f240c320359cf195b955e698873329115c651e3d2256aacc79788a86a59a7a97e240ac431d622c82a33efc04d5f995773162988773249b21579950aeacb07c45e633dead7cc6ec2cb6cdc3f931b6e1a72ed9867beaa96b6cb335f54e860c192b4cc47094da291c3131ea91b112bb95928ab7726ea2d727e32b439a2504ab31c7667c97885959595959395657a88a8895cbf84acc573c1e315fa121d798b7b723e632f348766eaab8f7708eeae8a1761c23e03db08733a4c1e5e8120d2220726799aa78f0b1873a8b5eeddb0d1f0b5da241ec0c1f56e337fd237e9ff97a3833bfe9952943868cb34704d6a08c872ce33eccadeb2160e57325aa5656d848b396e01ed636c90112aa8cba671e247b56d2ad1b2fce69d636f9018a2bd1e3d144c4735f993fe2caa3a7033bcb7a456067a1dba00c1a0209a2aed0305e09ae2bff6f7a7e65cef670e67d985c3936d2e07e66f2cee42756df158dd46bcc6d6752e789b18dd47b98926da4be3b9392992f97494d98cbccad346628eb0ae4811ee69d564acdad32736bcc8499aa78216ea0a423f18c89559210acbe9ce4ed7879a12a1ef47c4a55912ee11ad2abfdcb5fce6f2eb62351374bb2c1e882ef534806cb1948a9fe3f89f49552f69b9e71e5d80c57b23f7e65ca38cbccb8478e4b72fa83fb93b0cc23d9bbcec35959394091ce63a2e46ae294ed4d0f79d12ef6133e198f330452aadc657c3d1c8efb124362648f887fbe5b6f858642eacae34c9d27cbb9a7e80f161a16a93cb72ae33c5544a4cee7a7587e1c61f95615d31f47b4c7af5020a57a7a64a32afebab2cb982a7e778006b74783fb211a5c2cea861db4c47ec83e51f78d45d08f50b34a753fc401bab5ae1dd22b8c8a2f6ca006ea25462b1348837b2c5ca37d2b69d6eb6a3b4cce69701f63c298382acaaf66838b8bcbcb3e355976c8c585865db42f68e8f2d57fdf44b195ed4359b925725897ddfb11a46f94c84624898feda413f19e7d5ddde6ed11de374a24890f959f4ea4bbf72388a868dbb3a93dfb11f21b5545ed19cdbedd47f6ed91fa20dda3434c277dc8f6ec455c9d69db4857c56f2fe25245aa32c2fb761fdeb7eede23f5711aa2629a455cebf9307dfb4d675315afd21571a9a41c7595770f7b4815cf1d7bc7b2729adcf4f15d7b9c467c5415bfaece4789aae24b3a8ab480840b37f4bc5e2e957f9f4a11d7e73deca1949459c4853a3dfbe9d9c31eca4e45a759c495a98824f1f1fdf47511f9a80a3b5115468f300d49a2ea61ba02d665a24768516260061bd8c0c9ebe5fae26a3f44a75da633f1dabea5e05bd7bf2529204214a200c5444990bdf3a6378bb8483dd4e01e91a98c601729bba6829ee80a7ba887e26abfcd26dae53027bbaa1e1b57ddd429e292b3886b8906f73fdfba049013e45a977794e40a4848c2ceebe55a17bb68668eb8da773356e15b7e5c81921ec27aa8ee97d87731e8c3d0f0a98e2011c94ecaa8ca4736448561d40876655fd746a2fc8a3ef824bfe26aafcd25e26a1fabf8b61903bbda2f36c47e2e15662713a422cc445624cb1690826ec1a587a951a3c6d6ecd683f1eb1274317381f106e35f686ed4982388f81b60b36ab8340b4697bca6917b8759877594d43e3fc14692f09398acc33b3180c1178d7c2e1de30bbe3ed7b34eb35419eb68cc3a915d5c686a67f49b2b9fd6990b362dc3326d5ba965d8b163998631e916a6e36626b58cc7be615a9669d81625a9d471a5aeab5bb315632c3241e64b7317974fc917a63e56ea040bf62ba327a03ba9576c5127e6515cf534da6a7c01556d837dacdf5bf8c2d4ebe5c4dac8a1b5d1bf13972020997aa5a076eae5c23db558af32974ab16830f54ae5a47e524bbac54778a59e68d60685818bcf280545eaf5ca4cd850871aa67c6aa794d4fe6a987a7d46cd6a95dc8afa6af87151fb328b189631c5823b69ca6914573d8b5446b04b5ed269145b148a5ef54b92671af1c0d4a821e59946b54f79628b62d1ab3e08d2d048f97d140bca43b1a03cb54f87ba3503ac11522c3aa4587448b1e8194135a458541f5e8ea623f2eb1dd12e49656464483d54f8ba7b5f4fc547429e3b12a4974cc0ae242afe11a497482f9d48122245cd0a638888628b48e9a42d9d5454fb48704894e8f7397cf2a4cbf4b04c4fb336c774ee39de4b378a2d12953eb8cbf3e58bb8fa31ed229284a98fd2bb138901f22891d2bb67348cf9a925d29b72973f82f4eef2dcc318222622497c98ee9dc8e9a577597622a59f4ec4bbe9ece1a8f847947efa11de5d9d8aa911a59feea3f4d3b3989d6661ff8cc270f4e23a8cd110c5d342833a1934e3f7a253c3b6607ab6e783c3cf086ac3003951fb3db56376ba19e3838ae9a9fd540c508c54f836aec21827b5df65ff4dc7f8c455cc4ecccb8c6999313c29944c4e83fd3d3b9b2eb353816476503f75d3528f5888e241f9d417fa19a5e8c6d5473f14ddb8d2e8657a644cb3252626262626e6338aad751d7d515e3a15b553657680786464786474645e32afe698211ed20e860fa62784798c4f0c4f4c10ea190d1fe3c425fb646c9dce46fc1949f9e2c5e3ecf182e6e49cde3dc7f4168cf69092aab04b14556154654477791fdde5e9dd31eaa36588e92d2fe27ad1a1aca10c12951152621ff24255d9bbaf4b1ea33e506fa1435254951d517a47bd13e95efa11de534f51222df7be2ed46f1ac628b64e37bd0f73145ba9bf78c344a9fd3046a75f75953c515375838670543bafc41f66c3340921df904c8f4c146c239ba87d991e6ccd5677e0a486323eb56590d43ee6f2173ffde5f23939a6a78e3aa3e68bd9839aeb3acd759952735d2e735d2fe6bab8e7a432a27be94874b474245aa8941285ea7911977757f70e35e5349da4bce93ee44de79b4c3f9964123ab85e07ab8c6097e9f2aa23e44f3f5d3e3efc8c76e5d024715392987c46313bbbddda3fa3f81dc5964c4f5cad7c598e207127d18d2b95af2b8c195299214c110b55a97c5d1b572bd448a627b6542ad4f51dc558c517c6ecacf614a15714dfd6295475843c778e12395d7e5deb2171ba34b9e43c95a2cf177e4627af47779edfab76dd2461acc2a88eae58c67599b081071545b764fc7c5cfcd48ed941e5d4f03b2a9a02a886a89dda5370a1862828b08c63769a15caf45423cd3a55999e6685338e6a7fc6d1cecc383a8aada2da0388627ac556f7be2c8aad193d5112c5167797283d337c6a5fa3a41dd39ce124aebab3f085329cd1d3acec5996fdf370b2520f334f1511afaabd6a9752628fe5909cc2d650815b31528be532d48ed989ad19323534a327b660826066f4c0cce88199d153fb335eb13543ca570de2194133b21941b50f13145b31df43a9c1046141b51f33145b304571d597f4748cc60c3d941995e9a96d2a9aecf2e677145751b87e4647beadaa1e39dc494755ae2a7ef722aeee3e4aefe89024fc21a797ced48767baf7222e0fa7474ece89e69828ca9ba5b9a3e29b5ec4c5a362aa32a274ef3e4af7cef7e890244c7d7837d1d777a453fb251aa5f67a0a28cd7579aed8832ffb8eadd30b279db297e8c9d3d135a3b328e555b525313c313b0db660429492da47f934eb338a2d3914577d29bf4f0e7d4672e83392439fd10e7ef618230df64fedc3f4c4164a49affadf116a49eda37c72e4a0a101c17f72e893433d7268a8c8e848467955924eedcf28ae3a862766e78be2eb34cf887595e4637616db9ec1f4c0c0f4d47ecc4e7f59cc4eca270554fba4a0dae7524e6a1fa648caefdb10a6a8f65ddc5c174c506cad8b68a8368c93da18d378852f7e16ed4c7f12c5554b9a9a44a99c8ef2859f4eea65c5a7d2be9fd1b7c577d4ac08d67001b85343ac5e1af98c86be8fe767a4832f4cbd8c6a13bd6ed0cc1c35f8c2d42bf56a964cc6842ca2693ac0d0695d288a2ac0406c05e01759af250df6929f065b2a59c9b33328a3068f1a47b3d00229b134a2c1cecc481e94116a8bde2eaae0db2289a47523f85952fb510609758c1a330e2c7038c1d1a5d8c3ce46a2668538a2d47e4887e89091daa759340b93504824f40973dc34ad57aa543d545c1550c485bd880ba32aa649f830652f629af28babd3e8a2f6a053fb2b0f5d5eaa23d8753abb4e4936a022a26ae7a3d7abaecbf450f6481e201c41387e701cd5be515ce17052fb8ca308f5cff495a71c7b8eca33d57ee5455ca669327d6f5aa14354a81c1a9242898ab8ba6caaf6a61771611354ad74a25aaa32027b761fcfe890244b7d6437c91ec9b3ae2c7ec75620502aaa7a51205e385eb2f4752edc4938e8d0abd228d1e88286110da31e6854c1b77ddb8e6a9f8b2d1aec43a9bd4b8d6ad3a206b557dd1aec8c8dca4323a6bc6a145249edef121d30522074b8f81e5ab02c1caf057b85862e1f8e266818b1e4e1b8771e0ea9f370b822f6fc6e6e659d0f6bd6c6780eab5ca9ae47c49e844349837d23d82579e2aac1c8830f07108e9f065f70fcbc4469b04f87be8f0ef5d0a11e8c0809b09b3ec444554764444c43b0bf1c19b12e8cbe18c515275181dd9ea343bbeaa5a12cd1a1cf8514499114b159c4a57938da50ed67511b07160d36874348485dee3b81944838826ab0354a7c33589bc87206b2063bd31a953c3bd3128aee81a7760d0e46f29478e20e3eed40e8bce20ac74f6cdd90f2fb8670fcdcc0f17303c74feda11b3d377a6ef4dce8b9d173a3e746cfd1d1d1d1d1d15110104141a4d3308a2d2076e457a26104040d2320421a5a7c3bb52f79648ff46916cba028795e691cc55611579f46941e729ac5b4879dade1951ad2f84b515c117d1b0d5540bce850506d1a3b69d0903c3442144f83b2a7411a46cda2211a8a6264848324b886348c244f0ebe9004543b8a06dba7760fca48f2e0f869706b7826c135943c34e8506d9a28591a6af8129442c3a81abd5ca180e8ca68cad0135f88c3a8f6b1195d5d97b66334edcee078e1f8695688e3555f3872702861bdeace60622b2299e8228d05800be60c740b435a17164583cc3a4b0c6124cde203704f1431be471304e86f8d4f88ae9325f67668379d245d16c6b258de67591b1fe18bda47711b9785b241c2e56bf30052edb599807c7c479a4994c8388a0679b24f832def0fe901982073a5ce5c5948a6a3cf0102501e2deff75ba810aeb225e9921e49511f6c53010c3c806d80b00dfe687817f9a49e4eaf0006d8869100e11eb6c16f81f2491d743fe4b70be9b8609e068d34ab60417eca641330c847cd220bf259076724a5f387f0b8979054f61e76955f82def489eae890ab899b08190521b720098c3493f4bb28fb920ac96a5315115489ac6e5408ca37423063944656069b15ca1addf207eb82c0f2962f4c681aba691c7d9639040ebe1b170e0a5ac1eef2bee7a459a1c949ed2fbc6adf13ba11220b0f8bdaa8b9f238776a4f99e116d594efb65eb44647a448c3f007902daa1b2055d4856455fbaba65c9b1b881575025c41800130610002b0420041080561d3c4a686494d0002403ae92d2a5aac25b0702801c78d253780480210004002007ef881bb0d23d8f0a1083ecc1061a686921a3d0ca1071aabeedd7910020f32419089491203830466061066d01fd0e983f99de97b1d27e32495672fe79b4e7085e904261330c164025309ac3095c0942364ca3135d1c4d48489044c4c24308da00ad30858c665dcab031575a0c312e8300725cca18b255dc8210972880312e2008723c001f3deb03549988ce0bdc173c3d624612a82e7869a244c44f0dae071b135499894785cd424611a82c7066f0d5b9384690a6f0d354998a4f0d490c4ee4ce6a5410869404310d070862467d802c91666008219caf0833290c10764d89a244c3e3bd3f78c76c628b64c3a71d557d150aa9e329241bd2bae600213acb04248a84913264caaa8c24405154b58821294b0644912928004241ce108d84d463042118a40042228513284214c3185145264cf6e128210821084244990200102107ef0031ff8c0670655d996e5d9b1f34d47ba70a4075ce8010fb6c083289e44b1032dec40075ae8200759c881967aea261c60010737b8c20d6c60051b4091051435a8420d6840051acc600a33d89d515d75930ca42083184421063080020c8c6061e4054f78810b9ce0821634a1053bd3e7408c9b5870050b98b0022b5420f44493143041c1cef46b38e055b1337d93133bd31b44132d6779df0ba274d210acf134a4a951060d73d4a8135b2c74871834943068f8d578150dbf48c39487abb3a3abd7135b2e7ff1d0e56371a1341492d520b1a2fe82eeae346f59e8ee4ae53d2bb334c322b56432f9a8d050d6d346774f67273ed30e35e934d89a0989e9c7e4d360a4a1c907c9d6b5a206506a68d2d96af2d1d91ad4fb261dd313ddca5c9dd519be7ef7be19beaa7498fefdbbe488923f7941a190ac6eaff271aab4d3d429d477944443975a54b75d6ef0855fe937d84d66f2699fdaa68e09ac884a8c1943b8e9dc00012da1b9216482bb4a3f7d61c26da7f61ba871f44bb3831ac7100d76c6a8a350199406e31aede467937576991975146a888ce6460e2e28a91bd4851e5a37880b73a8bca4597c6628f128066aca4b1aeccc8a9d699aad61a137500791366666666686693a7c21c6a8af9704ce5e25e59887833ae6e1ec1928b6faa6316f85ee1cbe2c88bee954e6d6792347109d73d338b86647bea3da73c0473f95b93565ae10cf928a9a31753d248670197e5cdf4f958176d5f73c064201adcbfb660e5ea2b20286a8e13ae9a9246d490bb10dd72e95680375342e23a91d05f7e4c8d1dcb3693eb1c5487aa5c4a591744be35152312521f6c3486affa7cee8d360775083cd8301356b496ca0da2fd84fe693f9643cddd278341eec274392fd643e1a8fc60345837d179e1a82600d18db0e97b14091bd6b0cf76176ed215fa32b45eab2643ec619d1b739369a1c1e0e73ffd863efe41efb4ddc680853fbdafcb167b0c1fe6483197d83441f3f6402a6594bc366d616f4c9efd7cbeeb2c2040c5d18b56bc8741bd462e455e9e0ca046335ce98866f1f320f16be2a9a37a88631ff3c7e87c5e66882d999784cc9b78f3935ccbe335ca36ef006cdd7fa5a01b1bbeeda6c8d5ab8301a62528b7ad3419d12ba85c934294b34e46b404a8b61dc66d10f178bbd9123880deab89b288316a4e9ba0bdfe9742c25f370f8ecc313073b153bd3a6770cc45f89b3c0308c894a9487581e7290906ea5bcb594524a4b0b4d829950377937957e7a9762fa299a5eb4fc547ac1e3c54d37955ef278946ea2de8e23292fd1232d54e7ae94dff4e6e17826cfe4bd9325febc1286d112c5a444615fca4c82bddbaf845559c2a88a88efa32bdef795584ad90a4fae41628b83f88885980a065299301af47048ef4a2592775acd431d157eb5947213dc954293984c374d145502aba89b6677126a325183210be9de5f2248b3480fd2994c47994ca663a89b8efa3c1edd4d34e4da7947cdee1ece873a9b50dfbbacc4df679adf491ecef79d4c147b836d32ddb437b762258ef38460b5a32a223825b08ad568b0621e080ac13421b1b5f108047f17972f48837d4d061f73d197a9ac2063acbbbbfb43e460d78d7eb76b961a6ca6f258cf609b0e5fb62f76a64feab863dc3bead5e13bbd2f44b74c5bbd12e879ffbeafd49de3bac698f37e13734c3409e7bd3d4ff370bc0f06185ba6d3d73b76ece495ba52495b8f07d7ad69d6e8553ff378c87ac47430b64cf426b694db06024d0bc14d26821dd8101d91084e654288ad29bdb1df782f61e13e215c27d46e02d82fb066b12c456e0650d4159ac113605d211e2f54283a3bb575444954b72092a86ea4a32adff1279f345854e525112928ae8620a59418882bf99bc626eb348e5783cc4f58e7934592a8c15803d92f9412579f514a6ad3e10b5f9b5fdc6bc8c809a9a8caa0daf21b5b3f43559ee4e428b6fe7abd4ae0922745892decf2a42022a9648df8b60919a0a8cb84ba4d8cb2a89de66d8f3fa89f1aca1f797ebd5e3a444548a21a7ec0a76ef2259f348e9644f20625c5ec3c4359da264658d4ae742e525748acdd1bec1f79ee892dd511dab16b54c57f01e41af202c8a56120b6da2525e59c069b3d9c8d5fb24aa266ad8cab197cfc5a7ef14b1a2d95446c832f3cf62fb630ca2fa65fc82f7e6151fb9c2389e413b9c51374f8681a6cf9044aed3395449147fec81fa9e4c6b753774611ad33cf0add82214c8d18168b005399a90e0dd653f8f61c752286856e6b7c456238aa1b2486a11a7583c49083eae1f4f9dfbab8580144cd56b14e168b05c01af1c301549ab511826df0f73db6b5445cf177c8d785336a7fae0df3ac0d7ebf1f63592aefb7ac0d069685b201f2e2216a592befcbb509c236f82d0fb9dae7b511c236380281a93dbb9993640330b5df4490d70b9b2ce4c4e5210735d61d8ccbb76f77d968c8a5d29b62806d9078c08b2d26c0362ac036f82d17d8193e0b126cb3a29282fa1e30810b54807b5234a3c618638c31c618638c31c618638c31c618638c0718a241e64a53c57d5d5d431171f0852e552807db74106c13e4866d8408c1364300619ba6bb3638c8003bc37408951f360e16e49b98c7eb4192ca2729a9fc20fc03213ba87cbe01b6866f3004db30146c838fa42b0f642441868c1d90b0c30e318e1023060c201830544650a95e8af0f29222422ae5a2c4c5e5c5105ebc6899a2a585450a1696959f95151521a8a8a404212505950485fa907cdf0908a793e9072693e703cf2bf9944add91aee37ac071241e9048320a29b71d6c9ba6034dcb7250b3acf2ce440cc3c1d6c4186fb035dd6c83ade19d619e6641b1351cd420376527281d3a501a5c66281ae41eca3c0daa88c8420de0a066df942fd48caab62f33c1339dcf3dcd22f549c766c8d9e9258c320fbf9668305af1752c80145b9048efb452f4e2bd39a4415ee2f54161e2e19ecac3b1f42ed5a6a4b7896ea054e3713c2c525249be9b0c45338fd0b724ac9b752ab34b6cf10c76c5cf81f4811495ef125beb922e3c3c5c172b9a1b627f759bd4c1091c43e6611ec638367351a68889111675465d26463eb5491d726a0f759bd0210bb53b55e6a121971774a802b7acd1b6b8bc880143b5c3d7c3d961460c16676053085665be1e1a6ad68cc72923b38c551918d26fbae3f0851bc5498ccc30df0f79f9397a3c5e3ecfcdf0e73819dc4d8cabbfbc9c7bc77111f32ff4c7fccbbbcbf881fd8f34c47e041ca3e15bda53df6d6d5f6149d15056161aba548c06a9a6a8142c3596a922764cd1888c0000045314003030180e89c4a2d170449135710f14000e8eba56704c1ba7410ac31032041943088001000000000088a60d00f36ca7c10034b45e044039045100391fde2912e0eecbfd11360b046b50bb8e65068e013e356065abe6beba1791e69e9c8bffbb613428c6b7f0651344e23efaa4a399fe82c9cd2cdc4638e2398c3e7d9772934f818f5f34b8f894ef8bacae3b86300a34cf5c92ac4f24f435541f061826ad5f32cdae9002076a67f1fb978672e4f51f23ac206dc317589b781cbeeb8cbb65e9407aac150a482feed779636ef66014bf240acb41c50c8428c204d1e0d1239b11cc9dd268d98d04fa9c84678dd1419760d045ee5ff3b20357ad88b4077e130ccbdbb65aa6d8c081f982472e09d2e6153f3481a5d5c8621ef837d7e89aff9789cecaa5995e68e9e6b78b6d9340e85a2f632962fa5229d1a8b613ed562745276865f5c5488119cb822cc1efd029585fbf48e6897d4fd21688b39a721c354852c165b59ecce0ba521fabd9cdf01d2fb2518da39909fd805bfdbfc5c7565d909db9ac86ebb3651ddf30d83091d7aae3ce43a563ece86755885493631fb079cc08892ceed093fe6f36ac6143ee824666140cd1542aab02dfafc3a448f111fceb7a61c5fff07f55660c6acb5eba82fd014a43803324e87687db6a4c266a9cd4fdb50287e855bb39966fdfa5885c13e0a6fe1b36d84fadf4e4aa44bae88464affda785feed64cb1c9439e0d2fa37dcdf705e1ecaa6d1250e3b0539fff22a1162969150ca0673b9f35c9e89f66028118d7a849c17174a8523245c527292f2c6da9c591736f80619916b133b7fdc02f56645c29aa792a5e0c659d7635bd5386d3e07a83a2029b2cda64b7ff88d63aafa2d3670b1fc3607473a7645572d3c102d112b6392e1ba9e0aa75fb0fb146993a04cadaea5b78cf143804b6e598e55ec5b39ba5a8a94891492de3b992774289422727b67c647b06a2e2322281921bd92ac9bea0804c040201e92b4defb031bd8185808894988c48d9fc76a650f8f19e7cea2abb37b747545f95b6916e10e10fa47617688c9575dacafae22513d9b5ce5415b9df22437c237228bfbde985f9fe0fcee9ef1335be869175896b09840a989c4afee451bac3f473884cd06b44ecbacd52dbde734c2b282f8742c5932ecfcba64947b3ccfe27aeadad047f647ac9b9c685d20a78d3a68577ba508b7f9527606ad0b83414bc05a6cd8aa5787b1eaf91b7bbfe39a05539e891243bfe2779c1608edb4c5f3054660a96ecc3fd4e514213af303895998e6bc379e72dfa295974bb967525664a53e095e821e3ca8528fcf8abc9ceff65b275486a873bff136651cc3563d838271e818544e7e2021925ea10431c57b24078933f92f667fbf66838f58f17a780d670a188dac852f70ced151ac16a4142a13b2d34d512bf89f20c9750fdc1c0ee0a5c7e24ba15d7f406ca1d87ef9687dfe96a20b21bde3829f74c54b756f65bbf93fcf1f06a0545ef6124cc4c4aa8df6069c92374af99df05649073e023f1b389c31985d8101f504f377e62a0968b5a681cac6d80646377bd124f16b209c40901989b6348af21c321a29bdd2033d2683a6b1f1baf68ddccb1126e1bf7eda7c63120e7d5cea7490c4b91bc68cca5a74cbb7411da6c888a4c1bcafef9f653518116c25446a2922661de81984df930580357cd4b26e3a8a9c32f48fb65f556a12d539bdc083b89d265d187de1002a6a09f6c1db4d1560d803ab891b239a1a5d3a734aa2ad4ee81d1c1a5800bad8c3a2dd4c884b1582d94ada89a57cf4956dcbe1b9c6a7b8612f31fd01db568c4e21b03cfc7bcbe4013ce0b82e74e3fe35d92dbf17795f9c1e03b7f5b5cebb810820a8ed5015a4c86313944df06f397f3ce6b8a970fc212685b9ab5d143d51655654e7fb5cba191bc1e82867c21bf020d1a6277ef3b2ef38befb2e8dc727d1bf427a15026022c5b07339ecd023000c33e38ba03a0fe218c674f2b452954471c62d63445f13f2c6ce8c098c284206272690a2e15eb3d15747f17caefdf651c9b9c6e142b59dd9566601feee024c5c04db8c40bde70894df458c77c4686319dbd8a13d40160a722f8346998260b8d9671654644660ef72dc4436f80033d1d090b44d9e7bf27fbb3116899fff925dcf026b3de82085eaeefd492871333758d04a45db1afe6bc9937e4cad944350c003cab311a7f4dcbfdf352fceef80161fbbb896f72ce1573fe1ae4c4d8347a6978fba3039906d7036be3263a1cf009e5fa92423967757d024f0062e4abfbb1b1a20561e32e0cd2cfd802963f6028afae1715b180111d598370a6e66882988cf760ebfe48c0b10eacd01bd8cb87172b92a7aecfa7bc04a788c2a8756880e3630e089868563f6bb11605115079d64072d6185e68285aec06df45aa28d327a0c84d90cbe265a7a2981998023e58b4cb436c1cf0831dbc41393145470e67dd48bb7ad04c80564512f074ff78591ce1410021bba105ee5cbd36914fa8a318486d53bf34f4db8b68f3f4335f5905dea2af5d5479af201389d47900802a5b81fa4d8ba42a5d967df829b0ec580538e5a5eb6114e8e0f6813b830ea3c32398a48ef7e0782994f6b1bb184f9d885f8223c202e19b2b568ce5c51d6303782e9f4476eecb1436842325855c212684fe4e2a8961702f3226a25adfe07150222e352f2e2a7c47cb4093c760ad686c2e630a0c2629181e8463bd10d3e96403d81bf682b06b75677dd7fb7500e5988a3ca314027ec1e55e412de271ba0a1eaf4aee905a19d5bcb0086b1dcdf5ffc82cd6f6099131e420d7573b1f1283c734430320389be218cb45c2caa7a1766ca2ae99024b3e6abeadd777b198e075bd378eb97d70601631d176dc67318911ba2300bac862a6a81e9eb927c9fb9c9986cd751a1545b52744553c52b78750fe0d56777522d6898ac07ae5732f7e1b7c94fd8a8580c46620cb092cf66b9c4ea1c528b91332634b72a04d7f7beaa338aec69a8a7c813d85481eb6855d1d0a4ad4c84958b428ab6d8168cc0849818c910dc5a7a9d8f24e51358d90ae95f4598f249691ded720806cd13b0a20a714539ca2b44597c052df4858d55dc5ce5c360f08a0fc6bcb638a61776592b8b731ef4a9c23af1a6888759927e9a2da95efccd10137eca6949ca9850d93b38e7b9ec478e59b94259ed8d6b8cde0f41e0e8eb77436d4880eaf5e1410c21bf635428f43588afb5072cc75b62a8557f80e385736ce943678342c6b16486639bc99a5911868b25b2d2fa028677fccf0bce4c2f48d63750cb426e6b43e0751056ba48b2b4049c4ba8cb543a5440eb40acb44ad5f200b496519395305be30de2fbea6f242495eeb82360842037deb8636189afd234fcca11cf25ce2d9ca39e76c0df7de220683720f9734fdd34dab2c66b6e90ce07dd35eaec0c6979f086892466890ba278ad80acebba2094af09cebd8f71f0b3c8f7327537bec19d36787f08c30faee502efd7148ede45897463c6bf6ba20aa247527811caa9669255283ccc281172972f302c2dfca0ef52c31e1d794c89f5ea957abf12b90b590dc2c75178a621bdc6379004b56510e6bdab586c84987ea1d285262f84294f377533833f31d9a27cb0dcdfe0171792491f6a6cbeabc333ae15756e96e6ce09faa74fa38bd5ebc37882d6aad12abc3601e91f92b99c33863b86c0a6ad0901d297aa30af403512114f02b07faa65940c56c1e709b41362801fce228725b04da4507d0292009d100faa307c1642719737ab246548531f10a18149cb557e9270b83fd826dd344802465d155e4d13d558dad0782304ba562c87caf9731c6e0bd2b39845d8e8e558bcb0bd14854dc5738be9e41ff43465d7428ad69afcbc64ab60dc61e4cb2f020247d23b7ea9f225ab3049b012b8e28d4ab059c9b98eb0bd92e389d61767d584d528de8a2235c1f8cb8a1b4090cbc66705c4fb3ea3ce1ca374f8650ddd3a15b32b15c00b1ec39256aa534ca2f33640b85ca240ac08616e3a73f94c9c25ba9bcb864806303de47c76cb0342d46021fb29da9446a52e767b3c95ededc3ed7186d468e41c534d75268b2e03f4bba8a97945bbb554e3a381808f8fc6aa1a1dfbeb6abc01a0b1356039a8399c96e107392c5eec693dd9e71d2041ab27fbf1722d088a6ea53518809c3c47c42e09017732cc5bc1dc90a0b91f9a3bad11301e9238ed12cbab465c6011181f8aaba2a1982bfd2959e36373469b96e37cfa8b1f44ee5069158950034ec031e2ff9fae377c96f20be69dfb8a450192262009d563f46aa0bd15ce598b9302c88dacd2ca2c5ea53b8c35c70307e5081fdb1e9a86d9385c5e02c5527d00f9ce0b666c32306543322f2202dc7a9d82eea7719e80aae884985cbf8d0890f1a0c79e4788abb676cf09c4b43efc60c0411c7aefd48bd1761f4c9201ceae15f58b392e001fbf2c18b9189817034858ad6b4c89e6a294d04e9c89dff0bac5a8032ac72d704bc161a9bddaa56f6f42aa73d32423bba3aef4c101e36b721c7c790cc1595fe71f3b9abe37198940881022f138fd03221cceac5a06221bf9767120d7b3a54a1f3ad8fe2e250d8b13ae98e572032595f844e60edbd11133cd88c2b603d18c760535440583f02fd98afc7f4a5918d9d47db716952865ecb706a35eb1559c9a54951fa2e479f7fb60610ba52a850f21e591df5f0e28e6784346da30c892d528e750beb6c2a81ecf85050186520b9dcff4ce804e2097410954a7c2fe80150fcee3225633f29756dd1220d15fa4202c4b158dee221a1c0ef469c33081109ed59f4047d5d8ea82478bc5d0b14e0ddeec1cc5d1a344e0929b618807934627c6b83044bd1cdd073a0b211561f7ddedf7de7945094f87037e187c96cfc0def6a5f3eb6930e35e863b4d65e264e5a929dcd342f1fc8b68590c5e552e581b8f53b71848588d22373ae10f5399fa9d11c642045f9d0e0fc66a5b689860cd0a56cd54f49f33791ec7f9d7582c0e69e5698cc5f21e86ce324a597309cb5a55e54bfcbe5346bccb764d922a8ab9616dd6da233406fd5f6e3d50a59f36df848dc16494e0a7fffd2a7f93f9a296a002170e1e4e0cc83ef014de79ebf96765da4c676097c2ffc688f8dfd5ad952f726e1a27ff2116750913bd8a04cb1a91dec06ab2d2db2031550db3440aca69069392a2a13da189edc5c357a2a5ad11a1dda90daed415eb7bf817488b9235e1b339d3e7a68252e135ac328d8290344b8384485071d89b12523bdcb4a4930e9594d0eb16065b35e49a134a3e5c0299a2cdc73b656412f19b40a4273e6b0bc5afba6a4509e123b7363e412f6c958dc9a2c1b1b88f5aebf559799ed03a60611b82887992f79f69eeee7fe735f80bd9a7d7b84ea22a517f95764fdb9128438d9764867c4d84f5692208afbf5a6832697fe1cc686db0631b972bc72d0040d774cc5b30c4ee0652f8e36ae7413d5ed13c4426e61792397d9e2409f3a823658a23104264b06ca5476d06e45b6f01761f65aaeec6d878dfe0c7d5517a647dcb72bc2466b5f603eeee7b75c40a7c7f467ff571fe74a06a4f24ffbecff130a38abe8d44e8f8051928c14b79f543928dfcceb4a4032ac041eb14ae3a3ebad657c47f065d11ae6d44a29d27f21430d4845a46e2d58c2c4a7f35cf5a52716a8d459a54533bbdeabb521962ee1e9a9863e33c0d33e6e25be09c35d7cf0fc7c1e084d29551b8f904792230206c8b504395621a40f0ea5c491100eee84d64b2eba0255c87dd1bb64bb2460ef02e2a9694e971b49d2f4942b4a8daeac745e3cf09cf47e76a8b3366cb7faf04beaecca85209b978c702e987efb3151ba87e77cca1d1d5b1c53bfc14883c0938a6a1f2467704c8ef491985794dfbd4674889c74a9f3822155da5903b68fb1aca55b683d7394a001b4a325265c5d414ac1539865e31245cca7bde6a6524d9d618e4fec316950ac81bda9c775a4d8670e51a12039575d15195301c3d8a3733b4d3c3e0bf3376706b600f12ea30ca8a7edd4599b73c7a3c99a22da34ee62cd9219da4d649b5f6860c6d742921d33e384710a181aaa744790ea34cbad1bdcd3e8ff478e6d085fa956e625635ed64563037b871e7897315bd45baa90a98fc3c94bf0bade761996995173a8b1391d6b1bef9aac12e06eb9d571ae073844e96d1cdcb11c56cbbe3a05f3638942df52c6797ab20750f3dfd020a9be8c039d3b31a1ac2b8c0e6314b0b049999b378a0f29be55fa678a37b6d43cea31a0f23a8135d3db1550cbdb96de208c3e260f165080458dabbe6296b8e7ba3e23565afc471062ed82966b7dffdaa20c8f2d50de55449b290988ba54464d0d830cd54311d2fc1e591aae53de15fa8e8367bc0a1a6b08be1af97261c2aac55bcd699d2a99a10ffed6539c7ea8a7b9d15bdaa01987b70c050d8a4dc3b2c5e7b23f1d187129030f37164c0e2b24dcc3b20f63076d20b9ede4e04fdf1a9feb593c6a6bad54bde055575d78605ae6d5d9c773c5e5840eb3536b02bd4d05cead1182cb6bc63067133b324353df054cd4cd94595ef4a948aa191ab837d9fb9704a4323c55825c798013a87ed83f4618201f9b4ae03f127df232818b6065c6bd860ea42a2bf78518cf1857456f1cdd1766a9019ac3e8acfefd1fbd9495f89fec8f4ac7cc15d2b2679c659606161967212a7e78ec0040d053ecf6f6c905568d7732e308429c05931b26b362e482f212c9601e88f5315a67060f0759f364e436120239daf2158e111d59f7a3e1407d613cbd2e4a2efbd925ef729a4ed6420806b5c172c796026859b104bca6b207c2ce7962fc165712be4ed2e7c82ccfe38ef61d40676d1b82b6281bbce40cc03ae8fb8b33a05bbee10fa31133a1d76dd477d0991e2b66e04420ac79c5a465cf3fdcc2dde52abb9443341437044a3c9d7e77186b8b05a2d30d95ecc7dac17633e7ac147217db97e546a8ab888184d2a8cdc27246088f33019e76d9fd7808664848e2e2a1242e7049afc18423057f976d1cff9c5dcc794ff0ef7f54801e67144fe00f38da1184c9be487d2c3203d8fa182dc7c008944017024f54908b06f35f86be8c61f3fc8f729d15e8de2c37388c191ff082aba37f94e64d2b1d9a4cf6a408d57ac051496f4b94fc936339f8f1bd7e5b85faa6f8cdadcb803dacd68caa44bdf7988d4dc0149fe6080fa051bebc7afc6cc2d6a7c434abd4fcba3aed47222f38e19a511da3ebf9fe1fc9ca167fa0a152b287b920a62588a32a65087066ed2840fe1c5b6d95d68ce150ff631dd774503d80189e10416e2116f042e23310838320927cec523551aaf38070133c00a3bbf538cc686d5d1826e40ac04ed0cfa78b83c24669d98fcf9ee8ca19da31ba8da553ba741fe6e442501e68e628d398904c9d6b8f659851f12ea67e8d0af8586672624fb31ac16fb38afa8391aa1f5096236a5e1c967fae523ee30860b145914af12c67a7fc0049100071550fdcae89c8d410520d0306b9903909c55dc9b77e7f6816fb31800ec1fdbce8d0c31e3b585525975e61c40dc5b9b50be36c22601d5e15f277e67e5ba3bee458da18dd4846048b0ec9123aa7368029bde8706ec8c19234a50e4e0f86c3b7be0e6030354683e0c221b775541f6925e0bfe6088a9a004fcf98cd0b9a1c9c484738a200aba96a1851bf5099d10274c3008bb4c7730814f8009e80b166cce4bc4b78d9586d55061edc7c644149b724f3536f7c857550a6146d03cf8a0f92d790a53188c6499d798788d52227380002e2780981e9b2fcf92c30d853e6989748c2a2a37a5b865510ab2c7ac43de108f3ad01563b1b5de0052c793c169855f97bf2f4927300de79334bcb391441afe6f18aa7e411ae6bbf77635d7203a3f1849659778c3d7c79de2990af81808583fa84b6d81405e0c482f0fe46a91d2e83b6e2218bfcb3b30e7af4546919ffee8eb9c2aecc7629f852a21f4c543080931586c99c3f28126b5ecbbd2485e246e214e48b96fd514733565561f826058f263a040ab961a9d05039ca3e17448acc06278bf3873c1da09306157231b2e88964126edece171d0fb84d9dcb014c31d67a79cc22dab681ce0289441683887d417f4f06c5079c9f4fbc5a4d714a535fb232d89e3464b6cacfe9126b7dbcd90338ce7381571e2079d3e4039acc6d873aa07315afa64f165d204e922a31fdb6a57840c847411873c83ed4b0b88fd1fe3437ed1e71979b13ad3aaeca05f91dd1db71a5ef65159f96f6d12153ca0bc6ce8655073d4a54252035a41829f565555503f159152f8e7415ea0367841fe69cef5b55f4cc528f6622396988b4dccc44c8c62286631108b98c54c6c622786621573b1884d8cc5266662c76db961dc3c59595ff0a30b3a6b18752e10bb4e1097e157a4cea84b163d2849f45cd64dfa6c34a73063f717ac0b231e425386751ca1bdf6bfffadeff9396ea6450397d465c6b66b2095fcaf16c6546824c904c00025a773b74a540f72a2843fa058d051d932a08c45263f7aad2ae16b38361623e3afaee22983fef368d70fc272b728ecc56adc9b702d2597bf0b4ca1324a0cebd2c20e2c954270117ab85689b07d51c05da741c65e03d54907574b19a67515a86b55e8d0f4b02a69617b21e0bba602b6bd02c99d0e56463d4cd5125c5795e0a6e950a9d342eba0c1b74a826dbb02e83b0d2a5e0f5ae5e11a32e82274f6e204691abe36da636b85f55d3030cf4fe248774f63a6e8c4697ebcc3021810442ad53e6c42a9d759acb863cf8f2fbef24461b1e2c465aba4d1ee3500a4f42b2ca757353f9d67b502bdd040dbd79d424a0c776056c6dff374570b2107441953f09461542f27e00e293362b01082ec0a059a838fa35554e2f71f01ddaf2dcc01e41b3f2aab6c44197835c8133818ddf2deef6500d2a842dc88f67607c7f56b437b27ce01ce82f640e6aa01e0fba07d766af2d4d07de1c6f0b460b648529a7be47ad5a5232146fa99ef7085b405f7e50a012b49964b07226790e36698a83e8c1f0c95f7a1b98b700d710371acc9cd8831dc9baa12083325c0a57ac3a52ebdf6a6963baa71252ae842683b928cd328caea14ccf38c503b4aa113d70df795b301e1123e460cafabf2fe2423842228c1e4829c042b6b4a0cb29057f16aa48590aa2380bb49640351fe4062fee8afebb6864507f7f7b03ad86ba1e9eb4324c13e4399b7553fe3d1229d3faef5646f7ec018acce05564a0b263fb7aab6b8c6cd8ab3d24b5c61a93ca587995de29f424a1fdf097a8b94641148ab3f619d30bec378598deeac03c95bc3d3dc40de44d4b5ef891e244b00ef6f6fc5387c003b5713e954c4f76250ab817fef1fb877ce2d8412e504743076fb9f68398052065018f57101b515731dbfeb3dfb2f5e40c5bb98205c28df7c0aab8219c671889f37cfb933e8de763bdac9d1d60a9ff737c869155d80900240bc7ea81729f565e39636b2a13b5db557b878b6cfc458887c86ea6bb799e4cc024ec4a6123c616cd7fb8cc17edfb7a3a5f4b77b5c6792ce9d93a09e9e54b1cbea7859fbedf9169d8bf1a5ea626da60ca6057d0a3548e763f5877d80d62b66fdec63c055286e4563ed0e97eeb47e64cd29c20ba182be82b4a2ec075782a97109fc151f808795a38af9053acdc97f6cfc78f51ee1c6c86474978e4c5e1a51f780f6c96d324cf2cf0048ba6636360e158fa6910f118411e0047ed5b62a076633c07f3bb1a39d4a1c2d7771641cdca788819a7a38750446321bd5915b116b8103b87d40fe200567bac8c2ac2fe2619a136a4c504cf75008733dd59b0156ac5c85dfa6dcadf91fa12d940ab1fcee5f80af65e41d49e80ccc46c68c5e75a6eb494e0f790d1cd8bb4497368fdc964c45dd18ff1cd2483f91c046761df5f1645106a56702f0e93ac154073613a30bf097f9ea2880ad5e222afe08fbd93db4d113f728d78574c295ea1122ab7e3d5da97d289cd92027eabf82a719841fcc82126b7fc0d0c4c01a9eff7778299f886570b0d055f44ba07af5d4370478e8ef97cc7d33915d5c9430107250a76ccb7b968dbec4fc5c95967c2f218256123f4620cfac3ea5e55c3f6645f76457f51d8001aa0e84f35d3cc620531bf4721acd0bee693f33c62be2f397a942f5da05d6e61487013d701ea0420fed84c2b4da64deab8b0436ea26725b7c697fcb0d7e12b1cfbc7e2ac0a782db68c76859e219307583a23d59b82452a480688efb01e62dcce1611b6dae94b0645ae012891064d59170b0a43f3769cc8b920dc0a334adad0c2f3476a110581cc6bed8881a9d30f948d7a0396b3161ecc8bb42c4beb34dd7d01f9424e6f08376d4e8d8dd997e4a80abae343bb53c17bbf827ec79428ce68cb2080b5328dfc50ce56bc16e14b55fbf1a2b3a459e63e454f1a7932df47a960cf2ce3dd81c65ebc0083f4a8087da95fb19e1aab12b1edcd90bad0e968b05a1d7614ed821efb7e0a1bed781c1b4e4bd0497b2009f7720e2147bf98a1047c26244022a00a8b05dbd789d079f0feca46009f3714d07878a90408bbf4cdb77f722a04eda41ea5afbbc09e7b912c590a321ccdec86975136d37a0d700889220090e1119d19093d327bec8667b9c326cc04cf1ecf5f15ce8b0713c20c7931a760de24d179f903c636a01be7f2e166923984c306ac8da4a1995b1b11b61f337bf5aaa23841c09eea90e418712214a89c79a5c8289af197aaf90def5f6cd25393603adbe611963c95e922b9308981ba56762371ac4ad4518506f6c143249d70cf611377bdb89afe23cfaeba2c327cc0890a6ef120a8b63566a667df2b91f47c13c00c751d6e789f32106ebf2c81445daa429e442f4064cca6b7a315826706e50d5b888da08b95c078aa6cab01f6645c93ce9b61ff0d022149d9a483c532b19cceae52295b71e0507cadd31164888fb6230b99a7bfe6ec55c8e92a42adfd41ce48de1176fe1b6365768eabaf04f0c98232c87bb3ba957f635a5bcea208dc3453cc0969ebd6bd926ab0082b5bcea7a044a975abceade63064bbe5739acde1a64b89582c13b61cea140c146f9e39c505b4abada3b19d4527dd6a0824456a2710a81ba2bdd9fdbcae7cc7b37a187eb05018ddfff017771e3f3b49861ed8c3e5e5dba06065494655c905b07de79901b1702881af52a125eefa842c3900d61723b9bcee6152f3dc808b9e432c9794e09b82ffceb17646697e0780057ddf7bfdfa41747d14abcfb789320a84bbb5b71e5662601fd09be31ee1e82191b4a584fa5b1dfe46028934a2e909b061b27ef4f57e137cc216e65f611f47e4dc37548385121dfc514f512e6f92fe144fbedcfa9924dd73e1b9b85b64d4348819a0786cc6534aac5832bebec1f5542f235f43c8deefb71410241fa5bf225614099aeed40dfad695eb70870a9cdad6ba9648e97671d35c1e71ab48cf20bff7b37fd8322ed73e2b3c181e3c2ea0ad876cd0159a740858abb19ad0804db7547f675ecce04006043bc251827b361c8cc5ac848e57747cc54660f3ae89e3e258045f6d4c5e4e6928e6f0bb37a7d2160836e4086885cd635b739f78ba601033a629fed007c42d0a471387e1f773db3ffe2177fec28a5b3e805de54f5545b0a7632bf70667925cf129a490a2e71c6eed4381d43b84337be78a25631f6a473c19f30d051ce9cea522af4923564dab33f14fe934c91115203bacf4f9af267a5fd29c682fb0f133015049d6b758806959d3c6248c45ef0065c1fb627621ab7580c680d89330243bc450203221ead3c7d1c1315404c00993ac251e5ac04ee4d49268b81928a32da6ce3005f07b5d6a4c42c870ea00a87c5c4b7874e063088ce16f808637fe98dde5022331571286449865bb4f48be95dda0719e3eafc6368f78c548a7a1185222263e8915970a016a6a83c4ae1b36649fe8ad392793171012d59dc4e574aa1bc4fddc9a1bd11a1a314a888e6b94fcafe7251e5608e19396d189fc753a4e4ed84e501e90d1afdca724248013af797f964cd086e5a984a47f1413bb20b204bba383d85a6a5d82b033706f4f71350be494cb024c2b78b76dfca8171b688fb2d68c89a5f732671b9b13a75c3be67a65ce847e2bfbc604ddb8c7124499cfab8bf8096dd2e0474ed180479fa6c1c0252e98f1d9a0e240ca107ba2a8e196c497ba542da2d795701d02d822e7d73ae256399c6ceb3a094372cba6dbbac138b208d962cc835ec9c4a6145eb71d5be415c03f125c01cafed22c9511d9e41253681586a1ed43c6b115afc041e14ac160bba33c647f4718433cebef88238bf6ed6f98796f705bfd29df3b8f9c9d2cfa6386b16b08cba32fe6035936380f52a0465c7efba0bd43bb697d2ced9e698d29253ec42ca42f8ad75b899b9810f9f81c936286f751426b002d2b5f466e4bc7cd61c18d7d0e5f29780a7c20eafe51e62c724e366954b1b890ec2ba9120af20f2f3de89f04e39d310548182b2bf697c7c5963d1c38e0c15df53886c24a60b3f32068e07221907dd9a82891aa8a1e10d427e46207833010273ec84b81133a6cf6c12d4ef6fa93e4d5cb8a60c67a8f8158b85ee995adb7756f97c07c8f0e660a2cd8f60a2f46e83ecc4f3f5b1cc7a981cfeadc6fd008526652d9a3a83b8bd282ab86c9e3ad4ccbcac30e116f087fe1f84290ab6469042c6a329590a3c78c65d268cf97840c60edbc61508ac1c533a3da61cbadd5f754811d1ce610b5ba24ba4677f538c8998cd221caf452d78d03e2c29b8181f12e51f6b4e0999502f4a59251d8f33f299f676b42a7307a73c5de1a1bec12a7a7855289e2ba929f2fc3f206b41157a2b41ce1fde5c8d1d019a11f9c95306fbe25c0bf55bbeb3927bfd5e909450ce451304a8c766547127273c0281379f6db30f51c07835459abe2bc66a0220a83b640bb28d97798025578d866ca4414b33320de951e08060a140b25f3315e70a649fa8695d5576384d97b0946c1f48fbab8e2ede8885e6a07df4838e23465f42eaa09642438f8008b1bd20b8c60096473a9ab0872c9d0263da3bb432f4e698e7994d745e64130e4ff4fd5ec1bb292f024f3d501dc99c909723f53fe1c4be3d2fde4c40a5361b333194fd9a70a27a91070bc051da8196793146c72f3757d255f24fe50beed20225f72a25ac43277417cba8c728498f76285219d9d446fca26f44f78f53f97d31089870939ff27a8060b4cf00081581a6d930071e71eee02a3089a4c26eb46d2d53aeda5eb14252e2b4d810e82e02683f28267db08852c82df1479f03cd31d419703621674f388619bc89e0b1035c2c02b9547ac41ee3692402a6c2c27211ae4e203a40bd732b9fb038529288ae52f9a2b86c7af6f87cffff8ea709db588c488fa74c2ce097a77d7cf5cb2b39263d79d30fa07d200e2f51b142a04167bacdec30224dbbfa90b6e2b300b864ee2d520e46b6383086059c82117459bf6297155908ae8d2a1f11181e80013a8d995ab34a0f8314e85147088e29f03095308b8ee7afe002c2162c7610c6a48899caa690b22fe3c8b840faf0c6557da4776151ebc58b38058ead935c34cdfc7f7c306e64b3759a13c20dabe8b9180672d7c2122b413854bd01bbf6ceb579856e95276aecea71e04cb4d021c00b5692cfb2f3c62b59ee37fb4216b0e8e2d82f8339c10133ad48b0af88e305e12eae13f38c236b94b36918d617d7e75cf13609d94ee5bcbee1996339f6f69ae337b80bcd6603fba25be82584f95313db269417124f8107d0412603c05014263f1a8eaaf5b95d2dbeba4ea9119fbe1edea6cbfb0d1c8817df63b6086e0d908efe5ac565bf1a9c57255d2d9accc880335980a509431008c1699ee73084f6c72bb8ff42f9e5cad0bfcab687a881810fcb75314aae9a441322308416da0ea74cc3c0a987ca62a0c7d5407dc9bc88511fae2510c2b217816f36f9be6c8643b0435a9ff59af84179bd5aeee42c0890984c82bd620024408841dab8eac881b0acc2f5b89d1af681e3de7b484605a3c758c9c83457466f4f85df41b5ee46660ca567a99e9501950971932eba788a11ce77f767789004bf0f8e84f24e840b93cfb74260269bee4e39b29d04cc891384b1d0d4779b09e89c905c201e9eac3d22ad1a766c94749967c4398d6c123a0f3fcbabe34df974c5fd9c9a458160b2f1cec4260e2981f87af88ffb55bed4c6d97d859561eb9493bb5b51524f7c784a7dcd2d03d0ee7b5d5ba9d85508f5673c4b1b0f21b4c78f6852952a1341f1c852fb2932417d373bf4e7a6f4232c08b4eb8d101d823c53ad106457e48aefd1afac09df2ab8dbc038b1edebdf85c5c278993d947e52a44fa3e33d1d5e2b394dbabb1cd418cc4e4c4bd9d5af567d4ac7547c48ed1119fb7220563b3d751538617cd849b6c2dd55d910649215351848d29c1073464adc1b3c37ac7e1dfe040c3288975c458292bef8c22ca72281972f0f6f3d5d00fe013341ea6c10ed9798681c9087e97a20625bb3942f7748842fcff81d72efe6f9cbe403c0da7d8c48227cec9d623b7e87f62cad2e74551538a01eded07a3af70aa205a4aaa126afb4767343d4b82316520a6543c5ad09cebe19494c1a687d92e9d4547a627484997f2c1bbda70592a308902ab029ff0fd98b43b979c96a611f595462226b0bd50a110cb96eab13dfef58e7e9d4932da5272972912f57a32b46e729183cebb4ce73dbfeee2500175a80fe7706e95d79caa81eb55dc44cfcaa264d195ee49489ac6e6556b4e5088f2c05e11a957ff87e3b2cfb6005cc75fd0b1f00317825b284be75231430db3ce01e1dbadd735433c4d79aa595a8ac76610db0eab9e8859a32368960ad5a4c2a6a9654f6aba984a079956cabd3e95338d2a94024a2373f411a8f2d0c6118deb022eeec0afefe4048431fb3ef31740fc2850f757a807c469bca1008cb3c943a80cf61086c71eb057df1f3ab37b0ea6c21ddf788474c4fc3a654bd00055785ff264e02fcf031aebd091dadfdbc31fb3b54de6539c4716ff6c7326b356060a3abdb39561c5baac7dc077ee09cdb639273c018dfe853e6cd36e90efbb38504f439190ab0579b07e958f2914ce3e377b4d4a2dbc5f94bca69544668497c6b2c4e27010cc0c18224d0c924e2277e29dc723039df4a8ed355b0e324ad8f858d921ef77bc3137b60717c6dce12a7993ddb29af869e6ece425562f1969294a8b1e2b3d2b7861f49945073fd4fc28b667b2882c148e1a87845c63be829d498a90b69981b438b2de9886bedb1b6f6f3915e337effae403630ac283d9881eb468583b00cca56a269192da6d90c9ad0f9b3e05c02285ebd4503ec80c696a35f33d3723df5b4686c5cde15e238e68e6761e0556e122e8d1b62d1b9897e3b90c04fd40a1eedc612ef5c30a0a54866c3412d2cbaf073e10c18fd4faa047f0c9e9d4caa8ef68ca0d910831b765363b408d00704453c09d6c14865ec68ac0f5834bd8bdbe4453e67115681b95a2b2b49820bcff2d46a2fd1851c89e4531ab8d35da25c7117cfa37d02c87c5bbb894699d27860cb6b51df5f76a3a483e867832207c64be9a0e99287043bc8941deaa9f6f3928656e4aae35ab196993c743c9c7406624b842f1052f973328564427894aeec534aea1a3ef51f264d7ecd8452810c67b49d51375206378a797199e043f2559277d3933a61f15dcb3c6c3d5e620dd82d60800c1a4f8580a7aaf14bfdde76bb5d2606bce7f0a2e8c46d5d744320b3e8cbee70ab213a5e9aeb3f518c341a1161d25d23acb0d5e4242acf2d163ddf208a3149bc28cdd638ebd1a8261807192468f4832039e9002d8686635265057a5612389311291259cb40aa15796eba18da96d6d27e6aa07130a657d3bf4b5b76f1349f1c7e1da5f6a58ba7b1e7303a225dd3ac389666b4cd3176df9eac8dad973106d6170d36789f9909678604632c7ec4f326300b63308027b5434180159208606f88f4861be6bc81ee5a2f7805861f2c7f0bbc717dec44a092ad3a2f4d00abedff62fc6ec83ff3a952edbc356ef2902cda65dd00faa236f9446b11fd482468b432b1fa25b22427058b42c516f74cf2af7f20ef699b70486a6e61170b9bda346a53f32f424c905fd89453e9747240e41ea5e27dac766e84116bb8c6ed2807050dfd39f3175af458b3c7e12ca7c10203d56d0e9254c4536d6c2a38cb7a8af7a6ba17e21de641d79a5661f99f4c686b39fbe9976ca8b83db9335cef1074eba2211d989017f5ba8b98608f8062cf0b824c41a674c99c1e28595020c2f820c0e3754f345919bac484ec61497f4554562a311d37c64316176070a04b9c103c2969493e03100fa326134c38c1459bac8f679543506a79e0054276120da406ba4356e32c8c5fe358f86fed955192642072ff6b86e402f9828eb999255a0e11bd8ef98b1784d0ee6d942efb2461a520df368835a29b21fede8b21e083d2fd8fb52b06cdd921ac065304d96888036f415721e158b8144bba82aea82c89d6f4de867e8db06197b63aed9ec1e5d3b76935842913123c6def219f7816b18a5cf490e1d94dfdf93106fbb68eb5435dd8955df59324e300ecbf2e62e3bc487f3e58055f67da878f7fbb37af356e2023472db053c254ae60417add418deb182fc287563c41060c1d1c82ed757a5199d569702f8656446198738c526835849a821de44b30fb8c1b2e69214f9c8aafadbfb55489ee9aa7014ab11af10910aa31e1e50dedae18009645d3a4259f0fdb5eeaadc58557446394a66d11dc6780c655c11b55fe07ee77cbb5a82b886ef012578e7e1aaa8bc57d1559cb927b7e1d0fdc3d448cc2f7d11aed88a58616b971857e549a112cd40e06a7ca308b2a43422235b533a14e8fc343a9bf6f1b94dfca7d4c55726d1f71bc4915427439fca2192b3a497a1e4c024148feeb181da6bc7a8e82a5febe813247ef4ab54665a47154245c506cfbd921c17b714f28f1270947fe1207c79aa49ca77f83452f6e84e59401a2f04ba010f80d4266b10108f9afa676d175a6dd15d08fd7184ad137b393d54783322d4c79b59ef563e770ae313f40fc6b4ed2d72d99b717f1610ad3a8856ab39b282ecb0636eae862f3030260c85ae2541e79a2bb86f1715030d586efeabf956ef0130f52ec5023d80bd3da6acb33256f697da6e2fed117de436119cbd8e0740a2cc1e3f72a30669886d7d380efa4351bb4969931cc6556d431a036f6eb03462b80f79ce715f63c6dd479c2a0dc5b21bd0d6a5d13c36605c52f9b507c88aa148a3fa39750504884aba429613cbef1d40aca89383080c941f33829e5458b6ca0c4b678dd664b3b6dd86eab76162c5bb69976630bb6a682e75ad2c8454f1c35e277b9ab919204e2e970b416320323e7b4e25026eee688c3d8ea597086de7b144c6cf848a1306afcb559c9f1d406989dc06ea723b1ee2959896a4e1bff5a18c61bb45ffc0ae3a008572dcb23609bff45efdf425bc5b6611bf514f4b36911ec51ec17253589ecf9c23ca6c2348304aea7c37baba337c5b5acc25f0df209666b33daa2d49f9e05ae9a13d11e5160acc6c9196e9781b20dbdcc56d32463668121f90bb770fac4bf43603055733f3df1d514073f405baece9af54558827e37bd136475d9c65407a5ac97066c78480a2422973ab7a1005c90370e9d370e90de38cf1b079dd91e643bdd31dbfbb4b3f3ca598e9aa5c01bb6fb20f4a43c8b0d9f7d6fbca2a8cef3be1c6017f8c122bb23015f9d1db754ad95e2218a39a28fcf8fc96d9c73b1e05d87239a95fb2b226f8eaf909e6994d33c681cf95e2fba9e70978ac668a9a9bc7a91825ffe77906addd4fbdf6b3d8af2db7eba4765c1abef8aa263904b34b93f55f03a549f909afb3532a00885a362a57fd56b6f138e4f7c6e2b49675dd2889c971fbb80bcf9475262373c4ad87bef26f1a8ad4dffbd42411a6f764bffb692769d21163bb08a1041a57630360cda4b512bc142d26dc16dde7a01070307938bd511fde1c05489e903e11c705ccaa13d2216fa3d0e7303a9299b221095fc78bd390539f2c6de8a3a42ff3fc2461be9e167907301fa9afa3e2ca5f39fe8dc06e566a0b8a45333311d69b475d44547e6d5ace133ad588f1b5673a141f011e3df4049a621ab91f08352c6cd604f0e298f91001290c0ec8ae5fd8f719a0acc8892449ea42bff701503807e1da14c69a68d4b2a79c28fccadab03937e52425e32ca9fc5e13e736388797a60af18e83b6a6904d7365e93697d883bf7fa92ee1d78b552a1479381f4532d6d19701aac2505202d6430681741e318aff9ac6f914fd67bc3782d02cc314c2fddbcf33b6e7617d23eafbe38ae9685f81106a5131fab5340730b7af417364fc8c563418ace8b0b28a6f2cf4cb7412e5642cc685f3fd6faa8b55a35f6c007830264684133bbd057e300a2c70ba5e99d921c4301500f6dde80d05606f237c43898f3f95124668036e6d812a826d8ba18c6b659745fdafdb3b9f61d2eb6be9ee161406285c4502ceda2e7b9791ed2982efa2e82ae1ebf301601f500c420b927359cf2489e9849e92300186ecdf171f3f9d95fd53132dd868549a12ec5acd1fd1aacd5a46304ae7e46a2c1bc6f93e70655701cd458e183bb5e3796370537731fa0282f145f67c2b5b91c6abeee5f04b23a918f32fe600b89d18b434cc9851761c1625280eb556d43438323e9f8e05c60bcfce57f3376dc3312f3045ff1a4d24742f89b4abf12029b4f2f20b2287667ac2db0292f24c4114322ace268903d28a18768a8b9b122d40133a08b5cb435ced139f3bc0058bddac70794dd045623b125cba5d93207f148364cc79e87b7f864553e73811a74457705428001b4d2a40033bfa59bdafb2ed8ef6675805763a69cc9695d161c419976181a52de78cfea04bfaed00be453a31979e9d66f75f9389f142f034a3f3656c0debefab58b572b62562cd09b08b4cdbee244b41a43678c375f3336a2db21f463bb849a4aa612a40f9c89674afbbc512b5bbcd326b12325f05bb85a4dad1cb4e6cd8f60c65fecf37e0f661ffc6542ffd0964816c9da5fe7736033d72a9764eb196616221ba6ef9c95b01de3c12a22a0e125c75767cb6e7bb0cff37892c279dcf2619d2bea00a8dde2eba47d3a7ba5c11510d8aa44e6005fc425ae22a75921e3e1de7074da74b09e14b0352f3b5d48d9993865f8282eb988d8c5a7742f4c52aa93e4a89599fa9d07d3112d794db8df0afaa87c99891ff65cbe9632e35dc4878c29fd054c35ea4b6d68651b2ee019a6fdfb439deaeb797136d4bd49dcf47f291843753960d9148f847a9ef41fc16baf18aa05c6bc4613aa54434ee13e816e20df565d8a84115b14802a6d1fb50c12ecf3341691d22d25caa00bd9165669ba49508da8500079fa35c5930a9d7b8bdbe3e47046b125299670537865448a9ffeaa36c9dacc098bbfcd348fdfb7fb30ed28d95e9d486cffb1b2dc3b4f8ddf10ede26ba07c5edd68e03a89f73b8e169e9c1ccde627bd42a410df5a1608816c1178694d83a778f2c168ae1375856c6dc9ee9b12249d435fc834e4e413af979108e083b0fd9f1da1ff30e8c7542c45904601b5055f62fbfd8e3b3090b115f747b3cf55c9f90e7da6d421ed4dd8511ca07443b770f002bd3a58b892759bcd710aa234e879a986ebc7a27ee5010337018b8cea6a67dd43a1f06841d38ba2cb5afe3dde032321f18a1d2e54d71e2a9bee4b560f125f7a6fba353680901c17251fbeca4b395c466822d6f4d2689dd61cbab52e5e953c9b7a37c1a054445df70a664cc10cdf472a2b9a3c2806922cb1ed9456a2280bdc0f666d0326b6a27fb13620881537e74274fd21b2e17e64652bf5a5177591d8c14b3761a054cdd0d9707d59722b1b3833a7b9a041c6564aafdc2d5239ff8a4e6525533c023b1a182d5a03380b5af4b9520bed243b98ca4dd468551b6036ae53d65c57b0340ebdd6c6c56d2bc95cbbb522270506a1bca0d7f10b266f70ccac546eb995407bb72d9ec87c528a53c5abf551ac7613623b53fbdf5562b980af3d99eab44450470cbe2454d451f483eaad1174d6d8c54d96c8b2dcb86d0eafe06538cc9b9ac3f5ab25889c9d8b4515dd456606a68c6918bccbd5b3d1317ab6992e9ee6777d8df20c4330c02285864daace50d9ab238045bcf10c8d4caa1cc748b473f68eebe0b599e95197f8cac5bb21c76a5d075e58c1063e273668bf59c42022ffb4c0a8d1ede5d4d0233f3306618674b5acb57557e541250f52cfab1a6b7d741b560239a425c2053b9c689433760b96503b13e44aed81d684b25e30c2f939a82ab88c74a63c47faaea753689119050229eaf285663c8fad3f05113bd896e063e7cec764281b292e5f25db363d1bd05762a08f1e9b4baf1107df81946f169e5faa9013f1b5e72c44f712cee1cd13e68a2d65b47eb1cc1781cb36d71ddd3aa3f6bb003558ae13c597a5550fd3417fb8325f3285036a32606c90b3b9b74f1eb1b262adf0a289b2da0782247c514126d08be12659bb6176781419cd646d60ed56bb09dd26c957d763cbd90763aab353723a499d65bac6f88cf7d9304bade1e0ca8284209ab0760f6ea59fb88c617f33522ef012deca74cd28356a4913070757a0024221e2291104eef15528a271849613a8d1acc334646b5b57111b36c80452404f4180dd392e26e469a84931ad73490c85885d2d98bae33d769728afcc402a719207f0cd4d8fa1a0045821e94e143f66ba0b07bd12a4de1edf3edb32c394761ad7f20b907bb9e077a2b140b29e6f4293cbb716d1f5ab48226e08b5527db9399855d7b49ab31f75ae3a3ce22a7cfb417afbe230cdf81d56ed7d95567f057d22e1d7cf194eb82b9c00e90571f9db01e824f1344d0929a1ac8a031ab486c407c496802abe0c80197007ddca1cf5ea6f92aa622ca3349d1b64e454866b411ee2f49e4c35f3fbbb504b251282cf1d76db5fa8c9617d252662f05aa635ed35ee57321086114a8682684a272e0a98a259e896d2d48b8917587d1c450677a86e24bb909639db194bb563ba253157261101fcdd2add14e4ab63028c893c88ebb7b226d26f792930077ee50497aabaa1f8455335c5adbe2a18a473b580901f482a88d708ffe956b083400b0841c9b2d8b55a5449b401380a69466d71d02a3f1092db5ff3caca9ca4a72b36bf7d4720568d5651b00493f45d978903f0d0ef98dc0355d1bba4a2a06949bfb77773440a7746c0c34a0d8ccf914c3d8d806af0a014ff34874a3e38551714c2d97db3f93605b5ea35c67030a41cb250ed0a5ba21db7cf285e7f38abfaa2296304fd2e4fb43919d74dcac93d223061ec92fa821056da142e45e8d71bcabc36e28a80a4de27a6da71c48f29ce599f9b680c943cd4dfe03896042e65c894c88fd1071f57b8e3a1be1e53c8dc78ead61b8ff8f0b9180c36611357c6a027138967d1bafa9453e7972fd70e2bcdfb72aeaefe94374d58ce941fc7b5c05f462591d0f62eb1c1297fa2ff003fe59c230784a6285d065a9ebb5f68b1e5283c8e2dc0ca9fcb8de058ed91aa1f99506cb0b569f859f0e9c1a4e8c284dbff096694085e888948cc68a853059b1952a984147ae5341cb25201fae00f1315488756f9b106aed1fab89a6765b654a4c6901e70b3ea9143986bd62da7dc51141c9d7a7af7efb0d26d3da980396e1bb81f70fd2cb5691e9bd5345ec0704abbbe911382bd50d5011c3d8655853d255086e47bf958670e218302c9426bcc6067414dde839c45e98a3afba5c82eb41c276a323a028ea34796374bda70557705b7b51afc539704be0389e15d7eadf29baccdce4bc1c30a10fbf118e9786e132840ba355bedd9582968c325707435b3920a8efd74d68b9e81ecb2f323713e5154f6ad2ec90587c165c336776b9aa5246bde00a87b5be368b3061425d8090021fd96ed92bf968d6862484bb75085b4b46e3e5152f1c9483b2f506cb2195c5955b227d6e5050f81344be1dd3ecbfdb84d3f795621e1d2f2dc2282f5ad6b3c82484ff1f75b95790034ecee6ade718fa556248ccf1ef91d2c87224260e9f249d0e241007ffc4005361f50b505cde67fc4ea00b6e07b500a131adf627b0e6ff0090351b4f2ae5aa632d9dc1ec08db676a970dcf298657a1700bf33681b2bad9c1b581cb99dbed366a7e5b8641d0cab3fa6b00c0a9ffee5a216812666ce476b290965fed87ad8c2bbd13c0c5e9cf0833271061c24f79530991f4360aaef5cb49f9f9d0c27955f440a51ac81e644b245234fc6678ce690676d39bbc1e8b269f755f9cb2ed37407ab5f11d9804267f96e8ee374110ad8726379192fb51cdd89d580a79b9afdc13e9bb5b5a6469cd8b9e8a88449dc2923b095c4a965e9e4deb74b12a480b0131d96f112a0aeff416561bc81acb7a211b60d4ce180ac951074f7109c121f330edb556d4b94dbc3fa42f5211b1abe554971af240488c8f0ca76c9a80683bb0e9fd1d1692d357ac70c1600ad16c419cb8810cb5b544cdcb6427c5921aaae4059c6ab38cf2e45002546248dd83b5d59f87e93bf0ab37821ce159302b4a9d4672294ef2e2a295a5db7562460f09e7e58bda401c3a5e98e5dde5f07c57fb003035b4568189504dea1ce26a3aa3a182d0b5104e14ae92afae08ec36ebdbc3aaa175afd6786a7bac1530348350b78037f64875baffcaad812932c978b0f8b2538e17739aadbf4f4ef7af7c5222bf428c17e2305fcddbabadc3c0358b2cbb55787d7c2c69c63e4afd49b1217d60248ddb86a62a70cb024402e915e1dea64e435aa20a112e9ef734d36a68e3c4194173ae990b2a9473a4acc36ae58b484847658835351f61c47c98cdc5346f4b998229df880bcafe9996bbf2e921bc89809271d5ea2916606e23f9d1c16add6764a04c21d7221518fbd199cc0ad60721696125cf2eb2f8d08256065a1b326ea4d21afc87e17ceb55feebf308ea813946c34c14965455684298d4b73388da2555dff27755aa0fdfc0f8555b1b52ed14825795d9225c70a4d914fbab16ce48cc62234694777e9e4f4f7d0d93a0a27987ebc0782d51d78f296d3bcfa92353344312b627ed63863056c3141af401606a92963103e4be7740d29cd1579a15c7e41c35f45b215d38d508bc7adf995f5ac790d16503a5521c4a44bff1f69ca959cb3c6efe8f3509ca9b3788882b2eeeb8bea3ee6d3f30a28f010360779b202b629bec5733a4b0865be3b0282d1bf8409e45fd2795a22beeb7fdbc0a88fd92651d829faf3984577ee34223a5a21477191945b0a148cb504f4797d66f618fc012102e6b5f0bd54229fc94f659e77b07161fabf3e67668af77be4c477313ab0965ae437f9eae5c8d7f2a2110204761cc99e860e9f634bca623e327d4609600ea8e68b32ebfb895994be198956569bb9de88df86f6e7ab7c4c55aa49a69b950c9f988a0cfbf121f7ac7eccd089fe705625436bcd2ccf3c98c3b4f5da40fa086fd051cf7713d0d54e7b7fa6a10ccad92ee8de721a991ea81a3e21a0c21010213460a668812499cfbf32304ae273fcc3022cdcc066af8c7a864e2766a97c1dec31c8a65f90c84c884a9a86c1c3a01c4a04a255df2dd3995d54b0d11938394e5a252a7c9758134a16a11d484cfe688bbe9375d4286909220e349a86f9fe013d9364bac02f2da91342be857adc6abf7169e8e413f5c95458835a16c3e72e9efe1a2d574964c34dfa4f26b4faf583b7d37a8136b27b12bdb2bb3f5af344bf3737215a2116b5ad6b87f7ccef3def4e9cabce98d5aaf473148a03e38002b11a9b8b5a22b50d8938cbd89763d163f815613a9bff266e934c9070b09e95df43ebdbb56a4320a05f049a4f16da44cb2087979076ae9761b693a16038d3de5d8150f0c5d7831c071c710ee8626a93f8b00f37e765644d055d3c26907027c47b4f33fa09f4ebee9cce273a2170540a1effd95568b09a98fa4d999293c999e598c823da719bd48f336f54650239e3ce18a499bb804b3cd80b99e1bee11384108a06c46b3b8853aca45f1b29192c979c423b2a70f73790ca10fc507d80ad4406dda9b50b252f0f3220129a566ac09ecc8f5050df8f9f27d51a5e85c7d2075155f403a81e253be7356e1085a5d81de4b51478cd040d7372469e85890776cba58d0969044f668a6695d24ab84771d3b9a172a2bdd386e61f663812fb62cc4d15eacc680042ca7f45a42be0c9b36625a14ce8043c0295e5157e14586fb567ac84585de1c8422bcf637dbc6f221e545681d4d3a0e9a4dfcd2bd68a3c4ae697304ccb12943f88292a53a33c8972b87d402ae7eb9056239c7b04eb8dc38d5247ba5e3fb39811dd896542b912fc885b45a9044ebc631589b938e0b1c4991932a67c91605bcad1556c4627aaa161facb1426f9eafc5433adc7b27efffe85ef69b54ca304bbcc5849cfb558cb1b7330a393655e52095d32b4bf4c630bdd892abec1c7d6b767d87f56a69325f263546fde88d4c53b1921fd879dddac7c71a9804bdbc43422a20e8366c3e6224214a42337ab02098d5a28363030d6ca2414f7a3e6dd8a0162fc68d09425a786cde723861d38505a42d3ddf42339f5ec2dadee934b9e05949803b93fc64ecb5f6624595b7eaa5ba04a56c74127d7ed5188d5507ff55e415904db8b10dab178070eed1f7ceff3b028a4dfeafcff89b6607dce1e5fbb1f7d92a907c2f75449a9877f20cec015884cb2c3f9e3d8ccd92edcae159e4ce487f9d0400d4c1a85cd15763209513d9708b799222c85a64a388fbdf174c55ac6a402f97777011ed237a9dfcb82cafe0cecae26d60613ce300b401a154ddd0e78165949acddf0d969b6d6f10556f34a2c74c69f0801c641e75363fab2d9a2b9004944419536e4791fe5242e00f0f59c47d533a36d8dee3a054d8689ccd175be77efdf8e48a14843655faa48743db413f8fe636a12625f0b89df994c79365d7082bb7465abb730c831d9a7d31dbf0572ae91a7536396b86a5af93b9e531e250cdce6956a9616bcbc682df889d2920dfc44fd77d7d0c09bf89a2338281090a36551ccb8195570d219d6644d89365623c4187f9c2b7906136a72559ba31964d7533410222dd938aa3b6617a81ddd7e73950aaf75604a40fff7e294d2ddf0ea5bf1a19a0dbe08238eb58c71bae1d96ab670a6014c5faf496a09d01c11cc2802a32459e5586dfe55229c1672514e16c69944d0ef1094724df3fe85b3b9d2255b7408ff961357e2c9f1816e153b8b3648dcd3a20d3a8e0d3f22bd6d1bbf1ee42d973b3dc1c6167ba348d9f9dce3a422dedb4364bd6e6599bb345d8ceda8463ea1eeac8e762ecadfe9df7270412e9d044835105d7e86547d05d7865236873d1d8c55371571c2bf749c0b424685b67bbc4dd67699aa62b4af2d142d33618a8291321397320a184a81c6e28cb10d0a13bdc4304a8906d39fff15dcbd2b44a11b74d760c6bdb90d45f0a98a1b007d3ad6c360796490d341159983103f55ff587fe8904fbcf23d73146ac0f25a4694c0041d6ba9326cce0ffe436ed0e12d76d22120c6d1a37b9a209e7b7b4db03077d5c7a16c5228432e80f6c004becd2d78ecdac81d6ebab56313d556038ad852d9b70c1884ca602599c4e5d2d24eddc8223ebc5ebc6bb37ca8dba8d672ac41cb2cc0dc12d637167aa01eafa511bf154572cb453f3b050884d24e8d621aa1d2e2964bec9385989ef760a56abdf81251a685a8a074c063b3491bafe859cce2bad17239680fbf6f62b27203dd5debd1f80a0dfefe28405fca52fa26ec6239569f945c2b4728b44cf23ae1a228d9574c2ef37ca8d0e572533bc3355f5faab6dfb56a4ad00faf0e1d389c871e1e1f2d55ce2f7dfb4d2b1690474497c995b76b129dd7ebbeb9453276fbd87a381a724d13ca808864d227112e6a8ae2cdcd5c390908cf1f32c3022aacb618ef24b4be7bfb637e352201a5ed93366cc4e358616637291192b3d7d15ef3e73a4837441aa7d09559f7c71a272c594dc004dfe085453b57c530e836d5eca3edebfae1306b11077b20bb7fbca6e9aaf4d7958261cddc74165b1a0f5a8d67822a7063079e3fa3bff979e9ddf552264291593c8edc7e6214b3afea8c91eb778b03a6aabbf340c6591a4b52544b4aafe02daf876b0d70f93d89c3f41e51498f3f7e81e5187dec96ca81fef628f1524bc29e1f9a887b9f7ead7e209b032541f90854c86891285bec61935adf6fc4c21651f11c5e59aaa27b74bfcd7fc4cfd691111570c1536b6822ae640175f6b1797b12d4e4064093b487818753ce626b5fe8af035178be106dae6003e57cd6b55cdd2fa1a2297f4bd1d20ba1cb4251d262d9b28af88bb13e0a21dad5065212c3aabd82a0d17128ea5bcd2b53492f480617b06e1ceb7cbf762e4326c220b2186f5ebd77ee183688ff1816e437463290c831163ac3b25e2c08fd2f18525670bed060a9c11624088a4fc29b8667c5bc3cdf0803b0fae6724f6f44c5530081b176b0cdd75cc2a647bd3805e26e0fee777adbfd43a065a049ade2c758b07dcbd353f35cc7fa75b64b3adb11daa78f454dc0291bc7c8c382a42cdd4b323112fe3a6ce83a9238e63672e15d8d9e4d9a1932edc898ebf10e09045cb1d2a906e1a86a5faef4b49c173705455dbab1b751888038fb2ba94ae405c5fb60bc3a74135c70dc45b40f84e4ebcf411f40cf863d815874078ade7e9b87a25b50e7ac074fd6825a124782572e1be1a1b29e9816df71653f8ca3d9bb1ac3e6a2444547098031ac86dd6f46dd91c21f7bb3c5abc3444ca1c9450d2703026d8f164734b9f5b11fce97062a8c712ca7aac4164f478dda3754fac6ab529c1fb72c8b3f8b98dc26a1ea2ecbb35dc90ee40cc1fbf95fca2f6be29a657e9bcc15223e211e412464c3a8a6714d422f600c560e99045868f52b6b1767845e300494311dcd16dedcda035dab6fd8aaa823398778b36629a38b2f00155e2507ef0ade3f3ac507739c32d0c0a13bf9f8bd02cc9becc2b170db82e044ad5ceecdad9bb2de6e69db4a9e690525e0bce8244a1edd03907f5bf38f195b7b5e4bac1bcfe72245fea4aa951b6cea8627e68b1fd58a7958500414ad05dc50f28d3378a2afaa6a0414f81138b5bdc4266b40d5d7150a35cf0be326bf33d45a03563f5e77caffb8f5ee79683d37b0e3d5f0b7668d12c6060c3f8b8fc3740d8043bb3fd2d9251682454aeab8dc51d76521d619f6913a114b63c0bb1140d0c781635bcbd5cfaa8c6f34d2d734de9d416e30ea25783704699bcb9d996d590302a1a40c1c03cb21df3509e9136de3022b32a691ee5485ae3ec5f554693acf9b7480415e444db4189e0a55f258348af69e0e1da086aeefe0e897b18598aeff7d3333bdd293d58226f9808472bc80fd38cf9047a469dda58d5473c8d838e110da57c288c62a843bcdd1292b0ea837fe3abf7450fcc909b01daccb2d7b2ad38e8ba01cf9da1393eb7af5cc0ecbf54c10efb536477da7832874d1e315abedcc62b1fde0d6470e1fdd21bd49c3a0cd3fb264403fd63bf5a7b6e1583cdc6a0eac143a6194d7cb77b619dae2353b528be3037911ea0a41522950522ceece468eaf329a8e8de778ec4bba15ac35f9419a8d923e6787a8f5bb4c7b67a1c0d508746d82fd227e0c2399984d9338556aaf73b677a52a96070bc9632306a4230d3037cc862f13cd40e5eeae06132be60784e9d71f70d26c0812d5cff437ab8c64e5de8633dd34feb84f8991d9c9f82e18a2700f88bd61e1889e1bc5af1e22f337b406680fbf30b8ac338f616b2c1682f65524a0b21dfb1cb379a7dc1c64baaaec6d7cba35d29d8a1bc7a96be2c05656736d5f752f2450ab281bca56d823f3edece8aff9b0157d8e5992a0fefb7b766c02ada155080e76c93f1ccbf919970cc739ce6ffdc468902451c6a3c5b9c74c766cdff30f1e63e0fdf0678c2ce3655d1b19f4053d5df61e2eec4a8d181fdf48477304b2e9049b97d8a7c326bf7286605d153b14870d67205529e566dc391dc9a92250d8bf7ba3b831c1cb7e20c0b13235a3ab60c6509487da77fe117ad8add6f2c1f80b9458e40d5ddc5d01fa2a5341aa6c00aac11f3bcce06a6423e5cd1e5a80c648430764d0145ec24b715236af120207c1c0af8d4d9fb57681399c8cf8a4adb54091d5f07292f7927a25b4f2bbe01ec6f41b6df0c4f3422a07d0bba67c630bbf6f894712eafca36ca09f82d0fd5a08055dbe5f3eccd7d2027e2d3070ab71a7c3dc6be8b4b6355d2079e13144698dee087a616995a79d69d0de1cffd1209592d8a258ea331312b336b9378700913d36b95dde509f8b8d27498bc4e01f53046a45d12a7e578800c06e76ce35a7b0250ce678691bfe4f1586555a6e243bfe4bb30236295395709f5538a0c0864ddb44b9b64328bd84347beb67ada324ee9bdffec38f4989c1b3fb2dcb6f94b84e2d51d4fb5578a95ad9dec548d3e6b4f7d3852062e35b6306eb3e1ef66a79f2a09a43da358a232148c9d3e98d476715744b9b233aaacba24ac9f861a3c419ad662e254c103409e5d29185eb50996a70fe7474a02b828a5d8a43bc7aeff49bf6f1816046b75d903f0ceb7dc93f08342b1961e51adb14cda4c8acd83e183e72cbb42195e8d1833de5c8ee863210f14aaf546d259f60d67c6429711169f2e541d41803fa6a4e640d749b0c03aa0799e8d1da367640deca0f95114e1d338247290ae2eb4e0ff8f63fc3d126a4494c3ab007f18a1ad5ada1efb2ca1c0f8d5ba1f7c22c8c48bae4147e4a0b376bdda21640a9cd1c389307d407e546a2ce1b40db6bb3826b744d8ce2f5de2f7ca240d7be16d5c730abfa45645f0a8877d070926b62f4fa7c9635e404d9354abc2df0e062a13de5cadc2e1c39e40a1bc838c079520747dfc6ed9859de040f3b5e15e7179e1396bba47321585f1f890ec91354fef2498d41ddf4d14b51e1390a86a34af1fc1ee74516d2a5b9fd9f35112a61b3ada7874cf7349aaeb92ba9fe5243b38de139e2730ebd5adb306f0df493d074af72c73712e4f01e4592d82751eff04e5a65bc10a5066ca9fd6207839265a31b4810f00c6380ac3a0c6f38ab139f0822bb52ea4bacada772c2f5eec63e8d7f9e696c15c7ce2bd2dcb3f1b96671be6ad919d8f2b42c4d6dee76064c9f4feb5aaad6c3e088cbc9bb459ef83f56d2d37b73e9659b9fe69f8b82afae3abd50e7c758b9c4daf6170cff7ccc4b25377b96085dc7378f74aacfc962364b7deb211630ab285c24925af758cc96c953f5d717a019bf8fb6550d32e82e399458f3abb79065e156272baf2e43be225577bf573ea0b7fd2e6d1c267db630d18eb8c8fd51df0818b77a39189a07c221442b99c3d6557b02c3d50bb9cfa943a91287f06e64bf15dacf6f6b6d2d07ad15e51525d7052a3d1729e9b103004f4bb979dc4e290484cec4e6aea3ba35c4738206ebb3e49ebd740952736b28bb050315e21ed940f19eaa33357f86ca528aa04f26c258737a952b29e96aa7deb2c087e503de931d6ab0a48ee357bc499983840fd9a93624b8395e8c066c5b6c7bfdf5680c8d849b63bbf1a71fc446cc8e28e840880743549b6478e87e766a5f3b2b725aa6b6af3a30bba60d6c9d523b2e0076ab9629622b0083ecb97aeb2a404da4766f833958c4201849ed942e0f939949dbed057e34519bfbef7ab230418737a073ac4ca0e315dfd887e9375067acf2cd5dfcdfd61cd487917c15ea515fff54d7fafbccada8c3cc4a04844ac7c61e04ffa63a2144f4c3b8c7ea224d65b697836d9132dd1ae7bfd29bb622ef1a7729c58ef8126d44fbcfec40bf987cbed78e1376cb3bce28f32066051b8a6036294b4aa0f5db745f110481fed03e460a0e7db8a8f37e8463c318f72467d5a205483885720104d7632837533b25ac13e9a5538de688691ee2e5d72f174bcc767db076cdcf8185cc1c4cc7d022c5999cf480bbe30dec87b7c5956034933e51678077ecd8e687a0909cfd246571e4b080d182f10d2777197e41885a865483ddf2ab031f18726dbe19a500c17bc07b2f72c88e4dfba3e57b5e0c31d97cb825c4a6821fc0fee33eadaec70d6e8e193ae5061e964a3f08ea5165ae4272d97b3a580bd6467e76081cffeb4f9a3bfe56e5aaa58fffd10936839c5655feb2a994d27fea9961235da6d493c4f4b7270d01ab9217dac1d6a1b2bc44594eeee4bfb388c51c529ac798a14ce113ffd2a8b14536cf3904723fd5a56d4767142bc91a2c0056dbf7936187370b8f319514ca5a517e09f8db2c9948616fc561a045bc8dcae5e2f2eb165d5568e58db3cf8d35e30d89a6349fdfd180d0a7fbd493056755d86561ea13b6e99aeafa6ba23d52bcefaf0150c8e5b92c68a4309bbdb764dd9c1c854f00a3e8fbf365b965d7563455ceec6e1c858ba48fde6adf9aecb4ca25ac37de6b76e1badd72825f2d3e1c7321b4a82043586b0968d08789655a8357f30cfa8a9a50b497a90cb75390ad4daf66c68a4c32e06a8e41c3526b0acfa3a61b3eb62d1a7d542913fedfc8283dcf89ae0ab6b6e04cf7b5bbcb0e84012258c8991d445f0bbabae41670b25eb7c7e1b1a2d153e09fa8fa331c39a9ca26e0c95df1cfd9649f0318736e5d099c6eb341ed17ac1d7865f8781d683e8ad21860fb762c6b65c64608a67c7feb96fd32b2af50dbafe40b957fdd45bac6842c248428919fb6eb7c5ad54a16eb577ecfd3d77108dbc5813685a986e1d3033cddc2f5ed557d64ea6634457d3eb13a3b23b4e3e34d4b940aa89eec92816ce4c83b60225769283bf7f2060d0511130c9e54ccec8f754a35506a039cadfe252115655727f80bb0ba2c991341837cfbce23c18f1f4e5fa8948470d37e2b3c83cb71f36e353d8e2eaa53037b82a51825e5ff9b924845531545739a82e82cf2bfa759fc6702e3b782b09b15dfb6542778debbb7bbd2b8466c8d495170e0141dcbd8ecb8adc500928aa49aedd978d26ec8e851efdbccdba3d93b97edfd596304ad47d8d27d6a10c53f25e41c68cab53e9c77429e62d3b11676e4713fe60f0756d5786fb44450f7a14961218cca09b6a3338fe0568f939b6eae84be2cee549c6e4b802e4a139c2f9aa24a5a94f2944aae2a09f83e5eb4dc6ed61889d1dd8630cb134af0ec20007922a03778ad2c361592aee964398fa7669925bead5e5aae87fb8702c46539c795e6e68c109f02e98c841317437c32883749fec2cb8e39b18d749d6a1e5619e8b3e6c251cdef5dcce1e6256d141c1662ec9eb3776e831d4b4eb2b848ec311ff728619c836b6e6a5351e47f8875d0ee29b13f782ab5294791772be7949c9c017d30cc8f1b4b339ab941b55fa1955004e348416c01025d95b123191a2b2a0c538ec8e97908255f27fe5552e0ad7f62dffdc940e142476c04d7da336720f6feaf434d4d118e98332d0786544b9633d0e4a6dc9a795d160fae2d20aa5623955503d9ad3892b291cfb1bcca20ff2d6f56d9e98a73f53a667ceb8cf34e26d03ba16015529d9029a7d9b84a845531cb0aac050e35595341ced7f61516fe644339ff201d245efed20eb00d74d213a9986fb2a0ed6ede4745570fa0b9ae8445737e952c7c0ba7363ff25c7f963272d1d3599ad50c09fc4c1abf9e33b042a6e6fba1f89b26c7884833da14438dff21e5757382fed55a62c69be7d2915f7a143c55dec99e5753b6b9a46b69042d90e9051789e36e662d915c7f7a33a27c5c7cc756aacfd05ef592f9c07fd4c3c20b7f1ccaaaffccf7369fca720ba536c6fc1f32b640ea56927f3df199f158b91477256219fba6148bf2fb1d260de05273d824f9b3bba05559ca8d73ea594d9c719d5716e9f9b45ca1300452e194984c4513d84aabdb72711122d347c86c3b2d2e9fa3d1ae9a6194f1afa4ae9fc9a4b1e5fa8e2d97f147f007e0b7a7764030885d5368334e1439ea273a7144b4fb06e5cbefc938a2bfb2cb6312fdf07e964cb2423eba0e5b02ad5422412afb108c6a37ca61cd0fdafdd63a8aa2e1ecf8ce2da2336319c9aaa8906e194edf538b912f8f2047ef866f5a6b6e3dff051f6c5ccd56fab2e4850f38d6651e53d6f3ecbec8bb0e9b2dce06aa38ad3c61344d9c516b7be2e83c9075c227373db054bef96ccb4902ce7cae72726c060dc42d93394f45c37cff3fbda7915df2f6cafa64cbc7bc4c95fc1244d685168924bb31fabd3e59b2bc56a74822598b785bb0f91a1122ada71207c2fd1f9a376b386853da4274c3020c022af4bd25a70a00c6395a988e7c68c19e505eb49a5f89ae11636ccff6fa90fedaec7b08b54de5185062adacc88599641a1f58f02e12776b8ca6f03f29962f05638f136adfc10e4c9309b8fa604a6203194a46530720c65610f190b370541aa782c2001e07b2d22353849e1c4bfa30aebd336e33923d92c3f5f71b5374e5f3fdf3abfcabfc28f393e3a62f22a97a7cab830efa9bcc5ed4f749c701878f000a77756849a6b39f0df7559b8d8f22e213897b7736cf2d656ed1270cdf26ad2ddc477277bc4e87e7f37dfb282c1319623af91b63f54b81dd61b8f41c62931583a03f09761777d2a2b4a8c838ddd0867384f2363a3095fd88aa47c840a604c99fc0c322c7da5b2001cc879a5a8bcb0d950590fca4550067f5d98d548617ad56960eef62da1a67c52897aa83d946e3e1a19b2b70c6b3b663f8545bcab18ba856929d46f659f6bb3f5223a426ca97146b5a5028a3f346d2b4684472f0ff1a8584e6fffb395952fd9adb05b233456e273a3e8b59f2bc6d935c1f1bc10596580b0d3bd42605a930016a9311731f7b8dcb1c67986559fec9430bf3577a526b62790bce898ab3980b46c92cb0e744cf5831e2c84ee18676228642ff02a2dc108afd0b5a346fe2b513e3d2a4bd34b204659af992012ecac7070688e93dc398dc5dd9de378b4e2cd73b94968fa16b546019d1c9412a47e81735847823d645d484fa31a45a03cb9ed1c3b76c90b0acb36e5996d159e7c629376efe23a47b72fd59e77336b8787d45139d2c0355550083411b55568e3c3a1ed7b57793a001096c148e38509d499cd6ae3fd7e2c780399a6d1ba8028ef778987cdea334c80c6acf85f405b563dd5d4a7454c1dd01005e1309acc6a343a810c6c9e0a88793439846fb720d7548cd05528f054f45f9e4a4c2b08141b03abd73e50741c6dcf97b62a5f8ed19e49842519a70b9de6184bc2ebf08ad8ff331ed0f0ccfd91520d8eeb09ac43ffb283def1069eb2301ce1e166fa0907947358fb3a0dc06a247dfb4aa8d35817200183bf7ad6fce6014afb626af201fde09ea9a24e59a702ca78dde1e933fab53cd6a8f46054dd2dc8431eac20374a845ca275afec77c326d8c9fdd7cfe169d031fc01838c1cede87a5343368fc3050908d8bc986aadc2e804248f3f63b73d8d42f8f05389839ccd5be0aa0767b48a4917292941abf4dca61cad0d1276255a1d005cee175848d4436c6ef996b34aad4b036a434a5459b5fee8eede10964098c27fc45acc6d2716cc24f2e60290d721bf34f094c91658b2cb31f35b08835f3339a6244372f154b6d6fc25dc41672a249eb0468db43a152623ccb334666d0dec835b11ff29a599356138c3dc5dd86a52ee7549871d9b291afd866ce0c8d6042cd24b272cece8c3f8e7b7bb2a723a43e31373161b16fea981ce74aac5a41932fa03c033a266ef8f5c05b01845f47fb9dc550e3af92296401dae5c0c9ab40d2c543270e6116ea447b5bc1946496ae021d934f5fde7ec112ed0efa0359ba3b9e01717784be6fe8cd20255548e77a7ee2f041cefc2b3848e8d0e2910730ab70a1e9647b1680bf02d281edd8e4199d1a7668a322a1977ede3782f6c7d3bba1440381a72c21f5f18df844b95816febcfc5a0e2dd643a40d564ae1b86a6b6752e1bdb04203825041568600bcdf639e1cdbc075080449fc97dc9b9658cc6f554e1042f66ed553cd1a1550737b904970796c2af652b3c80d459fbafebc6f00f7041c16c52c0332b9e5e9d3130cc8a86d14d1a90073d154c9d532c8ddd34e2de1522c234360f29a58ed28063e9f3721159d3be0059f194c69aae2998c9372c9f1a49b1159c7d438a7e6c7affc9f9c42579a7c1d516d34125ffe5365a26c723105f92587978c1916c8c4cbf552de425216a8e5126288a2bab9578c14e5dc5a88f09180ad36b0fe7178454265a48ef1cfdc845394de76165ad07d0f0a4808302f57bc98ded3448e6898200ef9f35f6264989ca822b86c34608593c2a0711030363973dd0803c3e3815c38820fb8f67ae35b68c550df2e82ee8489cf0f098984f5c70c8d4b9d73c398c1dcbdab4d48cdc607303e0978aba97079919141bb7fd7cac501f3dc0e321d29721dc926a8bdf61448f7d70a40597cd78ae6f902aef4d856da8cfcf90c3e0b6c84c4be38272a8b785e6f7a6c645254aa6a02f63d9889d96b6c9bee7cd57275951f82904e38a5fc144b4303a492e1ab4f7d2c3884fcf2b5e3a1a741809b0ef8d26bf7eab5be3a01d46bb2192e9b9bc1e9d53bd583933f498552508d346871e875ffdfe21c150cf4febbf6b2bc77f504198fd755294760fb1c6e50ad927e57750f26fd058a5769ec3a1d17fd56343625c1a3828e288bbe96724f7dce31c2cc8a1d2520b90f2cf3ab95e21db134b60769a6ff4b5d3db11ed6c3755dec82b1018aaf5350d9db3a3b426185f15088a0a0d5d8554e4365aaf3781816216b84844cc92cc96af2077f8d684bd9f1145738501e55ae6559fb145d8bfc80ef9b15d9458255f463e21fca0952e53899d9d4019092b41551448b174c4e32f4baeba00c3366e327528b11ee186e80818a4e68bd18ef20da18d6b1832da4360d8bcc0ba60781c6c8b3f2dfe6834da00723d9860884f9d9e540b8aa7a0e1070d0ea398efd7eff0ee7a0369e19f397e9f74c142de911c844f8ae65c0879fbfafecfb752ec2805cb3a560b4e271416d5d1913a704b91c274f4e26724e38bea7961b4bc9042694cbcf6c26fbe338bed85d9e33b681d9e9921fd9cf9640f772c92d723ce674ed28d93fd2f7718df2dfea6f125a3486c38c23a0511241f09b0eb511f908842dde695faa9bc74c5c175c24896507a9ffba8373d1449f29d1ec0d0a928ca8ca164ccc5e200a82e7e33b1c6cc97558eeeb18e23e36cf574422a746890b39feba0909e60c2f009a55814481881c620e61fbad1ac4dc56f3f73cc9bf379f6c64389b1d4f5f5dbc8360b6522098377e766d6059c32cb0020ed2c851a06b5a4468cf2a29fed53a5ad5e0676026e1dea94314c037b5d99201aeb5929269a718a6eb22bfc9a103ab90be3b31d936f1c8fd8de569b2d2bd26b70127ea9d7cecd04e44efbbb763f9feb9940a7745b84b56a8538beb5d2b9b2a177866b78170d0ae6e87ab4a9d9bf8b85a071c58fd753903ff6b37258980cccf51a5266a819ac89a7a9ebb0f04364bb85795815d35dfa70457a78a3cf6dcf511f7332bd65daa76cea56dd5a2e5fee954490a7675bb0ba353993950dcc42ac9c39077b0eaf65dd33b2c4c4b8e6f28b1985ec675be907d5b0e6b95e0f32e261d4f7871f4cd54baed7e3c2e5ca913586e3f04714d221efbc0876061a62b9f3e1232050792790ee5523efadf4fc8ec0b8f1a6a701a7634fe1fbb846c518fd70690cf8d47d6c3043188c55ce03c39713242987f203ee227b97fc6f97d957faf2aaaf979d3d554606e6caaa973979c7f3cb91f3a8bf2640f9eae6e262fc21b51a13fd85eb16007c2a97d7208b428e81369624c0a33277c9ba1a4e3475ca864ef2092a760ecdf59542dcc9b509e17c64c18dcf9041cf3490fc68e4a4a550b2200781f83a8d4beacc45ecfad007c419008fb083a71468d9884195002971d45d0c6f980ec5f9d72d7577d76eec1d762cdf47606da471f1e6c54a1ebe1563fcb0ad9b1a5f020e455562c023fdead57592966c42d9d8604edefa877c7c937f65a8aaf2dff00a749ed50253231450b48b7782be0a448abe52c1191cf8434b2177ab3afee71951f8b7e655b400f61813845054c57a0a1e30b4181a3f293871d1789e0000838bf09f28e0da6946228e486948a573a20b800fc51ab3ad6cb1d2f7fe83078d640ed16df4a9d41d0b8db16ac6a31fabdaaa9cc206402306f79d5c2158ce106ceef559d0393878a9a07e6038cce7c2bf12d28de2042ce5371aaffccda764a9cdef58821ae988723e602769581ad7667c46664d09183e53ba4f1425cbcdf9fb78140d7c55d3123d6f471d046e16f2fec702fc536aa612c6c45099ae32bf5ef5281f1b2a7b00ada1409a738d297cda34781bdee76257d19b4d82d54c77fa1d6c6033e2d53351be1ce26a1b7df69a28385470ae6100ff09de98b47d5b0c47b6f1c4ebc8fb56bc195a2593daa264228f6a629aed0326d2c4e2dee901c9cd631dcf6d56283123b0749dbe5bc968ebb01f2980814f48b5a5818267b20730313e30b013ca604aadd1bbf54209c1537074df18fd404e6f8c63213b8a215045ec1b526aea0aee3628e784486ed7bf6f862234590d2c006421540862a500b8149e7be27b7ca19cc36e3659b517bda0b7469bd2176771351131121215bca94520ae40bf60b020c5cb7165b5afc812b8d16b7ad79b70dfbd01fbcd05634a2ae947dc3170c32ebee4cc7fb61ee9eddeed25d4a9772ce9652f0f8c796f539992dab2f8bebf6bda2ba9c73739672379fd6bea1eebba1ee27d1d316c8d728eb66f3b3563d75dfbb3afae1b27dde68685b866db4bbbc6f036d2cc3a4fab3173224ea519f6cac050a08b3aee6e72dab8bd57dba2cfb18bdae51d6a54d5f2e0b63ace3c2ac6ccacdb9e5fe741bcb78deee65d17d2cdc07abcc66b61b7b73e0fbcca7ee3e7f3699e3710acb48da8eb5cc6301f440d33adf2169d579be3fd4abf0461953f77d8937daa81a6b9b63abbb2cf2078351837043d02e34f9d20e95d4e2b2381abcd17f9f07482a3f217a3fb489836999f3391cfe7357b4f3e7cba57b02fdfc6d51d6cf198e2dab1663dee3293edf2d2d768d91cf115185616265be174ed48eaf8583b19af0c696faf97ead48926ff41204f283c7a8a1d742b282409ea2868d74b2fbe6603cf7cc7215526f1dd852bba4c893be7520d72b053e8c31c618778849897ea6c0879e115844249a1cccf74910e8370e0614ae374193ce6b4eee07d72356d856f0f8b56beb402223768ce0c0a244b022581437d1c4a298066beacfa9024f9baa50871553c03cd9f7f38ac56894687b6cc3b21fa5c6692f02b9e602790a0e03c74d10049adf8ff329281ce7776f7138e67b73ebc05941e011eb3f10f4215008adf22f0e4682be03fd079aa00f68823210e8a3b3a553a64b3ff365377a7564232357317691da63a8dd0620b2fe0f7dfac04a9dd7bce6ce9d3fc56639bb32f4ffc5564f9772e360584e2a78bb6b491c23a84deddf76f0e842b4a34727e0868d160fb3715433564377f4c0906036584d36e340f04033a0188064321c90ccaab01aac269bc16a2a68e268120cae8400aaea2ef016dd7f599cee54a72b2c8667c61fb198ea9f7203009eeaeedf5cbaa932a668d165d4b4e8328c2c8b976466485bf470254300ecb8c99ff0c67055fd294985002ab7c2a7d3a71144f3a93e5514b5ffdbe2e3a236a8c43f9fc751f4e50fb9ded29ab93aeda79e12cfbbe069b1e9ceb23448063453620bfc56fc1728a6b67c1e96fc2be4f9747a763e959b36fc7296a53fc7d66f539b9ae187f3e3a7aaa9d6f13c1cb115dda13a75a43b588e9b90e0f12fc848b7a5048f73de0c45b4dfde03499d00be29518053da6fe5977209e8310edfb4f804cbb4b8ea30bc9b5de62870180b36424313058b3402d03f0ea0f6f7c02f926bbc50aec1a7f5f865e31a7bf23f42f28b12355c836f64168edc843fa212607950567c6b95086b9ad0bf32360f353e20c0071f7a38400f3df060001e785069515129d52895641440868c14969414120d12098500282827334e4e46a6d148248a44a1018442200180405f00becf5bf1bc0e005df7093f1f0ee4b8edb74df341d3b21eb20ce301c3a80aa557e9ba2c19d5aafc5ea7d4fef55aa2ac8bfbc9ba348f3c11abb0ee6a3c52276045d49c55636fb6883cb59f86275af961dba3e1ef4f839739dc46cfb3c1bafbfbee324be7d6818d3270d64a028a508f58947f90ab832707e3eef2076e97bba54f216dd9720a150d91f6d2fc505bc2810b4e682bbeaf88e4f5e8d51691bc6e11f5b327f2142081c312569b62ae742778e3d7249efc7727787b3d968971cdd9b4e5071b2d4a0cd4eb2738aed449a5187e8bd295e04d1922b15229fdb1e5e5ff60a34f7bf575ad541ad2af525ed65739e5f5554ae933f0e4775d1cac08ac33f68a676d2a73c15e6c1e539bb9d8f13aa7c56e2dc6ce915cac172d764ff3b4b8bbc33aad938487c4f321785bc7cee156f1287ae9be7bed83d0ba3d7bcfe1b8815b3f9c5f93fb7c382b03f73d2041bcda7df61ac6c17cc2f596abec6bbd4fb6ada885be7dc0ec3921b4f26b9a865938dc57aa167dc2c20fac740e0dd7bbe8c517afa492ccb00bd6e1a24ff2294f4ff3481de6626c9eb1755aa7b9682f3c26dbc8000431eae2fc00c94e5d1c2044513dc68aa9ae82cabfd7efb8b02f227bec7760bf1c0c901f45ccb7be08edaddf61fdf65bb884f6d6c6bdc585eba61d56a87d69470cff166ad8f6da36a3d1643637584d16f2cf224a455c4b6caab4237bec07119bca42c642150ffaa51d3c957f0891544fe56722b51c8f92873b747a0c9921e3708ecc993aa599532a82c7da913993661a99a9b366d254de71d47ce6d4054a1d37f1cf7009999a3d959f0272a7f210eb63b29415a2c07aa97294f5fc3c73a7b265fd9c3673be15b6a8dc44736ee8ce070a5998c24c0ce360618b2c60118353478fb969628730b48899c9a15155669cca32c65120950dba8849f1bbcc8ca3648e9bf865388a317e8353d9735cb5c3b33dab3a7a4c651c374999caaf69cce5f0daa13bce144eb8943995254e65c67194c7b809873233e7542b46f62705daaeeca34afdd96f8a5f0847953a2c51c07aec8bb0aec7c22592f0c8fe0a4b7409ecadb0443fc59e8118d8a26be106165928726397ff6d4837a2edca88d954eb35f9d62fb7439e417beb7ae6a19f9e4e749416728ec8d62e0d51dfd3dfd16b1d062c2c6aab45d90bd56232544b0dd58a69ed038178a537dc647d83a29baccfc01e42b8c9fa0b6cb1d18916e5275ab4403f9f72ca7a56398a5beb451b9fe41a476521e778483bc4c2e71c471de126eb29f53cce71d4a6545567e7a299a9d6374db5deb2788665ac3f6279b666600f3759db5f20f7342541aef4add0eab0f5ce0199efbdc62d59ceb0243f045c3dcec9e913bf253feff55b7fc351a3b7be479f446f7dcb0f7d9a0f0259218b52cf1b49f4b52fe7fb72be9c6f74fd07eeb8c22245b4dfbe48f65cb8a37b2236d585255992d7f3d8fe0a87249132e4c1fdf517915492d08fc04d89c023fd4aaa0447958272fbcf17c17d0796e4839f1f7d11dd9ffce7038ebe034f4e4e7e34eabaff80a5f99bfab4f839194d9002fe032f09517884f53e80a24a10ab141465d86bdc902443b4df3ee1906c62d1032eaa044395829b4c4cc57e0b9748c2a3fffa25fcb12fe27a2e5ca2b51057aeb1a8e58ee2de7aeaa8edad2739eaf316a9a642205710f88123d7548b6d6eaac538d5eafef3141c69d58a14c97efbcb62959bacffc454ebbb96a9d66f3dd57a6e55adcf76aaf51a4fb51e639d6a718e9bacbfd11bb8290cdc94ffc06b09c516ad1f39a75aef53782cddf3efd4ae58a10fcc66327159232ab45d191da75e20a7a8a3b8a79bd62dd4a3cf3d7d8e324dbdc6dda9d7c8aa7a91dc74b9099b44520d1249d978fd250ec516af6f71936bc19b2d73c34dd7535086e19578f4873de3a6eb7a0f8277b92009ff489a8e23650e3415a7d6c65c2d56f56be26fe1ec551acbf1dcfc7dc61d1906d20ba42b57e49f32fc91c456e79ccd564b1af44a8b6178fe1c7e3f7ff5506cf18755ede8b158781eb6a0fe8da06d31752d22a9d1eb96baa92df16022568c91e22792e278f0d37155558ea42a35de66a7256f9c98985ad231df895489e337daae8c3370b8ae6fd77b3aaf22e5ec75edb552b9a9fd5a69188da7a3dab9568ea22b37c5ac483d2a1e1589e479f45ab90bbc11a3a1317541352d3692162d0b9c6178235dd5fe6727bcebad2b04d9b4d8a01a1beb9b4969f284ecd327d3626fd158f0ac75d9ca2f404a3aba7a7d57afebb91e29817f10598fc8e7940c65b694879ee7e980e18da09a062169144df5cbfae58cdf133e2a5448b8be23d4fe4fc6519ece57f3f9a0f69783af6706b5bf98da2bd08cd7337a3b935fb01f3fecc74f06b51f84a4f6ffa7fa7a403322554805527d3d5fcfd75355a019d50c16a01a1778237833a634a9fd2695a3446a9ab1f92f3432cd386ac68c8d8f44e1380a85a099cf9ba15e4a8f0d98c5d475cfeb317d0ff23693ca4d3d23cf4ba1a1a9a7279ba1e4a2d93a638666869119375938c326fb2ba549ca2a4ce969310b8f703fa6f480da6bcc15d18d31c618774869e11228f0d77ec87c2d2c15a1cdd7c2249be2c08ea3404a8f35c3269b61537b5332c04d99548e9a3133aae38c511d4d334c334caadaa6262d760a1c96a53fc50d5ba37fc68ca3529a38f10319456a7f8a18b57fc6cc8c9919333fa89dd2b32c6d5a997a5292785b47534f6d71e5284aa9b8aafd940e2958544a8f9beab063ec69c52fe00dd7686ca605f4537a1c85d18037fc02aae11afd8dd170584a4f6d500d7853bb62348eda4035fcc2d80f6a8b309a3a8284505bb698849b98ee5c51c7951dd47e9c23dcc49f9ac1443b11be54b420051329a490420a29a41005489ed0451475adb0a4a32707d35bbb7b49c78ea3902752b5a5230eaefb38781747c85ddfa057ee6fb47baff118b50347264e50bbd77afbc0edbdb5d7e4765d3f702452bb316a47c1ae9adc3ef0f3fb832ba593fb333251b91f7f30a1f9e0defa0f58c2c185251d0ca8d633a08e6185251dae6d3efa31101cfb97f7e97c6af16851be7c0b94df34f0a49472653643cabf24464182b62cde32a9424925405d26553851fb431f617330ee13b0421ff27b025c8e20ac09e93a9f328e7f519f82746d1dfddd3e7ef8084722b5bfc5a0ed1097cbef5fda28d926ff3752b9725d3253b72e932531564897d4626fbf1b0cb0efcb8285b6afb54c83377f944d85a7a14df35d7494d7a639e77b9be6e2ec00a7ba3fcaba30387720462549981fb2ce65910bca65599c3890986083832f83e72d2b72b1fd3489d1af7a8a8723cdd1952e4b536107e3a98deae1a61e8ea2b447f705d6d4df3d8a1ef65896f6c655ede0d127216eb4b83a5b8b0d44d61b41ec8dde2c3338910538d47e1b41b4b8387459b888b6a26813ad4bc76da7e9a2ede95ace0886750ba1f587df21a676af814248557b660a72467cb02fdd4bb12e3d5897f67a5a3c69cfbf9aa6695a777757f6baaeeb3a07392f9c81d048bc90d4e4e63a950831d5ea7ed24c5edfc67d7e43af591b10badfc7327ee17e7fe3d3f6fb81f643a3141e7ae09005c0327a3827308784ade1af35a8bd766d16286282880a91153855c4447485080b518e488beaaf55a1fa5f58106da1fa6b72eb32e0e8cad93428c41342a295fe070af1ea047d7fa3334dd3b40c04725cb488845dd262162b4a61c52aace82fe27040afc995ec1f50c86df1e5e8da6057eec0235ed89ce81bd48450cb080eae3cfd375a06e835cad58842ae665dfafd41209d425d972e08ebf21102bf704ad625c39850c5724cb82bf804053ec9f72fdc70e46c9c089ab5851361b4b6a8fedc14aaff88d181ab59160ee4329053b22c49589109cb55b122c784bb823928b0e8bf6918b8d64a70eb566e241e27c5d6f0ff809c0f963bc2d504816b8c9c10aa3f87a4fa6f9c0da7844b4275c955519df32e3823a29b65713378a327baa9fe5e4ff5f77ad6850b8fb8615db6f0880c7d03bf5ce11119af499fa4b7f2c4f0ecf09de06b624ff3fd6fb417a17238a6f873461ce5bd3fc7215997eefdb924cb1961b924ec6986a315f9ebc06d593c20d4312442f5efc00fc86dcbc28f81dc8afc14fc76b422bf05a6c8d81e56b4236306db0577b3849f50c5b2d8f8a16589f86e5a7f8e629bbb6bd0b22e4d5a953d61bfdf628077d4e757a428a327da1fed0bfdf674fdfe675fb6ecda178f6bcc13bf886bcc967569eefe481c5f95afcde5feec9afcfd29bf90367e51f1f8450911bf3cd7984fa22a2baf8aea7c8d49fc72c4f663571525f825897e7e0922a48fe89f2f75fe361f890368f3936002d4cc042bce6770002bcec7c00bac53c8ba082008bfac708df9f34d0084121d8e0af83e7d9df3e7fc397fe2a8a8941a502ac960800c19290b484921014122a1bca0a0d479727252e76834aa532412d5190a85ea048140757edf57a7e77975765d57e7e7f3a9939b3fe7cf1a756a7566f3274b9d3fe74f02d4f973469d3f4d75fe9403581777aff305b02edd0158175e59176afdf8757e89d2ba753e0668ccdf953ecd3a8a75c7dda2ce963a81a8f3e965716312b57f863e3886f6270ddddddbdcb267e30821398b32cc20210895103754378250e1ece0dce8e1ee7e666666e6d1a27fcb068e68c6c2ebb047b8a3451e6cc4111b58950cc7f56287f720d1b66a5dbfc6dc39640e9f2c12e5e028f560ae1878ce1b97e3da51a4098a8397655617618cadac5012496e194784e67999d78de3ae1878ceb56c2b1487f4c7e8d51a97c343ac6a3936dc652122d92282b62ba316531b633f02f28f94ffe2d0556e62f7cb88ebb8aae70cb315126fbc6c7e30b8bbee9bd338cdce4ed78c57cde8aa6d7310088e6d310797e342d2e216cddddc5892a316777393516ebbb9f9781c03e260fc0bde55e32011fc197144508f880b84c2116189481c11f32485234292647044c8d82ecebfe08d5e49a5725c8e2397ab3e9b8340ba8e574ded07d275f40f97e30a8263e18757e6727078d5a8565bc32f5b5b8bf98441db95b133e27248a74af20149534713f0544e0db9785253ab9e8a155e3a6347a353fb3b9a3e75515c3a959fab5e6f7733335f3c290737d546364553ad198e4a181942fda977c183e194eb787bed541fe75b48489a2a87e89ae21e0d08f64168bd7e57980bd66991dbde351d47716aabf3459f75fa94fdb4982fafa93c9841d62c6b5bb8c4a31bc2859ce326ff2e2cf1d09e7b2e1cb285ac72222922a9223ebf692aede933c783e3b890488abe46411f39a7bab58546367fe6711358e2b1ad53fb4b9697acdfd4f6252bdc14f7fedec79f0379c7d37c4667ddf2e62c2ce9c8c6fe2c2c6d25526f34e633947598adea33d467aa4584b69604264780a2ee1567d8a2eeee46405b0bf43a4977fbef13495dcfcfe37ae6b0840de1bfc212d6f46a6b4a1bbe022170312537cb6e76e7725e18dde4d55b506b4ed18a0a495a7e35f5b6eb2c78fcde398fa277dc758d058fb10ecb02b73b0704465ad6f6d735374ba3820a2aa8d0a8a0c2a2a2fa7f2c6c0a942946da949f4ee4482e9d2f64359c896aff35aa23db20f982ce8f287564eb0a41c103a02c3ef0610102ef09497457fcf83001c2e18460b32288e60411645508c1968c8052a1c4d50412584c2841655aa5092a2f410e51822f918466c27a56b22e36563641ab6a739be0ac9ab54d5056edda284605b66036e7949ec4b28c0a6dcaecfa58736e94e36961db04f87df2641d1c42a045fae9b64dd579fcfb7c591c871ae8b5b58ff76d9947c3e344f1e3be8f03022341d794dab62db92e0dc4c16857b85a68636f5a964f10a743862b202a42d6d581b0ecc35dd435a6dac52ec1c93652f28b441c1098cf53225ac5c222db26e260b4ebfdf2d17ceb3f1c4c966d224ec70c37c9512ae8c8c2e41712b953217219b6809903027344fbec7bfb426d94f6e32652d1d91afd738812ab221cc7702012470449a22b0762a0478bfdee2efdf31f9773b338182030dc5ff4da2cd0aa1add2c70560ddb2c50562ddb34072543c13333e07c8d83c97ebee563be25a594213f215946e6faccb7b46d3b42ed1fe7486db606362120c4a6fd48bd6e69f96cfcf974db3e49e557ea62fbd591516c8435b1cdb254c186eb07e44f46431481c0f87f4e96f4486e4ae2b17fb87ae6bf713099d6b9733a3c5cf9e72ceb35efdb74c03a0057441ad9f3509764e4a4ee0b4fd16da631121e5d3a152a1be16b0a5ec28afd19c860602764a111615d5809cb82845f5809d700c39eb4a8ede198c23e3d230244560a7a6dade911ed37b088f62af894162691d67cfe4c62af611c07011d72bafcccbf40962ebf9d9fed60f2e408daae8c8cb366f0e88d07c1c3218194fd1b00edec7e105abf16871e9c54b30434bada428ccc0c8d11960113235b588db2522393265475f4eaeeef0f5fc8642b16b08b345a441b40883472aa104bf0c6afcdef1e8effbec6399ef8cb450b06fae45bf5ffbab25503d51d533ef494132d54ff91d48015fdaddda2fab855a8fe0d2e8be1ba306059f80508aef1d5471b9d1675378beaeb03187cf0a1872ff4d0030f5ee08107151d159552174a25195c902123650b2929a42d4824142da0a09c64e1e4648485d148a412894257088540560081be2a7c9fa785e77554e8bacf143e1f4e0a1cb7e56c9b16054dcba0906558161846b1a0f47ac275595754cb5a1bceb201ebe2ce8075e9eeeabf001b40accb7a9b675fd076657cde3ceaa6e61a6873ee9ad85b13cfe5c53ea312f5871255fe7a37161ab7ec746ff1faf7fb89a43c9097997863cb0ee93b660b93c04dedc82bacd8edfebbe23ebc0a5fe24b76a1689106498bfbed354ee31e45dd7787e2c697b8129fd9e9820b2e769aac7a76bae0420c1de6a27ba789f7f48eec2eeabe6c2edcc5b0dcb29ad7b25a67a7588273d3dd5378d72c91f2a66b6623a9fbb3a7c8b12c2c2ebfaee6bdae36d2d3c40b2f7a7a9a78c1d3d3c40b2fba48cb70ed989e26ec458b3dd350f413d429e5d96525375aa872dc972851326fb460d5cdb5a4ee5f4a742817759f6e813986352f86b1cd90211cc3458648b99a73480c14d7c53335860e9982a3c83ccb9a37cb56cbdd1e84142207d72030d0e2ee7015020be2080e26db80e69ad6bc9a867d765976bbdda5bcae8d83c1b81c5c03436858ea7e7a210f3ae40a4b5d58a240fffc22f8319aa4fb0ddc94f6013ba6eeb2c551dbf5fe363a90732ae7b8bbf6d98bf3b7b7be4811ecafd7322317d873c53cd6dc8a583fbfc885f9f3f85ffe96ff047fe0ed108279b0c90425d20e7a02c9ddfd881e1818d2a7d1861010b0a1fdb001a1807d517939d10314604f3db2d47d02eccb0ad7f01f40dd1922d7f0f75ad4a7cb7bd0efff3e08c4409bfc5586acf08b1033d6c56559f8c506d7f0dfc2f10bc786f1c21e4d783cfcddb7d0c08abba25f0c59c39ac147bbf8168a519dcbf19d52b7f7efd1a70eb770e4d79e8240309086e31195dfff02e58a5289cae14845398427a94f72634b5e41a882e836d02f3419b416fdbab8ceb1dd878055762ae6690b0426f421e0eabf31a79a69e226073228e8b976685249b4ef3078a3681502aecd33177683d9b0113978a36845bab4fdc2e33426329d1786e6f568e1676459c2f88c7c526c6a5323668329e1e5503ec4833118cc73425ffbb61e62cd50b3d74ede8fbfb2a7cf834c5c3ca91394a76092ecd7bd0e9e6336b47d1445a398c747327d2a593f9ae9d3f5f4b11fc58c94546c846434452d69bfb5fb71f444c5c61114157b0aba785c042269e0ca16310cfb896197a7a8d7e1e87988d96c65ec3b8219810e232f0ef3347bd128d2af68e539aedaa168b52cd83318543487f53978a3a7cf4748cf1cca081c9284c7680a6bf8421431a951e8b9097bac93622626b5a914f81863a49260af798e1a8dc0120ffaa31f8543e82849e6ade6ba74c5463b151b7551b1114fc57ea486457d46dc74fa8e8c7a2af6a32a96b405af0aa8511676d8910e968e9aa8d8c805151bd18094042f49c5463ff88eec493486261ae312adbe185cdf4cc5bc959bb01e3761576d2f78e367047b7777ef16f5b4885dd775897afa743d765dd7f519c1feeb01a3de4dd8532178476842c5dec68461ef4dbc4b24468bd828a645ecaf1b6ec29e52cfc33ec44b5ac4debff0a6156ae8b61ef4452b37e98c40aca61380310ff6dab69142af81ec6dcf1ccc91d1334f9fb4c75ec33020b26aa168d5228e3762361553d2276ef4d863367dda1ee3e913a7a4454cb46a91186dc2de571e76a385984d18deb838211dda8f2adfe18fed7568a1ca6b1b98632b277f7b0df421c3d2f7f2b7b0f485426ce55efb8d0bc720b36ae1285f0857edbb0d5479a9f21a6f2a582874030dabdbbd0854715af0e17058afa4626fd3e24d9fbac764dc84fdef90744656554c3462849b9684ac588534f9b3034750b488bd11376f43aaf146462af618edc2d14c8b18f784ee066ffccf88a34a8fd194cfc88fa41a8a566ec21ea31a36d250c01c4b0a3b9097e53a0137255a5d8fc554ecc2ae1f473315fb0d77592e00ec29f4d8cfe093e8b137c0da70d4e8b14f8006fa11a5001bf7a33780fd8afdf38b480c0ed745748710281a6345ec47dff722d1eaadc8810f4ec0410f558c6ec0c39257a1c28752137a90c1041e526e42e1a8425ac2b260284a90719284704c19295916ec3511125042473801196159b0cf6659b0e7c251e41521d411211c419f24cb828956489605fbed4577e0d3d78315b1c75e2406bf7c46b606f6d8efbe7c41d81ad877e1c871351bbf7c40d81ad88f99081b42575b0d1ef622ec4562f4c97bec4745f8a51f7b8ec703d98bed037a1bbc11b3a9d88b568e5a5ed744ab8a3d666353b1df02943d0e1a3ecf76fc71450cf977050b7da830134d649b3fa834d98276030b90e0712d4485c1dc259572cec9c158160d51005c63d2b92c8e890158967dd6c46683c70f2e8be7b06a00307a5933dba4b7a4165ba31238e305c6fffecfe7ffe953085f1c206cf80f3466b4455bdcb4f22af59b5f32aeb1df4f6a71df8820b35af46424a2218c8d80b2cfebfef3e1ba4dcba4120fa3a2bd46d6c94491249248860d2e79d7f78b8eda974a1a0b2a60fcffff3b181e6fff0e46f62be26336763d1c91d880a84da5dcb72ccbbab1ac712d254c56c235fcad0ddddf43494b2be337666121bdc01f78d66f8be3afe741a4cac3d10ab17057a9bba27954fb491dd3e96c0b8fc716251effb8d56dc171a5ae1522b15243fe0525b7ec8ab8e1ff8a86751690e0316f1847bbed7379db86ee4eea38188be72741fedf22fe3f1989fcbaecec1f74b45d195baa632dba4b9783e7947a241a8e46d4971692d07cc0d6195e31f0461c2beaa88e1bbf885250973f3c62fd050699755ae1b6c97d065f781cbef8e28b2fbef882d33049a3fe684056b5de3645b9430068d8ecac6aecf5ac43f51f55e62aa52d0def8a2239a812bcb49fa0102ac41342aaddde11ebe2d5dab1baa8fe56156be9605192c70e8b925ba84216a4247849787e409bf05c904383eaef4d3c2b860b2fe8cba9d3e27c66a6e1ec993b2d2e69d17fae6246ab4838716e5abce9d312ee36784cac00838483b76edae126b79068d1eb1495415a9983914db6df16c76db16b419560568fd8e1a8e90486e209cb578c269f4f95a06c7f9f372cfef3c9491de70ddfd07a0746c91aeb05960aeaf4a2450b8a36f9cf95b5244749f54752fd471b5358513ca5d29af13778b367f2b4e8ef066f94353c3cd5926c906fe0d3e8fde51c76c6d8615f766bc8771439d07709c64a3770dc8fba8f945c48e99c2c1cb6f5b3599339546222a852094a8dc1af52a935d8554a29a5a4d292c24ba1d4a2e0326162832abd363781ae3f5ce6c89d1caf4a9594524af9730e4b3d927503ea2aec4bc1a6b559d87fe81cfc316cdaf8a1c5c2b4ee705a2be2c6a2df174521d0bf285e5a0f476dcac7eda999b3039140618fcf420a706a478f97fd3857f2c729b32e735897edb5b78a547f06658ed4e2f3fefd8fa4effd13c980140a4161f7679bd86ff61f95392d4a2a681c154285902a3fb83d83dc839ebd298370404d71a0a4c29e661d56cce91305b76620a76c2ccbe2cc3af82b60b3d5a2a63eb0c423fbefbf70c8f759122b3b925550f86e72d14dfe1fe8ab5a514a29a5d2488b534823730705d685abbf05f6d4bd3f11fc227978ac8b5c8387b61f659cb81f7b48d14101f1cbe4e11aeedabc592fe0aceaaa4517a345b762c05859317dd2f19f3cd85b75de78fb4b1e7e9962708d35accbbcc3b280738c15b5ff8c73f551c8810f50c041f51eb2b06ec00316e1f82a4ff0a174850c2629385b38aa90ac5816ff2b1c4b284e38a9625952464b96c59f8aa8400935e104c48465197d37cb22f29610ea94b02ca04f1296659c2b25cbe28ffdbc039fa41058f4f79f62f08bace11afe228db03538ce66db3422708d71aeb2ea48589671aac11be74ad6f46999584105ab08bfac3f8f16bd0dde385773e5a84947ea4d195283a02d2a06cacaa077e1792b792aa6b264aaff5cad0b632a6c0bab07d55f0ad20d3c27b0b9faaa0497090e1a2a067afdc29bdf5cff947154f6fe92c7515938e9c0267f191861014db55050fdc73933e74029a594fe9c839fa0ba13d563305a37a8eeaab6a8c7ed4822168e2ab4a5e175db8fbcdc7507d216bb6fe6ae7b5abbb03444f79fef74f0775df744c0cf6b1dc7fd8dee603eaff9367178dd40204164fd8023ff7cc961698877f9938399af052e6a4add2bb4805335df5c4a59d2d18d9fef9e48d53ee098636b12fef23fe02fbbcfa7ebbaaefb7cbaeb467320ccbc38b4ac8d7f37cbb22e8cf902b370b9060d976b782d8aae31c860265620a9d76f2fe5a5fd57273cedadd742215a941c18c41a3c51dd4edfcb0fa22d6e08feeb67386e6fbdd49a0a9e3fe85f80e4d87a7d10ae39b66a1fa46b8eadde07f19a63ebf74164cdb1957e9059736ced3e8855736ced0f72d51c5b3f1f84d61c5bb30f82d51c5b431f24ab41b49a63ebe8836c35c7d6930fc2d51c5b513ec8a7e6d84afa205dcdb135e565f5205ac4c1f5868c1f1767078f1d32643cad324a2fe34b61101df3658463d7e9630261e38716e59f802d3444a01802571e5401492dcaef40d1077a209556d4101089618337aeca88efa57c1e7df2615d605d4a38ac9f4fa48e3732b02edacbffc144fdfcb85d54c95397e57bc9c17cfe07d70ff6251d0ca8332ce97006d4cf5b1145f59eb3e29d2046dd9e9321458299cbf1dc043cee67385a2112a24a7f87e0a7af81f36f3805b76f100951690b716ccffd528ff4628bf6017df473ff3d733ab8dfdafa74a5219e7b6d9c5688e3fade02c7f9de33876382606988b7e8f673fbc00f387ae30c9160e2042feafcc6c9e9a23a90963db1cfdee5bb7c8961d86f1ab796b7bd608f16d7da7d5a372c0db1cf713aacdf70644b5b10f4da208cd70f04c2cb727d1079fd0cd8f7770cb4addd7f3df5fbacc94ed60628aa4bdd2cbed0a9dd7f3af57becb5a580b7598081a48675b30043a65e818255fd3451b907810d45f70c0d3c4c42e15d3fca55ed4cd6f4a95f1ad92e02dd7f1aa723fb2f93398ee2d694fd88f250b30f40cd5ee6386a53745b16fa40000104fb11f4df631807037a0d0492151389781089b40ff420d18fdf8f5efb7c08fd07aed411683d08bcfe0343f347a11f40f4e9e31781a1e8330ee67b2d045a2f02af0f8142205afc703826e055ec5bbef7ef33d0bff3fffe4663ded639e6ffbd10ae59f863f6de7fa08fecbfa7dc109d8eecdb3e505620bea719687d1708448bfcdf7f1f389f66ef2b9582d67fd99785d54320b2e8f1a282fecba2878b0afaefb5d08681df8f40550b6d23f047573ff4982802df83b00f43e088f9c0fefb8b1ba2fbef2d4e0716925af4d742db76af3db72d8e4dd33333f07a2607fd95da81d667747e477f6494aab41880eae18638982c0442b4491978a34dcac01bb9fa08c2d507a945dfe69393f9f1aacd98b23fe31255d41a01a4b77f4626aae8a4794fe4e7e97f60570fa45ec6431d654ecf701775a43948b4541f8d2a3e8df000e41087273ed94e081c254d0dfd3aca871fa54c0f3246c64dce63c3de11b8b2e8afd744a05547e091e767e945ae994e80a72302bb0466396ee2d0758af84e27207bf9389f771cd1ffc9d7fc0ccd32ca75b65fde3c14f0927194e3f0695be45f46652a37f16fbf1e87a3eb642f6fbc3153f900ae9b7a004760569201623505bc642e1aeeb54ba67140325fe5d77abb66d665b42e4eec8bca370f2a60e5470140e51f8997130b5e33cc97cc05c525a3f2287f3dd12794efbf665a1b713028282a211a9f6d04d29a42eab81178cd09f2442a23505609169161129116fa54b611e855c3b611d82350ab25703f2a9baa5d29e03503ae9bb2d73653f94ac654ce546357bbd7b8733554fe91d27511b99cfce85150ba2043e53f31030f93816e5b9f44dfa21ffdc9cb3e9d683d703027e17aa213d17751f955380810a9a2d08bca60f02e99cdb6edb355bbf6a29fd05b2f0a8d5dfd42205cc74bc6e2c00d3c02a98e97cc25539ba6ce0f481a4993edd405802412628289b44572c1d25f761e6f145b7044ef492827230eccaae728297a11a8aacc58759d50bf6fe17dbf6bc1b1b02fdc3b8fabd605f40d4eef13398fa3641d811fea485dbfd00702b98eb80b8f88c2d18340ab7aa3e7ff3e347a6d1b815c39e32040a48ec2ad20cee264d3ea2acf75b88b9b1c785975ce8c8ec01319fc2828e17a272827d809c7815d356ccb360ed46a685d847895fbfe6f5fb86f1b3775a0ff7c9124a1f73e1b4953b31f45e769b17f04ba1738bde1d4de3a707e405b5c36ec3d36b53f50fa8e17d269af1ff0071331be750581bb2c9c161c0b1ff812f442e11151a8b385c0ef3bd0aa1f7ed07be00f2662eaf7dae8037d210e0244ea675d9f5d9651328127c3b60f7debe906f27c1d9d87c757754e4aeb7253fe72d2c39ea227b4a5e15ddceeeb59164b90bddf068337be8c9c0683e53b9b04b5ab29ebb8c9db240cbcd1932ff046e9e9481778ce531b0c5e86d1ebc2e96b0c258cc8165c3bb205fbf489279ec0a640f96acb2755a93c7655e72a8a4d1468343ccbc332570f91f1950cfb6ab360794fe952caa7747a534a29b582c6aeea3a37788c51c902cfb2aeaeebbaaed3360f43e3df95b153d1674a79688ffc265c03fbb1493fca94e7938c1fb72a47aff2f0fb237d7e4d06b87d0ac83d09fcbc86025a584c14d0ab263714b0af475952bf1fe5121fc0ee7b00b5e701cc5e051c7d093c7914f0aa32c02ea745ec53b027811d4e8b54c64dd86334ee554983bd5482374a9a8a612fa7e8d388c4b553b7ffd0c828e852faf11e05dcfaa3d6a4627f3253e58f40992a9fcaf054f9a270a42b4fc6c854ecbf7054a9a9d87b60c72c7274595e2ff0244d952f69aa0cff866b4dea28eb2897f8f08d762ac94413c19860221876092134b32e9666a3d9684f340ad4574ed5a050d5d1b3a1f35f7a9e5f4d19f3fc59e5a606c3db9ad2820d189e07244df561bdb644bb912bf0fc35257dbae9d3923e915cd5ef3a190c4b1578fe8bd12bfb8466b2233db991a80b81beeb25e8c37b697d3ed6e7f3e9ba13accbb2912804fa28ddbc9fa0f79dd827cfa35ee79348e542ee6fb89661f40aa51074b0ccd2b23cecb38e037d3ed0c6791946338cce1011d0e2bce29f61d202eb0cb111645209b9221d52af67efba9a7030db27e37474f5401a899e7c21ef23026119b38f795d227a85409ff7b9e8e5ee5ac6f986713a3ae4f27911b3b41f5732fa6cca3410777fb6ff30912da3a13ca28545340dc3c0cc0a59d65b9818f2b264133d352492734e669c26e61391d8146d81af9efe9f939f13a5cefff624faf9d99e423fdff7e4fdfc4f0a56e7f59a050a993c76f468b1c549a34f4166ed2eee40f3415df7dd974242d9b60765dfbf5fcf0aac082e60c5fe107862b1df036bacd82f00ecfb57fa2bc02d8eefc51fe763f27bef250b28ac1f48a47aa00c3fef750bc7653222c0a5f663e2e459ad50c8acb2c570f7e282b62b636753db79ca16557e5ca924ba69f4f943dad2ede7dc28289c2da75f34d3308e93dad2be3c95ee357186632aeefd5f612c02a65c992122a0c5af1e4c3a63e047fa5e4d60a8767d66b7fd1856d2f6a5803c8f72cb673dad16e517d2cf706cdfde452c80656912b7a0aa14a9fd9300e015c6ced47e0c6ce2ba43ed7fbeae265ce30931a58ed76587daef6dfd04af1ef7a79f6b8244aa830b02914e35ceb3cdea3a2ea359f6dab731378149bd39672869b82d8eba7aead044a6a04ad0e65d2db2e7ea61793569f15a5d3d3205578fcbd9d9783d920304fadb7b40379335f4501e28fa0b4a6a684e236ab38c1764d6eefe0992dc23b9b77b8bcffc06cbf7d48115ad1fa9116e6aab478bd677b8a345eba91147384abe653d15bc7eefb183479f3cf4a66f7d904a65901641e69268d17aa9448b96f549581fc47a5f9587ca7e681a2bf5cad142af035738d26a84a3bef53978321c928407f6d90f49c2433ef643b02442661d7d18fb481d2525b568fd157a2d5aef6178bd62b95b6ed841693fca7dda7e01f1fef39be726f90eca23fad4bda42b9a2e1cdb481852f73c96ee59d62758c98e41957d031bedbbd73cd06b97b1061ee126f91bc8326e928f8149b8493e47ad252dcaefbbb79e57d86aabaef17e3f3a2b6e731df07a5e518aade4c76d9d8353e5cb9c2a3f47ca2e641cbe91cf343434349be6355ee8e52f0792b5fb5420dd7fdee396fe11792deac2d2f7446c8afb0f01f3f3eadbfe7384a3b497d9cb4fc251d887424a3d902baf5c52afcbb207813b32fa45aec77eb9d217eee0bee43db785258f7b1ef4b9a7ef855712ef337053ad924ae86f5f04e540b2f4fda64a5f48814df90fe48342a69131743e0fedfb21feda7f218fecaf7048738f81db67e04703932c163de0827bfa45704fc32592f0e8df7e097fee8bd81e0b97e8dffe46833a2ea9653df6f28570147df93d1c355f7a20d70e1c59a7caff805b7987a74a79fd7cecb92f52247bfadb5bb263dc247f82f229263f93afc9e7e4ca4df26f349552ca0fe2dad4e639aa5f3ec951fef2b18b0857010260a5a5daa8dbaf8c7d5939d95336aafba17d11bb027c686c4b5b381c93f815b10034b46be5da5663ceaaac01952df4d19fbd7661180d5b5ab440aefc438b2d2dfdc3d222dad2f0a437df9dfd05524af05bec95d945b7f01c4e9e7c869973679d42a6f7697d564f5a208ef93f1ae0f365d805cdbf589cad4dfc2a3b6e33b8ef6010cdff24beb1f23cb4117a18defed812d3585055ff709be3bd3c434fbfcbef7a860b298f6f21b53c6fa6d6bdc6fbf4f65a87c11bd90deb4c790ede09c676a2d23692192184126ef267f0881ddb9291b4e81fee7194f53737376d33320fc63c5cf7eba8f99ce3a82d641e2fe4420e7972408d29dd94056e6af2784ff50e63f7bf71ff846cc335fe2c2323e3af01f99e7bad9ddb3fdc33f785a5ee3f045cb97feff839218c70d466bdbf128ebafebd70dc91528f8779dca9f7d9b6ff803bb6b04891f9fd45b4b7ba70078685a5ee31c69e473f3669a9f3421e96162e713dd6f5f3b0bec32149bc0faa92a8544c5795494e3a35231000000002b314002038181088c462b1502cd175d50f14800e8bc0466e561b88410ca31042c620640c0101000000000806010180db922421499dbfcfe3cba83a3ab43fcde08c2e6fc7e67cae297ce3c882d9d81ac255a9e67d4f6ec91b31ec689ac9bc7e38e5898a58e4e41774d93ea4dd5f9742d8d553e7373c71864f2951b8d6e9fdb2897c1d964e20dfe2fbab333d4e7ca7f9b12ed6dbc6f636a39e3417c57d74dccadf19dd8831a71a17e365ce9843f2d2b422d77ed096c006aa118238085adea35d5b8bab91b9ebbfa1479df9cd5fb56ae64d944aadb06d3ffb628b89938894c3643c77df428a1d5631d483039012bd249754f4903ec1beab6cb7a3badd0d382d9f17513ac17d752c2456da940428fd6343be8f5bf5d6292f8bb9ecf7926140ff06d2f33f90ac109cf63c61945c6fcca3a8c2a7d2075c9bd6e7c597e4917c2703e18150816f8faf506fba82732bc028a47cfed80968672d8e549d44144b6f579a4243b4dfab8944cea49a3b867c3e0f03975af75c816cefb9b16b1bd8c9d7f9261bb21caaa2bff6c5b6a3cf72b1dd7889b0a0693fad632e624064709a086288f46665c10d1d600fb2b40fd883ee9cc88308039d339cced2d1706c075dcdd3d799fa761c1b6f77e7383d3069e3e95b0771b15588cfa334e1e8b939861021cab1621f2841d9ef2de5baf8ae3e075b86d7a6baae38ca6d2bf2cef4db3491c65a50493b27e020e5635b2e29609296d49f15ab6239bd391fab07f5817443cae8ebabbf8ffbfef849a48610da1090c1032cfc7df7ef2530c1e254025b51409d083f1ca275679f2d14f0b6b4eb4371435350002c2535949a04b13dbc8a3f0dc38094e157927cfae2a4a88cfb77af2e2101dadeae84fd965fba111d2013f80242e9fa77052f283e044d8b293c13026fc0be73080fee39cbc84108aa7233eeaaf32c8773821185fc6257889001fb693f66de57b161fb7eef220f8fc44e3def498106b766434d44de442583ae7996e8ebea1ae3876489bcb1eb0a36605c1dcd2c48cb30530ad98f47a7ccc58cdcd533da7bca49d2f7ca7b7ef7a1b11d1893d0a41113d1ea584246a07becc16473f282ea8506e18b9a7eee6985263c2937d272f879d127fcf5b1d3745c3e0208bcdc33ea000d9f1554a90a562552f5e09ccbb94f3d63a6b400ee8b68d324f1ccab149a4dbba901982bc53196d0e0d5e7d1bc6023b4747c16995c71c10ba15916c04091b7b9712bb2e1a50d779747141857382442359111a8e2b767ef6a20ac32116047c29909801eece328abce9d230a9559f8a78ed7c8f74edf556e1b644ae507f737c892b21aff7d85b2c2fca803c48ff0c04c14975d055cc8046f55310ebb73a9c4b725f8045a76f4cea1c24beea90d9f54bd860434d46c3240e89c814d24387715c9693c4de006625d77464c34db7c6161e1bc04c45ebaa4c125cacde673c5e1120d7461f7d54e6a68b8b694136dc896119a66c32cd6ef7c880ac00b4cb40948a3a4caf9a7dc4470be01426950576fe5f09ee54d3d9774e32d46a0ebbd73e5edd9d69bfae20c64f7dbb77909fd080eb7f4ba50332ba6ce5ccf346f2ee5e9968c45805ba5544706e988ff41661ee501b58b282413216383d9110df8db44a00bad5e614f9c1497e8a4f34aab85f2a4ea341c9beb27a23d41491d49dc072a5507845091a09ff719581bd19683f0848fa762e9d5bcc0b1bf791c1c5693b24b82bed681ebc3822ae4b9bbabadf8c1c9d317f46531c89708abf559e721490e14fababf3a86ecd493a379aaa4aa5602c8f21dd03144ed35842f82942c9db9571c996bcdfdc546150dd159aa51edb8f41881f8c4bfec37d2c53c7dd00942a38709811aa195157499f21921d040b8f385329c9631697bcdf18201f27ecade062bf65dc5656f6e40a5a6d63fd41f3a084a005d7cbcc5fc88d286335f90875172babdf050238a2833a00ef7cb451641dde31ca1155a68294578ed34a2a5a20f333a4adf5553011be912dfd60a2f044d305b04d8363d04a66a5db025428d0879b353d1f0f8033c1987cafb8019aa2171f584b1dec4de40d9826b039d09f610976257cad61842a9b326000d2bbdcf23b579b02156c21b7cef1c4c58d6919e1c9f9eaf993d83dc71b7a80c17b194c288703722cc1efe2cc39df0600d4ba368aeb0a76a3776571e653566e41d7f21befef4a9387284e3776f372105c6ca38c452d5409f29defaa347a8bf06acce4bf7e4fda6a898d1f3f9a243f4f8039431c6d670da248b2bf8d580775caf84caf0e5667b952ff7e98ba2c47e1ec9359ea91a3ab41678dda42322339e2d35ab752890154b1da7289ed6fda0d288f1bda2f8949214f63c05459fd766d43ae0bf6e703ea2068ec840ce0221a28205606f1eeb9451d1c981c6fa95848d0006de1e91e9b580af5b48f78498f7d7e3d7f0cc12d9d839d0f8df18b1729cbe1c83b313351b9af6d4c14d70058d2e8a807779c2f6669c9c53873d32a674c5d1a46b86e46ad48c4ff2d627771a6acf66c4f4f9d4b46e4c6821bea5abda89c8877a422591a568d9bb09c9de7af89d738d700448a507822575982c8fe8891364231202828fa88658d35454dc772597aef1130566f91e70293c28ac25e8c1da469761d6280871c4d61d653727634c1e64f1beee28b5bb0667223c4587f6c37ead4ead56d7adaedd80809b9f94689e1b9837847e2addfe823e148d5ccedc57ec06fbfdc7709ac1a1409b2e64272b69f08358673729956a822fe5e0a2ba9746283b23c90b078c3c0d34d38beb6350001a84d92f73a4b3b990cc707715e4a6707ce72d7d6aff7aab7bbf57fc80e7bd90e7075ad5810c0c76ad911c702093e847d86648ed6b56f894101bc2a2066b7c32b947bde57f965e54fa74a2def2ef010995b4bb158a9b7a348e333551a008e296482d211067447c245655d5f3d27fc3cb8cda9e19f5fb144ef2b840d4d94c1758acb064f59922389ca0fd033f04c35fa4c1917005617479e44e18a4d26e5e8f59bc7fe7a47f4d8cf37ff824f75a925e1b8b4abdceebcc84ecafd5830b1e90253a246150a2473b54d7ea3934d7ecc75a4b2a3b9e706a115c11cb32bd7e8c668c4e1ec7495f9dacbc645104e7dec2ed96f5a4166efe8e109c28c0fe859f1919a3d119c9e4b60feca081a44dc40fe9ad36527c52267b0f4975bab6b0a8a7cbe55a41cb3f8299f06cc9013aeca6b1cdbc1c3ab007dc0938b6cdd3c22c6c5ad623c421dba036dd26f7c0e7f7806c97806eeaa79bb3ecf38aee262d4b55e81c25c49af0d466a8ccb32f58dd14f11e9ac82c970845b16111ba637bd27e35c6875ab1db63d0cd7719aa1c031ecf539b85ff2305601f29ec1287fe17968b700dfef147e7f61b23a4a8e5cc6a80604a83b16d195ce782f41d7788cccdf63f96c90da030bf331310d49cd5dab1d2c5f9c6c8681200f16a82e2aa02b4c58c67eb7b8dfd6998f3cde7a656ead9185d6dd073d483a4dddd11ef0be8c0781d14767d6a3476d50a7ca865b3a6c7c3bff693af77a1941a963986cbdf6d3d0e65582bfe91449ecb3823afe386ba6e5de133e5d6b9da3e5575e8057c63d68eaf9d7a41e9b079ff37ec357f43d9e71aeccc1cca0924620a066edca19b108d56f80714145096e40e0c5c568f9db36d66852a193cdc07bdb7fd386f5f35ad133311e9f6781e66b4e20bbc62f6b3b459e8d79e531186c69480567ee174323810179983bf215cc7ea88cf5d96fb485246716cd9a39b9599243645437c19a27d0ae380426111487dcb5d7fcd740364355074bd8bad16aa8194d6d56b67881a16af9b621f1de68b69562472ef348b3287bde7a3f59c65b856c640348a6bad4f93750067a7e245fbd114fb272eb433f8593b77193c7a3f7c41705f30d28d053d7bd190d4ba79984f425e7f03bbf6163857b5a563f765291b1ee66d713cc5830ce076e23db04afbd460734b0b07cf8683f80801ede81be3034e6a939e2784e40462fed8352b451436472b21d6b34d7f32bc9901328d1588304845e759e9faeb7c6b92c0fb64d1c424c41f0fd553cfebedc37c1781f739f6fb1961ddd2717152f1a08908310d5979b4e321cd75e20c4fa477c870a9f711dda9c81f50943008dd0e89ec6461e79001099da36cf6338d874a556a7b9a730fb00073e8759bec1d5ebad389d4ffd21510d2afc9a2e193bb2fec8bfdd0750f3450ec1ef5a0c75b20c5add907727c2e5570dc7f48f1b74e9dfb15b1f81d9af22e757070499978d58bcbaee67d283c4c8f2990fe9bd0a33b0560bfeaeb45497b1883f61ab69fcc78df836ae537f900e07949c47751e9154c45d41978470bf03671e472d5b90ebea49b7245dd64668988383e544a1da007c705780b2acaa95b569790c03a97da78facdbe1101769802779ad930566e61389c288911514d64e83e9e3f85a0782c61998551fcde562318a820c7a4310623c5135c1e2dc6028cb70c7e5d642cd333d871ed236466832000e2d64bf0e3b0c09dea4327fe2a56daba949e0e95cc44281488c2cb88d6b50a269d9c048fb55ff422f971630efb279ba3eba57860209eb1ee8a253f1a1042c99e8ff9fd90dac04aace0413dcb228598f62542e9bbd892746005ee994239ed39c372478a997164cbe987a67406b21e5595eba174aa9b5705794619400f54447e8fd91a721434fc8a2c268bd799762d95f5e6b59bb9a867138710d141a02f03fcf7faae69e3883b6cd48907f2a8322011f301b514fc0ff3efe0149c041eac08bbf1957cddd5922455f36126283bbbc309b94fc62a69cf13c0cabba43987030381d848335ddcd1bf0d0bfe1013486c9fe48c82c9f396499cd73b0b711beb8be745bed8a7cf6eca31cb458bb240e9bf1b75ff54a5a37675033ccc6907b30502551a2e357e6aee4530efb08678cf50ae5344f94f0f08a188b8cbde10466a948f7520af8fc8ef15c9dfa7df041886dfbae4fd9a83982b4f74c5f570fb02958f212a1525f54e12f8134011077abe83bd4d33ac62b15c7cfd6709f6639cb5739b3f6dbf9ab8bffa7be55de378f0a6a12b55907224db535ff9990dd035084d54e17a9a1eab4cf61f2e7ddbbd9921a83ec76b79f35b67777c57353719d1c27b69a6ee8c8e109440c5544f35d021e2c7c9cb46d569b25be8f9dafdf530deb41608001460341c42dd244f3e91c246b0444d359792ff7c5279fa40b45b39b0944f2b9f5e7763a375b922d65a2c7d940604a43dd9d088f665de7e27b655aefefb6afe7304961e151c44c2909f30d88c35de77cc81c0aec6f6c70654ff1a013904205baf1092d7fc048013183236de4853d263d444033f9ca990ea6b9a2a86e2cdaf4999dd22ecc5a620e950424e2e647c0736e1d5262e031f34661bb20ad828a77c49d81c2c273c76091cebc134c9729fa40d15a35b43d6af9cd09253bc4938cace7cbd15ca9cfe03eed092ac8486168905b331814f1804989b92f2232b910ade222a29d4a3f123066920318c9fb6e18003d47a7ad20521fdcc356fbeed77603880a2dacfa1cee735ef3a2147b2ccc0a3bd8603346c026271631885edb398ec61b28156054c177a9549f4bfa18a51df9fbfcd776a05987b3c55ffca7a291f8314554f3652dd665a085928565896c65a42b65ff7830c10320c53acbd88a863471706600a779f322dddfd67e8ddcf8d6e478f7624ed1ab55d8f4bf96b3fa4b5d5716f0d6a1fbedb07f73999c662cf45da72b9456a43e3b3057431cd065fadfd6d6509caf70db13ac1754b7df22babad0fbfcd5aaa5367c577334575aa955ee86e7a2dd950ad7732edfafd37ef524f3974f36734451887e45c33cfed75d66cf41a3cf2e99bcd59f8a92131ec074ad8ae851a75abe92c27a8f4cb1e4452ef964c75cb6418436f6852c93a46de9676c9d10f4b72a7b01ee3923d938f3045674ecadd819f6c57061a8331ce3a383d1d3e1b00c90f807c9632760e8b28889765cc54d32caf9d6c7f1b3035c8c58e21fb9dfd6f7a1076db2dba43a00accfb3f3d821dffdd2b93017a8aa67d8b079e3ec31154a0916929fa0d7e287ecd8fe2b94de6d2f1944ddd98c7297bcd14ee8565b5c14daebc96bab937aa01e1403946b717baa0a70dd30c97d7d8f3b7d88f4a7b27be7c4cc5e80045d1a2e1c0a715c2cf09965a51ebf8e1a93aceae76fb9ef59e49aa5e823ae6d8f194f472a1ebfe2cf599068b3238989ecf4475260955f3418f3c149ddf3ece9c6ab435122fd4a31de990dc49e4de0d51a9faac883f76cb6746736ff93f93390abf1d4e5d6fb927e823171c5dfb65f823fda0e7f549a47b0331a900dbdcf482c64cc4ff8ad48dfca21b276916ddcdca43d4eb0f0734e59606650043f3c0ce33d5f69690ea8d28279dff655f7d44e245bd53f082268ddda69dc1b8a240a49ae6351072dfe5279bb8515b8caa9ae52fa43f0627b0e09b543037c8e1b628e64fbd89b7bf7fd9804b39cc2c72b364e66cfbc30767f3505e642f062ee9825cdf57bb6e1dcd18cf4e60c045864a7b4a9d1b5efaa40fac06c5d2e6d68423c402cd1eb36703d4a98a43e10e9d6922dfdbcfb2ac753be3f5221a721e9953a359a704dcd2b46d367c585666d6ad052434b18c2d8f6818ceda8f0c02e4479515d2c72fe7e9ede89c30c597e15272adb5e842ad6c95dd45dde8957a0f2082edb3d85e7c19d5da7f810a2ad121e5149d72e9a51774a169e60e6da9e5110dd19d62097585ebf15c8736d95f4eed1e135a18d10c397661494a076cc91dba8b0790b7a0e44b79b302d30b770d550d22f0d341af3da2084ff45607e8206e3df4a4b1c057db2fe179da26badf261a329aeeac517045fe17eab3cd27b2554653405f6204244aa8dffdd014c0709d1f604b53146a422db4668f5ac188553d444c08a922a0013c452e059a01f42e07de006c29b06a3b00efa8bc719532819ffb36e148ad0fd11d573602b77b4df3884ceb5e36b9e139bde287c14b79e68d27f730c8a23786f92da8fbda2e3209f198143436273fe4d86ed084f038cc60e72f6aee94d7be4ad5a9a584a7bbe8aef2522007bc3e82ed73a389708920ad4001ba8b506c028fe8b39e4562f3f5c39d46b6a985ede1104b32b11a51baa6095a827867bcf2c8f7cb95299b11580eddb188226e780859ce2b1f2bb3a66306a2724bf33cf3a604dc46d5d88204dac1756ce345bcf7cda68fd54329193c97179f36674bcf3c4ea5879b87bf0e69700015f69fdf66685c7bd0d513a19b468fd591593a0804eca05e8c2a3f56e14d2636add7738995f48713f4ba76fed2aeb8c88c5191998de4e6278c7d958475f5969bab1c3c8da4a316c6b6b08d69f2c19754c2a24f7bc84eef26146f169174e47ec0b347026de737d89fbf11a9bd67a4bfffe7510168b8b42fa716100330898510cfbbe0fbb310238f3a8177bfae757c1956618afa5a29a35cc7026df1b8e8cff189824fecec442a541247414541cd2a508736e2dab63299270fcc671b0b563a177075556e30cce91c7ff505633cce67aeca8454dbd7ed9be25dbfba5e7c4a285d5330062385944a0cbc36a81b0a25aedb4a48c147a268af4c99609e1e2b91b8dd925ce5ca06f12ba0c528886fc3a5562814930074ed9a4e4705e012c7de5dbadb879ca61a41fc7940c1d0de479cbce017dd82a804c569aac3bf1bfbf111e24459ddf9a680ae7aa01a9f62ef94b960ff79dfd9fa7426e6d4fe44a90f44de020455f7db38af1e1cba38b57488716459513793c4a28f7d8a3bfe59d2b34f0d1e9c725bd9a70215f59f79ba15b8a6b188beeb52b54ae065ef94c4b50909958b432e5626ec89f191e33b02e22655d10c253fc9b90573934702fcf247a18640a12b93527848a8a40eaf2a080bc7716f6ceb769dee646e51afa355ff8137eab37ef79bc668158a5b8e9ca36b110f9df40e91a2c421d4e63102c2cc692b2d3ea9e6d44d46ebac183ed43a8cd96b2bb0b7e513cade340ccb6076964ba83ba78ffb702f7576609365d901e2b60636e30336c7eb30a969647043c897334136dd508cb1ee5220cf90ff9c2ed946af6e5e9ba539a713623e86d1dd1abbd37535be0e25ee966f6497e6c879f2c20a3f0a0cab545f9d80592873dacfa0fee5156ce34d6cc0c59801ba1e6737928fc5fcc43cf75d1feb0545d7d2481b4e1dc67f2d37e922a6189a827e0d43a086af9e327b00da305d54d49cc24417467aea0ec2fe3428d7784c9757a1a7b3aa803efb38ed32c5b00995a1260ff7c6818d0fc800825200934a11978f6de50288e26c7e4cc7de3f22b8ffe70604682f13a159666fd44ea930da3de43fc45763497d268847642f529a814e250af7d330f820117b8330a5778075e617f6c51681d3b4b8cfecfc1667976a741a8a7ac641de540dd0107677ee6649b9f5f83b63728ae9c9b769428608f98054a7c9656a51d33294564c68b17c67c625a99ba67b09a04a3e1d86a30749755e9149e095bb5349eeaf611c4a79d866842ed4e59ce5247c0e3016fec2ac567b774b856c23954dde8cce55d89d440a677d34af12592222993bb77ef10253189f257171b5644742844fa01c6b194fd3b96f4a1dd267ea3bc80a5acc207b79153355432bd712d5f8416d05a19d20d5c433d702aa21f512659af1ee3cc0d55db6b3d9f4b8549909f402d46cc4c89baa09b513c8ff2b600c09b2cd6d4ab79cb763d00e1a771c13ac3ad09fd562e1e749d0d3945ae2570b443dab00116673c5ba405dcdb77ee93000305829ab10372d753541ebf1ff1f3245858c8edd3c6552e055786c1b2838e08859d24d05c909f6db212b60270c6acbc289c53fb8ab90a2ea2f818172e440d8078c814dc09a9acea9db7c182e4282344f0a545d1c23c116db7ca45c5718a9cc47c55803b69d6cd780bf692920c2c0051f8ecfe0d9d18ffef118da3dae35d0e5b0b15cf3946dea1a06e980306f637dbcc01b12d58b434989f37a9f1290705072dc18435a41314650111a9e014b8175e203d7a819c9f9aee57e78e2482eb19a8b3de3f8edb6315de82b0a561c61aafe0e1ab2713e0bdad69c2a59baea6e7b3c6151e1c5dd2fc7b8c3707cac1293ce4ba76cf722995aa791f78bc214ed274c7d459a613e88663cfc0f9d2ccf8ec8d82e0d534ed99d8fb76954ae06889102e9d64c227e72b9eb6006e5560bb0d28ea89b327f22437bc1a6226ff191aa3b8a59c29b353988f9ab4aef856e6a758e915ba32cafca016e29192895fa48dac2b3cb12daf0dc4e9eee715ca0b33019444753b260c8fc17b52d2a42570ed29db077c3b0a47995dd25ee935785c0d9d00c5c966d6088feb7133689500a10149c96ed603374cf07112c4630794a1ed704f1866535cb7e820ac0af3085c33a4d22340041fe36088731d3fac473664782d661fa79493368476722c748944c546bbcfb0edee570bb6e3391511c515b814333fb6463e6b65332dd60562ec8a2e2ad3294481d0f04f9565d09935789095df97fc6e30dfb96aa0200448c1b4e9bf9c4118e2d0bb4be3e1060f36d2390fbe908ef818641280b2cbfab9b97380ea36cbeb507abbcd729b78ed46d3f8a59676b20d58ebd904c64ee321b00202986f013a21e98b5042fae090238caefc5a63a3b15905769ebd375a55f75347d05a3f78ac738c6e0acc68cae9e990ed2122dfc663b296f88de23a91e5fb70bd1e7881b65ae8f3225d450d14f4bd74f3e348c9f06341eb3ba51c0c528631f2dc4a40cc47c5c232e08f7479cf9449cef0af342384bafc4d62806b40c067412db69499e0b3bdbe8caf7df196d8146e56d7c965c75bfcbe07337480dab3d61a81fa62cd292c03b9a6c2cff49007fa11bee08a6172eb10ec3c66a644284dda70ae24e4c79860d9e5d1ea0cd4431a2262486b3b3ab304ca8f170018c5d4d5f30da28c4cc5ec9a989cc71b267baa9bf9cf81d84f8b575a5aa8d4b1599915a05ff1657daad986269b5eb2cada04118f22d18fbde3f3a6dc53111dcc4867ab0dcc8cad39b15a72c34c9ad1abf4e5144b167e52e118a68ea045d03e1150b65182441b32ad5f93a0eaa2b033281c85539ea3111ce0a5cd15f3ac450f6fa5572e762c9601b06891f90dc953812ef58b4725f4412b5625a46f7acd29e983886875812e0906cc80ec766adb6492bdb7e6111faf20d372684651b103f7717f5b4c58dc878d20a978981692866872cad1650d8a8ade17c8d29535358a8a473062ebdb7ce60f02faa6cbd603a9f1f73b4cff2036eca67d2b5828932967cb319a7837b984885aa8f963de1aad3a48f661f03b869bda1f2efee946432c44a1a0c95157954400570718f844dca505edd27c59bd243ed3eb44749099a22a6df9dda1e092a0c311b446cf55f1c866e2ddd16cbc77533afc7381e9ec0ad22f0b82605906c6d9f13a2e2041e56372f4269321cbce2fdbeb572d453a7ba70074cc405b4f2471f3a3fc601142f3032f20510695aa4d5d15ebb39ba4276ae48dd4e8e8939a36882c75ce1159db4cce86423356b7c7b76b0e96caec9946c83fdf8c506aa0c596a6f659befac73d3adffd12823f2e94a7ce093d9246cc8839b841abcdc404677ba7c81c08bb6d79d488e498f8aee734852512fd1d547a1a56b18a9ad88b78a1a00632ebd474d7207bd3ced1e4642ea806161a465f798d6a7af8f2f83e0a1ef5bc9914b74621d5dba96f6a122a865f0d314692c3867c900434061e6527abaa2a104510581c33102d775dc55354fa07220a74fd8d7da96194f8fa1ba63e811f87e40ee432389def00b532b7d97730dae03ee710fbe44f32f0af54430d55621b8b8a7d831b6560c342c4e983da11444fc949a33fd60b5eb77ad1ae0a0d07596addee28da642b41543e7873f5fa8784c40066ab80d7ac47c737db165a6f3dbf8a68175eb04a025f6f2b91b779fc4370ef3f4e5745561b2c652b9213a80a12b4ad81232cc8137ad692659d1c0e3de6431d3159166f928bb5aab5827aed54b4c5ad59568d5b7d0ee16bfa9b82e3b5172c0ac52bba6badeefe4a525322933b3593731e5254d4ececf86df5a463b22b223ee8a2aee226f687a06d236a5882891975f84f316b6d13d8384bd700b8d127857b332c07be7f109bb68f0f9c21241f317c5b8d4cd20549c0f7c622e1592660ad9f0233ebba933832c46438d0351f561d17a70a9f32ca8b447c097634bd1822b64691d8ec774ae5680910f5aec21b9aed656a72238be9ec2ac4dac6421a10bc3d7b18a74a188f6936177f1153d393dfe8161ec4238c3f2d472473037a8ef1cb3a35bac75506f2822bb6af25d1132f33c822f57ed61e379789e1f9d9f74a48507b35d5c2eeeba078447159a03aeaded318fdaced93c2fe7c19b1118ee995f2dd5a0c1826f5ce30c5340c75af95b248ffa9778b4c699ebaba5d8fd44d902916419d4f21dcd5e58f3dad49d7a75d11270ea436853bf9665fb339921a7ca6ceaabdc1a5d38640d2b3467ea8d5aa8bae630bbed88001bde32f052de145278a27310595ce0c4dd11efd1e316240cd216e4584d51873d20748927f96c905914060934aa46efee6da2884e8041884ca9089a134e332bc3117dfbc44dc6bae67f942bc18d7a45dec5124c9f58fa587874e58c2cab5163f695c63477f3650c15e49f5ae493c19c00c6c26cc4b9eaa0abb5625c2212242107fccd61e044c8f183f525a04a39ca8092153a082924921a7eb339517323885efb4229a39a93c2d80abfd420e4a57b8459b050f536a319ffa7fae1ef4cca93ac3a8dc1c105e037402ccaaa81ba5dac5c91720899a4d9c34a2f8e2081a60da701e9d40f091167c0d11da426097a0854a0c66a668e368fb25d85352b7eee00b9c93da6c202a02fbcf829f7a0b7e8d038ac3511d26a0d93f9bd27246a2b30fb2958376c2ba4d3067202319840a88103ec456e688e9df0fcd34e63774ebdea0d057662c0f7283f197c09a8140c129398181479c4847a89218fd7fb265cecccd0e839815faaa6957b23b30ea6a51f95962485478228b665b1a1b7d319457ffca0d58e5bdb326c38457744259464f80c952f2b26ad7e4133b0a8862f117f2d510dbc1bdd8c5c4f15931d534316ebd5652a53c4f770e2364aa9123790aa78a5475f7d4ae4145f05211569304bd16b4f36b7684b90abadd45ce294b75380e778f8b32f7c5b9cad84843ef8232f2dfcc5f198c9d39b0f58a5841f56fe08b44673fb0fe6ca2e7b82d0676b648a03bf43613043aed75867ba4472a76e47d5f4b3294f97b289e929c54b35d03b51371d1109b4f70b2887d649dacbc652d0e7ea138ea98f7179394b4a4b14dbf7021d9c4344e48c6ad63125679faf6275f7926804e02589c0e53856f10587d155b9956e07c8c98fffa4e59b146a19cee37e00cdf1a82ca043b7d2ba8cb3dfd81cfb202a5eb5576c54b4c32b014754fbbab665739954cf38b0b6ea2bcfd5cba7a6d548461a8fae6f66b1f217282c6f001e51a87c1b5d7b94325de12befa6fd56713c65f767f124883ce4cfca94361d0d158da3e9307e6cb16e29613aaf3b798009b7c3055257d3afa3111e08a53f145a91db9fe99a27e37556702ea0ada6a78873cb4527d446e7c61e01cd97d17037de7f5750ffc844bf8167b6f831037783c47cae8c822590d489d172edefbd09e947795138a206d040308e6bf3192e92469f4747f11263e048c8f6aec0748996b4ea1b1c4717063b05b7c35abe702e4fafaca11b3b59f4d4fdec18dd99c3948063b29e01292252e01137c54270114fee06a5d27d3ac6c67b34786dbce002e155d43c3025d59ce39c94ddc310bf8e1cfcfe0ca3288eb3de769bf5a533451e8419b64c7a4a47062adabb24610125716b796f536f033d2c6fa70340dc6048792c854ce95eabd952bfea6e1faff82a9a7f2fbe053791ccf62ff0d753a0d9d58b239753259fb9ec6e6dc46f07e1b519918b03c46b02462f04394e7c652fe8b21134a618ee01abd340794a118bc997c3dc186b7dc1192ba018cc64327cb84cae833119fe07458e7be6c84cf6116306485eb02d5c6a4bfcafeecdd25f8c2e0abe08a6c50517b682a6b1cc073fcd1037cf66b002b2e9a2054cdf1ab8a92c11bd219b004200262a76eaa919190f663bfd5317f61fe0c67a86f957fb7164014d055c0db9a46d1a5bfd75f992ba875b8044bb69808ab143b04ecf70bc61191850cad79b25cfcaa3bb2e9f0acb0de6749b1d00183aa2316dff7275af4762fdb8a7f96a84cdf64a504b0e1165739dd1197d9065de936e9caaff668f0f634d5c9dc7a22db7536d9b062d2d5cc61bd47870f896fbb92ba0fc5c9d90b85662f409d72d8d5cd51c836b58f7c82c421e9c63efad644b5ccaaf7c0a4fc9e3e22d0db55ecdacec68a352034c286dc0737b8fb8daa143fb8b3060d06a1480dd81655c39c451e97220729e3f86d735f010d04436146d14a5410a37c5667d05400d07e254d2b4d0ea70735b73eade17c3877b75efb11560b35d76d82bd4708ef10f61f9a52ab4e7c5301060ae6d00f1e04f7a9ed13f7663137d407775cf6b4d9118f5015df0f6e25543d0862d8734a8fc3c939cd64223da5818d936d0d17eebbaec688942b7a15aaebdf16941155168685226e6d7c8eb7da81b2ad8d5887028ccc589f951ab8adda34e75670050926b6a7f4d0fffb9c494b0ba291ae7b191a9b13e8c003314bee769090e120b98bb6aa63be07a4279d22e0616dced1c21352b76260c3a8a0cb14f4400fc8bd8175e24b8a3b063aa5885fd2d1839d909e4bed5c335ff4fc6a9d389fe1ed96c62ef9fd085a1ca5713868bcd235216ed036b83015349de152f7ba803119d81a7ba8b5d5aa58f39019f5d033b5da0a13e8707352c07d1d37f0a73f19f4ac10bcf3691c3933099ffc77dd0d2b8d73c094d98a731016163e3388f4b52a0da26763ef58fbed022870f368209c0ba34fa1ab52fecfbf7333ac697614864b210d1e7862b83922c909766accee0a90ea5b1b4308b3a8253d377a3024b5890ed19a93ab2bd617aa3f921a2729240763871da4c8ca9fbd51b97cf29b0b269cc3655aa7189c9f4f758f50b25fe8101a876c8dbe210a1064b3cf016dc197b614ee5411ed10583f13833c9c2d1d2e963f7898e52d7e9d03739f07542db359cdd65915ed5f8c3ef981489fe41872202a7416958f31b04efea2c0843b42c9d75e6c87458b2d3de242181c05c559086ad2a9383e0e7c496de0f6ed82789c0c639c03cd7f50bd8ed33bb796cfc00d452978d9d65dc2e12ca0cf3fab66ec77ecb25ea3069023306cd4168e9c3f935c6c562354949370e769b0b1d6e56ab891e68168e3a42c676880426d395d2258896afffbf7639427935e097f94657754966aed23666ce863917a5071103137a12e8354eafc5e0fe260f29bdcf2ffa5db73f4d0f24e185e3d5f01617686b551c8dd0c546823ac256ede3b1072b9bec88d28b0ddae6efe86b5641fd302ed4be2d0dbdf728795643b8df48f030792134e88f9a5def7ae87e2546041c34dc0649473ed2f43ee6051c7f331f75f6b1016030b0659913458254c955c81e491218c493af4ecd3d245e9aa83c31a9e2c90cc0605e5d24c396ae9b002877ce3fbfdb5a5eb6d8f67666a3acb36aec7a60cd04d99797976a920026638241ee4793ff787785841e2bdf2712b8c8f6207baca599a78571abeb38bc14401d607bc23811e173d4c59e9c0e35940ec9bf95ec5fdd95ffc06b2aa27c7bf244b75d250b778bb35338a57e82ac809c806a4700200964b8454c51d53940ced540e47013aca9952386deb742b8f00943a53df8f5b44b5cf457d66d10e2b3f6650d4716be59840619cf7598cf39d97c08a7361d4dafc81ec8f22b457624696d5563bc8b00e03a1243b1c913be1217cc5c5072ec42bbead40719fd0116219122f52bbad72cea7874b9ec6714ea647cc8a37124886e4b9a33be23dda88fc62392b50d7820c552ac018330a4514c2cf300bae84ff1f5366e97571bb153c84fb9a8fbea1a99faeeb564f9b47c430fd3d8b7733e09a70ecddd67f40bea61ae2649ae7c5a15c5a9203e79a2d408b8349403d7b23a5b026efdc4b31c860e6b5995ae4cf509c6d4bbd74361ecb9139a97ca1bdbede276189d171f7c0c0ca758150ad4a0207e0d4e9cbd352508a7f6ce3a422dd83e32bab65e9e87f5dbf28b1299c0915a55183459d717451a96aebca3952c135960af13a4c348d0759d8e0b109e1d985685d6049a98720cec7572387c7adc6f758728160e6add7f276bd34357ef3edb600a116797f3cf84e7a0946087883428895abe5d22976255f9a2c26312ffd5f4f0df31fa4344602069e5ee3482976bbd51634bf2ed5050fa2125f78280d9679f4895bfd034ac8bfc5fe835ed2cf55d6ec27ab46a0e85252e2082ea189a47adfd94425fa747f9c6506330381d6ad5c4f7452cbd2558710a694bb4ca5227a62b01b092e59dd094967cec064a7c645aec9e106974c45a1a867d44716db97e452402aa22a083180f1a66760eab140457e637221d7523a4e4a84cc7199609a7a6b3174e26567310239fb1572b4d2026eb2b6fc1497094b4e74015d7417a9c9ba6e41c2d460a3b82915b454b028494f9619868317928a4535273821fcfb8ed8f858c44a9459e9d5c1b1ff0cf1eef4abcd29712726237626e2ba45a3c9b2fc6d596e60b3d797ab51861274d5fe28798a05f90ecb584be83623e5ad49067632a462875f87ebe4172fca8548616e429437076ffa4ad58e0ad3ca7a0020a26967eaf493484a5391022935abde3e458b71f898f4eafea2e5d16d4725af8d984098a09be4bc9aba88d0ba5c7ee24bc62c01bfb6863b016379e67038c196c3400a5cd23ef9e534b73622a6d3e0ae869f1b262727c68b95f695b6452a4bc6beb76035399a8bdaf510e01dbf40cfcc1822608c17c5740d7535949a5c6d475e9572e1931dde75898bee9701eaff4ed8e761983edca94619c0566f54170de53c8ac022eb164ed5415b50448926a3cc9461f16947296c83b87544fdb12697ce2455bec5bff6f5e35427ac01464c06e16b67b503c2ed73fc1a6df95bfd41326d5693bdb7a939c3ee37be6eee39b4034dccf55fc157b1dbe752a2a64803cbe088f811eb266eeecc58400b387d0727e515b7e4f5a88172d7c1dd568dda41094d1fedd3630a75596d10b472c6694acf5f2b8a294b3958f8db2071f109a131957b2bb0c4822ec799df5f69c4811d6c8149d311a76686aa062dc33a84b150391bdb056eb33c3121e1963d1ce1437a6b3ff772d8ee5260d38e2cd7574f7978df76b8c8b031356a4812328b536c4af359001f0190e159b680803852684a76e075d88d9c5500ed09f9ee24448e444349d05ecf0669a1a245697196a16518d5fda543ab4b0fff05cb7e84238932a13e7bce3e099d2ee1ad3e15faafa42cd3e3dcbcec1edce951c6d6bda1df3db705567cb50530189c48b1ee395ae1c24e6654e4191f5ad725969ae933f20e165c4c845fb2f4e20578ee30a3179c099ea0ba9444533cf2118349b981b3396d5a827ba406fe6d9ae11b43ec5e0d3a5db4bebae846707a65521e4765f6c9dbf965e4d7169e550b8bff5050e48533197cc4de02e5a5d18130f6c1cc73d24cdff7c3590b259dcf07e82b662c5e1527f75dd52fa25137cbdc5628982120bfc9f9769e9f7d02d8e442d0eba8ebdeb0b233ca0d3dc803356baac9608f42c2430a4b3043c523c7725e2bd9a4076f599bfe9bd6f0bcecdb76b5285f1a72bb1771bef0ec351f6241820bc3708bb6d7bf5255624f08d03770d3857326a434753e4403cde838ee8c91c2dab833891d5d57ab0d27b91493e36c414bea2fe2d0285e887d37528645f8107078401c1b019c94bdf10553c67335b801f8b5b359e088efc8c4274c8601b126f664b9e205d3dd66af462ed217604352bca39fab40537a8593f17cfe260c87a402043a724b6268c38981c520688e0bcc0dd1184db41e05177ff1bcce3ea98e68323d08f3b888bb834a8ebd125b3d558cc166c9ecd5a3e6df26ddd3ca65448e55be5996b5e9ace90eb22f6ebf8a90d14b0ac49c14544e8cc0f5fc0a2fb715148aef88afdbe58dac2a07516a86f701510cd726c91d52c76d048a4649187b7d5c4bb3cfbeaf97c59f31e1594370d4cf496f4f55c42b7b348c0e92ba0b3b3c3e6abfac385221f61d322cd5738dd308c9670e883c2972173d2631d53ac728ba80805d65c5d3903c0ea52acf2617c447d9f4e5578a5be06a6a2980ccffd44046d74c9a72fa957474fa89a65238f709b0cffe88a4a0643936eb11a30d034e5e5c20d213b85dcfc6a57e25651f2b8f8b7eb5e1793a1166c2e25ea065853128203239cebfc26672501817541c5f85c92b600545f78e3892266b9689266729987163052431f6258ea169576f7972135dca6b11dd96ccc66ad3a712273b4c36861b3439203d20f3d53007068c7946d426c2fa4c2862431a807850c8ed458c3aaaf9a17278d755c8ef6f9ab233efa28114bdbfc0bfef2e8bec8154d016acccafe53cfe83825e3ce8232319c8840b24469bff208b03ab34aba225d7529da099ebb949981e3cb4e3594f92615058fefb68889b9f4675b65fad307ced489ed551bc97cdd4b1ec9738b4227683da9ca469be152b17cf7df7cd1e69acf6242087a24fabf01b939d2eca5171daef0a3cd056a858fc9a69f0b5b53714deb65564f243a2ea3e48a7dcd17ae8d374617dfaa3c48e30af33c7c768c53f10fe19805fc06e08c33d5929507c54e878ab7b38e6e868037430f77439ba4a5a68bee77996a3791041445d2d17e906ef6e8d73dad5584036dd15a15fa74762f4c6df50e56a27d563c6fd2680a735218614d2bdadbeaaab8361c95c98459f0ea12dbb4834221bfa06d6d8df9168b190999c3b279ce9b4fa240d6a24948e430037401fb333d2c1f65c0270d2cddf17ec14bcb80183433f5ba41f2add78577f5a58487d60fcbc408b4dc9f27ca328b7821f73474da8b2f464e7a2d78d56ad2394973f0298c92704b65f7135395b4cdcdf4b76058ffa4cec9363bfe98bd5487cb3f2e4bd369a9f5d69dc112cd48ce4f5698cae4acf09b7fc322ace180cf3d1ddd35a08ccfd313c4c4aa4b45485105520648bdfdd08c614ac57fc51bec6980eb7b914eb256f6c928f1495bbb139b51d8a56d11646995d29a57a6980c9a00acd6d79096bb8d93c86d66551e2a8407616252be5ae8d2a099e48c271f392bd09e2dc7531202e882f588b1087e3804d37f61db90c223d011db086df7d1f2d1c1242a3caba8825729d91ccef648821505d6d053170154d0c9a8dfc1056930315f0504b738914b4078301dc879db8548a019da55606c0fca78ab48e1de57aca2004672d6f3028b20b61a3181c40e1b36e2a9bbcdd98b7eddf1ffb5b5254649e21e0972bb00cc4becfe7309cb53f76ef99c8cc08903a56de34f41eedab0641e0659d40fc59bdca5f2dd5b7315096b7db4e203b47487a786289ff62f6f170b78cf04a9fa772f4b24113dca0b9513bf0c53ade32e84dbf0ba011966a554913833804b90970f414b056e2f1ebb4270149acefa29b947b58c2339640b92d6ec122bd22abeae6f02f3920a4d8b76eaa914ce59df1b59a388c4b84444b9af4629608f64ba03e230930061f7143f59a341af66970a51ace3416a799782fb788aef8028bb6e610e7690ae36e049d467eb6d76ddb11d58950636fc5283a1d6ff7cb0ee4d21bd2dec6c47b3d3c091e92ec2991f935ebec020367923cacfde10c9d4f368359f6e90cf17b69f48a2d59bafdd4da5b6d85fec168076f37980c43de3e4d2c8a942080d481838b8b9ae5c4b7fd946d9e66dc6846cd89ca94d3007002a9e2b4f9952e0b9fecb4b7574cfd236e79d10d6db6f5fa96105bffac92c2dc50631e45a88a146c35cc9d2c2b4a424ad164dcfbedab28b24cf9321981626ba643b301242dad681c813c523af53fd881958dbaed58848fb1314dbe51ec618aa853541b1c3412ac5223e939e58cba975706964cb12a6483896c06d058e6616d9d611319a185314fb4e56515f061983a0bfe36aaf856db6a766358c2bec6664ebb451ae63e34fa1566921f1775283d5a31203c72b561ee1cb617ea31ed60962cc79999b48e9bd3c9bec2a0ec3cd34e77ce646b7c876c6e6851cc868c05022cb965abc3f45d3fafc28179569a8868aa5c0c9975b0cc9672a98c70e79b35c02c4afffa895b358ea29690a850e7a38fce1b09c361bea83a53d35bf7e7748176aa00776c294981d83f4d2146b83b128c6c653aa9e732f459b6c9fd5ec3ada2afee78d96183b9181bebc384001a4be0d558048de858eccd2d8aecea34c92813fe33b13795028469b117960f841dd61fee8ebe66bbe10ac426066e8e10630f785dca7506a4c7046e3f6a2ecc1d2505307e3076879be2be4d5c2a839f2dc8b4603bc0871fa4c091b22c34fb24160c47d61afc85a0e37ab0bc83dd406275318bcad8ccfe14684bf391227dd2aa61bcc772c6578533839645c2b34b1c26f40387247e70e894a8ab38f005bce89e8e28a0999c61ff236e85b60e0b5b143e53555912537b770f3b73012d4f6324673509ad28011e7d796c08b3e3b222f37e59d15be03f66910da275285bf25bb0a495ed87d82858c9efe060e9d68a5290a5262774e6a1bcc985f11fdc682fdfc5450e42d064b913aaa3e879b1bfc8ece908ba881e8094375bb16c3f814503ba5ef5501eda0426d2c584cdc68809f3ded1540dd5709abd3b289b04b3aba6c48f3024858f3ee2c2e8d6d01e3354843bd7a6805a172137f025645c3bd24e03aa0a08d9be711e184380d3d629bbc583b2094855a0ab8823668171a9a40a658543985dde5cb2a6f26c6d6d5b629b48f0cdf883cc76c692dafba837de725212b56f651a6b88db336bcff1b5e5b8d2bcb3d018d7ea92d77eed0c55dec4f93f77866a9d67472f4ecdecc299bc2b98edf394497c5b12f63e721a5b748ea689010574e9f7d2f66c87a9ca9b6ac58e23884213b823939b8e483f77a668515a7794d284c7dbe2c65aa1e4ab2ba044848aa195a783cc3a04c91dc0cba5ae87e854a576275366939ad96164804e2bb6577059936f88531bf0e94591b90843f5afbcf41514cca0e1c286f23f56133e6c264ac9080242780afdc2bf26664dc6331788b1b70cf54e4ac3d4a7d015b32f4728f3758182f7e2b05efa467f5ab27d639d2023433e1bd089a6dff2c6970d745b9ddae984f31df325bb02dca2f8a7d560de9fbd86617b767adec8f436c74bf90f7a58ee176bd215d882942bd4c958ba72decc8163f81024ce3ca936b99ebc8cf75146c461c11fda5b8f6d5476e549925ee2a73ccff685e14ef93bfefa9764cb04228f33d59bcbcf4e5f9758aa5814636bd2696171429bd556b8836fa8499d818d29ba7d45b529f9e90024c9b6a065a8ae61003c1b1f0d8fb923169fbea1fbf869c140ca3718a4f836c71fa5dbef41d601ba6e89a15dfd213779002b1ecdde8b4b2a2c5c2d8b858444c058d3a2bc18c0ded70c460cefb46645ee890976f690bd609eec92715048c335dd9236e6ad7b1112b11c9cc0067042db15d67bca9418297ce8b384a4e093da43835b9ca972ad4b2cb2c9c544be0d986ff3d91f7790f9c4bac1af06340b09b0733024ff184f916d98236e247d15f79706b4b404957853a915a801a428e01c445902332c1223f83326caadc37914b6650de1c74420e51825e73244345b5de1cb4254c79c0580704a9a5fe160c99b964e51925894557791d8a44cd26bf2f01609d4a405a3522d575c8a314b70ec1a31a688f40fa25e1842bf1217d251f22ef782236f9a829421ff27b0d50386af38968ddef6bd9bce47b625034a91746c680b13129d7f8a361e56dac6139c4687bf33d53d9ef1cb9172188f5fee5111bead72f4dc1ef4ed080f40f312480d047c19044b25c8721018feac36668595d30629d01212f228b82203200c37b9daae4cca7be6f64af723cf63a6ba43ccd83ba6d66af5224f67570a7f9cc83726c646f252ce6a584f24ea8635964ee19a31f177f75a07c46aacf809b4738ba79421d216d80fa1965d2e79fa1e97f032351684023d5e28a40a38ad3634163f89064d0183c62a8df2cdfd31ab6385241c160d81917a0b8044826519ce3f03c82fb51a12d119f81c95f9f2c0ab51d20890768ee0036cf434bd5acdf22d81729045d7611f69e0841062b9de834e328b4ee341a5d214025051ec8efb4405b36045539ed7eba1f36310007b2e6f6d80087b4d733deb4ea6d315251f2f5c97d746c55495150bca17681ae69cdf899bdf6d4a2257c300cbb9c145668ff0d8e23aaeea31c29675723fa240120b49752d2ee879f6dedb775af4b311806361756b7dfea63e2d3587f39fefa3cd9c53abdb26cb847fff94238801dd0277a99ee4cf613ec6742a804eb77d38c4425b901360f2b00e520379cd3c0bd9e610f342c80167fda19194d198bd8db5588a7e566c25a2a05bb70f1cc2935606c941233994c2bcc36803cd312076195a9007c0748054835da7402eefefd2c41059d083b60d3fc296b9b2f7996b72d5cdd9157c938cae8dca80695550154393cdc1fc3facfe5de8853ff280238417abd653dc843a30a2faa952b4e08823dbcbd54e1d122651b427e10fd281898630fc3033e40fe0acece2e767e4611c48a93eb240c83d9be6a5ece2c3bd42882f11603dea6463d798d7c49f8707aa49608e67ff1d7028e62b62d029781fd25c45f8344e0cc9c9c39fdf404644bcd594b0cd5afcb73c6d9eef341da518416ce29e6c74e0f6718d0137eb7d6ed3f04447c55e3b73df4076f36308c19176b282a56bbe7441dc76a5eb1353a1a0a04e844a0403c43eb63a9dfb32130d9a0204969e6f0e99f1ae508fc234339558bacbc3150755c15fc8b126dbb478cfa9b96e846dd8796aac71bcbe308d0062fcebf581880481b7cefabb8c7929fc2a79d4132fcb8dde499a4a3c02b43b671c39dbfbc7bd5872c56c0623231b3d4e34ebf23b39dfa68824208a3a1d6c251f731a399b389a6bbbbb5a8a34c19bebcd959d3ad3c6bc1b14077e37c34119dcc4aca19794d4727d4c30d53764791f478f8beeb73c916748e0fa4cc1386eb66de39a183f133674b76cc64a295c50cfe097818e94eb2c4a4c1c94c5a7385b662c1eeac6ef07be94f7b37acefc044db0e399f985590972e3be7f7ff04960b6f9411c1c753f1e569bcfcd311bf9bfba5d7e439cee0d7311fa740e24bda74bf61b7bf8e43d9a987cd2c866692d3e70cac658098c8f96f20972299ce09c45d9bdb74a34144222c99bb519ef34695eb3fea86f3540b3f647ed62d4c609a03bc70b8d1fada52e10103f53fc8217582ce061c7489ff355bfe1033492cf71ef952e0e3abf766c7d561e6536af6134db718c7081bb6dfeff7075c224b168e36d9ce6008eec0ca9d0c91cfce60a0ea83958d75cb79d9766b0b567f75b4f9c3b4a58c53ddab3cf037da2c76006848d09a2afba0afa3cc1c3e48195787575c5f308d8dd38cf94ab1d6a9e8d72cce3c77587af8258e705e89e1e607aa05d322c9f2abd6cb3b7818c20ef60c5fe7a839294b1775a6eef1d5f9d2f4533adf7f16d91609b1e97e12deeaa8afc7ed156fd71e95ee0ef5b1583ca5cd5510ea96e084244f7300a7ac83042c725f33bec86a95222ab5aa504e147416806b8cc3b52f96f1040d3388e7e64bee8acdaa0619a3151d11d250840c90bfc9152bd21d4ba128e6fdd766d958e8cef36f19cc0653a1f0444ab759434a7a7978586fd05165e85fd90ddb3cd4f4262d40b75bfc07d5e33f8b3524ba79152c86e72e6b0985f9a3749599b048e3a3bd05fea5c3a66b4554b558b7b6e8fcde102afef0498674e3c516fa3578f78bc582585690aab8f271086a447a8513fb99a5019b7216b0423803f9416c997b28b7203dc96e6943907984cfb97abb683926505bde019f3d5350489748f1e494ab3adb1b01417538899a628f355b8c44a41d91c70c8e54e04c746ea1635972a3f6fd5b622cf8aae5ac540f7544499d6e784e9c020ed00201ec4f50bf36c97108b014ee248eba80388dd7955723c4b49f668a2cb5d198aea90fee32ed83a423338858703b14e94b33295f1430d2d1096cf54a2ac347c1a691c90907fceaeb80abe88979a3b66f8a0847eef7b87adf7a3a408991b4943fa5010420a1d8ce57c4fdf68c6c1818cf68e645e046cce962a9f9fbecff25af4c95e4e1fdf0abcae2084723766b1e012b9628ad02882270a47b9e06897f924624599b8a70169692b2549f09fe86e7f9be369c23db52071edb61acce458c6d021468e633268f158707ced65a946ae067908870873b1dc93a58f62e7f061fad9180dd1ac02404cd16b0adda5698d19acf59fbb95f9e19be059f3836e6c09a9d4dc822452f6898bf231fd4f519fe07a390a75254872dd9a29ca4b6d86cddabf8584d798d7f71d32d4c5261502078bb1917aa705b67b1952211f3158ebb4e5bf857e4620028ef47f99e8ca252a8391c8238d22c5b049414ed0657cef6b1a7e2c2bcc9acb6510e8407676c57d0a7c5c9550260fb0b07a9762f22d66f67d8bb5db5057e00aad35e8025efc9a6bbe461d7c2a63196c17fea05b267766d514e2f290e4402f78321e5574c914c7c9a431ebc00522b14ee4af672d0bcbac6c56da5f927803c0b90ca9e056d4bb1c07ee89fe3ae3bb84e70b1bc4fccb43e152208d51a2d33bd2565ddafa86253d1a739ff93aff5e0adc227ae1681ee6f5ae7f343807e21521f8746e7eb978452f70cfe33464ef482b0efc31fb3a10150dfcb0bc93473d1e4c7435449f08cf20b9b6453a4dc67ecc63ac810cd846d924eebc4daf4fab5270767b3838610dc6c6e4823ab6ee595353d3449dee4ec98ccb41c4c1a2dcab59a6e6da199bfd26685a451520a100975e0d5920bbd73633935e5f7a3c412b40f1bd4f1a11db5f8e00a753eb0465d1fd850870f2ca8e723b6d4e0a30d35f9e8863a3e64411d1f5ba1a60f2ca8e1c3b6417dfaf71103649bd671e3a15a90b85600d67c3aae92d5d522184393188cea93c1043ad3dc5aab198a856d798c41430b80542c6797fe7249c17bb41a46662d23f161923163f789ff22a5f87910f91c84d3e77aeeea092f9ff465ebf0adceb1bda859552c8986dc2000a84c3898079f88dc1af913b2440130fd15d128400a6a073c66fa656167015371bf0d00ef40dfbff4f99b387ca8722fb0cad1b96ed2b74f95211cfa63d0f42fc3d08d6061a0daff2e8853a59cca0aa42bc0979332b93ef7636026b13639275af4336c2993bdc8b76fb14e860244ad1411ff378100f99ee4453300948dd5ec505d03df23a0491acb8b60874dc033a642a9ac2ac98f08a20d757f68657a2ebf511ba013fa83efd10a51081b602de273596e422bf05fc5930a4822647083c4370782836e8b1f172378fa89e01eab8f030d23484c1ba33f6f12c421e26ed54cdc5fa66340f8a43563d1aff3cc10ea66800c9ee28e1cea3c360dc1605541d09867da8c00014ffaa94ac94fef6347fac051813193f8ba54baef732b9efe361166c25d80634f1d970775eec98cd4cc40239d23ed8baa6eda631bfa8024e599e4ba30522d6ef6d4455ca8c40ad8ceba385ed9bb1cbb85680bb05b014b632fc4a46865f02fbefb86fb9a97179c6e350d0846ada721c57f984cbc49503f051c8b0d28246161c1ac38bb27d4b98fe1c7a0b208a2488df9742c6dd6698b2f6e862b1b09ee1bc5f3450b7d7e23a0202c7348d9e103da82028e8a7318bac351d51480eb4d0199a99ac8cc3c2b4c4a07699e58504d85d3eaeb1c24743deff20587300862bcb3560d141d32a8042d88816336e8e6035f4f761f0c8491f02add43075b388ed36400fd0d25a3090fc3057abca2190d3cb5ef65c1a99bd1ffe6337068cc6c2bd028f0a07feffd998f2e52475a359deb4768f805110de826df84622418f24d44579f820d70059a7c5a2d482bd3550dba39baec21406a5900723be4f2066db411b7d45690093b503eb6cc8bca63422aa2e07b8d3e1d182a25a0d000eb6cbeb32fc4c157f177c1b86bc5d1b10cea2e7d4ec3f68deff3d0fc9628b990b697cb8438a6e9c5ab74cf311fe399302b75bc8abc2cd61cd0e971c25981933a17f7bfc2fef555c62ceaba6e1bf5c9e99027cd3197bc624563d8f625869feac67f0db6d54faa3da02a83b3c8b262b16feaa8a36a10ef280c3aa8e28ef0f4f2d51e6adc23da8e61d0a957b5ca5217c40da78ed724860922560315cb24eefa04ae068736170080207f9e74eb1296cc12a234d629954e12886127d43391b0cc26ed474c52039f9de83c855c7f3771e8d3c5de0593b59814bfcc579a55712472b59a8abaade915e247e2e19d23e57764d8d7e5d20e737e25368c414caeecf8b4721e9f66b31109f25ce8742214882df06d9dc946d5dce42da3f56f7090323be98c64c1d20042c5353cd76116a5dd12d39ba5695142e601606130432cf522aa18a759255a8d1d1d7ef52d7ceb7160db03575dce30f330ff46c6787ad211aa1f1c8d7662d606cd204b67cae6df27cb6d0c0bba4630bf0fca265e6d2a053efffb84d9194b78cbff80887c69367015315b4a565af3dcb4fd80310446e286768dec17375bcd489a71307da1827864a7542852c1299941ed9e1e9ea4b3e159a7835a760b04b0dea2874d6efff2d19563d0ac0e392c04cf8af6a81234d7dbbdf4eae4a7a736c341e3b65003e280efbc80b498bf2bbaa1e3e9fd6a67e32051f049c1c5674e062185efec32eeb3de074f66729cbee710979426020d596af7815ce5960909792d717fd0cde348522080cffc849aecb1a300d022bc9de6fc425964daf9a12a8d6e83681a8827f32b017971defc6f547619f135ba008eb38c5343ea890860e5d9ffd91080e934910d680d601d05accd9a366ccc14680d9790076643528ddd742b6139095f75d0e9fb1afc233e90711049de835e98f9bbeafc8f8c01d5fc83072188f2235b1ad37d28d54cd31b83bb8a182f9a83c11ff9940410c73021f690ab11e9859e2544ec67d38b31a748cb240e273ce9d4ed5c222d4ea159223163463b51d32ced465149f5604ca5a9398cb6e39acb2ce3801684dc4860975788f0213b7c906117a5320c8b4ff9d7418d7de51fe8f282f0bf137db07ae903546172b068e55daa2937931ac70850948575ae1d96465c02c67a4bf3745032099b0d0a319035800d6924eb00e6389b709a442023280b53a0c2350ea1ceb3188b640cb490b09105680c3311763887b34ac120060923d2984a140f61d672588b2514ea18df9bd14ac3a663d3a153a1a663fcc91b5e90e850bdc591420a68b392858eb55fc50cb3190ec28f7b7404aa3608aabcd63e16d8ca1618376f024da9a0834e01b3e12ca682964dd5881777b4bee917ca1571ee5f4e804ebc2f991e139806b8fd740233112a44b660fa63a95acb494a84b18771cbc9b1b6951f08654f5df91e7b651208e8da81bce97d6976ba6a13b8d31d07f7b89dc7e36b84372203aa2ca733548ed41bb046e07479c24590f5377c57e90addd5f181f8f4e2de3d8c49a3550bec3972ba5406d4e8b44016aabde1dd108f1180e5deddc218a652623e75f66f13cdd7e6e1ab3bef7b02243af5b0a899e8baae838557ea1a6a518b3240bed878b48d84e926b26e96267c002aa92168261cdb03e8c7d66042c8727af230d1eb2a1fbd162c9fe35a6d8a00e47944f08fa03e529737106d0ac716b2960710b5e811fb7189ea1edc5301e321ee908b8b884422dbf123747c0a6b66fcd6abeb780898af7dc7f32487f823632d011b075408844ebeb24d994ab2f6e030e534200473645ca527d181585699c4ce16c817fb6a074c1d403e6c9628d3f6e57c0c038e88a7f0501d6ca684a250496121c4bc7aa257d28b2c3342824320102655b39f538ec01656808e310009159c3bcebb46fc42f446f14b3c4fdb9796df8b696ec29b718a529153d7fa8d417186a86525f2e01d9b26c6159d068c4ed450f25e8f4ac35c314551206f4deebe8d42cd7bab7f2d23d657ff348c6a5c75d56d583953ae23878dd79681c3208f354e714ab4a21a4558d4b15a02a819ae4646cb6741608a4b5deaf6467aea3555d87b8269dd7fd4398c8974f33967d593ab198f6f4143b4aee7d612bf1acacdce7821c4943d98efaec451620e933727c35a7fc78f9067d172b957d26999af481e729b77443bae31f59b62e038bda3e67662f6f2626ccb0846f69439d5df0766e42701308bb44a505ea2630a2a3076ba57969078ec8d826c74c7c6d06193243311bdf5ef76bb6ba3291346b7dae48290587e940dc3c3d6000568fd1dea7a5636d99b41a4e65b20a1f95e2167ef4f20ae5c3bc9e8b934202ae9f52409d127069022ec6dbe43c1fb1aeeb08ae90d6d80b34ec91068e819da224ab9b48c189e51d25713589eb897894eb51a40c8ccbbe1418d3e909c6919f0b53fb69c8a0d4c3e4f23657c040981806982751f64b0b5f18125651e85e07324c7777f658c00a2678a57493ece46f49d4f3111389451fa4ede7d606d0d41420e53388955a4a346f6aa1446e7351e18f3b741b707326102258573591987664088045341efb3f0a01933142ea4988d1f3e8ed719d326055949ad0a34193c52b9fb6a4eb996d49d62bce72c36d21e1ec8f277c2977c880c3557b10a1bb254f3145333faa00f3544c1a307f45903141cfa32fa85fe2c2d120d3d861e8afdaa7a0269f80176314a0b36877e7fdce92404dc0fd84d716bf68fde761c9927aeb9f48122e87d3c8c022572ab660cbe952caf355e3acffbb7b68ba5d87a9fd03234fdd8e1d3475464466f42269200895eabd1825adf171d9b0ae2c98442a38a59b59010245c9fce1401f8dd43267648aba939aef206287e199cd4b8f54a6c8f22942ea08663445a82145781fd5cf4d1ebd54fd575a464609f4779e5fdcda40bda362edbad8a0f317df817122e913a891624b14ac9387071852c9ba8a1e99d410a1482f44e78e84974724c20966c396385a73e50472387c4e9e253308766e95e237f5483f01627885dce218b2bab36c07c9f3b0037405e78d80fa147658da5e5d1cc7731b121188d634637a3470bf03b502fde4acba06b3803681e46d8f2550d5d2757e6b3ebcd2182b65ef569f3194d999e536778567d0f89a12d67f351bc8608fb10b8d1a1c16a29a280c97a3ae027729c03fb3d5c9bddcc7f82a1175794f62d943bac3f07d64b70639329a11822b1af4d5b1ec72ace96d6c62521bc345445dae05c96956a5e98abe6d869bd4340fb7515e09133ad623cd370b91dcba8682b635074ce852ab12fc769335e42febf2753ef806ce062b1382d53f4f09729c31053fb8e32314432691879519f4bb9f0fcfeea119a54183ba1f653eeae70784fd1c4862142539891a01bcd17a0bec647174cb8cc72c6a8eb0612c21225375948ee072ef911089d900891a7318702ebe553bc0419393304f006b0a277adccffbd4406597f1a061742206f45f01413443c9b6b25ef09f6106a10a7749e3332346c01e675ca81901838374d2743b6a6db73e3557943dec6509ee9d22cadfafa9644a09052cc125b14e435fa5a061210e5e8acbf20b316c6d2bf92b978e89176769e700d52535ea1e8718e23a64aef49991cbe427aabbe6ec7af07700cf9d63f0763a1e1f63adc52a8aa59262292fa612574e261d44e7b5f2efb4f5f4a68e235b7bb7524c865bf24376451d2572e55211d29bb9ad22f6db42be589fac9af529a67509e521ef488a2df941287acea6e5feb45c57032050bdd6ae149397794b7ab7b43b38dbe142b4f4a25e3bd643098679cbd54f026ea3e39b4a164d8a966a9d11a53757db283d8b1e22791322594da4c35627904e02843933ac249ed3328fdf881b8a145da53abce996ca5f891c0e924378e510356c812d07fa137ac5d50d23e85314fe94cbfe1bfd0fcd10151b752a4fb446465221f64c896a673f1e2f0072b844750a2753a1f964c4155081c78f571cdd182ce38ec489e0e9462e2984ba66103a2bf19dd06d6d0cd24614ad21122bf211c3de846b000187c370687ba2a31479c338148e2684d5e46e38c28a1c16935f6c1e5aa3d3059bd772785f01d57978b689b470a04e1b021a25af78f33efda1ec9eb59581ec17a4ad62bccdc0b999beebc76abfb70e4b9e7350d7da3d92d89c194af7c3a33653b3db0302d5df2dc50b42d06fc84f40d5b72eb32fd19ecd09e9e2b85aacc8acea8684f4505559511592fda94d206474f7b7a8902ed68f5aec2197498e9a5b5f40a02dc1f7c42863f13a73dcdbdb9cf70fa0a6569627c478f9120b0c65251f2133be5348c843d1e342298992896a44dc66a68e79183ba823ea90ac6e58b5f8c15c34f58e85d30288faaa054f7a6d34d6bb00ceeefd054481d0db0fb4a4286b4cdfd0f8c5d4ebc24277d5d51ae88625e380f3515144fba11b9957a1faceb908f1f498a3eaba14e3af621e4e381c849bbb708a597744706631dc98378401c52e7aae063c9a7ab54eac8c49c249b1b8fb5ad54ca534a24588b47cbe0283f115f8f2793722a05269688dc26912082e0d593fb2ebd5917dcf4f93a0356840200e458a1fbac19aaa432ddc141b611a7ad50e8346ece44c04acee34f160b62da190052564cf37710e8c21bceec3e0484b02bc706554340a9eb11410b9a18361fb162bdd2469aa3971a51cceb841cd25f071c735f592005a9788a4e040bb3d9641c6d212c93f64375e67fb1d11452798fa1a60082f215eac5e7d300d00fa26481102d74d58ca5b960489e32e546c185690c4272105c1153ff2de013f468d9a1f78f86c8810bed175f07477c784a97597f1aab838577897098bd5e067a1a58efe33a893e04c57a200268af96d523e5ee0e1d12a27636a5f393375bb4ad50378ac6219fc690e256f4e13362e44e6f129fe6b4fc252ffcfec3da0bb4da0fef809071504b34a379cb5869c6ae6ed2c2f3cf1f9dda5aa1939c1f315e3356cccbb094dce883c92e1e00890bfc860b1b8a9c4903713338f541eaf86953491e8174569246f8c6ff871fb2fc861558b785cbd96abc129bf7889b6470e7344380185818ef5348e6af7eb1304e55b996f2df02b4b4daa1fa6032cccc8cecbf038105208fdf50b10c58b648e56ebca92dcbef9de9926bf99f8bb78653aacd650d6ede418242988739473ffc0b10698f0d177f1f1d77f6737069159ba471d5ab001c1a8100db563124c1af9a35d1e89004ee344406f9e2209e34084d3d169fd290ff948fa0ec2abf6e031b6dc8a448e93bd03d9d7a2168aafbea4d665d48f7b4e9d6ae4198718cbc85668889e682946e5e05caa570b74901f6bd144ccc024f0a2f639f47713b8a91b62f9e44017397557345c203265a0c1e5aed0cb1a83e9b80d4089a5572d7300dd4cef7828b11fbb178484921b55e037394ee49888abc30e2348075e1b8db0355c14d18b3a6791d9b00f4e600c269c434240b338605ca76209c5309f24e6e9f14451fa29847a101979e28c4d5d413a1ba938dd6130b59b1a237dae0885ab948bc06921384bd914606497fc1eb6338d00c5af7590cc65daab968355aa235832b0298a3a9813106b2dfc626f53ec78d92e903afa4b187a3e4059cf75404d36bb326f56be88524067b4d995d1ae3f805af76963732ea815948fc4262262a0dd622c9dd0e0bb722f5d1279b3935b199ad37e36c5c40f30ae90ce18dcd5ad4802ac2cf1025c015156af203282f4b91a89474d9616f7fe6bec200044baa7244342dc28c01352e59a265538100ea00b401a722014194e01eb11c07836741828186dab810818c1908b4c85a2880a191988355c348c819d1329063de839a14feddc5ce008758dc29b3b3f7f06a0ddd125be7378973a125de87d7dacdd6e2c35a313a7898167d860fbaf462a7d39665a9277e4e588b3bdba80649072c3e6ba46a2d71545c773f5a8c940471a51e117cce3f6806dccdfe01851dbc481665810fe176ed6d7788a79774e82723c864e5dce6be3c579611102b82ce3774156ac9643e0698a02c566909a2369f6497ddbafe94a322fceb9e67e27518cc1830a461f84a818f7ccd45da964c94cf14984bb452fe3b47537db544570741e5bb01bfa52198c9c49802a31f359d6405ea3e42d642daa77305f01c35cd2a9799639368ae4962cf143bf75d13072890146593c3a8cec4df71a5716dc352a5a36b5cae36b125ab73cad16bc11f6fae00fa6025ed69f0184d5cb043121415fda3c8cb9993074ff9601d1fcf4661106668a57f88868599757a7d8eac11d05475aeece69cbfaf4977c636594f7fa65d43e0507e3b9291f0e3e568cfa21bfaafff97bb01e423003f40f0fa7ba64bd4da2b3c0a629a04af28446417253b97682839d37cfe147a0eca8899a210fc9f364f89d5ad4f90e1c42155b42edf0ce137c626d9a8634923c08f8537395581c8c879849c1fc6337c1685dff5861cedb21549bfaa55d1f0e2ff17116c9aff5d841ef17450fcb98c4a228827966cc1dfec859c17a8860756b17df78b7382a507c7ee4d8a463ebc4f7d494af771f36a35ef06aa7f85314b8cdf8db52c064fb3b8d08bd0731fbf11a7442a794f7d0a21299d8540e4443130bdbf2f39498595f8169a91487d7dbe0003b4fb24cd1c4a17753bb67fb206863ee4777c1906792e07222ce782e16f23c2e5348e87a30edc3fd259ad3dd02f7a6edc775e7e1895853ae4ddde5488ae0e0b789a05f958ce4797a2ac3ee62103fee945099875d5089eedc9edacab8c33b44025104f6295c0441ef54ebcc806ae47d54ab92db2c75cb41f5ec35bfe017242e70096c159d09ecb4c7b827c6e65a580a1802d568015d1a1c152c22d9ad0ed868124ed84e17fc2f42a1634d4a70396ff6f733ab8db8041d0c5d2d80f6bd99259d8cc10b0c324640f1c7fbd0d412a44c40e3d113ee5ce781ec037c3799b443602d27b7f20bdf2bd84a6dbc2ceec223b9b09dc92e2a48b07f6fd7cdfeee1c034455829040650c099a8f72f96db4d52245293a3d79509947044c7c76b00860599d5d9117db601f3a304977362b9bd00a04a02be34ff0dab24264a3328458a8959968c51007b0019bdde5f583be32e7da59d279c47af4cb9f4f0180d54901bfd001635f7cc41a9ae7311e0a2226959108e0493c08befaa49613f51f2991c8af3155c43920d4cd709432e64bdcdbfbde0f3bba504ff90ae33243d19251bf71bda2fb7a0309752a84b7e9e01fc3e673e7d903863752c23bb8842f1db5e5a51cc786175e49cf645cd8d35458c51d9ad0700a51c57c95d98a6f0686b12a4f8bdecba79312310ff8908cb08057128b202a3b56a142e7f23c8f4590d66a14115366841c55d47854e7fedc05d609f5b9d7170c63d07de5d4c9407df31f16bdd22f1c220bbd85cd22e6f8e76390d6ae281fdeff6645932051fbc01e3af975b120eb84cfb83ea2d44dec4958333601f0f6603b4524101155911b2214868d277881911a2ec310a7fe5667ab6fb96f9ca9da4641b861394fb22e2c91d81d18e5f6c879b3122fd2948226a028450975f30c72a9c3539968955e14b5a26a81d9a08239a4f449b043f3c724bbc23b36787776b402289922097b58a5dd44fb35d1beea2ba54aebf9e1801cde62b6306af8cd86f90ab8059806862d17e671f7d2ca466dc2d3009b8cf9ebf4f7f303a6d1d91aab0f7642eb2dad61cf299a9390374abf1015705c2eff23d4aff2bd3d29985a691ec69563f9563805fea42d51929b1c27c3c8a048e331482d53e4ad0d0e696c683b18761802063a229bd83ce2d0cda78117ae2636779934990b956605138ee18f201295632a5fd96417608ed3073c012400215ad45b38488193168b2db3f0f44d952a271f6c4eaa8fe61d0ab4757addcd6b988c5b31026ba244fd10c0519a7d3251f0b445ca60636ae93739e07804f9921c74ae158c30d491f845dc8101d23e9d90544701189bc0695d95a6cabeea2053f3c6cc55216c05ed4d88d7ee92d106cc5464595af10a0046f5ef3e8008b1c8ca825457302da44abd7d9e9851f0d83c0024038fd9d054bd0b02d7f2213c66dd0a633ea2f14bc2917aa0bc891f4dc951eab4351405fd30b51804d142983b5903258afbc21fdc4a49a668388d160a7e137db060ddd664d58719047bf042b07489a84a67962d7a3d8bdc9035719e41ddaa4ef591f88a1485f46ad199e6a4e6e2aa8fc7d075209af94817fe624a1f3d8cb33e2a199a213a5c4ce17a4b92e6002c70d7290b660667354b15bf942b8a309bd90f73a032fe9890ab4d419347daf6fb0125068508751ccc2281426b16ee7446744bd60618a66cb61759e823146763b2c943b8bc01d4cf8361722311665d86343275bc069e91a8a90d64fc686fd7c4c2a8540167972985d9e4cad58a1418d67129e2679b8803173cc08be44445d06018866f61d9e8d48e39725501632c6929a5165944a444da6892893ad608b50db918ecfc0a12bb10e4f23eb474720a010f34123b3a40106042e6505a4c8d41a98506fa6ac825aa813a4477d862b6716f5f5a9b44a37e68131c1ccb123cbf880dbc3bb2feb6be880007aad7eef1bbcd93a00debf0fed7a39a731dd8aa3035a319974e2c8002ab130446907cebdb4007630929b460189a48e4f2101d06152f37a3a387c1ed7ce2502c35c66ecf5f7aee4c753dceab73332620172b0dc303e0d948c4f4f71ae3b3d2ba23b60bdcd5e29f61db578a3793a8d1eb531cac2bba6c5d02b8783b1cdee4f40755c159fb6f0a122119c4c2fc9233429b77c989ca6052ac1f2e0f3e7003e1e0494b94b41d68da1b13e7cbb8dba314dabf3989048d39878afcf012febe650fdaba94525d594c90329d90a4e85fc2802f82f8b043bc125acbffdc37b715b505898d84c278d14b82f624b77fa8427ee4f9834c96dbb521e05a16c240dc29e91f6f89b6287996f1afbb380783af8f612f9423bf75811eab2da70933c4ff76950a3d754addaee4ffec45856891d122b41a1a176d1595b57c9635d7af883ba2db92f56cc700a576c80ca78d91f6de06ec45783305485c86ee949d29e23c15e2d5e825e6798753bc4ae76488b1647c64986a8904d4396881266896ebf147c508e1123e9237889f445f910e58aa27bd29e0007543e612b8a02f76c75c37bb79c3374b3b0cb3315be9f9d0358bcfaef12475498ae170fbb9e3448ad24b494312cea0a8e583a2e48cae5ad031aacaa5a7cf4491954b5d3a52307a7b0515ec13e18d46121fb24776eeaef48468571662102f911fa95d2c6b2bf4657fb3a0c6979bc6cce280c5ec72c2ff619a10797dbce646929306534df3f29732a20cf1014d1382fae416835f44325ca440699c4057481b882aaf8d741f0f93959d5df2891d31cf4236b849d1f0db2b5235ec134b1ad50e6423e785bf2fae879042cab7f31c4ec67a9d8e880dfb699ce41eca099e1e426c09da23210e68bbcebbac161e89633e1b706c9a7f9d54f074ac613ee27062e440bc48d2fe11aeeca3964c1a73b254df05097c53fe380f78c07ce73a860af91726153f9d81bdad610caa7421eab2ac6010e211f1c80df34bab1d054ad880ba5a161956705165e5267bc25c0abf98709e618d19fde84233dfb3499eac89464ca2b3c057080a83ccc4bab6ea35eeec47cb9c0bb5c6203a63d2c8a81d0c2ea8585e30f8aac2933e01bd836c18e0485627b8154f810850eca779c90a890c41f6ae1be4fc8d1df7c8ffa2e2f5750ad561e638d6b84851b616da2afe459a2fe0a016d519a8dab91de4e4a30de0e126d86f113b76bffea7690d50570d187a00e02b42a5d22c04a66bd038a71efa88b9f771dc87778cc568f5aca7d0f398357385b10812b202baa5ccf68a49c06a339fbbb1ed8767cd6337c34339bb69513fad28a33b82e671f161611c53a8e4bfe28e3d9519ec20242eea9b76e73383a229a4fe980ff74dbb05172d02d417c12eb200791a83742a2c9ca1228ec3246ec3769bd75b104e8b6ef19ef7657b39d34c89f590b65c390b0c46ed58df83f917b70dfb287425db29d8bf0d2c07522649b957966617c07b99dd8265b59445ff461907461b80abd5f0e927a70b7b8e652fc2bb35f17fbb5595c56f0e94e10e9c25e7030e0eec7951fc06a8ec94b6e77b898a439248e8f65a9c00967e058f65463764f7d3f63f4adf8df3928d28fc8d1f12fe2de6a6df907c472231828015094602302252793bb903b5a5fe205373b3538982c9793784b59be3cdbc69c8da5269b042c50932ea01bdd3286fbd6373412a2f4355fbe65093fd1a4840e195151241e20c765d90b07cddba6fdc9a2cd562674b264bcbad4e15ca62988f66ab51ab49ea70d5bdc021fa58e88ba6e3c0fa62dc9a56cea3069dea38e06c0310c1eb1536707c9958a4ba9d576dddcd4de5f95b09441a933309c5b727a10a81b0433953255981e42a255251192d0d5956041716de18e78fa757fce64c6741c99acf0591df2a7c1db18fa3b0f7f828547ffb0a56633406b61b164dcf779431704e55bed6192db3cee53403ea2db78690157db8f3188cdb0e35913c5bfc33d370a79f7aba7ac0a794a044e4f8253c88b68e96000d375016e4416ca2fdd36820ad88f93e1fa67edddd37ca0c6944c3c911955278015f12cc596f140e67ddd16c7565240dda7cc19a2426246181a68aadcb912334c78812711649b93bb7ed56abd6a3784a3cc12c8f6a842e0a36a41cabce847ad73cc99ea38e4960ee8082ef729f3d03cb4892323b1d562cec7123d43fa5e5ca169b9c8028641a893b19bc0e964ba4060ef99ed69e0654c719ec1c3667b10ec4291155688764ebbb3d0489ca47586891049e249d28caaa48c7ea5a78975f0981ebf683097642c80dc4b4e0accbef30cfce670d1a64345d01b430649f881e035b254856c9d4d166a5746be67d708e045c88c087f6b152dbb82ae3f5b83eedfd95e0f23b239b81922ae9c32786b94262aced7fcf2a4740b5fe32e6ef06f9de05ab1b81f62fb79b97d75be49090f963979b251f3c630a12f6b097e8f818e6b086ed2e7b234d58a89a01618ac51fd3c232183647e245fe7220122945c3e956a90fc934b6d3107a8bb400ff3f0981e2defd0c003fe2bc8ea5c7b42a86d31291e529f5a15fd7f7752b3ce3804f0bf9dc19e31c2880d345546e22127e621c41836f53f9aa3b48f1bd4a2fc8734323bce486e99f60d29636997c73d9163812e60abcfcd57d28dd6394b6e0cdff51e4641a7b8f59d5a4437920d53f08601d762ecee0754c7ed7d716973425d53fda6de851c9ccb5babacae0ba98a5286674183e52184e0c406f51afd0387ccbbdcc03258c22a05cc1487229e9011f79fc056680bbdd3d3bee03b780e90cdb3d25f64ad992b81b597fa8ac29c8d7212ed4442bfb5110364a62b221442d1c7ca6b549cd70e944ab6af67233f3be332553c5c4d9449f4947c6e134e95295ad59b15626de91f0e1a30fa08698cb80a6a16ff83c90d047b1dd7ab18b86791875204bcd78811d4c003bae582915630da55a50365804b8804bcdd702a870e9c0f2948bf042f675cb516d98589e981df619881f99efdf36aab0f9e3b842161f72844b507c692532897fc0fe3f33ef72047c4e422aa67a7f0fe46e4de7bcbbda5dc52a69464c3081709ea0831a85da35c9228f99c19427ef3f23e745dfe91f8257b963ff2d240d9b3fc9097d7045063247dcc74484f378ec1f068c2f068c2c0389ed225af96895efe08cb677f44fb97ef1aa833982058585e4a2f51187ab29393d9d2b6c592a09c9733e3bbd2f597f332836bc2a5db61a0c4591095af9e72553df5ec07a50f818c46968aca8f2c57b151f07cce6c71267dd33d750a2aaebfc635898b62da8ed233fe2c1c947c2b76b1f88d6a5497562ca72ca3bac41737ef9554db01d00ec26022a0da2bb8fe0cf450dda9460101c5a0622853baec5bb04902010101a1782abf77cf77f5771fbf7939dd5ca8328f062aa1f2f5257dd323c75ff6b8cd3151978a98a15c9779387dd3403e53bacd39cfa371282beb272f437d396f095740422a28a7222282b2e660422921076fa55331e992fbf8a94b28ba55ccaa2ccebab4bfd6dfdab2b0ae15bc18c87960eabf7bc16cff2e26df7fe376e8d125ef76f0d13c04c1ef7a5d56c54013065e03cfc10f9c87d68a794a975e4ec518cbf4d30b2a5b2e622220d3d5c47d5b3c713b99ae7489883cd3e928bcc682bb7836435870195bb0c95f57814dce846ba0f070fc89579ab15efae9bf10041b5e00428d2efc800618cf5ce02f780b2f3c14c35a7834309c05172c3c9a97162f487c05b60277f1685a58e8d1b03017bcc589b578342ea5be806d180a5c7236318aabc029ca59f889fbfb8bdaf9a96dba2e7a5630e1c58d3e059b2c26aa6c3783c4b653b99d9fda76d77552d43d960c1d7584745e14dc0a83b285891d264470fd9de795b490aec513c2bbe91e173c92186a17b040924265421f61cea03679ce832b9ba032b89293b05ed6c99938146db3b1645df7b0a005ee8433613f75dda37dc6f29e591f9a788f1c7648163f616c3bae88f7a4c5e8d228e3a22eb9efdcae8b9a0ae84016bf27394d2c125b0f4923db91689c1af7b21f6c5ce84c722ec8f969c3a04ff51e9e219583402abe6ce6131331109113794f91d28d6dbb2195df785797adafb8232057a474fb2d0e861fc2c00a862d7c41ed54a3b8a78174f0e3c3404040403d3d3d3d2a2b0dd440424308315103adb4e40899a374e9c5bf2ccbaa958962a61325d74f68283c9a2874942ef937d105ba4774992933c76c2bb4e4f75b52c25a25d419028355d54055fd7ecb9255e65afd1e94504a0ebbb033eb5ad172eab28c621410500701cd6b8d5ea8cd05040404d49cf31e4e94f57227fce44ea0807be8bde46595a6829317c2a0767e5279da2bd9e8478f3993be79797ffff19bec474d3d8c7ae408cbcf3f92bdf62c3f7f48f6dac3acc87b222fdb463d1a7f2f439dcff247b4cf1e0513c47c961f329fc52ad164012c9ffd10ed33abc45b021550433b392c36aaa8c14ececb617916eee5645812259fc3629b60db639648cb6fefb7b92858fab727d2f2fd232a83eb905c194f1dc31edb30ae7b4fae24417d4f3c0be2f2303fd0273dc91279ffae0cd6c978ae2b326ae1de957144fc238ccc2bff0823f5566f8474eb530e06fb777bb3cea467fcfda7f3138fde4f6dc3f9c9a7aed876621be8890a54594e505f6fcf5df466fc27d6de0e74a3f4f88d9fbad9295497be519d02aa1bd0f587cec45de02f7834fe95f3271e8dff6571506c9619357383002e3fa350285411de139b8a3d3fcd82f063efa7396b3db54326c6b892b3eecb7ab8aa2cc8f510487df8d0ca3c1a095f9aa0742bdbf123813df6953382c73802de2bd3c1be7bcac3913fa5542fba33eee7fa5bd90f362e667d9c49972cccb27ea217bea0724f97a00b6a4f4309bf9b92a31772cf8a2452dc8a9397396c729cd3590f94970bc62878363bb8fece404c2afcce4f73d64a14a56fe6fb941ad3282f1825e57a4e578c02864e54f8b4392438fa895115913f1cae88ae5753dc0a2f427d99915ec93d2b9898722baebaccf985990e376a56dfce84c36ec575d3722755da16d4f8d37a0b78c65f072429ae7b0caebfb3a0aaaaaaaa9c057ef2939fb8dbf949da57113191d7fb420497e838390644f4956a571f9fba57545a0fe5fcd8c50efb112b5bfd70991bb907893851048fdbcd5c8447471efef0ba85f9c1df2d84cd5d1c618acfad71df11a6ecdc29985c7ed9c4ad5e1ae1ebcf1f9f46965e3d3fad38992bb9f7cc551fa3b495f530e61a215ded8dc09b5d71fdabb8fe2e5dfb8ca391fef53366d8c3fcc0d7ffe2ac239080f7d9c8f13b8980aa62cf1020f963ac9e3f2c4125c27302e19756babf119692ee689bee19b15d7e59bd7429dfcfa7317bef5bcadc8a7b2fb958c5b7e3d13c9831dd89a81b9f62df1ea8686031dcf7dc8577337d068cfbde92e2443d526ed7f765720fa787079d684edb4db64ed4443d7e336314d6fb68dee21ed1e3449c83a10cd5bf73221e3e133f5289f54c7c1e4e22d50829633c2fd5bf573dbf1b27f299f855f532d3a95e36b338c27a887a3c3e7de7c210dfc37836647837d389d8548225801f18e3c6e7e96cda91d98e649b3ae7af24e59b911f7f878d2b5fc6952f5f7ef7f312bf1bc5e717dfe5bbf3b89293998efb9c3d1e2b99c47a259f63d926d5cfc874dca1851105b32de8bb418cdb605cf8fe0529b7e17c9e21801b88f7c708190837b74502b96940f949ae0df3837cb83de9357ed5d05fe646f81527739bfd1b42f8f0232773fd2137842b2e1fe10b55dc48dfc331e20208e8c708e8785ff383bfa36dfc3b56cf7c89c4c7ee8b9c3582af5b22db8eb679b79b7bb6c3ee63feb63bbc0a0ef0dcc785fbacd871e2c6472becb5cd8bf2aea8afc7f5c9217eb7c38ab9b0ebe337b00842f119cc768fd9aebadb6e5e6afd937ffde815f90dd62c3145323b2e777f23d7038adf744fc9b2ddabd8ee273cd56ef4d557bf64549f42cc9a4f2faeef486258db6035da7738485f494df34cddf36afaddb115d4d177cfe867dba8fce81f135d2f2ef673d2a6f429c554fe0da5a058d10127975d709f151c385d209b9505d92e3fbd286de62636b232ede2ca6ac1342ccb806c5b1da9acb0bc918f46f0426ccb80546c549faaac5416da429fbad00d03b25dcf826cd79fb6602ecdad8d6080f4ed8ef8ed4b49dddbd3976b16e171dd62fe9aa10603c4afbfdfd14fe8fe38b67ec57a9536c1c369f96ee6910a6ad73db7e7f7f7a97b1e4e954ca94b3b6c2549580b9d5276383e42485db0991a7ae0517dec18638491543db94144be8d27bd7f55848753c3f6c7fe180361f512da78d28dafb8af480f3fe65de1c57d4fb8cf8a2b50702d26b9f83548dcbbd4623538c9717cb94616c47e6591b0f92c88b5b1c3761fcbdbc874589e6244b78bcff234962ac8cd956789d50d1a376ed8e01ccf7a886f43b4f6c68c972c88b5c11ae16b6fb8b4dc60335c12cea9c12af99c997f4e09296786066b9fd93e1d34a77834eea4e5bda5e52b6b593b44a85b5920e071c982f4c71d2b89c5d392fdd01f5f860cdbf195f1730a0d22f089e84af6c38b4140ccc7af38be2a1345b10ce534db4ea72e653ffa56f17bf4885f339deaabe45826cd5141b94193f4244ee6d6e0585e72f32b8eb4f23538524c9748b3c7a3791f6d7c980bf315a76541aa975687ec47acec4d0e12a946dde0f3e135b856417dd236416c7a57cb80c4b7518487e35f3db14f04daf0af82aa8d8f363e3ebd01abb8f8242051de8091aaf836b847822f07f37d6a9b0ec7cbbcdf787fea582459981f723c8ec7f1399eb31f3f70bc0e1d35aa8af456961ecb82d878520dee6916e4c65752e67d7849478ecf6189c8dcb0bdc412e1de085f1b0f7fdac6daae8253b48d0d4ba482406dc34d9901a99e6bf2a3e5c6df9010562ff31e09788d3062bb6fe3ad2c08f7954522befd9905213db448f07db68b5fe37db80cd7372ccc0f2d446abc11bea46fb144ace56c2f1100f6dccb816de33707b5eb9ea0b6b161bbf7349e64893c286d53c37e97b21f62803cbb037623eba14fbde4c1a7c1c5d8d72598979f6161975e3e3ef662b19a1b71dc185b6e4c654ff34c55d0abf1872ba8dabfac078b39842992ed4895eda60f77e1ba6ee1bad9a4a58bb98ffb34552cd1c8569b9aa28377a2fc66367933fe47b82e041edc79d9d4759f4ea2ff745845dbcc2e39b16c0779075def01e7adf50ab9d543aee371e53f244578dcf83042ab672ec14868441c9e307bd4dbcd93c372a1146ebb93864eaa930721aca26fae6f6c7ec7723be824caeda093cbc2253dd36f31b9fd7142517ba68353902c15d0097402049ba70a72520575f5a40abafdcdd3a819e5efc386b6f39d3b85625723a0d8f58af0440003c0a15463c38e920c0f4ec35858288974c5c464ff1773c55d3d99ba496bce38a164792dc3e885512bcbb0a96959462f894d68559be6bc69d6ac20f788ee6f3dc3d9839561f4929bb641cca9b4e61504a741e8256ab6bad11a21ec256aba9a95153538eb48c55754561a560c21842c382f342c1a6384ffdcddb777716b5575ad4ca78a0eab482f694dd863eec8d94227ecd2cac63a42e076182b39ad8b6299b6d537801d6c4a3b6ef0c0c186bb326261a924d21613a3f2af92e9388410428791c8f5d58f256e777d673d5dc1607b6bf22157dd28a385d76b4fa7a453864b0b4b262f08afbe46d43f23e26f7516cbafa88cea162dcbb25d4472bbf86e8b8be52263ee983236e0208001ec9083cd7d37ec50735f0da5ce61ee5c9515bd07263ccc1d86d025f4f85dfcaaf2affee2baeae1cf9d6eee4c11582d994ed72d41c49f2f25bd70d7967838260554a2669401e96b3dbdaeebba5ce2156b7da133a20561f56ae0bfcc476f2cadcdc0dec38189f1966d8ba13438991d95062e91cae2ac186364b93e72efd26870343a924b89377a5fefe05105b5817106df93b9f364eeec5816acbc3b7289544b541746f81d121936e5d03bfa79b0c9470e4edcfe7982253dbcd2075ec9270524b8fd3d78eee43c9ca9e4d1f4f7fb60d34cd2c3b361f21e0be6086e7fec51cd9db6a92eefe2c3d7b21ff1e5fb708b5be2c6b9e32ecc8313b65812f4b7db00104203d8a8a2065610018a680510a2f416ace021baa0131056d5901b1f42e80f2137dd1d96ee07ba25e92517c750bdd43e3b965be43d712508a1a2a450fce3c4790aae420a0a158565b0683d57117bcf86fbae87fdee0509e0b249071c2e7739c8f80e00365ca669f94ec7cd71f96560be8bf96b8387193eb8bc9080180949008dc95134ac42f1cf146dc33f553ed75adf47e7c0a6050ce931440478609304569e5c7f1f5c80605391d10512f0708e7834fea32837035ce3af440d3b049b7827020f873bf068d8c449b8c67fc586edfa16611337c135eee27f81238cb089a1c8009b588a126c2aedb089511d78380c8591f54783bb1d6f5b7f1925ae4b1236f19253137c02f7a79184a586edda5d9ea1f81528aebfe55e060e5ee9fd190a524aa8b721c585eb905c17ade31fc94ca7e3b7f1363822daf7f3121ab6eb1be30fc3f10c8e85f04a3d601cc4e0ca7c2e174ba45f7bb72c964f56857f46d726d3a51ffe99f23d7b4f84605492644af0995f8732404411ee292df1ec87ad1debac48e95e8ce39978e8b0f15dcc7ff71d4c0e5ce33635be6bb9ac72d986c677dab389f94e72767d708de7dc8b2ba2c43d5d7a432b454617681b48c46885579e7fc5767c47a38b079b78e01a207ab049888f9c8723c4a3f1af562587eb2dd6592c0f6ce29e5733846b8010c2a621d84484100fa77b0245c55e71a94cdb60cfbdbc0d8ef43538194f8373e95752f90d5c966a089b2400013631932170f8043d5ce33f23d59723745969fc6854de47cbd4c70092db5e25e02f1cf3702c833bf24afe2e1c125cf26fe12cf04afe7c0226fe258db25822fdf57dc532b9ae3dbfcafb1361ff29df91ddbe72f27df84633ae53b9dd1bea5e6ef7b823a01751ba6c71ccaa224a575a190bff651e690946123df3028f7e6158d13c7c40dfdb82ae4c49290fa78b7703773ef04afe9d1cf21b99821f7836928b57722ea083c1533ee38ef2994ea6504db8fe47bc9f4ddcf78a64bc650a4aa1eb299ff11d975373d64a22410821e47f10c27f750baa7840a10ca013edc3261213f776d8bd36dcf733cf04b906fe7bc83717cfc0bf30951931368f4b9ded644a38f00cfc396b7512a94657e3e6c037bc03e1dbf077967e3703fb4ee576385cb7c3e14268e74b75cf2825d8c457700dbc6cf7d3ee5476475e71a118a89fee2fbda2c3715947132e0a85423106339daa72afaaebe7bf4c9aa008663faa3b6d91d2adae29a3183030c528e80254fb344de2df2c021e9eb6719e2e89e0d9b808844c9f1cbb08fa0cd7dfa68b5ec97fdb62606d4c673664663f331df6ceb49f3f44fb6995783e332d090886fdeb26c28f7d33574489a9f0d2dddac6f228e6f712a59c26d60803d9beb1f7d1efd24cab5bb7b850aeb1345bb87761382ecff22b93525a23a455c68614c3e81236d12b92507b106d268517855501669fb85e57e0c4f5a70c6040a673b190bc916bc2998e90244330c83d14176fe49a744b756a0006b99783d106609cfde05e0e73fdd32b3f2b53b4cd7683cd0c0f670b1e00cf6f583001e0e855de7fabc2c399ef6dbfb879f96e0b0301e2779b15069044c9e7c4afdf6d59b8fe54da96966fe1ace5650b130518638c4fa284478e8c57b2430ee91390804ca73bd3f1288e6ae61ecf905e6edf50f5671855e9db3faa1eebd05d1c00f838009dcbed7fac43a7529daad3f577e15a58561a80554edceaf44afe5ad42d95a479b0af1c785b178f05d7eb9226ae5726ae6f5bd8c0103d50bb2d757b2acf68099bde26b40df98dff56e437f17de7fad7296cdadebf4661d36655be1b35f181efea18d7eb1854ec7b608cec732ddc6ab9b05d9d0219ce900515ae7fa5824d1a0fd72cf1ef32295c216d12ae16821e307942504c711d0a11ae571f5c0fc2f5a743a8fc4e86fbdaaab061c16d596c527c4b75f3e5685a88e15e9cbc2fd31192245ecabd275b8ce04a2ede97e9484b46266af5dd06c56fa8130ae572c6c326279ef1b0a9edc5733b6aed95ea2dc5764b51275ac6739d13f070fe01ef862aa001cf463e76f21bede433d8109b642ad36c9765f4745da6b0a1eb942b333373af006d43d7b7d4c3e115a0152a6a072a07ca008689719b16afe4df5d5c7fede4199b362cb8c6b730dc4e3b5defc2f5ef349f4d62b155e1d178f75605b9a5ea16c020bfdbca4079763ffe574aa6c67417162c23684644722dd148787a164ef4c974303b17f247bfa91e468823f3e404f6f80cec40ed26cfcde96614751baae7c25f3941415df89367887f357240fcca2a517d0652a176a5f719f82df7e53c98aa5de9c295d3853fa35b39c1ec70bb922c9c0a2bb02085ef83b49f76c6b74f4061122a3f678de3d1f0b775d82d71ddb60f0794721dbd2e21611ec28a2f86d8083c3d95130ffaf9e9227cc1073ed9028aca173f46b002d01329c008d2c2108965b48bb74096b852a98c66b5b64ba3198635d5aecdaa732455aa16174cc60b49864b0bcb8aca8b2603fa64a8942ca594524ae90fffc9401ed0ee01c4d90f5866840c0a41f643f5eee75a970410bf9efdb02e8c0f42d7ba0c3457653a46c0202682ae117ebecdf18dd90f322edb272543ad53e2c6085deb92b84f2261e6343410d520179f99c95047354ab6d7e592f3adf2be369795bfacbc8ee68eba5d70bbe24387db55457e8b99a9c61541c266ed91dfcd256d5384742deeb13e7b96d64806c47ab69df67ecde72feb3b33e95257dc485ab5ba2e59e930fc389f0c957ecf267d763cd21e8e5f55923932430ec25060f78a1063c91393cc55ef906711a4cbfd431feb9bf6f199fe96990e9dd9cf2c0a9ecfc9ec12a49c26304026122643ed580813eee3589139393e3d6602a492dcd3c318f77a667213573ef526ba04195eb62b8259d27646e4f587cfce3dc9f1c7c9106be262555c8c4707ce06ba9cd483e72e8618b71f46871eabaf20071d4277dace41f855844dea8a7d87f24f2e76e4de15a82eb184f268d8c5e812c39d2eb17f51dbc4bfd306a02eb50d40937ef5938bfd3e1a26be0d40d706a1eba369db3005d774ecd9416cb801d7b4859517c19ddb92885d0cfa643a97a01a38472fca532e64dde7e1a4e728688f80b7833b95853b47a89dcc65ecbbc4457307eeb48dff25513225c6ed247d33bb897b610f3cddc61aee5cd6cc4ff5137fc6181dab41ede00e76e18e8c37b2a8671e72d5bb43afb8191fe720dce91928667cbae41990191a704c0ce61264cd8a12ddd6aaca48d32e8cd20ba32a23ee0878bb69bdb8187c5299a76d9ab0daa6df79949c9bf1a1af549bd0b93e85c56fe6893b3cefe765efa3597be674105d1d4597e73bf7d43177b67ee6e7cea466a0e01afe8ced8c8f5b9f0599a101d7f043e6995897669772a20064653f8af0a21905d533d549daa68817c59dc81377aae957c7fa698d3010f996ed2ccb22b99d7f65bdf548aec549a04bfd30f3dfe5243e74a989e85223b9cc79d1a515261f94227c98b35612693e28501e14e669860142998301c2af4b9d3f4f23d46ef2cc592b89344bddec6e8738b201c6d237ddd2d62a4b41df39cc1d6ebd7ae4c046e08d82e773ac97690258cf5fe2d136f1fa4aca2bc69fb1a253fe5549f9d3621dd3a56f9be732957c1fced64fac0960d9d733f14b6d232d7fc9b9e7215dfea0bbf8f09d5f4a9752ca9f57ca9fd2c26f2550b7ac8e736296ccac6c4e9951ec61a683616d614b61bd5b0426c58455a04fa6e381ddf952561995f1957c4eb44d20a5184be5488f7dcb94fe8a4f237dfad65f6f5d94668f3dad329d2c6388b9bc143a8c10c3a61571c03eb3480f9df931464d00179a2ebce1421d540070218f0b6bb82e3a2e9cb9f0c69dc1356d2fb4e1be9b1762366a7cc7726f58530dae8130573e852f7bba7bdcf82dbfbb223d7c128c6cb22a6ccae1c2a61a4c00e09a7e1c64d8ae65a8dcde5caecb8cdba31ab7bfdfb209025cc3a621b806006ce21e1cd84484142b94e3d6701b0043386037b8fa961b3dc7a9fc732b6f8363f91a5ccb43804d3abc9afed6e1f6efd01260530f1ffd44b0898737e403105cd34f92f1c407360d01824d1058009b2430a4370b01cd0ed1343846c12bf5c770cc03c31d99c121f1c2596002126014700f467a8d2311d136a4974bfa4e7b6bc625d94eeb643cfc77791f2e839bc02582f468b6fbe2623b0ab0bc1289880b2b4b910bb17a01156e6246461c7c5b062e7cdeb4cd3e089ffbbe2c087c6174cf0cb7df2aa2c78d2fe38baf474e93227af8d0d8b4783be480e37aa54ce8d121b94125462d66118b344692fcd795c4f1fdf85c8ca4aa7118472f2ef6e82139563d36f804b7771c6dd20b1008100810084e84c487e257138ea032101fbab1081fbab1aa78c8899ca3302b20852e110bb9bba8f17df8944252496d21a1f83e1cbe9d1b9ba1c775f802f93d968a3d73911ef7bd1f81a7b24076ee3e46813e197ed8c3155366f574eb01be7cf915c763dcf8d5c657a7637eee5ac7d7df88ed5a1823f8568f04bcef8dd8eeb37f3d12b64820c1b77a303fc0972f2d912a5a4bc42d23b1b857409330c163e4cc7c921a9e094fc34e8e9299f3ff643a6be639cea15d11f94dfba88c6a1065198fa3aa20ac600420c0c58fc6a36c95053397799dfe3a9d346a09cd3040ad2c30c105c1d55e7d1e98a84070df432e0b827360eaa1ad9cd4b69a8fa6b16c2aad9429aef1e69c9672ab586421657b395e867a448926421c19bd0aa6c28dbe331821d5c2f4c8c2b40d82732a27955a2d6af7505d757a67b8c0035e188f0c421250593fe18fec8c9ee8a9b2b415aef13ee3ffba2c13234bc3a38944198fa675e0d15841413f5a124dc9a3f1cf84b4123cfff971f29b6df9ad85c889df5c199174d27665656525d389795a837b34a6d0fc2ed603ad05276f97aecdc04e396c8ed7617594be64dfa3d161b32939ac4c85c970ef622ad0a60b2dc2c1323972d8f7688afca692b15951110e2b13c3f1a581c9d0e038867b98938cb67c0e1d4bd854faefb4ebc4a692ad96708dbfccebb05d96c3e258829d644edbfbe86d0b9ef1df5228df520ff5ef37d8d00dcfe33331d89425e19a343c9c4cc9a3f19b8ca72612012012edb02983a2030f27a38115e437d9cf0e2b88c60a4ac2a6ec09d728793819126ab0e1fd2613f29912bc9b4c0b6f463b9170e8e099d75ec0cfb6aba1629fcfc87c5723c7772eb7f49d763bed94f21b8b884d405c4154eb1436f90065caf5afb2a2274501e046297834fe388c5470fd6f70950cafe46fb97a86e737758c3793844d750ad72819c3f59bcac507aeff0db69ba326ae3f0f3be45ab8fe35b69b605c7f00d82eab5478358b57f2b7c1d520bcea8357f2cf6830850b059b6a14aef19b4a84276caa54708d3f9c1e5c9a9f1db69b4ebcba82572af299fac4cbb4f04a70fdbdf2f896f2191ba2b8fe35ccd86e966c3775d81c38ac8c15aaf11d96aa96d4dacd25d76bf62d990efd96a75cb5ebf2d80d181bcf5996fab2121313f3313131f565e50b5000981b302c2b2f967b1b981897bf9a72b95a42bc0384182e7f4f6dfecb72b17cb0aca9b5d0140f94d26ca34e7c50273135689cb248b9643f24bd4e97bc4e5232d716d532ecaa71ce397df8a0d4a364d8d583a6f105bae42f812e31378d9887b9e8cc9846cc0fa134cbb22f40c6b400943ef454120fa761be833f12e386f96e23654fa2df1877dd176c868c27612e2d5b8d94d6f8f7629847b9e8cc5c5ab6aa46192a231a303e387102c20413b175dde526a445b9e8456127e183ca563ac69b149e899e362adc139ba813aef1a7b6a5080909a5ae9424925ca09c3cc0e5c475a291f5202fcb4bab20d4eea1609e3206f349c070f067b3c2c379b7db84b694956da96d0ab6a5860cd14532f07066bc7f120fe7dd406621a164b8e45f248947e3db6b6f86eb4f0d20a901c2a8f18fd41ffd11f8f16b5fb28f8c60061344fdd13ba05a07d41ea24b45464a3459407d6895784be8220556ece454dba4ab7e7bffd892047d8f9f6b2d46f86db1493c1a7f0bc6c21f171a5a14292424450a0909a5aed4f5ed61b21f70b8d5538e6a91bacd5d336bb930f8d33267569166b870bdbcb8aeebbaaeebb284aca1cd8b6de8faa641517fea93ee2a15d7eb0fae7f85c133693c5506d7b39fabc7edb65465826e53e0cf7685eb54300eae942fb8f299c97b1f28c19596975cc932b8929fb8320d574e99ef0b57fe939299b8f2470b573e2eae94af847c083ceba4c88b96602af0c74e18d6038c0ac6b02944e10c624eac214bc8e53b4b68ce49e994a11af634e537f4345ba6b0793a49ce619d3883f9b64e307607ae716bcdb091a8fbfeb8b84c08ed8605cff87ff1a301f18c9452ca169494f70430bcb8fcfcdab6034b61d5bc767099c128d70c83dccba138308c7b5726d3119284e5579eb9ee3ac9f8d1bf7c92242a5f9fc4dbcacead3ccf6764145dff972da5c2bd9c15eee5ccefe00f577e1df4678e4c4892689568b280f8f095a82fabcf486c2bdaa66c607469a8661c6673dead1cf0418540f02749a5455dd2316d67f9501b30ca5990c372a8ed7a5c6961240d4639eb36e4644e673accf9b54e6dd345228b49db74b4e87a37e143ad93b583154b065614d7ad185c7f8ca84bfed85097b021a6ef4f6d26f4d2cacb66427de5f561b8a1a7184624432462133654f15891c8d2a8a452636666aa5129a594f2b72abc9bc7ccb228bb3e13facfac70fd271036749bd043809434994e6c4dd358d334ae2a1f16c2c3e1db1f2133b96d611a9e64e553cdef2a291cd3b21622af2eae2e20adc16810295ff750573fa8f2061c6e5812008c0ab1ae60090995a19b18c329861e0e6fe10bb681d10b306e9b17985ccf7939db50f583da1602c11f1d329dfec6bedb5257c8ae14a5572a65836553078c72d8955c737d99f38d8a2dcac3e1bf1dfc395971bb2d459db0893ac97ef4bd9874138fa647f06afc4b70bafea8ea74f95c27ecbb0b0b7f79059985e4e2d9488d4712492eccbe5466578aa6aed495a2585c7f4cc895c5957a25ff20b01bf2ad203649cb0ad2983c1acde76a2e78da138fc6dbe5c1d052daa6e59da7959de689b96a18602bc39e4618ddb5ebe10ede4d06a5236958255395b5848434994ad1f7d1d5ace6ac66d5b2cdccba76ec70a2b9fc505e500da6d1944cc9940ba70480edc0a61e04c00690fde0ab9dba548da1befb509df68015ecaaae5455f9c02ee6508a8743ad5fb91dfcd14e1695587552c08ddb980e12f326a93ffae68e988f7d0f999492232fd7396d757ae7a2da54a325949329e940a83eb6faa187437f0b0f67fee8b18d256409b5cd75ea925b4295186a0fef5e3041a87c7d07a8d8ebab85d11cf03e73fdc8c2682f443d027df4b6852d759ddae67149deee3a5d7f39957b3994da6d4872ddf6c5f5af7e502b9f934ba95fffe5486a6182187d7d21465f6dfd23f1475688faa31fd923f0ab7d3957d013f75d16e6fa3b4fb073372caef0b62cdec6c5b3d1d8840dd11910bd1317ae6327d8b923ee11edececece4d4d37d99ce657ff4ed261e8ddf2d55f5a04a212b535dcabe93a96da89a52f9beec1bf3016bea84b6ed6090d44ed6b44e2f8302c56f84689aa59d5a70fdb3087f603a998e9024f12ba5d90fd7f8c31d380cc2bda00d1ec4c1b391e2e1b476626b097d5b42da048251ae18631a0669cab39f8ca6ae673fd785c09fec7482595659421e0a4a8169274b483b6927cb0ad75fab91060104568551bb8780ac870cd31680097934ee8f5d76f69692330cd79b540609a1e892cb863fda09fe4020ad0573eba2bb8f602be4d1549f44098feb95ec90c3048f91d3647ea772bb877aa8879a71bb87ba6ef7509add843c1cbf0d050c42884880f8fef2b3d7c5f537f4b630faee7d01bbb745fdeed5aff8d1cc3aea585da0109a669a9b17b4456ea90d0c7abb2dd5f2a314bca241a814cdd585510f558d08000000009314000030100a060462f178481e0aab7d14800b889850686a1d88931c08424821638c318600000080011080996913c3ebfe598bbafce3edfcefc0abf2a292c701181b1403107df6572613dee97f2ba39a99cbbd81adb571387fb0e4cdd7d63cb9bad7b208d0bca14a3d6098e4caad4178b9bd60d8471683069b9875eec1582292bf60b7a800c09bea32b618b6ec8132f2f1dac03f6d6c2cffa2f9fc7c452d9997e8a3c6e81d59e4e90d23d1ebdf509c7eb4231958ca9f3197cd25aff37d49b6729bbe10729892f56427a977479793e7089218219bb843a66fd3bc55163a00977a87fc21bcb96a38e122e931385c12d0a5f9d4bc42dfd2de6b640efada458c27b983c6980e5bc27365014ea718df4e9e0c4aac85d9a036d7f1b7201e73a943d059eb34c5f74135ca3337d3a1cfde7782d3e787fabb5763ea085e61cc903ba229718428d639a23c38aa62955fe05c5103522d730f6ffbd48b077bd1e5dc81d51a85de51ca605f744bee08665765d9c90743f21ef3868734683002fedfbcdcc584220ea98d3cf2b2968d6e7f0520d9720c502830a018309f0c52001809bb4e3300d0eb991b2901f620feb897929868de90d3dd9225e158c7ca24199ea242f30d3567be86f9aa269620197a12a0d06bfd56e56a584975502a6dd293eca452575ea8474155091c65c890d1fee8beb8858695596a560bb019bb9cffb33290f797af13282840f1079ceed0853dc1a1895e911ec2cd1da7b7fc60cddab70f8160c80bab86f0c76e95190cc2a694708305c24373b1093935491c4ed8003958b3b995fdd0e4c35d566b18da56c6e21b509e72a46b5690a82e038e1c2b0b629205ce0de955b06d9bd1586584386375a84ca6b803b6ee8b2563d893ca72754de53afa47878d261185c4ef994f933021f06a7bb6f3a65bab942fc42a73a42d41139d2181f8bef1f04ce71bc062bb61b94c2496735fb4f79b0c8ede91e1ea081e78e6bfe9ad6e59b9bd94191a5c352de897186b77bc7b43a826b2294f14d934b7f7863f8ad2570fdb5b5c93fa41a226f6f4e0b03a1102ed0266ae7399649cc6a1f4ec1339450acbee41893b57566f0bcfb17b3b041078df6f6edcc4260159e76bee16e0de4482435b78de5289838b66972774ea40da6adbe17a45b00002be6bf80a2df6f96625da851ce308dd0e720cf5262e88290f4aa0acd2d16a2c09f364cd1e7469eb072792acd818823a099237ff7d2c9acb5760b40f6bd4078270dffeb4206f5171980f848fe1dbce8a6aa75fbdb291770364e1e7c0c50b279d56a574b3202673d65adacdf48dd49d91a53a3f057febada556682d2bcd6dcef85c06cbe05a218deb4b2da6ee649329829298615635a352bcd39751a828f6c64662d103d6341c4e68fdcd142070c3ee3d845c066303ff9bb66e794e093158e2e6d088bacb97b07b8e1688cc73903fd4dbf4d551ea798040ead79bdecd0e571262d3a1abeed5c1ad22005eec0952111f033700055414beda4fbb1496b7291e3eec959dc921576c694531cea604693c42c8d2f5bf802753633f2aeb31c61bdce4d5faf3d8f0e1fe5365ae062b873ca698ac64e95037bd2fe9fc32d96bf5ad646af901a88f8cc43a61257bf1569f5b7bdc6de867ae0fe0bb8f197826f4d446d1f47f14db814be87f51ed81aede095c7c3e6779f58ac18de3dc0200499ee6093083a6b3ff708d855bb4c070083c0278119023173b0425b57cf28438e176ac4a6d192c49ac6b01e7caf9abb638cf6ddfd80f0cea7efe3ce24089abdb1bd54142148ae23feddde1b0bd22e41afee2db371d97cbc0abde5acfab20494401cafc205e9ae0d9f4bd11ce1a9cbcc52a8a32ababa4b016d7b03dd976889519fb40379976b3f2ea3ae33c50c791c3411d29d2299c47d42e4a9121eb804838d36b77040070aa91a3025d885187bd7549e33fd30296eb349c80c91e7b9af1586aaea07f9a91033659e4ff4c0df8681e8ee25f4c1eec4cac69e8554e0d9603822d968ff6b85d804a4cf65f776fbe972e195b3179b7c76aad58c52d79ade9116bb371d88dee3f66ace2c027fac09700167173c2c777364fd6c823052accc112b5eb0857a71e6a748b133fb9b1313932c64b2c2995b15a7d12fae723ada8ca18662ac0174c4089a94f296556afaefbc751b8a4e7f300777eb87184e796021d3d064a1f784f05f2258f0e4e4754bcbe1782d0399e8f8d2a97beba4da5ef7388a43c7a1f6ec1ee26c02e21d5d1335516a9478971638c43df1326cbcee690b6ed693829c6a984b4633a104e5bcb80f952fcb66d98172f81171b733d1587d8b31438b96c5685c420e0eac444165c9ee8522e14e2e644c5d491bb220ac9995ca0b219909d33b96d14001cb7d8807c3eab11e6831353736653759f1f00db22d5bc8f7b31834dda69beac6a029a197b0e78d9aca51f08383a063e80fb2e3effa99dafa90cbc528f1403dd58b50dcc8bfce261238fe1cc907781ca5a5e7dd7e6746bd8a5d252e2cd414d68d9c8e4084913b30c8d5f21b2f911368b61195b56e515ba13d7388f7729997af46b1681f7c12f15ca058c7135cb03f8ec016a70c951181f4708ef206332671825da8d69a02f14fd5d77b6a47ae21889f68cb3ef5e92de1808fb4a4229eb518b86c791a21ea2418a2f6450494b30097dfc5a2068a4802dd05ad1b7072ba7f63870b08a75a0a9a7683db574780467184e0f445fe2313d8d412d675dc14534f5c1619931a0b76bc3d14b8431f2ee63ba61b12305794ebaae8e99c368a9a7c1b7e915d8e0429cfdbc360110f6b36355a123975e9ed78dfe4bde6a4843ac449d8cfc890b5d8e924d906d9205bb4d6314a60d50f9851398be398971811ad5dd7caaa31ab5d844d341099f6fd56e62a5b23aee217f79461e8a082fa52216e17dfaf31ee0115bccf0194cd3bdeb8ea93767b114380a15aff980a3495855ba35bfc081845be0aa4c7060e1e872857190657b72ffdf8ffba51c1d6075e6b16ba68519966c5fc5fe8c0652ef0c0a96adf45f23419929c847057d9b5676a468d8f810983de412f6005cdea5466280930ebb45f3a522a718b5ef707c60a4be520913640aa33e384744303bf36b120c2c0904f30dc610151c93193a95a056e352e5383e131022a54fb27a33e6e91866f5d8e14354a7fee0e8b24c54c827861487eced004322f5583d322d9fb9a145267d57ec065c1fd50195006d228b5ab954a51944a451fe6fbb2d10a3fb570d066da0312703a5627db8a9dd2d5212d560784e068a78d964c9e879fe62ec28da394fd2ffc68df4392c5e7aad49e337eac7891e7aa0fe0b34c3e371c048e2aa0d76649ddf1e1006e598cbe8ff002a97f790b0a251242880578e2a6def54229864f53c987b3a88198e4ae16ed72c6f528027346c3f3e2ceb218299c08571c7cdd9ecf7d35648464fd6e9666c5a3f2ad9b6e674e5a415927d4edbbe197d20df7f24a6190db58ae9ae7b1c35a4924b8172e29f413decc06dcd89c4bca0533e678af334896aaf2e1f381bd4b5176764e2390b9256525565af36e20eb4e38495a7001c5b4ccd04bd6954f276eb96568e56959b4eae7cf3b9b90d620001b2badffcb09433621fc872a4a4802646f382ea8e365059cfa342072cd72ed355b439f75adf34baf28aa097f9db5ed43e3c3b10c2d4ba04caa2c65aeccc27565f323105a646c87fa97c59e6fa2b747506d6099779a804a420b28b3c040725ff89aea3033990f94288fcbd7e4081ee9b8cc7d38ce2344b9389fae8bd57563a6d9f1f5362251cce06edd032d3c39285d0d464c5449809a166084a26a69899d48da6e77e36593e5cbe971245a2ba16ad6c290ee895ae750c7ab0a039a8c676f924c4a15066424bb45ef414afa8d7a77848863abcead19a8104e81704f956b27e3a6ef241d78836061bb4b18db18b8972e2dbc46c1cc3cf607f5369140a2c5e4dea83ceac2b82845aadc679084b2d5cf0cb244a56534d6361821e0b4c2b0c6ad8fcfd1e3f49b6f776552ec061ba681bd97269783ef220398d55f06fa780493bb05f7f9e37c38ca435ee23caf1a0a5e0fe5505307bea04a8b83d7316c7740ca1547e129f6902a53623a04902aa0eedf2505a2db69b62e55829d665f50ca8f7ba8421a0801b8b30a821a542be3bbfe78c317544d0107ebf22f2d7da8f1ed26b2c5d61865ae5f777b704301ea419d2d7d4c300c9fd424a104a2119603dfabf422eae3862ec332a712922b54848bce028fe080904e12035d748743501ecbe95f7916881d8292051b89967be80c21e36764683d98337cf251363aa31c2e5d3c991fc0e9f0c79012c203570c24b178fbd877929d3a8e3f811d8b96bccc07376823c3653ba07c6a1bea51b6a4ce273977ab1379ca13e944ad65822b29405b246f5f720c122a72e770686ffe00b2bfd180a1e09a7be1f884d8cfa06847eea398f9bd86690911bba57198afda68fe20953b2ab079946e5ecd305dd9956b1493c036d429a74f79033f5cf081240dd0d52cce4f3d340cb60a174f2426897323b34e333ab50431665b6059eae3be20e3fef5664c4f917ba4d4ba163935bef3d2fb28d485ade784cb000b4fc082082499f93717e5c66334192762c9c6bd43523fd61d6b99c9e364a895dd8a9855617f262967501cf324d100b79815ab00b384c702e2c8685828f6fa49d51fbed61ebb9bf1a6e7573cc72c1d545ab31b166b200fb251043255d260931660c1c738aa4666b7534298a2d5a21e163218e00b4ca3819b2fc5860f9b4cb7fc6a0815fef5eba0ac0aeeb102b1a97d8ca4e04f670474621ca1bd9f7c25713ef98045bfcd126ae3c34c34fdacfae2788c00f25b126e90f110644e4504303ad72aed80cc1798a8f3f606acd32fd624a4babcfac038087916e646cc06775f153275c3949d7f389470ef87e06dfb7a5687c7f8bef12186dac9fd1bc11a064fdccd447eba1b2f462afb2bad4eb772c5aba723460409c3a68519f50d1e13c1f4521fe9e2bb3c7e33ad5a74a74e00c8b96f5a83e153aca9260ff0827c9166ab01632c9316bb48a33fcec9743ca0d368125cdb55cf708b36bc3dc491186244dd2cb9c9c28f188e58df66b5934f78ff27fef06bb53316b7fb9f3064eefcd1b4dc35d3056d91b2bdba693c41e52e8be651a2392c61baee532b3e2e31fdf6b0b49dc3eca22c8c277fbf891b837bb12ea3f0eca6b723aee0452f41743f3c00ec8204c1d45787a7cdf49b81f5c9c4829749c5e5a5178abf1081e3152f6dae58c53624724a11f0135dd614a65a7ca146a9c56aae1df24e92d0c63f05f1630b846eb2891780f0ca38ec4a92761fa91076749315a54caac4998997c433682078c8575a3265ed93a6f2c4ace6bfda79028190a928d734be217ef0b8e3870ac58ff9ac27f907deb0fae79e0cae45d11c9c1c45b7ca2082b37880a1f43a30c18936944f7f8203b9f5d4f485a2631cc53bdc447af121d741647b73c22d004800ef6463461b8c9ea01c2c7720ab62193989551015595b07ec882e2288f2033d243d158d039c7c749276b70f922436184bdf4d037ebaabdedf079945413b6831dae3c7f2a76bbabd61305ac13e7ce40d4210670bba743b947883a823ba337690965099d700a839b6b7ac8cfe53e953dbd755ee4a596bcd00e42434776db85c81a90f878821687722e38ef56bb051e00ebd77a15a76697c0b56836acdc514e85aacb997a6a6ca096e928b36e5fce63d25bff718e92f94a0c84e00a190a263a186f4a092566c123e2a9c034096da8c836465144a01139590b95e2fb50a04ebefe0708f177e958639a24b05a4f78cde43a55df1e8be2442608f4ba0daeed4261fa0373b24f15f3f73424ed4411c4a120d34e2ea579ce715230d81944a25e1e3adc72221064bcd53be408a8715c874c15d19c27542b0c6d66c6a0584d7eb5202cd7ae66db47bca51b1ce0241706db08b795bbd1e1920d4d0ec0c7806524d8ca602313ab00449c0d0f25eed7c7efe55fc9db97b0320d136443311dba532d08bce31813195aea1406557b09a9cae9459851fa2f46e4c6f4323e377b565be89724762003b3f4e12216dc9d377bfa87be3c486844b8c63591acdaa3b414720874789defd09c33ca8691c7b818f387ebba435d23fc59306efd6d98cdb8cae9c82d8f5aeddbef55a511988572e52cb0925e11f46d6d4c821a8935b5499a8a5b7fc94f2e28bca017f00575604dab1d36894c969b3b1f377156657a0219af7118a6dff39454679875dd77b026ead0acdc995742f076c87b70887250e05b15895140864302208709ca7ceae652b24bec27a66337f067cfe3487be10becb99af6da53e4f1786ce588629530e9e806401e169483fd40b72e48df9bfc406362a2e7c14f0f8f1bc555bdcf8fb76a3514348ef06f950d0e4c997b3578ef63c216935dcce2950e697764da791f6e651d04f073b67750dc08a198ae6245235b3fcaa813a610437a73b039abd8c820d3bdd4e0b1324f8c5e32f3d6a3a03d28c2f3626a56ffcc62b6e90394df6acc596b345417c9d8eff28dfec20d0eae1d538c81fc739c545fc3dd987aafbbcfdcb7f8fb81b8a21c649002755c7ff14e45d44c424a12614c629912ff2e07e98d68d05ee11a906c05258cf71abddd9879ffd3353f17ebceef23c818c7c1a0675126c053aaff15d19ded6d8f21aad299150bf50c93b5b7cc878f6623f0dfbd5ca9a93fffab03c28164543ace68a5f9dd0e9a3bc4577a307c3abe35f1d9f68ae94868a2e1d46d0d7b420e58513859c84760b9e031c8831ac262660e637c75f4938e7bb221efe4d5f9bc53cdb633989c69ae26990d102bed16dc0dbc6b641f912d344df04078fc19d1a7010d00620071a214b1f427bf2ad4dd952385a620b891a5d5f1bbabde675b45f0b553a52fd832bc171667dcf5d8baf323b9a27ffa3f8e5b554ba939e74e4632ac54901c2042f19aa544fcf59297f58ea41cbd748b5e654456bc20a9cbc6e831c4a5e88e5c8a57993342e0b66928876a82488ed5ebd8df5d49a9b8068db5ba40968c24dff5e4e171a23cbe21030fd272f9639f1c366d4b2271fc9d7800afc28abe6418a529923694d7b1a07b855ad4231b23811df00005ca44ac051b411e4c3539382b371e783581b2430b381d68ef6edb8294b55944c8738f957ddef60d1fdc4c9b14a85a31e1766e0c5352597f7caec21427efea98de0211793bfa06b1d584897281a385ae3036271486ae48d4d9120715035f0b4b303cc5441dec500cfbc2a33961eb64671b3a00c13a602273390df5baf7452c8c4434e89270956fda8fc0018e8f492225a916bc11018ba171f93ade1801f7318ad274c2555881ec2cb6b07fae6ec80f31d2beadd23a84c397b8f0092cd22cf5ad51ad851a80030a5813bfb7b880a2b6445734d44b26681e7c3c98760db724cc66fb048528d879fdd56e79e6e279ee862a38c322e2608cb08d5904058cd3187df80b83af67066c7f304aaa41d5504a6d182d54c41850ad3fed147703627b5723a598669d1404c7c56dbf601043a88b291bf584a74b19824b2d2c9b1557b747a42ee3bf4a512abb1b4e426c4253db2ae4958b6d0ae013de96ac7305e64d7582be0c54cfc37d1685bf7dd2d49ede26bb4ca0e556e851f7c97459be6dee30afd7917cf5b72353f09b703f6cb36330e94c0afb66d01bb75fa1cd1f54b49c05e61a411ccea67fc6db05c64e011780f8c7ac2666075ba90d32e57340ef75070f08214508e9d43a6e3de0a516a6c2ce89413090285da05ba7882a78d4c22b900dbedc5d00c305cd0b29eed4e09144321c44d0a90a3c233c13e5d399d44cd7825850141e2aa01198b59202f78028104583b9824306a1d1ff18670623dfb8b56324af12e7e43824fa96c698a2e34ea0d00285ce785b0d5d50a4dd3f32e86f858728cf6d8d4ad110f842d74896860e0f7c1ed8e6b2d4b561b11e8c5dab0dc9fa227d1b321daee5cc883345866beb4e3c62c11779cb37c1261c9aa6007dd55ae8c1dc3a558924a121f57109819e0d0385459a4696dd5836d2ded77ed587058f071534d01b817721d6112a590cb8cf07550b93386184b564d84587633e03a95977a5c4ca55eeec39c0639212dc7fcc6e455fd6a4228f707c5572a51397a44f90370c75b1dc41d7229bc027a88be2dd8784ec72624bbc422768d8a8393b48c77bf1052b9cabeb7893f8b9129857ed0db57e4095f473f3cc6bd968312b47e4420e812327a48af92eb75962a99324f00ebae2e97e029ae18f361e767bda6508c6c87e548f1fbae9111bfbfdc22af8742884edc68795d27dab765500ee285d1395ff378d0efd3f5c69a74ead5d5fbe41f701b7297520e71eb44639e44d1df6191355f81ebb9162901b90cf47a1efd14111c9c1e0634bb9d9e94ed8a18bd12bbe8489013920ec4bcd3238ddc0614ec5051c597ce4f56b6f7e39bdc39de37afbf6974be5a955324168358d4275c94487f71ef3bdf3403f139f67b6b32d91e7d1a5ed3162fa6403c562302b2ebd4deacc758f85bc49fbe9ffeab4c57cf25012cca9abeb80c7881ecca2f312ce19b934247e3984dace38043fc278198b2600d2884c35fd75b949d2eede9e60fb431ed4d805ce23aee22cccdd174810bb62ed3737b7f569077a217373e3a26aa5f35db68d01280668132bc55cc3ecee9849ba91f8177976228acf41cc96eae7a5b7c1e1265b4cceaa5e3466f0b49cb3bef05d8b653aa181fa0f53072751a7bc2ac1931604d9310adee40585fc33145dfa53303129a0e801ca53b0328243e80372481b64adef10174129d636d9f319925147311365c5df7958d11db9c0e29918cf640c09c9da9363e36647400aa0da04e00e6ef091762f818ab923d1f9c939950a923663eaf990cadf4951b9e9fce4761005b015b67e7e6a52768949841786df22bd48b7367a8e190650c5f8c65f37fda092848fc899fc3793fbeb5582dc769f653e4fc6548c87e677421244038f33c089a771b39bb3cc6dbf3d72b08b81e722f99d274228b40076b2198f3a9978e3f4c81d62b22bcd9d5872c3b727e92a45f0f4563bdfead3dc362cb500a8c89ef920f34a55eca1f848d024912dd54a8fd979518a0af13fa98369d48769cd20f9cf77a592dc9c6ad811fcbd79106d30b735e7180c7fec2dd5a0e7730f6fcce07960fc24ff325225672c8a3fbad2aa62e541f43f201169e0110a30458f804fd50b6a83aef0dcc2843cab8303a035991d50c32eb9c99f6f17d660feeefb4288e0a24a9486bdcc7bf806589c6f7a08ad6643f71fd73fd965af3bd58dc676b55d4c06eafae55957558435cc9993676c9837fe4fc989cc647382f1f7d6201fa24065f047348d4f3e3dbd0e259c03b75e6a53d858ff09ed58307e42d265d673c6da3f47671de86c581886f679a8258e914493659fc14cfdb6710ad6ea76696d012212170e770d39d6d06c4940ad407a012df663a40dc042f8c8189fe7042fad2d5713c15198e3ba354f8d8c2d45c2234d066f6caa87c99509bdbd185588cec1518b2bc932595bbc00f3cd2033c19c7633655729d872e8045252e6489de3d333012c2c89f691c180dfa133f8f0286a307249e82005f3bf49c272b86f81b3a278a8a90da16d24e0fe1e84aba1e449a8f2dfb7bcc0834a0b54da04461061cd34f49293e2dfa4b100135a5bb81cfd5ba08dd53047dbefcfb381d7c5223be3a803ef0b3f94a778215b506fb84700053f49137f1d0e04d169a3e84e3cbeac41daf33f6604e3170a38f0d2025d904e36a4b635686d96ad36b8ba956cc5cfbfccf14c33fc273a58486ece4154a46d5beebbafddadf6382e86903556d95765166ce83c7dc4f137991180bb96348660780ad3b669d23788f1b632bd0f622ef33324d5ddbe7f67a916195518dd5b18a8ecd1c9593c257a8bc76aae711d95a264e82fa427b9dea959978c719f1d71cff85bc843f920f46599c8fd1050ba8a6d5698b098c9ac17693d6f32284ec84aa6119fa9632b980e05d973192abb1b09f3a7322b3b0e330167b53c667f290d271d619f533f7ca956af4bfdb215a596a91e134912e0e9be239978f64e4635fe041353399d8c637e1ef3b963b0109ac16b3da1857ef728144f24097f5c10a18becf4b4d18221ae6c441f36ee81988bf422c96453246d2fd5c47520685dc8cf221932e8bb43c09a8439fc8094dfc99856847feaaeb357753497a12897b47e0af23d18f6da0b77d6db50bf74d247792750ae43e6664d666a33ceac1ed1c0c58e206dfe8fdb64e9c2bb0b3c64737479cd4ab1211f6338f9994a93f11ee5a87609496041a3f5d3bdeb416eee435b9a8cd14c6e77a9b6176c55dd5365bf06d7457e84588b96acd86f11c4ef050a0b1eeee227eedfa2b210445167dc936762680803134488de40fd5b968a0eadb4eeccd74b5fad58ef9bb1d5049158f4cc5d9c4072a5b6f37f2b512582b6dd812b05151311fb5aa80f72c35e9cb8364546fa8cb724bd181608fd0326e63c81c3c2adf38824cc31bc4b364e9fcb5802b5c1754274c0354c853d0ee44ae89da34abfe787206eb9f960ec581eb9008f782dbffd5487f1899a1f8f9e7c079e18f991f49e1b86220286c7b0745cb3a66c58b638e79b138a583532cf20e0dd788dad1906cd625ead912e1d188ca0db4fd091b85dd61ed143d932b28c8d97ce20535cf637937bb11203d0b5a966c51eb067e75cce949b0e92fa5466f7205cec669a44ec9c49c60c99a3830d463693cb88929ddefd87e74b86bbed47b07c7196475aac232993dfb3db9ee6fd9a93d321eb06ad7518abb6afbd9610b96e66a601c5a9aa113cf7aa9cef250b53d1615006e4510dded2cec800994e4a83999c3c236c24b7e79c26518ed9e86bbcb85d5ac64c281c0967dee1088151b370bdf05f8d3aa3d404e61eee478feba1358daaba4e1cf53f18dd73d9b96087ec527999e8c2a88b6910214f9faabb9c952625fe6a10bade874bf3a706904020e17b070f3e6e19a55f20279021d77fa86ad61669f4960237ecd2f669445ee71d59f7064642dc8f1c8cf029ff37b9df4d508e27d6787e5d72c414655362bb6c1804105d37760e8339e8f0bb89d2c0d015582bdea766d80b31edf0fa226c6857bbffe6da91587077d365ac7e30d591f9880e93de8121a54186484cf0ad96171d42b1b639f29663f5b9c5f4dd1c2db83695cad12141190b67c7cfe405452c90594554f4df1a65859bf47ba6e9eb0ce9073b30f5373f45c6111ce0216c7db1e8c783268d7e09dae137c707ddc4421e59979ef421c2825989b95893141c2f9dd06e9c0ecd1c94d8254c437125b950e649e76b920b388c6c145395515033e8b012d9e40b27dba7c8be56bdf7cc262fb458fe370c3675672d73ec9f3f1f1ba476681548a0e227b8c6050cda226f2548b022a8477f76c9370ecbc4ceb64d0bb89eb898014d1bbff2f7e55bb0b97dfd0fa4412287820586e4d29c7470957689d6432a87f7874d09607f8b454b4a06472ada445caf13dded3b663d264d28f2f70e082c2cd9510a3b1dccb02b4fd4ae711e77142e116ec09150ee179572aba06a0895ddc5a1a706d4660afcf66377956fbdf0c26cbeaf5dfc1bd0d84a5e4858ad26ca16dd85c22b5f6ba1ec6eacc3da992ac919f1c020974533a29e5868504cdb635266547d66ea0ec46bfd9a599d7053d5e41f4ee470198f499f735e0d3c9695fa64f8ba4c1ef8e4b64fe998b44900b7957ac258ebe47b49414303b0187aee8a650163e8af94f897f6ed3d0d93f57910c8934696a309d3aab373a8c1bf24b4987b6d03f1271786c16941d5ec17670d6c884cf52e373cca944b1a5725d25f1f3ba30b28995b6aa4cc490454ecc401a5da85841b5c3a1f18246f0447b79587e49e8bf52a6e81bedaaad2fba63635e0c87dcc408619a87953ecf06eeedf3254c8bf6a59744dc44407e834d61b4538a3fd867ee945ef2d24fe9bc23acda85837914cb728f8992ac2458ecfff8491706f60e0a632a353f131604726b2cb94c3ea163b44d5d300112044f3be56b3deb188742f31c9f64b5a6d598f53394369ad5bb984ee650d094e68ff386bca25c488e80676e3ecf1386019221ea290ab3f94733f40095db8db0f8b72e98094cc19bb89ae9ecf5c1566e2b7f9f1468c7e46797ff2aafee5e56e69d3a69ae2c394c04e28d21366a84d109ed4411b28d796c7f5c432939e1b854665ca4fbd603b5c09683f0505e3e57b0815913dcaf2fe72898d7522bd31a32f16cc0067ac9dcabf7fdc7fd427e5a1d56aef0615ab1e83a91613b63f6f839ccdb777d2c952a6167f804fbb6c1c3149898ef3bba1029f83e8efda5a1d896ccfb85368bdaeb6baeaef02743be0647ad8a6a47ee0a195713b33f623f04df97e3ec6345c04e07ff0a38197d0993c820443f8745429afa29edb4fc18dd3826dc0d72702044e4fc127c2a7e5363f1b0013b185969b236a164d0cd06c7443d466f6d6a7fe6471321161c54b1622170d814d5028c99af3776c887415b1eab4c355706e1657b8bb6f9d7588abedc7a4b2440f940d69f3a6783e6bb0559bd303ee7ee6798c3dc4570eb1148faaee7e7dea49298a68607854f779bd3d9f47fb434fa1da2baadb02131da7d72d1390def4926bf385b9091a8df412654d398cabc04451b0a1010da30ea1172d0bd2720d440615cffc5296f8494a24edac441c791ca3ca906ddd758f7aca6241518c4afed90ba0c94249e0f6d08460bed5a84651858f663113022810c55b93743a99a477d42c3ba180de902294809d4b7968753381b0db064e0443c4f1025bcee46ff9a552eb587956871e5d940f206a63ed2be1ce8f31d1715c9aeabfd63c5bc4331b18cd9175489f88e97f6e0f3540997dbb0e34415ec090126edf75e6c154f9103978f40ab2d4d84c5365a867a9f95719d69eaccf5b3f6e8ee8fa7e152b4f489f65468a3337ddd579a00dcdc03d5d6676711af8952c307599e2e92bdcbb9ba942eeb8a8ffd35a6c84ba17390f1b228348364df5b8378a170c8af50c18be7e7c48461a08e2a218f3c1add9a05b46685be15a2d8f09d356e9586678195b6c4d4971dfd590cc6a21aab50ce84b22c6cf2aa1ed0f51de3e1d728458673d83d16b11cd776a990a3816e4067ecb440cd1ee3f5601b9f5c281b0ba731d5eae65787d333efe5f2d57f2b584ff7313f1aa3127865ad12728966951beb5d24500698e10868f947aa291e083312f4adb8ed346c1b50a890463d3a5034a246e0f6231f7e31ec3e15d6048a415b49d449722a5794193ef847a5e82d6f3b3ee98643dacc64c1ce9197e0f2eb8a3031b999501285c4083c72e9d15d822fb69b0ca7a899d4244a8cc2ea565719aeb0f0547f209e20d0c1cccc11fdb44e4cc8b6a985d1cc373cf22fc9fa4168939a2c57e4160ecf9f17551edc71795d4196dffce28892102c95df45f03980de5cafaf49e14d6e55e0d4d1f22bdca7caed8c1fc8e172deb16ca1283d654c4c1ff0e836240bf18a07b999104bb0bb3eb77f16116de3196dc46f23feeb877bae9548a3752f15e52be11fb2b24e41905f5c9097504f1884b781eb1f73e974ea06dfaf4869b09ea9409d74b31e0d0aecc699a7fbe2ce212d6f254303437dcc337de7635c815a72d53a98f8ed75eb324e17c4896f81315c6abc07299d009fd235962ba2e324187a4702da5b782bec5a4eccc3ffd02904695f12b6f4888500c370ac530d5b1e4327638280651f03af6c11d72fc64a840403eeb6695dc29939fdba10d2480a164cea8990f766211adf770b9f2a8969ba73d912a4854036cc57009a454c54ddd90dfbb8d06a98a90bcc2c4444af650d719e37afd3a4ce8e4bfef9c5261d063c0a402f3e8e3cbc9d1484ee43fbf931ed3516ebf0aaa0afd788225896646532c709e310643143c3fc61c06751356e19111e0b06f782062905d54a6dc30f6125d5f0484b7f47637d1e72f32956d636e649879c4595b055bfba2d03d45d3af23524bb0cb3854acbada9418031b200eea7c6f45f9cc173696bd4ac0f489478f9e3515eee3eebf663c622d2aa5b21562e8d58fdf5caebb68b5a3afb0e500da29ef33e4b85726d72e777f44bdf9073205bf610169702cb10e465493f871eff622d3d13df0ea90fc39ccf500867161cab365323cb93c70c8ceac1910a6d29f696a25c0c959edf8f8a5e8dff9858be30f9a8e49b61100e31439451abdeda9a32449dbc650a13857694a105111b983b1e8c575219c2c53a617a6b98d48a13ef564a32224b2afd0cc1ca8f45bad5c405a39c60078c9e44a3dd7c98dbd176ca6ed35ffcb1e817926302287b2d9828746680724a69bb21bc9d71b98c745941b82a51d582ca7c3759201dae1cdcecfa14980435c87d0183a0dd6970894ebc91d83cd73de0ec158e17d5b7a283995831cd4bb54f7a7a8b28db36ee5785881ae360b03562787a7ceb14481ecdad1726c68bc14202b1bbde37e46c631502faa455b021bb76c9dfe26772aa1ed75af020337bcb891d1d0549c31db7c233d54360153ed94c4c7facd15f838a53f1d6c251eb0a373c5f6016db4f6cd466957309134c8f890e158210a6bba376d4b58126c89aa7d54c86fdab9f15b4e7958873dae978069d986db8dc3b83ea09b16ac8b7a3b82737a1f5d4dbc768146878e34b553ad411c4da0c6d1ea41ebe1b9d877cc17675c8bf521d95bfc5b424862c54d28f7c846592dfc8ccdb84e0b3b5567dc835fdddc9b1027170daa1ff1ffe1b1d82b276f44c0983381e780fe64e1ee900cee8d7180866cb75f52a1410d8c21655813cc1427a1c920dda2e53297b490bafdee069dfe2c5a080534b402ca19ede071555817d342ecbc75fb4211ce2acd311cc7ccf860f0aa4b9575f61b9b9fc5c915db3725d037accb62459d0845788145c5ba8c9ee7d2c987fc3e92890f44663ef32500831136952a1be3fb9d25362134ddcfdc531516b56cc4f377966c4452569b55234af181d79f64491a3802eaed06381ded52e2d7c6ae11c10ca1059637a48513ae3c8a0015c7fa5268242898e62adba9680b7d339241ec89d0a25cf0a7c14ea56906466b413a7a1a620b5c08fbfdfd75662ec047373330cac683b9a7604ec15ee645a8218ed8585fc146ef2d1329b9ef4da485355b1962fb48f312103bf7edcfb89dbea39f4d05ebc66f1dd25d2aaed40f569f26a5756df91df71566fe922349a12d1de9ea116bbd58ab240c94a48239a2ae2b8fafe4ecb3c9e83e777476bf1641ec0809385ecbcba54c92afc384987522e1feade32eca259a58743a232f651af4d2b391802788d38331419aa62dc81510d6eb1784d99d05d6286b12eacd32e7d38fb030b9be4f1516bce691f4f55f4a41488b61804d279683bf7520c6814b45962b60e2926494d2501f29337a9076b95d10e91a10f1344f6618a13c33ed972587cce78735d6fa45046d17abf889016da3a862ed17dc499a676fad2fd535ebb5487b2b3546b9f75e973530f61b0020dd038b00f7886411be39d46693c2822572e98076c2dc6e6f221d3ba5a159d82bc455dc22d5e86cef7b4187a1c919224b8114a02f31089c627b60303b0f3efd74c8a6d46dc6c1cbb787c8b9c313ff9a68d4dc2dcab697f68b167d6afcd9c7a93c99c0476f8620c1b4e421a2255ab2bca525f7f9f67a6204869603f793393a2c62d6540e9974808a1809e3f499aa818bb87b424091417eb904c00e3f0634e32ac4caff245804edc032d860c1f5b358840e9a42a2fe26f94aeaf46f8ea9c785a1b2cb747c504185b18040b0d5296bd6c3120ccc7e47d014fa4ca67590c9d5bf534aeda20480214e8424a0f37e4615e0b22962ab2c87574128601f5273d4a005bfd2a8591fab1f12a7533b5dc44f5fe8a98a505b78412b106ac7189c089b522d4a5ceeeef1e6e11604878b98174a3197410bdafe86bdc7d80ba8d41b79fec493875c35a8213624b51e4c18de2a56bf8fbb7f66b254bc03d7595d3f2e6009253207b51802973028b4e06ddb65ff96ffb311a5ec871663abaf1c12ca6d8462d7d689a93032fde061bf6615375b1b3e70c041956fba78b01a645bff534424804063a281a0960e2d3c9697057fd8ff7e8b0b85512dd3db047d93ba141ab4ccd43b46f3d1edbb353cbf263bda48890afe934702506b72cb1a0cd43de050251173e594d0f8beb9c9e84b89f9a86c28076f8c8b3c3914474b4784f10149c4ba325b59683f7f84adf76b8ea92ac819c018b44acb4e9d1c0e655acb4e9b56b48103c374904dff08f6419f1e4525ecdf19cc3bc4e7479c685c6bf0fc14e3543f6469550a55babaa0d2435e594c6970bbf4de711f43752c3713b68777590c249229ba5f54fb66dbb2aa3ea6d33571e6372164b4d29ac31998028ea4abb4aa6194ea44206735f64078ddc246f04302dad332f7ab665499def3f7b5e0e1a89d4331173d837f7b24d2216365d055425c0c83a28b9b4b1fdeae767734e8afe986b4aefea8e6ea21667f80345fe0b9914a54543a825bbc8fde19108061a182436b4a360cad52165cfb7cb1f03016d3f1f8e085bdc48950f049f316f4c8dbbc88ab87f468b3a4e0ec62d2d22472ffda79491d91194bf61b26ddfc3a83c640bc7c6392a5916dfd6a06e21c99d5a4be7106a6a41cf61312cba7417bf34f574fe85b423c00fb1066b9e553084c394478d044ad542dc030f893050d0d4260ed2d68afb6f813483600aa85a9d2e99680981b1c4db965c5923bda3d219b3801b2ebb0601a38802ce8d641050ce8d1aa9788d7cef7b987f9d0ae97dc471e7d2e7ffd612c1d25d4bf31d09a39d5edeaa59c72a30ddd9a84be9a07355b306fcb50fa02d4dcd9f015880762a706daaf18bf9ff6aaabcaa14af72cbe273b76ff801e14587e42949bdf60fddf6ff5c95af61dcd21bf59a1c4bb6f8b8ac0a2da51b46f315f719a7ab710f7072776ca996e442f056c145470577ce4e4ad4c163e6e18d3f95dafae01c5c1d5a501877f22fdb1e31eb50078992fc7a08857c3ee3d953a4fed42f71cf184221caa774e4177eddc47ffc9a0d8b8a32c42533cc992e0f29e731b4423d23b5c1f8e3bd7158c33b473c33d8166bfabaf1d343508c0115df1e57758439455f783477c189ad12e0a7c5aa97e5554a9a8b576c528915512372dbbb79b3bf5c7a0db0fd2f62e04d3569e96d11a9287d90397d62c37b050a579915bc91acf299da3f123efe55224e26dd1cebd16c7b6ffa09f1c5e20053a8cae0df03cbe34a037586686102e2dfcd2db2096c0f628e30b5d60359fee467f94664db78d9baf172c3c1799dd8a44a9189c0d88bdb52f056334cbee596e07ab99a7ac94c03809d69f42c0b3456cff832f5827024e202d07c473ead93b5329200c4aa79659b490314094c0f5d2319bfb9e30e562a8b8a5cccc76437c80432ce2385439ab53850068df02141fd29d424ec819ed64c1cb117a3001ed4efeb995255271a3051b2ea9e2e6b11f3d3ec270e0add9fc34505d637597df95c48ca11d4ee537b1c4492998590b613235a52818d061f546545d7445efb97da0cc9d435df3b4685a8790818b100c72e7deb26fe12d31001ca7dc54a312f29af4171190d03c0c821c7cf063e5f033476aa01553c809fb4c51a15f72394674fe6c558336fa66057ccf4200158bbfbc68995b48633ef39ffb15d1b824b3b276720b2037afdd520ec9ee865f64acdcb1e8581c9da1557066b3d8ae3bacc1f73018fb2b1f21ee9c4e12e369e4c569604f8c48a30ba9188f5c97f616530ec7745d8a5a50566d9b81cf519ce90e7eb09a720a5cf8cfff74c96adfa0f5574ec0566780a3b41c4d0128c74c82d45e9e59d8bf649326c6372f71b164c0e0ae177fc684d3f65fd218084be885a4789f024caa8e9e51b909be184e237d63eb0d3f0c4b137db1be7778e163e98b33b3d00be357af4c690a0e7410fcb6a9102ee8d9de17627361618ce00ae71606cf3265c2aea566f543873fa6dc87d28834f44c2aca7bc2588920e4a4b72c3ee4fb0abd9cde3e5e5ebf38bdf1766a672fb981a4dcd76d75ab13693442b345c9a79565b658b36c12f903ace7d6c4be72ef28990f4b18fbc3d8209fcbd1260a400df00d8109ac7a608366e0b3329d249477a501e6c45206289982e19867e4a60fa87b5f024cd965fa207702c7e9a7cc35d22a7fab5db29d11787d53b7ce938524f14cfca69c4a14a4785f4d2f1b877aa9c995740468f5e1aea6719f2c70ae5544daebc0d5e3582b992391c9a89c6d0486b967a23953f5b938d08f97584f062aff9733d2159582989be021a41bd7e2cce31e87067023c6a6f5d2218e646d6d6081896c60e9ea0a301e16cd21acd136ce0f661f05d367ff80032913b26837709cd4c8722b3c09cc6152475797675c4f7617f17ff4a86d9412407ac1a8e18152aa8fc6f529bd00f4985ccdb9a489a10e95403a660725959274c4d75d014609f42a3490ee472b1d936098972228d6886a0fe9501e4ecf8a3666544054c83d4dd530b773d7ab08ec24cddb919362008169bf3f3ebb20b1faec05fe041d67bbe26806b83261bae4ce91e8c04ff65ba7e55ccce3400a13b679348f6be43a4a107ec1b2c52467bba8af66ca1e4066ef6e65e766dfb22af4cdfe64c2ab3b5b6265adeb5579a26be6a6a662c3b707012b4fd74898244f3845ccc904adaf728f97356b9d03404b7a792898e0bce498f240a3752106411ec31f37821bf08e2f8fe813ff565809eecc193e4eb92ab80b7e5f6e8ada4da118bd276a5b1054a39241a078592753094ffa000dfa1ad2af7339c4a8399d802561956029dd9cfa441b6808ec32df3df9a4ddb24668916eb1f601f99f32a488469e9d8b882d62feae2d2f4ce3cc0e82e3a4433a7684c6991d33bef0798912c1762436d0c8e1f2084e06d8a5721136c1f5ff19037809117da85be3eaf7898af61aaca3a3c10f540b8fb891d24cf6071738f8ec51edbf684da0e4f0abe4539d42f69ac108166b82824078fc13c12c00045a8fbb14453c8ea6f80e7d3854dd382e7a681046e4a60cf1983afd4a2320c1eddf97eb45fabc1ce8776fa4bfc9fc4509804fa87bf91f3a56b1621f535b7ef25803dc435f232b6d01841412fb644e0772cc44634c0b6276d7b8c5d38470bf89eebe927187f3de6ffd686ded497d96f37c7075fdd3f830182d382bd55c3d4f472149efca3b11334e11e8cdfde65de7157f1d0e47227ebedd721b899f30bed999bb07c5ca9af6fb476360a7dc5d95125e9619be98a905bf80a95273927cd0072bfe232cba4e9706060f7b65a52aa2de5cd4b4b5bb67bf208c3946e34de57388f798744050b47b0bc54577c417c7c3a290804af081eb2307f7cae62fa621db24dab8a5a62c539c2dbe5f63dbac3a7216f67a7ea38b42b3914d29672ea04ff46f0e967af5995cdb23a0ef417b0fbbe9fdc2f8db69167ba2681ef01a0b8476bb10c6f95e5eeee5dee74d687f84d8637772ae6b103cfcd3f1f6cd5d1e9ab5be9d5b36ef04370bcef87a978a4f6402ca261bcd427f25acb317a0fbe4950cc3d2ee2f95915ae310cebd5c277a6e5ce2b5c5820f808485e3f579b9bcf9b7aeccd59bd4beb6ba851c008a6f3c8bd0448a347235e9642f9d4c4edb79660324dff2b2d8980c0064a6235d9289c9d36cace1cfad8917fd7bbcc826bd81e5691a6fface93ef4cb673b2c7c45bfa6671c724dc71105a64f600f11932330539555639bb7f008131b7ff6b5a89053705012bdfe8ddc174ba87d8bf2c35f362405753a5fe9f3fdaa876cd9a42669b1f7bafaac565dd1b73f885bde71e322aec572fcece01ef0eba5b080f88539c7c2dae41b31f12124ec18ddeb64e6adc10ddeffd3eca042ba880ddfb024d99f6a03f504c061c77215eeb4715b46cc53cdbe3271186efe0ded832724815cc2ac0210978a19307758c456b01fa7b77a59188a1ab258a70b2bfff438a9672cb3998ee0ed6fb18adf260796f3a93d9883d94b42eb76c2e9bc56724e7221fd8032cf92e27ee6dbda1da95d0cfaef2e4941218cb7fe0629800c53fd1c611bc3cc2c2fdd0da7db82ea6fa5eb609a34e2368a2a2ce58c8637f29d6e35c1ea1c229f134d2c518078467f4bf848b52c24eca3636a7ab8d195ec30348dca2011e75f926b42da934a69c42964f00580652cdb050ebd22461a6dadb2d4dda6b9f7e5e9402af9a880fcfdad4e1843ff0c199b4e938e80713ecc9223a4ece38c34a912c884e8c6e3c40563047488a0644d251702715fd0a137390a1a1d90954a6788878bae417897169300b30b9138074dc0c5bb1faef0632f9ebf8d0df62617d27dc2443bf59e028c3938c6594ac57e6493f980bc5961d90641d5dac5836bd270cee681cac345afc58c4110081837abeac38fb2d06629d7805b4b7a2fd0373af0859481632c1696d8ac921847f0de7beb82da565823362b771aeb408cd42f4fa66f309a7a8ae29061a49ac2542f58a0323d48fdb395c923a8d382ad84b4443dc33bcf7d7fef35a67afa6f06bf96e5183968a457e3e4c888cd63fe21bf9620b8938a68c63947af52da8ea5dd13dbb3a642a1799f7242528a7cf7a25cb14e1acdb924e099678e176a44bd02352d4d9b0e2bfc61b0b4a57b6c7ed22cd733d39a92d9535f2bbd7eed1b3f04237c15dee04b7b97af1d1fa01119a6be1c2f890f027755610b702509bdcb9d9bb4a422ea0d55be7feeaac409204ded55e02a1eb91ee977b6459e4ddbc70affb8c6313b1fe2c0498c3f6d3cd33f933d1db4ada5fca79acc64ed625ce19a7c35e6a3b7c5ada534b6726c0dd2280f4ae8072ec48deb7b5de380d4bcc47fc033829fdc50c11910e853174d943a127129a97b7c73c5d0f3cdd6da54571445daf8df5123b5ffb2ddf46fa56817c8627d66bf213d6eb34d34ece5d95eb6cee3db60a9019167e848c232762b2b76698b2da71929c8b87e58e7eb66b3d2b742a070bc889c3527eaa82f666f1a3ea9cafcfbf19964d59f51695871df554a5f793bbaa72619a7c0e9b9896786ff336a3f74752b9019d75496ab0fbbd315cb9a5dba57e2df79b63f6f4e6dd22365194288e487668efadfb0bb95bed1c95526aa34429f8c6899b7bfef4be29fd41e458df48dbe329b0560f84b6abb032da03808d7bb84e982be012722fdfca9b2d16980220a6e968b6b49017b06e9146490de68fb48939ea02b7487e363b509e114a87dfc2ac04706523fc00ae23064d9fb484e1e3c3b3e3a65b4a19926715a19887ae7684897b3ae69a7290d97963e41b85b6503f2974d07e5a3a260ad79660ae106cf72c226b27b21df1db138840e228e4762c8704ad6bd68174de30fe0105819366fff51177e4eafd97659ef68f7a7d207cf62b72428443186495232f45ca757996f9681333c27566b29087628e091287d40412fd39421f66ea536fb6833c9c3e3160f2815dc2b3ede382e9cc3ad4f8413dd5ba68379af1a8b4ac27cbc542e79f01ff5468809f12ab847cf45028865f26c2a5ce7540ac3262dbcc3caf11dca88d4c23207e0e4febc7612d05bd798c2ad36022930c51839bcc5595bf60af2bc30c6a5c4985f4e1b6c663cda153f3328156445c0da1b8ebaad673b0fd2828898d24603b6816c99efd237b38843b57fcbb3ef827a80d4adb795d5a7f68eed7745d83ad280c668db10b1342800803be9b29a672ef9a34d3dde523aefc0b98aa51d446fe3a31020495fc3dabfce6a744ee18eb37bd6b34ed84c60aaf817d15dae68d9e14b9c2a66655ae87ae6d873287049fce7852fc4d238898ee59e0d2af26c598902e974b02adf52fe92725bb9a66a5672f460fdb6e1e5e886d19773b479fbe541988f22ae08ed999f0fe53903c82b149c91363c913bd8d588e386c85698462cc6ab41267bd57f6a51dd7fa8a9ee9b4648e7554b897c65bcf3f12c7241f40dee296ba51c942cbbcfa031b0cc307190ea055f2d665942f8b54bd4cd9c94437196140bd7ea6182cb8607fc38136bfe65fc6d21852eb699a7b1a9192d26adf2fb480137df85895e796c634c0629c8b8de0712581d34cdc3e8b3b7589e32c300d193ad63d2cebd66e70889721cd411d77e437ab4f93eadfc4d8910b087cfe9e051c569ffadb662832712b3048de18764106c709e60d2a0d568e920e5ab64e3ca034e730397dc8b6095576f85746820819fce094f81a288ba613138d8f70a1fdcc0337659923b5aab16ce80f35ba5992cce684320b83adb33a0bd4958afa61e5bc2bf714d714f26940b79e1d99b4a26090716cd9e7824414fe80e46d807e6bec106e40a6909152d7ba79ce836d4d71146ddc990c086efdd97acb5b00830ebd1810464d7d2f4626a6f5601121d2c83ab62be90af178918c5ae59c17668f63cff3086c377e5b5ab3404b0aa8cdcfd9462dcc18ac3653bfd23ad5b8eee152489059ed4a13e706b394cb99796ad6f99816b61b7c62369d2818dde08c458de7562bf4ccef57105ca4d9370e8dd3399dca580e3055717b57db8008be01aa26a48f0559ad9bd6ddf0e3eaeceb537a17a04e20cd0cc5013c83640f7a317115c72b244abf0ea49285c5e8865b7013974394a6540c279a761e3fb18976751401a106489de5496722a6a247a1cf6113c39479708e7daa3eab2c3a482c9be12ba48cf692e30a3b147c8d3634bf69435258f351a3b0e02b8aece1b9c812536feaa4c9c744ce371916e455e06cea32f6e7bc09cd794ec69d1048ed62dc0f62fa1f60013deb20ba97060d0606eef5447f3c773e9b5422db7c7647fd6195a6d990bd7147bdfafde2b0417f48513b5f473dd0bae6e8b9d3a0a00fc870a6542c1a1e756fe21ee8b6bfe46e43227de62eeaf132b257bdc71836fb51023893c1109808aaf940680390e0547ba1c5cc02986cb7efcc6e7d661cfac4f41a0b79d7dbf7e2fb33bb53c509c546f95513e7e5d19807eec110adb8eadf86f27ff3f4530c8a1b9e5ee8a39d5162c9092dfa84c8c5259ce06d7e7c66fe724ad3a4519eb6dbe61efb93280962c8dd4ef342de01da9e7ad8d2f8e02f7c1096b77fd488b2d847bc920f77be6390d01b7b273bb4e829c5afb8d34291594cf70bd0f8b1d74db45b40ce3c1bceaceea57ee4f6ecfd1843fdc25b3feb7039f63777785957938f12d3faeb283e3556b7337e24e6a3457d7b9cae84d633cb7fa4b5c3dd0adc9024a34a78c060f3b2c81795f803d287b6c9119a41bf52601ee79b72306e14805e34c0d3495fdc904060402dbfcea5301783163d2b30eed62807b8660666f909c462743852160950af02680ac8ff756a4eed62212fca4f2188afc9a3d6e509487528a6dcdeb9bee96155de11ca5b706b18318d9525e57cd85efc2babea46fc7df75e0380d8af23c20591a22b6c381071fc8d37347eeb3c3e47f3065e449e2d3e69e05b1cd93d060b94a323d2d568b727ecee506f1e2bdc9ac4fc2b61250cc96dcd52f6f304e518e77b5d2ac0f16029c3582fd0f010d698bd776a82b57bfb9cbc4eba0f68c272b548806669de1d0d4e034a50c6ff9c35acd40bdee2e434c938a3d4a11a394f67fa90eefe917984e29599fd396553e3461b15a213284857aeb976605ae95d3195c73a82397c4b832425d6819c716c9b40c332324120ae64282cb957c3fb346b921e27f1e204ea7373ed47d960ee97690d3d17e7191addbed6336ce826a759c419460058f1eefb7d82c49ef491c40621f6872deaf438651365697807db31ec9990bee9ccbb31bf8574f7d20e256a6a0d671fef9587d63c1c75f98fc5cdc1d60896ad4835b84bd534769e41ae80b80f5e7e3044d64bd007ba39780c429fd1f1435f0d4f34f317874f48517482bd0580f46cc35a41433e740c0801cc4252ccb2b6fe29b31b4e00bb82517cba31870afb3e1371b71b0e31b7bb7b1f2dbcdbb8bf88d1ddbc070f47dd251e148d28fd1149b4b1a14d2069858df230ea9a498f23aa0f86c15993c4cc8eb9e4d6a8d37c4c84d75e70652907263c5fc0d877b0076763111d868a682441b9a2b74bf7a1fe93066d9577563278770b0b4673698cbbf6901aa6db22974a2d34c0da4879784863c0a94817c409ea0d3a681fef53a2ab6dc7d12762c2160caa62666e092acd820580d904da809329dbf3f6f9467e34d7540a224116b254c6e73fb57c71f9106ab6cdf31f6f5d4ae48412210ca8a0a2d9d45c992d01ae87623a44b4161a9f1e9bae92365864270fa1350a1a62b1bda6ae9ffb2abd4d4d4fcbf69a25d9fc090352ed350f9e07203eb7bf22103e0425399a74c9decbb7657b4dd34314e429acbd6631dcf1a2e6cee87173d05e83b14f573bd8d7dca3be1f58609918a8c69da771a524c2bed7406fcd39c9978a3887a493c23701361b36992b0c8e284b490df236bce0ae50fb2b39b29f903368a0fd734943e883b75e60c9fb35d91d5cadf9a53a5f6284d16ce50695d2ecce92d8bd6ce8490f85824772edd7891ff1667b936a5f2e7bb659ef5a3bd64d5cd93ff16e09e4c7ec283147d403745f5c1efdde29b8c97ecb90854db6092f54e294966c0f280ac9d89dd8c71e994889391ece34c0bc068593b59b75f9ecfa7ca9f98cba2727415cd39ab905e398eada63261a80cdc4d592a39c93553b40c21b04278de4192c03577dbd3a3d4381ca9cc8d506a5250ceb54dd91424013bb9e6b5a5c6e5c4b0cb0638dd42693055fecfe83325bb87a8514fda0c8902d6924931c8792a46bad9a4c5849b437d49331a7d6fc1228b029f627e209dd8accd64804406487b3cecebbf9ce932cd9658a74ec5233f631983ea425914a702901d89a26715284bbff230a330cbd76cb4414dea30ea57fc8c6884e1055994272b71bd8cc8d2cb41762906ab56a9ea3a64a2607ea148cd84db0f5d96de139a0e4404a33b66e8aa5569ce959df62f423086675086e010feb2633435d9d2c8e97aba0cc9814f89ae5cb50068b7a8f02ec72b4e3896076c5f6fa9e57671bdcde1f4c2b6a9b1977ff1e47a12e42a4e09a1b9dd3fb188ea01b2b6fc9b3482ef19d1ec9301ba0723fad29e3c6d88aed2ede94d7591aec53f065c03277d50b7672bb1c79174d99eed3f89c93d576b474296ceb39ac73ba7f2898198433450bd3e1e69cf34cc5cba7d6ba64291dad41b51b8692adf4bf5f1cb956326072a95f54f7e61fbc897be66f79e75e431a3af73f4f5209ccc342b7665d031d0e75494adae7e40bbfd983f9bb41cd2ab272ee11e12622c9dcf788598f3813005099cd28d7d0b44f80680c9e0969d611010f2ea5309e8bef9fcdc156790dfd2c1b720b9c848406366875867d46b803e98b574374c298156d2a1b1293bab28b57d2be216d8da467cbb26863c9a349d93b32ed48518372dfb27d44b2010bfbc6b55bbd04b7783ed210c44784b7e01cfa2d25424330cf9695cdb1d7f4f4827f0e8c53b52f705184bb2180a0cfb4debb17f61c6fe554aa48b9ed77135e36295e75814f50fa0a2a336b6056f427021bfee3d10b34ea58c8bc393e5a4cba800017a4309cfb470d140b8588f05c2c0150984a3c4d97684ffb4684d395e4d0421b291089dd7f3f900b17466f4ab97a30bac70ddae163b1b1414d52959d1cdbe9f251db9956988a5512816cdac3689e9b7aff17b717fce21cf300224a669ba6c27750090a741c7948752b91bc1159d321f3aaef5af3e3af5771e3563009c8d1166fd613b4f7f1eea8edcab5aa1254ab09fa0fd4d02eec508c629fd6d77d1b6bb043873682918fe00c7965c550e019b37acb6671b8a3a9745964c82444e1380170b374cbf6d82b24c9747246a609a33dd9171c5563c0a671407a5e7150c98c8505831d90c42bf581c2f0be73720f737fc76f107ca4d707290a4a91a6b8385f8f2218dd823f70f602e8a400927e78e6c9bf2c4a428080f9e42cf2ddc433ad9eccd801e1f1bb858201a26335c8b5ff6340ec1fa827737b2e893f5520237246a9f02b62f494809dd8dca9b1c8f8ee7a1db6aaa84bb72e492ea53b16719ce4a31f02e71108cd22bbdc09ef56f4915a4e020a58740cfdbfc36101588ee1094dbe7e63bfd95ff8c551ffd20b0a1be200bd0bd2ad152d298599b32fc4dbaf2e4cac73741ebdedf74122135c64a2b6bf3a5315a58e4afb8a5084066636537eb965e206bc06ece9213c175db933a5c4519d8e9fd16bf028b8299aa69cf9b89e26d75e03789b9ac1728119fd10d4919a920b6018fb8406d76848cb0b92b39dc1a8138b6da4b105a4e546c969099f2743078f35e5187267fe1c3387e8b99a411ecebe80f40c797352af6b575c71a1723ad51e4a676a60b552615a2a8380f8e487054dc524cea7c74c24f5e1ca8436cbe9f7566f026b5d9e05299743193080051cacaf146466310ef09398a8d474b7e5c9253c5cf3571245d28e719c37b2dbd5d5b2a39d0b46a40274ee2190de5462329d22489a7d10f50e3a2c73e84098d0626b494db53334e438e8536cc0ab089d8e42d4cc2e97b2f87ba009dbd214e863bf62295aa8b22371dbf366519799989457a22df4229b7d49d95bb30b844d99f56422e1afcfc3ebaeb1ef28bc3a56ed64ecb6dc2f922014e55c0ac1fea9ad34535058055998a79928fc816e9a0cab6a6e3fde264cc713f181066cb990beb2f119cae3c42c0398c2d1f0ab7abd477ad65a745123f70b3c08811652ce643a5b8239dcec5bbaccb30cf51be9e3c35a79cf75d5a23b40d18d5be8d82b195e9f71c832deb5ece0ad94dfeaa00a958d091a05c1bc998ea8a08c617ac69800730a49423719ef10436c5391be3ad78aef6dd8b921f75a6ae5be8ef30dfac06e4941fe2350e8e94b84a2869e117fbeedf25592121759c0cd9e32ba350682fe298650f3b0941b59c10cc3640ac8624d55ae1f42c302c59dee20aa50296975748f5c75a34a65c2bb661e36b4727ccfc0438cb1a512f8dd369ae257dacfd24e04b309355a329ede8161615ccadd2b17f8b87bf39a8473b57b837409876f25f5598fab471d690f7cdc12572f67bd3a1b106ceacc41f60fa7f5b981055baa14c3f4d440ff7d55fd27dafab1a5f8ad0071fb53c18a81f577f934a3e1352a774cc93b886624088f155fcbfe18e40850b7f02ff646d5d3f33669b20bcc28114b5b9dedff08ec1a14fbb886a5e2e573e0c9d3150f871782928ca568140b736f61a21e19b7f4bd6c090f1013372fe971e00901bfda4a27c7e44b9e192570a8499d56fc8ae622217bd7f3f74a8bb7c4c727db28f77ebd52bfc42f4aa724f10fce6380e871976b4145147342ef669398056908e210b9893c5cab1fea3faa73df13c09c3bfb7c1ec74c2074d45358837e8d7195952611944dd019a74d0f09aeb8bff73f2904dd7f71dc35c4983bee44e061ec3778b43578f10a6948b3f92124ccb5a0ef87424f09f6c135dd22fed37c08738b81c6f01cfa816ffcd320f7541733e8341f0bc8a1e7b48ab8de8d7274f9d60091955681099badf96e090db8d8204d424dc564bb6e1e54a0c817898b119e71955556e917f1aafc9aefa60d5f05dbf29c299b4396a3fe82011e286e9aecb74be9ef55dae98841b9a6466bc1c1cf33eb6000ed6ee01670c4dfe2d2b5c2069573df48ce8cae6096e3d8521675fa6176d1adcee0a71166017df3c362b705e82e9509d08caabcb21baf72f1a0300667a5ad7835039a54b7c8123f5cdd8239c1ef63ac240b5dfd29fa94ce29aa042e1074b7392f56cd3a999301fc0d27d4be7bc6fe0319232756fc9f36b4d6b12e843a80a2d95b6b27dc2cf20b4d88437ac504f7c0636ac61b0d1630126ec79ab623507b028d1149018257f7522a398df1ab229fe14cd93e684af177a6b1f51fcdf3694a8316772f4204f562b60885ede3c2ec973af660a50505294abd1cd347ce4f72c91e5bbf2230986b1ab75eb72883f2df79b3f06c33f90e27259a4da172a4b74980d93398f884002ddc4c8fdc2442919295508bc2dfd62ae27fecf26aa1a81d505361c38867b3560f7d9f41dab7782345fa00661f5911a2ff770f2f1c29654bf088b439c36f79b021600d5189c5d9547655591741d12a537c3af0e27b38e1076d44bf4c5ce729039962c893f237b37538f32db4adb941e77804f71cd9ce3f9fac2c029a592edf4c3b2435df6999bef12a5a979fe02c140a693824f5032c0a52ba9dbb7922d7e0d56aaba4881f9b336b2f62eb09035ed9f302d654516a41ba26866775383ae76f367c643fa06ee062dd8b123d7dce41db20bb4d3e7f13f21840da39ce7909582ed80fade76949a5f686934b3aa47580c2f86c74bd94064c260195733c9b1936fc63b352bb2a875bd21f14972e5be03c0072cb29c48dbd9788a44db6d0440380cb7e4a26f250caba260c995ea187d94a44e826bc8b228e90e582d4574a78d5f2305148383c29378035d52a26a2720d7d380d39ba2142ce2da1c849e08eb372ea03d51323db9f249865d419b087eb8516476f6963d37f25d3489c226c1e9a877c55c28365b8d3750b9e0dd51af9d5b73b1212fe66441d839bfb3e4eb613cff48acdea5cb7564a330b9cf6b52a32833d66a162cc94bdfd7fbfe70590c4dc91da1f9b500302c7b843f482b49a52cdaa5486166402666aad7be12542d96ccf9bd2317663cca0ed31a2186c9b5c885d4a9604047cab1982e8011e4c53af72efc4f3d419ad664136ebfe839311c9b5142f378529169e8e4dba503a9ab76b81e14457487ef10654fe5d15f028c5dac11e0945c67d73b4e5ca4adbcc7b2190b69fd91bea01e1db439e35bd1ff80bc02284dc60147766cd423d60bf3ffc615e688bf49cb1eddd6b36687d0e5eeaf66e944cce2fb03a453029024f021f497c3de2b4a8260034cd9601085af7d6afbd2903caef05cd4ab7775f4552f55ef28ac3a9ea5df1b19c90f5901aab9c049a107e39595837106f89c5b810d8483fd8f97de4895552ef81124daaeaef62f303343a1b148aaf0d5f2d8c27acbb1c018a9c4d0e37bfc3b08fb04ab042b0a4977042115a9a5b701712effe2081b08e20d4eeb62b9a20c8ed27a4f5fa8a53a4d07de7e471a8d2c9fead992cf9fb232488832ac55b9d4f620f3d8af82637e1ef8d7d44c5ed37e046c920c4adb735590d49fafeddf6e031d0337ae582987abc5503f874632b68003c2ebbbe9bcd35a1bccae782bed84b2285c7ada5db5daf566c200cdd29547a20de7d0886f0648a9bb53703c81a2843994a2665a98ac7375d2dd21169b4fc1046ddd807f754e0e111801eae49db4fce67870384b13f438d051566dc67eb936e5a6d6baa2843261635bd738b476d7f0eb0bbc12083b66a010f28f3d0f0c7b5af11ea78a13c73001a1d9216bf67bb6382b500bd1cfce8f7ea39deb024a81e5f5a1a1cc4308dd4202be16660c93d3ada268386d09a26f3a6c5c14c9a09f0e2a7e375b337f5caa7a29c935567b3043b61b863ec779a8352587b90e0d83e0a5d5faa0061ba5ddb80d319375d16e0d43b1f9afc2177ef7e59e24d53bcb78bf0e713b13ab31089b6c005c8b84eb09ffdc716bef5e2c37edb834bf35d56853e5275f742bbcbb080d84aff81d55c3efb02432111ede56028f01b9283e0d7a0fb24d757d05036965a1f5f881f24f54875404927c3a18e9a7b67b29f344722ffdff68b3f30e4962f8f4433f5ff92f89c7bfa8ff531d7307f4a55b802c58e4edef3242d69fe7b95a79b650cbbb90d28996275484635e941a8d55b0719961a3980501609d10d994f006b488f0b7f3042c6e77f8659ac56715bdd4ad789a8955f309a2f674cab4b337be929fe34a9c416dd749044b23bee48034f43498924ba79f73de48cf71419bf8d4945f3d18e205a2ac04a4b3bb171c672b9773c1b9c62416e3686c337efe42824669474ef6df02bb1c88e84512633cb5c9dcf8eb56efc39b56aafc3f1a06edb6a2864cc90e00a827e33f437287f236f25f73b96cccade802b7aba58d7cd0b75834a2e4fc5c4392da0cd9d55c3c01f2424109aad9fd719a9a1b338365bc10cdca4ca5583537f41d7678872864d6daad634ab509b37e5b1d22ea159d988dc442966a74b0f58b45f91a6013129d2c25e932d105482b6d420d36005276d347b95667c3f5931b0d29c97f9a5152cb5b4a415646d874b65a04a29c2f6e43357a395e823754314496783426d4812ac41899609a2692e67adb67eb46ac9ddca5c0cbd78689e18311aec163399e310175634eb04dbbb596b282a72f4077ba33dcab89013b2cde2a098bb3609b597d580e043a923218c959b687a1a80c51fb1ad0c66d5687ba02d900b5fd7eb79fd00d120d4d3859e4d5d0086d5e8af01918b6c2a10feeff70650037e7cc8ccc105ee8f45c3115310686536e98079291ec96d7ac9982b6f98fd5f2aad4be0a826b77492a496c6de6ea6484783cc75edfe7c998951b70c90618e13a6dd29884f9759103a4758fe63de0b06fd5a9cf6a1649b34b54608217bcbbd03391220117411dc134c1f44eb0f252a7ef9a17f8f98af7ff1e1e50721dcbf47d43b2fa8d41402a9e0d1ccb179e29cb7cdad19ba8668ec2ead7ae40829d7a3164eb9a4562b5047eaf3661df32f9b142ba6bc6cb5ad294a8ba99ce7b4f0d7aa9c0ab470bb5cb6cc85c5ae2cf8e3f2b5664a66ff05ac024ad30ba884818a8f902d5281e985f0a62445088255f428c124201330096c229dd06009e660434de0ce429869138757b8b3d2c99129789ea3dc7d68a54dd4a945c9cd7ce6dfb7cd577b444f5b2518c4762526ae67f1eec5ab7dd1fdbcb8d76315aa3dbbda96c9c4e9d7dafdeddb5fb6261b538f33b75dbcbab85b128b136d6ab1498f92bb340a6da2b27ea2313a83a51326452d97360dbd5e6138d4ae2120b3a390b2df858ce57943c2ea79730295fd1e2521e3e0d3d5abf83bf80c73f0df475548e0ee2b3668e5abad2984c55cd2ba296cbd9384aebb5c341a83124e20c4600c4e43b3bc2589df92240f27ce3eee6e494f42d7500cc96a8edca59f42b8309c21086b4e73aad4e3931e97a86c756537f8cec2d4582095c6e60d0aa6af16886881cc18d7d0ab29bf6a98825ff91ea4c67c207bea0ee4d8e560f650a51bcc9143227bda680672ac47b3c73534716420795c1f9037f4f507d506981ed525342eda96b42d6d496d94eb117ed2a3ca45d43239ab4a4ec050c0f44490227dec989edb8cb0842ab62460a3cd09fe80e4d986206f66cfd664e250aab41501d3bbb0820b173155888981a1020c0cac0683bd4ce1e5a585145ab4601105162c5e55bc5e2e5070716979424b8bcb092e578ba9d56269020bcb0a1356565496a0a2125211862c25b058ab24ac5620124050b5a4527d47f8be9411522954115028ef89e7754eba8e9b82ebad9f37255c2b11240fa5740892a7e54d9f674e399930b5302ac0fe136a4d9436719bd296e48a69c160c41a9a18dd92a860c2b4c6f60446058c09b6d462f5419861d545730dc196ee22aab02558cb94eff07aeed620d0a11af59af0e6e42272d15c432d2eb548730b673a94df9bd296d4621f2b21ccae21d790a4433dca383d25ea7187d3535a8f2c8af44843f2bc9e6913ea834a95686ce6991279716a448da8643a031d3e9b0833a84495f0761a2e2e3bb21fd5cd41582523a38313a3c298817ac9e1644ee32d5afc73a1f1d9b8d070b1b179dfc6e52950878b8bcb3b1b2f468ce3e05c6706ea25a7e2c4b881616363c35dd9628b6f2decce3b2bab0dd2781c69d0b015731c38fe934d84d93534c39d7f9c8a93dda767c8e272e63efd499f96b93908cbfc85cd13bfb88bcd35b0cbcecd730e8ccb9af3bce17ee670b20adfec7216efec8cad408da14a9b3d44c5cc5954d8d24c0b8b64d5e2fd1637c8c433ff401d339f99f90b7a0ec6cdaf9b9b7f73d4cde24bce10268e523f19ba8171875443362deef440d8020645f2346e612b6d06e1f6aaf317566217191ba471a8f36dc6db6e2fea676c056ae06681f280bca156b2b01557b01ff645b27ab8aa3bb2919b9f4eac204205358881690a667893084840848a1184c007443a96cea84313d32179432f14f6337814de6a2b6da8c5a1aa5495309566504112284a8014850c2f904b499c3074050e9a30e4c48c9e12b558dfd989657c075ba5c85d82f502a947b2839558c6d6640321a5d1213a048233ac81054f2eb8428a3408a1e0044af0c01786988e96f828411aa43c21832ccca00d374a30053420b1c00a689062d6f5891195d1da4694360d598975b012b7588929ce740dd8e9d5446575c86568e666cfc505e73ab445b10161e2d0b7d84d07bb0941de0c6146210b4cd88cc0c4627dadaaf75599aa58d1bb3501813610d6a5aad4e29441559a38c39630153d66daf404d3c32e7d66a2db858ac850821cd8e0490fc8c085193d8c89ca546308c21acac002361c41c38c1e56a332a1176c210c5210412204382c61460f6ba2b2073c3183281ca108074e20c28cce180b93e2bccb5ebea4380fb32d29cec3d8508af3620d4dcc4a29aa5c46c1a194735b6507e07e75df24825ad298edadc906c263a924832747386f495c92a7142e61cec83b0a91b8254d38bb862656b5d89709d750f53c15cad5a4f5b6f359855b3319292352b2cdc462b1582c0b6115794bc2c293269b94028a23745bc2f450144942c2520a264652f4600a7e6129450fb0809df4e009ef80a5931e08017f29d50c67ec868d706753f853a9363b9f389953c81bfa193ba5506d41d89256dddd8da26d4a49465dc7dda9246f9c946054f4c8d42377e9a4064c70673fd710f7be6b48f2803190371e90325006331605a6ae211eb84c306319bc816b88d15177712351dab396f47235e11a128294814734460f2215615b4214303d1d42c8e4096621c139b7a52e64e1757747919494342b78d4a2cf10e62da9492bf538733abded2716db6654ae3b2d0c761510a875982b06e633035cf7afda50b6c805e16c46e20789eb954178eb81fbdabce6db25ee9e8570f798eddb580974495c495a843271e86d6ece3ddd67a600ee0765007710dc48e43c43406c6a00ceb3026aa21c608cf15c048e3d379e4e134700b8613cf7c079de3cfbb83f72f0117d89b98a33f724b6e7a0177721f578c4ccbbd2803f34fd7aa7eb481232130461862d6d4933378989a70ba9c5ab04c512007d9078debe496ccf33f31c8ddd3ecff5673ec179695e316ca9c7ec1ac25b8edd9830457a1cbb1d418af431eca6d422fd8ddd9a4071697a456171faead4e2d406caeb62138bd74469f1d875aab1fd6a63ef7e0121dcdd0bcc7beee2259844902e46f31a3b73181609cb633689edb9e299575b71d7f702e2fde1117dc003f8c55582059639cdbd49c85c24435cdc89d318bdebc875a4451739393e4cdcaf7ce572b6f2fcb3fccf394ee4709db8d735745d2e2e674ed8eb848b4663f4ae15960b1efd7a2eaea4b1fa952d09e6128c896981475406f3bc309c7748862dc1fc74260861ee82b92ba9c50973170b0c0c0884108659dddab179986dd55f6cdea6006463b125e54d09797b02a66fb1d905feb86edbacc2aab755bd655db41089a7222a1b42fb8c6568c888ca86d072662c0f5ab91346d018a5770d51d910961bd4fa0016ca5086203cf18126cc9ce811e4c42ca2317ad7916b89ab49cb604bd935e442c29409ccf504531715ae2a26964f885081336c69e54c4dd2c9146b90820438f4404a11662b3973228725413872021c58108423b395ab441a410813ceb3e8c6ea0eb1b32025794b626a1d957a44654d45c7e8615eee7ad4518e8ee691a130c39658524451644b9ab0a5095b62c196604b982259bdaf10e62d29a9c9931691386132849d3035e961075b938ed16f49ad862d8905964e9a40e42b2b67772679d22245a22708ef791e90905a8360bd49b0aecfd14a37050209690212d284028398780a890224a4a947b02f9010214d9d90a61625ee4bfc7540426a1748484d0937b56c4ba2312a048a9028429cb85721518084481102a5d6e3964465e091d72a4042aa68510a8152bb46654de4a9875a6cdabc02d3a33ac9f3c2f0f5faa9c875d2bd9bc32552824761b300bbbbcacd193ac1eb926614b5d65aeb1685b749b139a1d63077f37c0167001e6db265a48c682ad580a867c5092cff9d203c0c4b274c50c27d731be1ae1555b425a18a504530dd8216422778dc9664b728b628362936246c4ed8a88069dd6e98d8843e26faeb9a05577c1b1c6a169ad6eeeeee9d1a9dd3b56bedeeeeaedddddd5dbb6b77edaeddb5bb76d7eeda5dbb6b77edaeddb5bb76d7eeda5dbb6b77edaeddb5bb76d7eeda5dbb6b77edaeddb5bb76d7ee4e55e19332d965eb0e57940b504613fc4145e98c6ad7b1b2d05b94ceac26569424a9546adbb6d72b345b79ab6e03eabb32b23a2ac216ae88d2394da18623984b43c819ad26caae90f0faec7a76dd9c4f868c743d53fd1796152df6c3212a236a284f70cb949046a46544aa29d450052c8bd0343434e481193d2b4a8f720a3530c13da3f7ba4e35f5d829283db6307d2a4a8f2c98365e2d752addd3e78fe877cffd2e4a8b7dbba6ce0a79b332d2aba395515e198d4e515aa44e2dd2b0d6627759503ad645c15420a969903d5f4de2d01e57307d674517a59b3dce6e0d983e775270edba54adc55ac7ea6637fba69a8cc2ccaaf598534618ca8a1585336af1496bf9246ad1f539d4e25113b836b8d4751430bd6aa947207bb62e481c7a22104182ca5ccec39625938c43964ca9e79794d9b33da162f66c47260e3d12243ad00113264f3c214448094a308bc0010e1b51b5c28a3294e10b5fc00216aaa8a2094d904738824cb624aa4c188471b059e0c17b628633755f31bd45d9a2c81b54538bdf33aa29f581aa097ed7ebba08942050d7851c10425613eadc2b65840c2c28f266f6625d010b599037ac261615e48dbc59830485e0b0047f7cb8dcef2bf7657ee542331fa7b1efafbbb2727da8048557e1546a2a6544aaa06ee3d5bc8a9c0fda3eaf8f1a14be5ea1d9a7b22a28f8bb2f1fab0a350e052275a1067e9dedaed60109e10f549db6a5ac1a8d8548b8881eb922813fe15deed3f5f552b12faacb59b52faa5b448fa9721ff52a374889ea41dbeb55d787ca833afc51c9e1cf8644ac4a117953634d59593d4b2694ead624961930a5decd21d177c322951557d7b534a5809a05ecb31f0ef074f1ba5955105449b77eed24a5c5ae2e51dd8a24554e2d3e754abc689f6d150c2c33a08cb448bd27dfcd21eeeeb26f7ee1ee564a2ba32e84796554919a67e5210b42130c51a9b0ccc062c392159596f0a5c2a094dee239cc31cae1cb3b4a09e6e617ece6d7cd618b9bc396eba19a504d6f4235859733cac9111fce59456aafba68c10303cb0c5e118bfbb48bad4a15e9b563c195eba94f975d19ad8c5c377b377be15d19ddbb3262d53c2f0c591773769ea6e07028a48545afcf68b56a4addaea9ab7535ce8833e28c38236ee2170856a4aa546b7509ad36ac482ba3bc15612a41896b1742ef822edf6c6561b7bf6a93d15291122d691b5a32e509c81072f69adb964a2275d555750b9e97ba3d5e15a92aad2c55a6a55a4bb16a5c6de7f3c5e2732a01ffbdec9c75352a4b0d35d19c94b0bc9e88c555fe7ae91186f765b5725f5697e5d6afae0f9520162d3a12847209db0b4cacfaca889c6d9f8a4dd5be95518f12af6aab264f295cc22b264cf32a09d319abf6ddf3429639e3d46b3db3c020cdf0cc62834ad18c2b65ec932cae94f27bb1d8eea9ab752b5d970289705f3d75564d25440291c22316ac5a4833c228903585c565d55ed5c5ce7852525212abc989f584840422b16a60114803694949492b233d0249820587218c029f4279b42630ca7ab421fcb24473e80a63a048ae831553d5cb76b5eea96bb2dd141aa377b11ead73f28630e8d168cc0381ccee265daddead56f705fc2f3037568d55ebf1036bad7ba232169a47a4c71595b542d7cddd14cf0b4399c2ac1a0bcbf670b94433ae02de1edb765fc06f350cc107ad5c9777a0f5958707af0f95a019b7032ceec2e22b1667b1729672a2b2195cadab07b5ee0bf8956fafa9271f2c9f01de1721b6af9c887a97bbbc9ee5a69c688c5ece6adf8744652c5f997d4d4e4f2b67f1f044442e7f5d25a59259b597c822e7355371e99aba5a67d4a3e785e1ebf58b22a5a95aca4ebc3242bf7a82ae8e60fa54cde92935658886bf224caf923aa2321629242a5b397d2a29b544652c77794e2dc134a5946282017abfc0c4ac55e742d97439a04014fe66b8fa62743d5547ad70be9c9e1d1de493922c835535285f16c22c9960aa5a8b4d2dc25454307b649c5e25059207e64e34160795131110a8215c810b566110acc0856ea82264429302d290908e80142679c96477d0c557f6e529fba3acbdcade733687c3d81d5e552e3031cc7d1a661b03b9c0c431f76920179858e63efded505b21cd205292527d8240de5c7df7565e1772b90f95bb7cdec5e5af1bb4dde5f5a07a95fbd29733970bcde857ab4f86728252dae150dd3df529595660d5e6ac76f7ad541f2c4625d3a9a6f5582a0fcf75292f6cce68baa89cbe4e57dea3082a7b851d4e7d76dd592542ec799733d204122a97a22154b9cbca5f462d726a082b0b49f24897af9c0897afdc957760bbcb2562e5afdb81fa955b04aac73cfa705b940a13309714a66eea2865449f534628a32644c09a327bb627961b3065c58105af563390b22f29b5327ab9600583550b24cfd77de0f7755c8b9452a7042281dda3566b71a1504d29a554aa6e28d50c5b8e027fc0a3542a94ed3a4bf14ad5b66bd1e2b9227d46f35339f51ab6a7000ce0339adf5346abf75ca566cbb7a56ab469a52bef28232afb6a5e0ac55dd455a56a3524545393ec2cc59c45d90e6555b8bb22983ea76a98fb6a5d4da25855c81b5614240e3d6b0a2ba32394518b2d9e5155a04f7141a6ac90ca821c534f98a6c480e927983a2be95bd24dfcc26aea9b594e607832c319daf0ccf242185857905a90227d6a5e208d33ab6694dab6d4e9591c2a646d81e5851cd86abf905583c1023938f5ba8353a96fef5bdfa3ebd7ff9ea3ff5dd9a210fe6c467d7be70961541028e6842209cbfa3131853cda52c527656a7df570cf2b2d980f3fbc407187d1c84c9c6eb98e68b18cad1f2c2b3a2c14585199b15201957007150b842c192112ac950eac245660ce0a08a8c2012fa0fa62a8827ca99b0f0329944d4a099457835ac2eb607819e8b85887b7d3ca9dd6ed45e5c056696850a5335db16d79b3bdc11fee32ff36b0fbd76df5ab2f7628a13295cdcbfea921c7715ca7ea522ba857a8d262a56013a72fc3be37a3b543be90628b5cbff65f5f8ce4a181eda8e1439fbea6457d4eaaea38cb8477ee92a905824fca4c29792a0c4400439f30438b9e305042abfb4ee31d5a51e73e71ded9913cb355d4976010de5f767047607a82f052524aa1d468c300890b62823926de8942ed6c8d1484f9859b4a274f608125d5047ed1eef68ebc10745187e309263dd4444deba159739a138a941eeaa126fab6158f1cedfb37e478df97c91e1f9906eeef20c7bf9f237b8a9031ba783f267b0e5083fb33728ce93162e2cccb8c2fefdb16393ae0f32cd9f363e2cc1539b6388b1517c5fdbe99a8a53bb54dd4e2ec16dbb4a1b0e5b0e71e82d263d3acc12c921cde92c365423e6979c52df74507ec2d6f39ec0699543ee9b745d2fdc3a1c201aa2ac8a3df72f3cc81a47bdffb983d198009620d859348c5013d4e5a476016bd66119791cbcdc0ec9946828e4c9cf9962918e6e6c64d347b26d2d48114e7671226458c66cf6c3271e6c34bc4c40584f98fc54e3c93f4e843eb408e3ba4c864f64ca599347be61320cccf26b3672e4d9c24cc4f23b3675271347b26d311a4d9d34313679e0a234c557c40decccf7f2d3bf1a4625ece5f6ba7157711d31f609a551ce1baca73cf2a5a6fdbf2095be1cd7d98e77eeeb3ee435936373e8275d7556c6602b360606e76dd75d65d0fbf438edd849c4a30a539658e418af32cecf4c2ccc29324dcf9b934df433df69d6690e2bccb7da2c2710121ecbaeb6d5d8d5b9f9fb51e5d37b76eee7ba73eb4a71455eea3f2791cacd00707ebac8ba3c5340c7101cf306416de545201f9a4fbdd5df4c2c414e26a4b0a3ee79c73ce39e7fc9c53b6aaef89f438fb570855a4cc9b36866788678e52dfa765cf2bbe9d1cf134d6b502e1030e1f293e79d4624bdb51c2faedd3e3386e8ae0090d4edc9456be1c20811ff2e9dbe415c229854c9a48c0ed04dc5b6ff2dc7d7a9b493dcee9d4a3152d9b34a6f9a44739451aa0e0eed934abc07dafdb36f904d767f9e4801fd2893eff458330ccafeca18e36ee099f94c99e12eed7f9fa39eb99a4c94edc5708172065b2a519241b7067ef5236cd24762b0ae51296581641635def91507a4d009f30579f2b967207b2e39080394e0a2e8aaeeb6a98e338ae2b4266b984b9d318f722a88cf5a1499b4b9ee514cc71e1eb454d4573c92bbfc2b048145faf70a6ced144f17fbd5eb3466a24a419a59158e04727e76225eeba66bbda46eaa5cff692706bb1b83a7a45cb55deb5b4b06c37bc2c955b87e894aeebbaaeebba79170b24891907cc72957736875449c2051c8670eb5fab5a3dba666517c2dc35cc9da507c8cde6265da99c535179f8da7dae07ab915a89cac0da12da4e1bd7538a688c6bc248bd44877011956d2fd7cdaf22ccfd7b75465df7ea3a25f31f8b66ae087c9d9e68e5df592ad5f6bad7c7b772bf0bcd664e4e1798384c9da572baa43ad1fbaa1c775faf947dbd426a458bdcaf60028ef338ce0698e392c0ed2c1608cb5b57b1393e8a5b1688378493800d0d6195a72c9192ed34656b122a2949654bd2fa76957324082553eb66cf0bc3d7eb17c59c9d8fa371f7bc307cbd7e51ccc9a94e454647484b92b0d296b44de18638dab604090973af4ed4f3c2f0f5fa45312767074bcce2d232318badb855932a5355aa4b983baa7596d67d71a13c168ec6d15cf7ce92a44465aad38b2e37d71af753990a57247a54f6a98454d66227e6689c17b6287d8bed412f11d1eadf8956ae726dafdeadb5bebaa89d45aded74bb2f427cdff6a0d5bf6fd7872a68e5aa0bcdbe09fe6c341aaba2c5166a9ba97ea72742f57a17292d726fb99cbdb45c21e4ecc9e55627ee538ec21e2f2daf179abdb4dc1721e8eb7dd057fa96eb037ceaa91b4495688c3b78a1994fd3a425cc9d2ea1760e79f43e52a7374849cb83ea533709736fb93e52076f107dead22534c65115ab1a1ac212fc791122f5ef44a4fedd0e28f141ffbd03f5a913f15d753b40ffb56cde922466b1218da93c6555beb29bca553815ae0ed12995568d2ad24b94b36fe29665b1126f499bd2b6b431a1ee3dd3292a9b92cadd9226776a458f7489e785e1ebf58b624e4ef7bcc32da132394b525a62aa61ee4d98e358e7566f5a1b81ef228ce26c9e4ee0bfb34e44a47aeaab4ed222c715d118774f0973472d61ee292e0973577147983bc82161ee2cce88a3f592466a917be668983b3d1236d883a89e9e9efb0b7cc23207266633e10935a763851705f1703d907e90f09d2482bbeba7fda1b242e9894db85581390bc3e0e7379d7ab4a2652f4cdb131ade9a28de6a98aa9e9cc0200b386f52309da30bd30a1ef508a40f2488470f1ee9d95908733fb5cc584aa4c50d2ba1c4379b442145faa4262c5f15310a7a9f1259d9ff939f931ed0009f7e21ccb0a5c9e464d4bdb3cdd1222dced99c8c9c8933bb67cb9838f3d616bb73d7ab2fcd3595c9d9ec4e8bd4cefa50d8528b302a5aa45c7f7acd896771730dcca2d559e984065460ceb270db0f35813d55f89a739fdeb610e6fa854f07cce22c648c058be790c5b3878158bc5e7466e6b1586ca6a6e6ca9838339fd687c62cec331686050c0dcd692e372e842c9eeb5125b295c602a92fcee23e7d5bc910be85eb8fd6ebd3fe68e117965733ccaec19a3065799d7e3366cc70518199020c45b0eb5cfdd7c48a70e634af67085bfce6afdad811d76b5e6bacaba6e6d6bce29afbb2a3e6aed7dc15d6a870cdabc7c3260da1c4fd2a411d2a972a047f260b4b87e737d9b325491ca9c253f2bcfeb1b4f064f96bce1676bd5cabf9e9fa0aa8c3f5e962b9abbe4a1e99d7a73c7cc4e462ef2062ad97eb9c757d5a978c9d7846b5e270ec4141f011f33f54d8f5acc2b11c72e2c46a1eab12d7b85c1c17c6befae685103cd2b2d5e9c1a38fc32df0a70685deec9178de1cfbb7b2444a2aa0c275f59805273763485cb8b84ca87470dc7c0ba863beced527f7d8c1231da377f92a7641d8d2d0d18ca5b90f6df067e61f95f246c64a4ce3b528846b0b5bc316279e1bf883ba792be62d1887a1ba8deb318e334ff3f90ee6346dbbcf581a9858ece61f38f68faac4d358f19ded6e561e2d2e33f369bbc5652e33f316413c2a1278460757f31a4ebcf9079e39f79977b63f2dcc250880895d791ee6b6bed6bbf518d5cb274d7d8d9db1d777dd28bb6b6a5ebfcd7e9b79d131f3ed3966aa78185a73cebeec100f7318b1e6359fb7d61ada59d86b2c77d8a7e55c9f2e9a8e04e12ba8c375ee1ee1fabc47a83e1fb3f9e5bab5451887ddd7716caed84605c3c5e6316e6dd1e6de25e6ad20fac6b45aad98d65d5a2ead9b7b73979b9b16ea53715151715109411d2a5739ea0807eae80bf3efebee8207a3833c027518985710a85254bf1c06a6aac41ab106e63abc2d451de613dcf1721818a0067550d45f74a22ef7d7e79dc931e32085f00481b6f9a2637bf71c9b4ff3889dc67bd9113bcd6962b7de5ae5cd6c90c7cc2bcc5fff7118949518c6a25edeb212abe41ff8750ffcf9ae0c677c356345b333967f5ff7d2851f2dfcf2d7b997978b24e6f3b6c2bfec4bdf45655fe66deccb4cc25b154f2c96e5b72ff32b0f4c398bdd9af496548630c396b62416ec660fb3a68083d3763b0a73c56bbd9005610b2c9d44815604371c018ab9f8192bb6e7c53e4310660fcffcf509da97d661a7f997836c188c122651999c7935b6e630360b61984ff0072689ca562e64fa353547f77a21dc2e1d64c32e57c6c4a9f9f4a13056e635b6c5cc10058f449b5b78e62d9bc4c47d987dd9019ee6e069be71219c79ae47b5c599fbd0191bbeeb9095c9b94fc7d81cbe1e21eab1450b5bf34a63256c892af5b605b0c51a9ad37fae7f35b6fbf3cecf1b84161967cf920a7ca984aa84049f6759041e9e6fe0095b9a02cf2c9f8c369e653d9d7bf0b481e70c3c473c6f0eb2c9106d9e587c2763e2f43d30c7cdc557a5986dc9c6a432d5685d6e35cfe9ae795f05fef41cedcd776cbdccda7810968703c0fa9c879dbd87c51b91ade8093dd460d2461adb1e9f591ef7b100380f3688dbb0b257bbf31b3bbec7766feeb3ded8a803ace0676cce394170b6d1b71179d98a505b119b063fdf4174076329f0a7ef666348498a6c506c4cbe17d4bf6f7bdb9cd9d3dd4b8d7006e29c8cd9b3e9e8e601dedc785e8516c19ce785a1cda5b4b9db66d33bf20ccc1dd6d423d0e961517acc717a1815e4f8737ad813e6c8737a9812e4a8024bc20fcf8d69304d1c7a1a8d77b8943be4c6322ea58ccb1e7d7806e26ebde3ee9857c6c4e1de1d775f6c1e7b253271e80f4c986e4745260e6d7d4b02b7241c3dd40842c77cbf3f411e399d8178ec9916c1f53737efc01c0d9e03795c194a40488a81d1e21edbbe0388fb830d4bb7edda78dd71f30c1cbb0e3fdc5c718cbb8dd8eb09fe38bb611b1bae621b1d1f06af8c8913bb5d3471e88d62b440ded0e3bcb3393a6cbd0fb6e7392c3e909dfdc7fa9cc7f270156be33756e20fa5bab17223327b36231f114cbf15cd9eede8e5e6c65b91d9b31dc139aa480b244f7d82bc319a3d95c9c8ecd99070bc8d60faedc8ecd9964c9ced68f66c496a1ce708a6af4f903c1b14f28669f66c4c7a788c234ce70d9d193ac4623736f386ce0c20c4dec5de3736774777654c9cf99b9b278ef17c7b7d559a3d554a0c1060b436a4d953a16c49664f6daa51a0a0df98dc388e9b9bf69004d31a975e46900dcf1acf3370fdccbea4d8c71626c5be8f5591629f079b9262ff88d68d81327b5c2eb87f63a563c35229f66b94d9d3499cfe0ca7eeee35ae0e3d56b6687319b367c65c19f5e3b113c7e68cd90d77313b3fefd33c566219b367fb4bc2e408beefea502f38efaf6a8d82e2baefd6adf725086306de5ea150d8d2c4a151b6a4aeda38cdc7dca6759b4b10c6e511d352da68b1dbc196549262689196cd42b865833b47e7b9a65e11c33d833bc665c6b3ccd0257ad1e11966a34d9c6ec17d7395b35779e20e6807f7ee39b80be1b6b9e6e3dac53c2614b3411ac75c191367bb8df5a12d2b7eb335ff6a2e63f6485c73f1a7e6ca9016c112acb94fd72b664f953271e8635ce70a4cbf0dcd9efa3471e8eca9564c1cdaeca953260efdcd670cc1b80e446d9037b44a71892165ab6d556c4bd8706a1b669eac90397d9d32f39b272c7318d70a4cff35aea71757a0e63ada465c56e21a2b314dfe92306381c8b0403abc83cd3029607a1a36c3ae50d317d62285397d1b81c1dc7a44957a840252685dfecd5026c625a8a38563bc2d122d1c2354c1de36ffbe98d7c0bce6d9c3aeb17598f8d75b1c81440bf7fb1ec1cded5ddb1f34b23fcec6ded9d8a76dce4e2effc0ddbc0479cc34123fb8c3d8b6db9120acf73239ad9ac3d45c47b771208f996f9f36b75a2ddcdb8ccddc5d2ccd39fb83f8ed12f46162b17e5e9acbbc823ac4cf7b84f8ed1ed1fa3cf7a3855da769dd05760aeec8d1e1eabfeec34f300898d75c8241c0bce6303633816be667d76ccd7dab69989b3bb0d5cce66e0e2f636e16c23537e6e1bbc6c6dc3c714dcdc37f2aab04058fb4c8027f1a441a9a4d7a0c42b1ea744b52f593987158b5ea353987c1720e83dd26c543a8eae8c3ee43278cb7cd42d8e6d55670070adbe0094373d9a3f82d76d931982b5ad922cdcd61ecce5c18b779bd47d81cf60677e41cf609eab039ecd5c6725547b5b136f6887ad8bf2ff609ce7cd2dcfc03f78ccdc171d5c26e93a3deedb0fb74cce61f2d0cfb4dd7b3723733816177792b0b553bb18dcd7d68ce6bec8dcd38b0cb61d8fc03bbbc823f32578631625c24aba7402526cef981fb9b16c279731138bbfc470be77c82414c9c7309ee68e19ced69b3629bb249d9a06c4d5b94ad96a4cab135284d5504d3697bbddcea14275c9f23ee5099c7bda244a22c6e0738e2986a4a4b4b9290daa8a334088d68b17ebb45b491ac6122fa4e0d55263ca1de56c8d05169634755b4486b2dcefa4e724465aacf8e325126cad4a247a97c5394ea0977a74eefa550ffaa8ad296de533676c466a9235683dc21e179499930adc59096a4ba2e7d522677f2d2f358c85032d6f2264a98696d3e7b5ce8399b0a5fcf2a47ab10662f49586d4899a60e3e29d32e00a98c289c81e033254aacea05f89baab62b36c02faa4ba52643b0ea6d5f546f61efa92060d5dbb67db5007f9caa6d0b1ee0af53b53d15f8f3546d5900410a963981bf94aaad6d825d57c09f5425d1e13a0297209c017f536e953637bb5525226f949a1401178143986bf5e99e3aa755d7a4e4f5a8a24e35d722dce7d914b8b2485498da02011fc403129e6589947ca74e5456699506daadd2684e116eb5f74ae1d44a45e24cfc6d17c9763feb1db41c0ebdcfa7be39bd50de805ee76dd4c39f45529fba21f53c8feb38fc5924db53dbc671dbd761c52ad59561ab3ad52acff33cfbe1cf225179ca7e65817c0f0224891987154ba4c487cae814fa9a5444e967373a85d6a618ac7955a41a7b2bea048983644b81174905398cea48e03da5fad702fe789e6d814008611585d256082952982bad084a2b8d220927ee4b9e3a44de50590d410c765a80e9b30e35c602579abc7143d8cf3544e2794c4c2114132d343917278670fd276b4cf047de7a4508a456271aab9739d12784f20de176ee928725c53d0f48196b0a2a183dc104b8b29230a436853bb89e82393e9c23b658ffd527218b8a1eafc05589f584b5243b2b5aacf78a30774e210b24dc4af2a6beba21a49c7dd158fd662b88a7954568830bb0049184b50de17ce74465de50c7aa3714d6cb2196528bf5950d617fd68b2e435c1b5ebaa72e349bf6a59bf7417f839474d787f7d40d7ae9bc07bd7417888ff9f0ab2711dea079a119bd414a7cb0642443f72e13f4de59aed0ccbb4aba4b1a0b69476485da1e34d6d34a1acba1b7228df5577687c6a62795eeacd1589f42114391a3544f2931717795dd417137e41d75838290a0b1be11340334d60732849c4980c6fa439e7c4225d1b83b9a45a051ea28cf22d0662f75cf36ee3c9bbacaaa0eda247a2a81407ccca76e5050eaa93b879033a279a27967128df5bd9e9733ef72a69a58cec01f89999c66e0847b086f97097713eeb712274499a042b56b32851892daa339b8b7ee7e3f67061b422428aed71072aa53597313f3c083e4e96f8244c8b40cf57ec7b8dbc9bb53c710ca5abf6a51f45e15b9773d76733aba73e790d0370824392b7157ef9dd131097a37a79f73b6d7be1c57bda74abd7eadb5d6babd627a20e4cc23dcaf1edb05cf39694fe4131c3db26039451ca02cb5384e2563f3b225ab14e7b7caed60e11c04d76dbb4904e15a6f486bb794275a7d00c287163912e8eefbc8af1a3e00e1b5505c8b7ae7ec8fd60feadb9e42cdee2af0ff509ff7adc61fad228c284245e532d1d2b1faf7efab14a863fe9b13357be6bc3b12a7cf4dd63f8e037b34313b90fb37a3c59eabcf79961214732c0b840f3d56ce3dcba503f40d10d099cafb45185144108ab9af704f6272dcb9afac38954bfbacab53365d8513fc59ade6957c2bd6b7ba4a503cef0c558b20c8016ca5fcf99ed3634e8b4178be5fc120289e18659554a085b9d6d6c2f3ce68b5d8fd9c19a2cc613dfea9fb62c0ea4b996c4309cf29c05005965380e1093e965380e108fe248d6fb563f3c43b9905fca1aca716756a3bcf2ca7caf2208d773ecf813a76be7309e6687d67e737ceb22c2b4fc3deb8047f80fcf4605d8243c8afeed36d83faac7f350de1c43279c35d823b5c2e5b047b04338083d0ed5e09d27f33ac7109fe20092f29fda4aab7a35038ec8b0f96b7e442b38f53d170ab566c3e389ac2bf9384f61f9d54a2561903d85b82446353a7e6499e9ecfeb6841670b5396fabc4e18a6ecfb6c7129653914ff15d2d87c0edd6e0eec1e12957d4ba82cb5d999b24429177fbd92e01e1be3480ca416a7c4df97b22eb396996bf65155cab6665f55a52ccbecdb5429bb32fb3855caaa84b3cf53a52c6bf6a15429bb9a7d2955ca82b3ef53a5ac6af6cd5adce7e002a9c5f93a8250e66d8570e6a9d9b752a52c6af6b15429ebcdbad9a7a24a596ef6ada852769b7d2caa94adb3afa54a593afb5caa94edd9d7f2b9489818472dcebf66389e631cf5d889878093f0ec2e9eb2344d34364f5734b516670758573debb838e19ac7ae53933c379f779977797a21499e89e75f497a947dce7a6ce394a5b390ca5c96def3ba9957b97989390c4ded26e602358eb9f938342b6631659411a98aba2005cb5e0ce94419c2f33a4e3406e6c6c5a9c7163c5d96a88ca64663f338fee2666ff69e9b439c5d965c86843a4d351a118459a7a6235fb6cf1ab167b9f442c4eaacb36e07faabcbd976756af2664aa5096e3e35a4ca07c7135e394f189284a1087f5fa792200ed498e97bb67b04fdd6737d42142ae42e0ed0bb41c8813ff4ab5456ba4a82e2e8915e24f33e3dd6f8d48152c3bed0fbbcd0cb729ab1a4a821d469ba3ab516eb19421b573eebd4aabce15e88900f7205b13ed4f20eb02e7bb4d0f8cacab3eed397f1f05c966fad8e3be2470baf78af660833cb899bb29537f1a3858f409d3bea329b85b08cd29b3b7af3cecab90b36787de89665e7de9ddadc49590e7db8fe4284ec405f0641e33b3cd81ca4318db3fc86cd13d398b1ac9cd1b012efd895e3b035199b7578c2f339b840ca348ce0f999cd3a58c0f3d6e610670fe936ab86f0bccf8b0532b1cd3a67c8e307f07ccc0299f863f19765712456be9d85bece923f59ad4799518bcfcb8cc88e644778f8bc0ca9c7fc224bd263f6912de9316319931ef38d2ca9c70c9335e931df50ea31db78d263aeb1d4638e390c153de69acf987accb1e3a8e2458d189b8136ea17b416bdda2b166bf11a2b5bac81798d1ab761e3376efce61e07d1e33cbc8747e6630e9f1f793e3ff67c7e843951293d6617df9e382b7accf6e0941e338ca3b0cc47c6838c66f37919911e338ec77c5e56d4639efde5f3b222373631ac04421acd146fa9c5f91cec6b66658bb3bf581c56b688e33196071eeee3738c8518e22eac6c310087d99e1fceb3e3a3d10e9f1f8d8c47e39111a9c73c634cd263ee1997f4987946263d661963528f59676cd263b651ea31c778d263ce591a3f3f52613f3f32f5987fd8e7c72a7accb24517972d3af5608b604da1714a7299225bfc6156b608136fad6cd13ec7ca16731ec3ca1663dcc6cab0b2451fe7b1b2459e9eeb60658b401cc7ca1601701856b6c8e33ab51e338ccfeb40e931e37c5ea7a9c7acc3e775a2f498657c5ec7a9c7bc838e941ef30c9da71eb3ceb9cfeb58d1631e75a6f4987bd0b9a2c7fc73d9e7c7a11e33d0773e3f12f598739cc6e7475a8f1949781f3e3f12e9310be03a3e3f16f59891b04ec4e7c7223d661f2dceb3ac20c2f668715e0016081d9625c5fa90c3d200599a1f4b03a5c5f91e2c4dcd63d2e2bc8ef596b4383fc37a4976b01e920ceba2837579b22e525c9c88fa06ed437d637583ea0e2dbc92c654eccd2dd6941973b30cad6f8437606e9e111af58df0f7e53ab5b87907d3b0b22b6453645680562645e6646551644d2dbeb4f8d4711f1ef37909f408f3f90cf408bbbd78732bc77ff30be82e6e86fd386e96f9f9ec66b187dfdc6c5373f30c1c8fddbc33fb8b9b6b609a5a8f2fa0f4186beab1264a8f379fa771ea51fc3ccd941e713eff82d6e30e87719b9b5b3172686a39c734351dee435393711e686a337e83a6a6731b34b5f1356eae813fef25e9d1e7f3de921e79f8bcc7a4c71bb7f1796fa9471a9fe06bbce7e616cfcd2f9efbb819b6f300dc2c23fb10378ba80b71b34d8f9b670471f3cef590f0bc8b538f0190d2a38fa71e05f079172b7a1ce2f32e537a14e2f32f5a8f417cfe65d4e37d8ff3b8b9c5e300b8f905800371330c88efb85966c77fb859fce139dc6c2373f30c99cfdcbc83b38bd358036717a71ddace108dd1dc2c8469ce83c504788fb56197e8b0ccd2487db3a05da2c33e7693f9dc071b7fe121009b0f190d9f9b6bcec3cdf7d2f315f11b04f0b961e32d0810d341801702b89987fb1060881b2f084000190f37bfe8627709efe52ee1b588bd380f45f07033fe8d2278b87122253537d7bc45113737df3c56840e1f4ea4e4c5cd02380ff8e6217ee33e36def37d3df8f3f9b0cf8994d8b8f9c57bbed8f7d22200c73eeef31a6158e331a18d9e13291122ec11d2b011d6b839c67b42a0181ae1771e550d9e1eb72a183954228f9b7b5e430500154f8f9bed4555a892f5dc2c7630ee121ed05dc2038221bee72ea1eab9d9c679ee12aa1e9e1329b1b9d9e6405f8c9b631cc65d22c44e1029c901742225e2cd3cde63e366009ce735ac47e3b218998d1a366a9c4889bd597c0c8ccbc2182bc46df4788defd84dd6437b4de3444a8200a27764304de32e11f600c48e2c3c2ab5f354ce4f6ac7cdb2efa47e48a1524ffd9c4889ece69ccef3722e0b6537d338ea2ea1921129d1e1661dfe13cab859c67b08af13444a7e7a3891929c9b775c46e3e61f8efa0e107709ef5e0e0c781adb77ee122a1a3b2752827333ce73ee12e16fce39cc5d2284f98994803707711acf407ce79ce5746e1ec067e3cd3a44cc60e7b86f03b8793c113a9fcd88389112d85da2c33783dffad42ed161241cf53012d68c9b612c1738b673ac19caa22e58b09b5d1c070bc789946c37cb74e3cd338ee32ee1e9dc8cc39bb94ba83092de686ff4444a66dcacf399c671f3f859e3989d4889cccd32df664ecfdd253a8c240722ee129e0b6f062c87bb840abc398773770915c89d48c90e37eff019ab9b671c769708b113444a602e4ea4e4de7c0fe670730e02f011802184e8c103004100b1e3071d16c77db0b3e7b038705c24abf7606777874663f3d882f7b1dc79b0db6f587a1b167c0dcbbdc76ee7b1f4342c78654d2dceef58eecaa2b4382fb3db9539d12b93d2e2d4b1359f6163dfc1beb80c7b731d6ccd736cec38f6c563d89b2bbbc2d65c190c1bbb322b5a9c17ed8b2b7b6a719ec6a6f08ce5a8e081245881656ca7045a15788073b094051e582203be961381144f5dc0d6de453fc62259dda0395b1dc62261dda09ead0eb348fa06d1d9ea122979b93b20f84c498bbb43d4e294d558d83cf1eb3ef4b5729fde2cfdc672fa423f31ea2df685be67578839539d1bc1d1ecfbd7b24a34a667f121486320fa208de95d39fdcae95562624acfc272c22b6f5d251afc61a1413ac7ca93a02bb25a8fb249c353e684a7ec493645e5e69d213c3f8425ce3a3591c6e657f63436fbf5a165d9bef3b29c584e3de61847584a8f318ea84c870a3236af050f0c785ec70c783ec6d18c7114e328c6119e97357933696adca65303696a542667e0cd5e4853d3a9599d269ddaeb53a853d3a9d130c43f5a9822f17ee0edd4e616a674d2cdfe68617a49c46549e9d87c77594e2dce32843974c2f352a7a6a353c37236ab38b3a1849968a14a85261353e5430d4ce2736ce4130f3035712b63fdb797e25093d62ec555aaa344511dedbad3aeebbaadebaeaa6e1be7a12a4d71b34b7195a2bc6e7616759bbbb9fb363dcb0457b75415df6c3a5f288fb3b1d92e3f00d99323a920a130e305834919194f15b65a9e2a7c591f1deb1ef4076177d1266786689333c3a585ba5c5a50d5e33617a560f717ec322fd88ff05e4f5114d562595109776a84b3c7a7554315e29d0cd4c03e6c4a400040def4717062905bc01e07e400640a0bb8ef83b40200b20403eef715bc6fd6ebd1a3b76da7537617687bbd0f1592e9965e4952ff752af53dc5a5f26cf21dc5a5ba31eb29ee4ba5522cd686ea1e5416862cac6d3b8b0355f3eb7fa89c51657bd0585da5787c38b5f246499c42a1506d53b76e96aba8d4e67a4f28668ff76639ed28bddef67e8feed975b7d4455d7aeede735474a48e42bdef8742659773df576c9e399a7514c8433571eabb8f77b97e8bcb7579dddd723b17e7714ef843d96ddbb68a29eb72e0cfc4a7b230dcceb5ec7716bbfaca4a7d0e8d55951b76f7e9148ab2ee0e0ef50e755fee436512bc39b4de8afa96cac1df5b7424083398fa111cea548a29fa7d9f50cc1e89bf0e6539dca552a9a36cc5a909c5ece94163f5fd43a5c2de73f0f61ef4bba87fcf415a82dcdd81baf7a1ee8462e26c294ee6f3a5ee1359087bf7e9ce3f5e987b13c1a99b8374a8ceebc0220c2a619088d7812498381db72d2952da64f04919d03b67bdf6b82a5ae46add7541e694b0efd91faa59046567518b5c7727ad450e891639223d76e78e0495f50839cecef7a0b2d9f4cddb44653d34f49a4ddcb37ceaa1ee3385ba439f77b310aae67597e26efe21a3e0affba3aaae3dce3bcae3de3c505298385e67552a5c2d954f7d343b184c6a84032460c4e5d36566c826248218e180f773fe15147100a19ef40949c5506e53c2fbe08363db4e65d27b0d79e25121ab91b3b37524d8b62b43ba4d7a824fca78a1281f52d990202776686cfeb53da8de89219b17e4840f34367f39cbe971069635b0aca7cfdeaccf3bf459c4b3d29ed8a79b6a4105499c60e924054ee00ff8272ca0021fcb272c48a282282fb074a2822635b984a5931414a560a806964e8a3c796a529a828a272d9882e593163849e183222cc3520a26b5a52424dad21345b00e964f5e80822258072c9d9ca0098b4a9389cc6c220c5fe475230960f055f5fa8db860da8c5c54e182c9c5528bfd153c018b9a28296d2a085ba2f4e8a20aa16a2e96b860e282498b0dda6a55dfa70a04639e62a4e056dd98286a08a7917fb389304a8bbd347d708987007fa60f0e34846932b9c442803f93c981861ccd1e5ce21ee0cfecc181862c993cb8c43cc09fc983030da1cd1d5c6200803f7307071a5234975ce220c09fb9e4404394a60e2e3110e0cfd4c181860ccd1c5ce21de0cfccc18186244d2597f807f0672a39d010a499e412eb007f6692030d9938b8c43e803f130707a225491e89e70d2e710ef067dee040b426c923f1b4c12506027fa60d0e449b2279249e4897f807fc994807a24d24971807f833911c88662479249e35b8c43d803fb30607a21d491e89270d2ef10cfc993438106d89e491781eb9c418fc99470e4473923c12cf195c621ff067cee040b429834bcc03f8336570209a92e49178c6e012df007f660c0e445b923c12cfa34b6c03fc994707a24d185ce21ae0cf84c18168f3894bdc03fecc2784709f4e9a503c5ff582679b0984cbbf7a9c3fb8bc4c4e8f338acbcfe87106e1b488c63a083d3d3c3c32d927002288502191435cabeda07c96a582e72a569db32c2306501d00fc515d1ab5d8aca31623283d06a92d4d3d56eef55203ccafe8fb2b5deddf7c01c09f59001008211df5aa3a282dd65c6bb1259e2f78c17dfa1b0038001008210cde20f305070fdeee05b7d52216001876b5aedf41e951251bc7bac30eaa63e9a4074ee069240a2ba528030c82cad041871831a2b012cf1724d9162850b434fdcc1fdc965a4b056fa0b012db80d7a6c6623ff30796fb4cb22dc04f20fc1b00f83381600710b384ca82b6c72ca131a41828824f5a20053cc19f18a41683e62ce688c6ba75ea15c118a31f2f5c67c01ff0332008042ba7915f31a1b0751ab1592ae11c40201a518b34442d360d0df7cc9416fb0ab0d62b6713fba249109ee0fe05818434813f5308f745520ac23c53cb334e334fb8674010e61749429a84481122454814215284380989d2e30c141f33b599a6174933b517493d020989f2a2c98b22540450bd48ea51822f0005730009719a994200f0a70209699201ab4cad15cce14512a5b6bad024e1fecc142a6319d158dff3c2f0f5fac599293b2d3422a222205a11108dd62210ada8c55189c620adc7174df08ba47ea1845b6a2f926a3d02d1682d604b534b4d6583b44a75bfabfedd2013833700a803bceae699038846a44589c10b442bcadd12ee5727283882eb05d0c240342218883f180884c4f54042aeb8403422ddd2246ba9d1587f1fa8025fc117b0a5c6020462ce24d615b8ab795e18be5ebf28e6000d79d2238e0f2cd090274baf252a7a8cc1c4020da182c985c9488f373db040438c1cb51c25e9d186071668489225ae25443dd6ecc0020d21a2b568447a84b1c4020d2152c45234a4498f311d58a0214d9456946857f428e6c002d1ae18521962d2e30b2516680893a430e9488f34492cd09023482ca421457a9cc181051a526488d16a8811931e656e6081684c92c024283de660030b4483d2a46ab2a2c78b648168564cf9a650d1a3456281685430a5988af4f81a58205a11239491911e5dd0c002d18c1c7947497a8c396281684996744ba2f40833030b448be2c4391de91126030b443b82b42135e9f125061688d644a92a3de9b1c59105a23d59a24b527a6401030b4493f2d460121303d19ee48dc440b42a7a7c6189e71316885605ad8667b7d4638e31a2a2c7bc1d61a61e816835792371570517a53b323ac2fd98a318a4a498a517e991bbaf1825dc38c7182d51174a5162a0c418b94882db0513dc2782bb08cfd464acef2185793bea995abd472b7a35611008f06e45c21823296585329ba86c3679792e99827b68055ef56ac19a7fa82408b4fa09987093242c583a3981117672029a9884fb302c9d98200cf84775d05695952d82ffbe813fdf91a020cc0006af7aae479fcd41f00f15eec04b70759f066d56e1d5573f54b8bbdbb71384b91e2d59528bba5c8d54408b707d9a4b628c8821cc2db5965a8fb2054a8f1bd276d431463a7644d60d09f7a9132190da9c57c3dd55200882e0cdb57a354c29b8ba95083fbcda4ff7ddbc0412fede3d086bbd206839fa7a95ad37dbecd5f0f76904d723bc22bd9e46f24c24af7f2179660d5e6f2379a691d7df489ef982d7c7903cf389d7ef2079e6d1eb67489e1983d7eb489e2983d7f3489e79e4f53d9267d2e0f53524cfb4c1ebb1e4993878fd4cf2cc24afef41f24c25aff741f24c1dbc5e87e4994b5e77f07a1e9267f6e0f53d24cf64f27a2124cff4c1eb89903cf307af1f80e49949af2f42f2cc2866105e9f00c9339bbc5e0192670ae1f50e903c9308af7f80e4994a97ed3cc3643caa96d9b8126e8422d4295e2f0123e43887f07a02c87102e1f543c87142f1fa1d729c3c783d0e39ce1cbcde861ce70d5e3fca71cee0f538729c3078bd28c729c59d3c4fda93dbb0f488c69a05cc14d74fd933539b383d91f0baf4fa7a33f78fab2db56a5b9a62de3db7d48cf4f8c3ab61d5fb314631473146aa9dd79dfa4ea552b18c8ea88c66a6367b66a6d023967b84576a74b69d6584fb3433536892689266a6603afb66385bc0824b175c2ac1d6cf24d8e9824f24d8d982cf253b59f079043b8d3e8d60e70a3e8b606791cf2776aae0d3899d29f89cc24e147c4a61e7093e95ec24c12711ec1cc1e710ec24f229043b45f0d9c4ce107c06c1ce219f40b093f619859d423e93ec04c1e70fec74e2130a3b893e7d6067139f4cecfcc0670fecf4c0270fec1cfadc8115fa5c6299f8d481edc0670e6cd0a712cb81cf2476039f38b01af8bc81cdc0a70dec129f48769ae013899d459f35b0b3049f34b04a7c1eb118f89c810df229037b81cf1858209f4736894f1858243e9fb016f87c81adc0a7114b8196da8b241aeb7a3471fa61d8528b317281fdf1d9027bc4270b6cfe34b213f85c8195c0a70aec8dcf14581e3e8bd8087ca2c042e0f304f6019f26b00ef82cb20df82c8165c02709ec023e47608df8246215f029029b80cf1058047c0eb107f8a459037c0ab105f8048125c0a713b6884f223b80cf262c119f1fb002f8f480f5f139640370213bc499b042bc03b6c7832c8f73c002e01bb0415c03168867c0eef812f6872b61751c03d68707b1397e010b7420f6e749581c47c2f6700bd8d92b60f129607dfe2289ca38251fc21749b51e6de794a82cc668c9c4e9af38a525df0fcbfa1156e5d9869f801d2f015b1f01bb7308589e3fc0b6ee00bb7a03ecca196059be002bbb1156e70ab0339e00bbc3116065fc0056871bc0e6bc0016e704b0315e84bdf900accd89b035178085711f36f60058f143d81717c2d2bc879d390f2b7300d81c1e84bd07c2daefb0ff0fd6c575d898fb60619ec3c20e645ffe635b1c8765f11eeceb33eb726c5bee635d8f31428521ead9e3e1869ddf0c55c2cf1a76e73d96e75f057f90bc9af09a919353009eefec7cce7678760e026f66e39b9db309faa8339e0b822658b39df7ac6d8034c21d5be33cb6e7dbce411a77c74aa9034847db586663a0c89bbe143dda49472bb18e8db1828d998214fb3bd81829c89bbe0c1b13051b936363706c4c13e44d3f868d61828d59828d4142cc52cc11628c1033c514fb2f6c8c143666c6c61041def4656c4c10a4d8cfc1c60041def4af8d8942def4ad8d49b2312e6c4c0f6c0c0fe44d1fc6c6ec40def46136468914fb2f362689bce9b7b031388879d9981a4cb1ef62636860638ed89819c4c020e60979d35fb1312fb03146e44dbff56a5b8f31eab175f3ec239683ef7aef1504aa5fb90f65b14ce018a35abf72b350055ba0b4d80f6d4b538bcdba2d3579d3525a6a42e06712cc01be8f567dd04a79b3ba7d74fb488be066eb57c10208e17a6bb4d83b2df68f246ea9b544a98057c3f5dfb66d7de4e2f0914a4f38c68818c21c6384fb7dd4a3aac5233d5e54aa42354cb4100d139c0c26a610052d608550eaf8a4c871dc3b6c91bb27613309c3fdc2945e09b4244f0ee95159774ef2581879235fd8a725d0e376f3abde0c0bbb8de084044f7d8f8694078b2579a4ce8a931110b5132267e8a54e42282f318e2798202194587658b10ed541d83239c43de34670349b63e3b089548d6b0313e6676d3e0be19c4cd24ea5a5264239ef3c41119aa0c8b4d478ec7d4465411c024fc03d2a6b7de209a4bc4b2a7bc97ce53e7c8ccd595c52198cbb5c529948f31c2ea96cc6ed2595c9b88bc35c52598cd75c5219cfce67c6ef70496538aec32595cd8ef39b4b2abbf19e4b2adb711a9754f6c3659754e6c3752ea90ce83d5c5259008e2fa94c88f37049653c6ee392ca0c701d97544680e7b8a4b201fce792ca04f0212ea96c01ef7149650a38002ea90c0107e292ca0ef0025c52d9035ec4259539e0445c525903eee392ca187023de49c29cbecca3b1232eff1d61f356374b37dbb3d9a936dbcd3c2a8bc9585f07196bd98e8cf5b38b44ad90d41f6153385b2411a811783f87ca24f0fece046ebe046c04ac4763f31078c0119e77c07c03e6199084e71760258d1971331dc2f30ab092c6127033a5e1790458496307b0f306b092c60a304f002b69ac883b002b698c882b002b69ccc7cd3d05cf07c04a1a1b625e082b69acc73c0f2b690c003737139e0fc24a1a03e2eeb092c67eb092c6745c1faca4b11c37f7123c0f64258dfddcdc49781e879534d6c3cd3d24690cdfdc3449633cdc1b56d2988d9bdb08cfd7b092c67ae679aca4311a77c74a1a93dd3c9ff0fc68258de9dc3ca7e0f91956d2d80e57869534a6c3cdb192c6706e0c2b69ece6da5849633517869d48347626491acbe1e6392469ccde3c6998c65cdc3c8ba6916ca23116374b273c5d6e964f720a9e6f49a595ab622593ac5dccd9994918818f904af8ca1c8428131e9d3d7bb601c0337c4d8b86a8f591d35c32452ab164aeedd53763ef82aef206685cc4c0c0eaea7b017b69c1e2b5ad7290c8ad7207622c2b2a216b0576abcc040c50f579abaf06c6bcd09c3504759b564a71eba24f0a11ca29ce908471b09ce20c34bc2dc15d77840fff856118866118aa54162a4c754a19650a5fdf5b08eb3f0af2f07016da84f066d5aa7834ce1af8401e14e70d803c2ace1c40813c369c83bc7f9c0a05f2e070ee40c7a3c39989aff3564c95f6c295764c1371a64c2a37e3e04c99b6b05aad56abd5ea1907d3a887c3f0f5fac16711e360f01907e74a0b6f5592372d793e1066af62da7855a7d0222cffd9dc35a7b904cb7796b39b0742fa79da610e7fada2aa6a2bfeaaaa5acaa9aaaaa2e69451b6a1904ee93a056f34dc45b8bf2405834fcae41513ee19ce1f6e8614d4c1e16d7e36addbc7d9893fd915a9b54a282daba95a777fed831089ca6ab5a62627279c5335fad4a2fb40e81df515d28a498ff2ab24b89b32a56a54a67a77dbcda928b89fbb22a95aaa0977fd49ddbbd0ace3bcfb40710ff28eeace1d758350575da11977f38b27dcdd1ce49d07427a7b06217d4ed53265ea5ebfaefb4199f07763359838b1a3580d1e43c22d4a20b525f6685de50c7013d7d9e00a5243b87a56ce8a98608f2e1c81af9b125ee26e1bb5979a1e6af3403b676df484d03ba54da4701582a9b7510cdac8063b8802c594b248144163b40c1841c12dfc764465f4b54663956575964a2fe15ac3f5bb6dc4729d6edf9e4ed4a2de46afbf8d90f09224a5a6b526a75aad16dec934979670f5bc307cbd7eb1b29cc5fa64b134eb6dd4462c2aa3af47a20823a80cf5b0a5d1d16bdb701bd5b0864661c81decbe2f2aefbe0ff0cd1dbc2f2a5f39f8d57d5139eaaad5a97d51795fce3cfba2b2721fe057c0ab5c1faaa36e50cb59eaa507ed83566e7655eb8c65275e7136ae14a8a4ab54b6b920e79852232300000000006314002030140c880443b1703c22e9c9f00314800d91b85276541b874992520619638808000000000000000001047b5c3a87db0298eab848d0c3d68d173d3e78061e7d6296d74b276d70538933929eada07d16a56cf777dab3406b2e257b3ee10564e6c34236824f81491fb55e532d5a9b8e1e62b6f5b18d16a232ae040fdcd5b2af1f75899dcd9870dbdf0d3a37291bf14dfa0e69226185de7bb3a701d1eb8d6d417e83b548a9e671421b17674de749cc2e68617500a2751c6acd5ad69326a4e4dedfc412d0d6152857bbf219f6c443ac0a5a573b3fbd521bd942ebb901a077ca2437bbec1eadfc6177db1272caef42bbb7c2c6a20f10952cc4e9b133af6dd8de4220e18c6ea12ec6d8cf1e07cd3abebec9473435656ef4cc839539db10258c31cf4648d055dc91a9e7ebf8992f39cfc8cfd58c3d93213b12782aeecb2aa808a081aca5a6679e781ae29b3043781bdbaacfc87b2881db2269ab8d67d410a89238b8cdd73bd57a95fa1cd4a70b4742866012d72117e685ebc43f577169b7789777e732d41254b14b0f8c226095be9450abd0afaeb42d7826bc07ad82f26444d5fb5e690b76841b5ef551e1697abaf651c5a1469b96f688df68330a2c07c36c8c61d51d59c2de6893cab9b944540b9ce5322a0770cbcb39233872ed7c5e059e6345b3a3b14f6bfa0201aea80defab21b9feccb26aaa481a6eb95fcbb48d3129d86059b5e8dc01c211f02c805176d438807a782904f0427dc1a96148c9bcecad8c0f17c38098646f0efe3b7ef4845cbe0bf35ba8f1a22165f4ed5b103394b42c78af55d981c7a270ec6d6accf568783c34b8ec0528b4f8e411f202a2c55281f7abcad37bdfdf9d9a5893c0382800ef0090ad2414b17bd31a434681faf9234cfb8c69b66f1ebd37a50063c9eae4ccb74b1f4090a2dc4377bfe4103402b48c91c476776fc823993fcb36c145c3716e843ee22bf940b125d768c878b542ef7dd6a523fc0e0817fc20b9ab490dc1a5de0224aa54cc7a9246e1dc400d4416c70ea595a27f032fe4926bc334ff38f1bbdc696762325ad2b7783adb10b7e96ab95455f5b797c0f7beeb119c58432541885be56c537a172264382c1604fab1f69d94bd0268160fb82151a5174a115fd2fc207ac551405f11805dc3236a60a2b4e85d24921f7ccf8342e8d259ffe95ffe15345f4ee546488a31dcb52239dbaeeb37dd306fb3ea0f36e628afdc30c18c8a398df2934e5032bb6e135062a0bbf2b26bfe96351098a6ea2fc144abab2b63701f5e7866a81491bc4d74148b02c432ea93fdacf03e4b3ef953a77569bcae0ca5c0603cb39155ad6c4d698ae3ed73a4b55df3fac11f8e2bff1386ee689e6663f7d313c4b1fb00205aa735713fe9dfb7d546b95e427e6af563ffa7005174001adc81bb4a2657a1f3a4817469260d36593bc13db2ce6b46b3670fa2733c7f9de0d6a38c0d5e3ecde7e0f4f3660e3e40d6d4c125485f1e3c84a864c16168af1efc87b461c14e140a58644617f1f4c746cbfef628a05f91bc1e2489989149d2fe50e9657fb7c4d49f316dfbab29f2f79a9d19e434ed6f9ef2fb05ca14e607358b28f24520660152b28b642d9c2f41b07c4ae9cfdf952509a01996b15e2d2e6e4cb67935e279307ebb4ede2b7bd5d62fb0de92ed459b12f9f12e1d3b616ffad9bd4cfb0cca57e9b79c2fb718f97d0ed30dc376f13046246e0946d50268b173bfc244133d8ea83b0f6e0a9b6727dc92af3b2fbcee20ee8b468ba7a8526876d8579bdc90b3bafb145d366ca472bca9f743ec6121aceb4bd9837ea618ea30bc1efbd62df891c46167ec3b5914224d1d3a32d63f98e941bcc0f94cd8b0b165913b28e086a06f715617a905c30cac8b4c92d9a9499a05f824b7866cdb0ab2d9d4708ef83990fc52569f6c2f6aece46047335b5b3fb49a5c4e33182d6fb011d1a9552ce14601ce4ee35d1b2ba8a652bc419328339334a0abc1012b29e0694aa3cf0c62ff83e8da06bbaf1dfa50b2338613be2165f82f9bdefe596fb788744cdd3a4190de76af5ea57d46e50ffdd490ba06f3a44105e833829b219b4f0a670a49213e4f0a3d791ba4308b66ee97a634cb3f7a329d7ad5ec7ad13f3ce948eddce9b6e8c4165653d7ecd2f1aa758240bd6cb694666930c661269b0ed5d559b464f397af0ff4a16859d776cc9759ff350e5659541ad5ee12dd09830c60a96cd1756a41852d7cbe24e2aac59391e8f34bfded192a06bb4e41a4551355789488dbc93b951e9a40d5446d711df889af7b320e19d60a17564ec2ca437dc249a4f40e670645ba1cfff380b69ab4911b32872209313d13e860da844914de840e5b0c4c56d079d1d6fc51a41c967524933aa0c2cccde610078c8c6ac1b745c0301db25a936e4b2f0ea84b8b3322ac8c99f6a47e01914aa0422d70713b2a9fec92d7b9033f8ae190b7215a1b1591e7b69d3335f0db43c4c80414c1bc3c861fc065476bb23ee4485ba15a30ebcc762719ece2c096f1cbfdb0db9d5afc7284d2e856f487e1bd8cd8b9d259c4a5eb36ea43746977d0c82197e3e2cafa8a931ca4adbb957373d6229733e070e8ad212f97f8e6903d95a1881087b9cc4de787c9b3185740e8e6d6a7e92734245ac9b80b14aeb20fd5723bc218077491775f04d30e6def19221264cca29e66d426ac7f89c89648f37d884e57cef13414830fec54aacca56fa0956f1fc758a1388542c6695c60eb1ee7cd43d1393dfe7dd1cf37b729a6a67eaa1a93c307ae169cc24e78dae965c0456e655be0e81f4136918a259ffd5febf48cc52de7d31c327438aea3c5a811f9b2713b11c3b385c03d9491d9be156963304f52064405b945ce652d282181c6d2424a33309e5ae42eb387d4b4c8d17ff81dbc6b3a04f79a8f77cf162925ca66d27f4183c21538a2808c85426041a42c423ecc416a5469d2dbfec4263e5f65d26e45d11dcd363977ad38d0dcbee9af1270442cb17eec98a77866c7be1269fe3317773af8288dbc26f6dd62307997425b35fcc3b930c2f0ca08c4fc18f05ff1841d7ba1abd38d93d826e8a611c61adf37fd55028e8825d68f1df314cfecd857a21addf8c46e860e0a61d7f87ee7ad78d17a9ce6020b46704b646b99ff9f62a1dbf55d5968aaf9ca429af35155f5adefbeeec877f184d475b861ccf78c39829092594872d95b140955c89490df87f98a54276d2e842c9a09bc9cede24d934718e2787205524cbec65b895fa825231b720dcbda8a8763de2576a18b3bf34105e79d60ab7229698f0e44b904e342dcd1f1fc7bceb2bef96b7a05a993095d20d96b3dc1ae2bda09ce2b0574024707eff6a93fc69510db12ead7a914d74e935aaeb2aa76621de66a80e8034217c09b324d6a889110c4972ace0845eff16e859a4f490136c32aab5fd58914cfa245360dd00cb441012bd6f16e3e4ea5f87128493036504fa6dcea7e3db509ca0884e1548f707b6a1c0e69e4a837de58fda6bba11daf3b7aaf4ab15149aa2f07e55c78057b76d929669634f29a899ce87cbe064c28ffec30980cc6873aa4edd69cadef587cbe7966072971b5d39068f0a2ac77e94119fa82d9ac41c3f47a3d6af3cd31f744acc3d1dba4b9bdbe0e11d9b43a5042d45a48cfbae2041c82d8ff639671cb82d02ae493ec7a7822785628285043a5b5b83b145715087d68eea1b32efae1426503ffa6a8a79ff6cefb6f4cf9d2cd17a3c9879311e48520d5ff25a0dece33b706d00f66b3d73276d657ee8f1922427c17712cc64f1ef4fc624ab75a9d13193da67e99b0d341b33802fd78b7b1da5f2b2f2c3c053f715114e88f419d0f46ae6b271d4c30c070396966b1a70d2b1a2a5cffa91ccdff88af8abf4c5698a61fdd9cb18b6c28c48b9fced00a2bd42452f72174c58d271108b77df991fde01523c35ae794528cd82fd373d96c92873b8b4d2b01db02ae7abd8fd43211a5058a8407b867f46c64ff93018103c1d8b4d103c01ed86d3fbf563532b120a25bdbf56bf1a19b74502f226d4e71cfc9e5abc2cf96c3324229f1f176a15d0d0d9ea4a5b782b04286b33a940a2948be8e17fa77e371c5ac5f70195cab934b3b7c3c1af3ead1b699cb52891af4505b8ce50dc65c4e2228a84862b796f13a79b2971a5781720ced6d302bd3093fe229f92964abae046294677b4801ae114d37e09791493c45f9b0e268a3d4a5e9dd8cdd67006a3dbf66e40a62790e2420eb95cbbe7ce86704a6ffe94fa885ae6b6bac29849dac6a0144136d30c786037e882d04506f1b2a7d206fff2422747becbdfd146bb1e9bd91ead3b10c4816247028ff0a04f529c98eb37ee266a2074883e49f590834c7ac804af5a7de6e89f11021e480bacb6698aaa76dd422bda463d22b9484effdd2b54b12557a52ef4aaf57c12943ff3f15954c8f6fcba74b10393d8307d2c9aef7d352006ee5a768e81ea13812d15e73520ecd5b8e142dc00a863d09bfca4a5116ac82a8e3997956cd55cce43eab9e9ced8c8d4858808cf006bae3ad4eacaf411cd15edce417808e5072033728490d322ac9b3343c2009ac94c51bc2a52c7450c5d22d49704312191b8feb37e8a9204f690a69e666bdef029f09dade776e1992814dcc20865be45eb23d2b8dc7b4c2b7fb52119c7e7e48eae03efda79c3ed5f68dbb5655089f4196f3b368c28f3d9bd55ebda878b9d4be29c5d9c31b0793308594f598264583c2c47c9a4c1f1b06cc63339cb21ecb2d935fd5258f8ab77f995f5e3f052402afe83dd8af0d0b19233054e9be150807f24d9a5626ad0772b42369cacf2a1080c3441f1a16e581ef136cfa012638a2eb0c06819c54361c5ef2336b93a6bd0547625b3c93bea3fd3eb6efd4a88f9c0a2d66494c0fe87e18671280aec7c532380740139fe7b5057b4d063b4d01d5aac7e43ec427954ea12f871186b10b37c547448adc599f709291b7c6869e248d40a70457176c2d03ecdfe8cc11afd8bf293a89b2c1ea695693c9c5203bd805875027d3b3b1c450bef29c133786223e1b04914a2933b76b15132b21dd1056762b93039290ac7703f5ee7996b00d316d33a178eabe1760f4e0a71624f6b6f855ddb5c9480d9a657c0bb2a31809c4aba3397cbc4f662b49dd4eb54b04af9f931cb5c9e3c373543b8349162fe3ab4bbb619258d3b6858a90703ccaabaf6fd6d81a08deef8a7b57c9162dcee0ee28acb8f05291e055a1b915ecd26e971de91bb231f2299f6fc3f57499fb1dd063c13e8910fd9947611654ff77ca29fb07d1ac6eb3668dd3c0bfc48de483036c1b5a1247abc4855153f88325f0c86f3d5e2a06c52ef4f35c8b1b8e20f29229e65389e2707d63a89f4e042baef8e19aa59b7d1c2eb612ac59b854e05e320bae125ca099022a4383b006889598942608ce581bf545fa7d5150ed0bfb41458ed1b510ceeb86e119997eb89f5cafa916f72e12a22f87099575876399f9810a5610fb2998d03f113651a82cb183a09fb68dd5f6c46878edc7ef3cc0fc7aee393f899af7f9629c39cf80adf866ce55931a76efce1b150ecf3294e8c22c34e6811b81ec8e19435ed15537643e7a5d4edd18730a2b566a73f976a1da4f2ce69847ee07a2058210bf9f61de3e16d5bb04dbb54825da9164cd039451a2a074177d1484798245eba41b9a0bca604239344d92ce7fed69e3289e8701a18b3381b60e0dce03f841e964d993f28ad021febf8038a6087b09f4cf0fc610e3b467c2869c048df424bf4f5ff2e06b2f8007e322fda74d9b099ce556dc6ce2d64c5e49bd520bcd0a26955ee7277470f784eb131c0848f63d0d5fb29a4373f984c161d8d2001069f2bded31a510739ada04cb3dcae88ee8b01ef9615b523ae8bca36b5ef57417bce58e2d04524920896daee24db8015cfaef1ab6831fb782ad0afecc442e209cc37d5db4327960ead5ac96afffe4f683246edd2093a086530e15316865c4f7806db5abc6d2825f600035e5c6ed82e77771730b89c8fa27986d63f39806cd53d65549abec53be9207ec4badd69cafafe7d6e68e0c311df963fc4e36a798bbb7be8f96f2e86230798fc26e45ad3061733f11ec960c981d7331cdb84497a95aed7f8999b8a276c8e81ad3a6d09b71b8fffb4b685504e9c438179e89a76d2316b1b1986b5c4c30cd31752d832f108037c57d5ce0bd2fa33ce443c43b3ec10dce18cf90e602d64b4c3476ad5e7db69699f54413e583bfd78952588ada697c928259cdc47b779e63a4365cde4932c7c7aeea8b7109fa38c5c652ac8f66a724ca075722fd0e9b79482c32c04b395898cf2622f6d3c5092890da5e5720750e448d702e2ee89d05d46ed15b3c8462f87b4815836007b52e94dc51bd55041a0bd2f146a633a67c314152db7a650b388950326a34f215f2bfe63b3071821d9a3b25194170fea6195de8aac5bba7ea849aea235dcedf4a048bd7a94a7bcd2f6626da986e3474c8df941ff75ed7c403e1c0b3a0d91bbf9ac74cd0538ddecad68fd576d2b93bb152227a006f521aabd8575c7db2f2f033c94e527b40ccef763b6dd41ddb389bc063fb713b87222c65840111a0ea2f1b75c57e522276e8a82eb379caf3f262668831cf6be0ba87f03c8f411c86f2436052c13b325d6f650de806a745e99d2f7641743b1dd9551bfacc284d2b59e693096bcf11a5360f72f9d543a917c4fac34e4a82bdba080907f0265a2928307502c5db789d11f452e7b7c22ad1825539be8e838e066e687029c7c9afa0fb4adeb69b9ec5e5eaf9babb02fa69be69c504d7df21932531ddfb75b37df3b0323b04b4897772014e24108faa94a6e5abd6b50310a169a0ebb404e032fef6b1c84edf94bf3b5e14491dd5aa344e6156ba86d4d3af06b9e1a3fed100da817c3cb0633a2e43589026fa322c344cf00668634b9e4302d648905e639e8baa232d4e7f0541845123bfb1f3ba48e84367d7830e2c78a5663396dd505864847ab5158099f75086dda63ec20b9476c511ba9c769bd00b00d01684d6b0413e533a646389329d5ba8d788f8530052668a5887ba00103a118724048612a5416209eaccd15a1700c3c21c8c96e58365ec7f3764b0c826aeffc2f4a05b919d0d518fc5418ee6238402a4f04eaef8e9d9c8b299504a6a7c252980521fce47b575385c567852001dc20290ac08a29b15c073ad00f82002410ded680e6889127008c783770bfbf1332cacec2262f73d831b620384a218e018f218c2bdf2ab027330a4874a1d10f06213b6df84354af2ae709e428e3c956568f9d7672b380f3ea3e8d792b39fb4717c57f696a0582aedbb0394e0b0d0119338e2e2561630657ca85436ef0d40aba68ce4420c3ff7c7a1e545188e00c2302bb48ed1d4d1a4d901c05585c243e528e78e68c474f2210464265a7518fd5ff9aa365ee811f2ad10c21e1ca0f0c41b80d27b96f68d58e224622491456f004227a714d9f108044991d09890a9b00fa3c13d0a1120b786ba02799b315aa0618b9d0700632fbcac07c0cef568433a88348002470e43857fb50f47b96fa82effa7a76c7b56af2c36f6a47c7f26a0605f38acfc0781ee248be562277b020a0756b4ddbd55f180ff4050eead39a3dd111f9e2af6d912adf86b88699a897a9cc27f1f5f8682302ca60c00ae93e9405fe6594b0f03d0c2cd0bc0f7c3c5c8edca0aa03a9197126a8aa7d60dd125e9221703068901e4d9c403bc28244cd86e57d23f09ca7a4d025f37fd13cad0a99f504ae80edce2d9556b90f627eb17521df164b45b141c061951d32d667c4fb02c5c7cfecd42bcf9dfdf983f5e220200d883aa407b21801efa48c651daa1fc4ec9006fc0db6001c702e0cfa4b6afb4ac64be4d1a610128dfa29f4fb743ae30f8148da286408dfa13ffbe65e1cf52397f1552740b170fd61e797f9f3312873b62c63f1342411e6e3da0f32f08fd10be757ff40efe49222e91aeb8e87dcfc9229bd2fb98672c85f88db782d2aede311b295fb53a0a634b0d218787c81e763523b606576e81031fc535c7869abfa43bde10821a5dbabd28133963d22c7494df23abfeb3152c6ab934d3bd8d256bee555ab0445ad65d8c742a2b7177597822796f9f462ac0a2ce8a00e13ff81e051927d03112c1029dad6913869f50e24f0508319f470d3885901635e79605e364e95ffe781bd01a0c7b58997ae2bccd9e1bc18395935b3f273b291f365622a46a312da794e4c2bfaad4a17664c6a13eabf19c62eaa13d5ab73803acab02f45fcc235bb8039b25599244383960ce0adf6774cf2f2bff3ce174c1a6d2e4519157ffc8f1b60aecb61cba9ccd7441b55322f71fc18cb01e453acb9fe6531cc1964959dfe11a4a6901b09c7277ef820f17b77bd011396b597701190bcc6721ab3f39cdf71f98ff7d2ff516129fd44f1f6f5539570c8544112b0425583ff28f861f792a3cde05fb916860e02f905ef1b6fe88abe2fc15ed5e84dc201e36c8d3879ec9783f7813ae88bf94c68d0c7bced0136553c7c59983df129b61f8b62be582033fff01425943d352139f8ab20188dba0e9d300f4cb36115f776b77f698e45b13753abcb3d4fd759d15842b2cfcf86773853da788bb7f2bc4a9759d9bb9be7d175292b532b50165ffb86021f6a99341976df104b9032782b2f30c4bc2b0d1a14fb822cae1c724aed0733278ff6358e59121c70944e921e274f32768a03a29499da4d3fd87ba0c1d681a1e40b1e83f8e78c17b6d39f5005fdcece572e9939cc9ad9001798aa688a655956e5a24111d9a06c9a0ee2d9c2f3977f3771621aeb8e76e493a576a5cf42eb0718ee9627c4453284587a04057c724e96a1ecf628aa1c0f8707cd6d13ab85f8fd581a212621ee9297e1c2347f52ce02b6286c2ae9e5f678dc0435c555a29b7383fb9485feaf189dea2238e22dea63579d161ebf02ed23fa1a56fb725fac6e22c0ebcf8439d9bb31e2bb964f17861bfb5b3b61ffd423ecebaf6b01145a43bdf7d2158c7d8e51be8042f9efa8b5f83a4d4690602b0fc7c168bb52338b806d64fc18b68260801174603a2b7ef2eee126ad0a4aa2e9e1b07b8a6d54caf1ef41b08c357c7d774b9ce346953bb47405bd32de9acfbab026f9455dd6cfbbc1680a6b2c1a6810de9155075240f1c42b70581d8742f1a95ea762246c0572283760d0b9d3387345d63ad6ee9a98bf6f96a688dc7e75bac5f4919f42eb42df11801d75733479c55d6514fe49ef392dae43da38ed548b192babdb00c38d827d65cacf29057efc8a3ba3b0050e3643be00cae902f68b0c636a2dc67dda23197511f5c78247b8eae89e31bac12c09878455bdb76889903dd79efd014366ef5192706d438335d3a95510c4045d4333fa0b83085974991d41dab20450e9be45281b88d93e9cb99089b05cd6b3665b78c0605f8bac830aaf71a817736d5e155bb7c8543fd5788bddfc55bd841294da185a074ac92f61aeeb5943dfa147a6c2298a12b883853ab5e4ee29fba658fd460039761e60811d3494a7c56a2566eb241b882b281e3d8000fd59d7b2212308ddae09368dd03db42e1526cd0030a8e62ea21a7e4a85377dcb502e57ed6879634a89799901801958700bfc5fe5bb2bd9488d2c77613325dc41640f0c1385a5f00e57d513f693333f37745883b79c0b1bcc22642f23bf67a7936b29fb228ac37cef11baa75a968cb7a437678b28d93ea080963741c25114cbc5ba09e4715f592b96eb4afc4da0b2877e8440cd4f3e047bcb6c5f8df04662e11b87a079aadd9f67563ab48e46100751f80e35d131e84aea25b6715cd3dfbead433e4c92eaf685b4b197de812fda734f267034bc989bcbd7247920cf95746d9839a408232389967153f968123b87f29ec631a17e69ad27152e52d5edb65e454ef30d3b8688a5cdc6e1f1aa2d0086b394189b020c3061c721c24fe1496d9080abe23fce9a31a325134d58fd4cbd3361d01346da48808a42b77952351f260766eb081f66fda597159fd2c1a48685b14e6b656ff4c0f4f194a0126115e583cc022da7ae686b35ab943174a1e2e36ce00e7d02ad385254639f0708676200dc94c082a6bd8047dcab5a6e8c98262cfdd83d52fb8d7cd9e4c0660d5a94d8f070d8e61283fa66559310283caba92fd0d4bebb04b50215fa997bbbbc3e3fda5bc4f888ec613ed43d2564366ecbff1dfb851302db54c742b71fff1961092ff36f4eff626bd37a6d57ac35abf44128bc85aa0961d35c49586c49da6c6081f755790fad7a09617123561d51efad96618c34a3e17d24933c2ed41fddadb0cfa4f7755b08c7733959d5e923d938a5466eba5296e87fe52919b12d126e69ed89d4d2c80030016aa9761c02468a6ffa0a60925edfa8c6423e516e273abf748c1f3d07db2fe72218947729d8d182320f506dd5bf8038e211b558c0c9b2195eff2ae041e184b004eb10a383b9503d408cad6a3355b0176322940f3d115d82887d6ac363592ab5568ea85b670e536ba8796a3732e54721657f54dc61a981f5ac7d9c249c8cfb8d0f9a10edea20eb7d06d2ed3d174652f1b4a2cf36e7a2b285081bdfe6bf77b26a511e98f7f95c0e1450bdf493de6322c857aa2934df042c46a049410a0439bcf3c65f1a8c75f0b1fe5e7407d21650a06b3ba962c88667d6d285b668ed2fce4d50af9ebc85858b02ec5c56e7ebd6a39f36b8241a6408116bdc51613ed994f3e554bfb7a520dffca09465ff938afe571c421493973cca0ab6e30afdd2951cf77569e6fba67ad72b0ae6b6937d07f8d96c8dd87f1a840c94357f33a76e2cd5533e351ee629110da2739ecf898eddeaae73bdbbef8f2ee515d0be7a8a644399446780527e9cbf9c8fa02231ec1efedae13a7d19e5ab8dc07bbbfd2eb166df51f496247d5a8a9b1770195d46d81be21a70ac5bfd12ee6b513404935bdd7bd1ab1c485055c2e08580a66c3e7e143f73fb9ba7f3e7c397f722fae3cdbff247670e71d75224f663c5b621056f78221abb5ba219a9e3189f08c3aa8df05668186ee2317fba8f9217b7efc117c442bde54b91c004e5e82dc8623c1331d11a95296061fcb960eb2eaf5deb27e03f7d63b754f6d48200728dc19e008f3ef26142c171bf2ce9e69f0bd9a0670304da822bec98a328223c7293ed871e031c16ef1eeefbdddce929853243a047759f74bb46c326575a5eda4ec4d805b4f844c9cbc2e74bb4515bc2b5e659e55399100331cf17b3c0ad78ac737fc849f4b398c595de5726d9b784b0c718813c6789f30e60f13563cd517d29652309fb121ac182716a634f5019cb8f4ab51adf66d039b57bb55d87b672f694a7277a0cab0ffe8cec14a20712a2c8ea0f594215a287feb46090db850d3c2cf9f1842e03bb76f93a5ceee5c3b2990b12bd85b961547210841b30fb8746b4cb8e4076619e052ab8125f200fd264a17bb164582b1d085cf25fd52c3bacb171d37ce753fea334ba3dd219d56211d279a742c5bf1a160988d0f98f613f81e2a681e0f32c72e748b4376862625dc8c1e43f3780b39c6556c06081c01ec611f708545202a898e81cf33ce23035f322fa9557c2c2f34c3077cbc4a5dc364da3e619612cd1d8f51f551860b56f90a769526beeb1b48fd7e4a730a07aae892a4f2b8de32e56b1622377085e048f0686d17a50dde151404737afe174032b6b9a38a81259316c4ba8fdb07461053f0b2442f104b8fc842d4d4ccd9facb558f60e00890fb03ab37d769943e48046978be5ada1c8a32d645ca4e6144cde7989fcbce64ae073c9a2e64658c0b7f3ef6abeccf4f906e0d47957c9910113a3ff69bad0910306ce7cf35358358426f1de27494bf934c88540232a3d057e03999066f1a6b5011b61641558b0294f9612efdd585ef460cc21fc72870b2238c1a1e86302b067c3cd43b82e9d48112338d3bb44b329f218f17e9c9b51a79347e31bb826169900cc7e065de6bfb3d79123a39e626eeddb98415085025bf6fb29712b88733ab7b2e2d436bf5294c8cccd8fd050a2aeffe2ff9f6407a255a88c08b821bbd60ebdfbeccabb574083cf1302848fa61dd4cca78a3b0be9d879a7f56ebef8d77fe31f0f5cacbea53242722814dff539645f2be601014ca0192ff84fd73b96c3914fa8909e62fdb75c9d87d4e4d4724c120b3f6be92923d23885e2f7e9a0f8f8abdf5131cd3f343ef4a0ec3d4cc976ab55895f9caf1ac588f130a5f9d8d5a1ede457399abfadfaddb6e2386db2428e55c9129b464b6b78797ed96e71f285d3728c6f86ad45c25b5718f0396918e5a49babab027e01b0ed0dbb0b78743255828b53340582a44cd5b5ec193fe89bfcdd05fbce56060689f4ec9950460427d9a2ca14bb90ec008362e107bfefc9393c1fa6df4568e9b38d0c5091bdf1495ee95e17a1a5305ac3d278636b6eed947227c5c5b771408f50e3646382949d4c6c2c14cb108940bb41d710ae9e4451da11f7eafe175b93d54a18840dccea391440c3ef1d5a17401a94e7409d325ab0d32885325caed879d8c55b4f3ff67e86f2c561696468527c4da91db3a63ca9ed0fae5366a8fca7001d1c3d0bd6a3ac7895984d0a0d6da3b945195df874363f470c6d4e52812213808a5add7c577854da1a5f48daf98b2b30f6a84b5395d96003acc2d8c6c0e97350af2646372032ac205892cd565470bdaa1e3b7fc955ad1b9d9c471617604a7157daf99a3e7ab63c896485dbbf06a2fffb3fb28f0e8308652982de1ddb316da5cf80909ff4f1f58be6e951f47c4b2b0dd1a2f8b28c3c5c1ba00069986400579b8adc63fc300a9e2616fbc6af6839edb467c8cba0058899f76ad7f2520901091e9044f270590511888c5052cf072c6816d5f3bd3c7cc20f2fd73399bb1387153c34c8334cc3d1aff120ff7518476b96b60917a8a9708aa2f96299cd35f19fe5bbdf7114750167bdeb1e7da4a91e5cac024170c500aa6e3e3d01063b3f67e5e7e84b06d72a0f813ca1ff5f7b1406324cc8b0b62d62d189f620c413879b43b078164c6a0da50c507091cd6536229f594b944dfe532bcc362e691cae51909b380d7f391105a836745e66ddab4c67a3e29aef60f81fe4fc9504b30b5a3261e5a95f0465c763ea39004814279f3c05312e84aea0efa09e8c0681e7fd227e1607d6ee8b19a4e02033d4964dcc6745da373292a02f84cd890e550c5ab21d3a90f997d140eb4e5bcbdb149996693ce0490aab6a77747f8149a923b2e61d7c60c196377f4f2f48f0e56bd3876febc4f443327e1cd40c434931319d56b6397653df91098a80bc46378d6878d0c7deab39363cdcc54ec60428f3e0cbd4bdd1b684c7a41eeb3072970c2db02ea6190e80b4e334d64e4a7f7de79c1a09e83315a24f5fd73966d34c491881f26639cdd7ecabe369bcc3645f0b924669d1818fcde0e1f78f1a3f6009feba850a27610e375905d1ba582c7574a78a13f15577a7a862ff479ac6060a88c439742c608801a2fb5647090effea961f920f3c959a853006e22f57a391aba118c77455845fee93fa921b721efa8140b3256ae1fba6f0dccda1ed5664b0d12a7daf574393ed7ff8edf890959aa78705919b82c0fc89756c4c10e8e1684ccc97a6ca15f34059ccdec520f68d73c127694077b15e50b2ffc3fb4fd6aefbeb7bf9bc177cea7f8bdcee4ae986c0b68e09f39e3f04cb9d557ed8117e2047cc65604483c4b81f23b7f4c56c855fb04f4050b69e0ac4bc7561b20544ecdca8ad4b38820cfa5da42d7773a8648b6ff727d7312d56a10e66a48e581f051f2f89cb833affed94e2a82bdf3d918d449e455880402fae6b0c8a9969e9e795feea7ca051414c41cbf6a8ff50c07d3445733aa94c37a282d637460c98e48d5aef1c2ae6457676e8020af76b493010ce8ffb8338c4133af83957153886a1bac43d8075ec52f29ac816056cf5a3691e3d14d7f86b0450742d386974f3871b47e12353f4f6bd8cf4973c0bd1224c6a283e781ca8f3ebbbfbded075851f6d01c556c73801f1efe73c37a3ce43ed5124031b8d90e15d07e0ac58939dd1399562aa44ad619918f61f081111699ffe4c557405f34a7dae342aa85b38378c89ff0807002d2b0ef2d1eb4971f4b6c67a5c747e3e2cbf68689e081d4eaa9f1abcd231b2e7d5fa69361f859bc9886939dd9e10af4ce6932c257a4838e09bd2751a89bc8bd37ddcbc6cb92bccf16acdb4cfeed05f88164ca699f5f122242bf2053a4c0211a001e4621349b15b55c3b2fcd0e1e67cbbf5c1e9a06881faaf26a3a817d81c9c542c6a32409e26a2b39b0e2178bb0e76a649f1a36d8605667c334860d02ec5c3573b2722036b2c656194d66007425ea757b6c1db10e9430e23c2e692a5dd90abc3e0d29a313539e951eff0ca24240324ef4d8f682ce157fa4cb4f9b62adfc87085aea68720e7da35e2daedb4cd0564215083f0e21588752443fae524f4fe12ab29d7e7079e30570d1985b3aaeb4810848358581307037fdb813f99f26171b3c73676e369d25ff3c7f74a711638807a96593acb685a9833db34a1c27ad643a93eb739927abd30725983af8854b9e7b3b1542e636b780071fbee6ba246808ed4e224c8813204fba982208a146cb3c1b7af6cfe7417c021f41fbfa883dbc3fd768806f67a7f5a802825f4b6a021d9125dd2e38544c2752288f3c27a6c9f023a01a3ff9f100cdb583b0f1ca5008d1ec52cbf7e6641b5062a0c8942d43ef5472648c961ddd5d04cc4de1b3b16f167151def40e84f87ae070d9a08943db350d4f14101c0461a35fe55eb014787b9c06aefcc673a0d7106e5e8aa834f0e88085db5033664037c9e63859fa9b88ec08f030a67f9bf878cba7f15449208cc2b37f2784b8762cfd831dc6b5ea52f88ada140cf0182b89d03d6ab1b1ce7f0aabbdedd7873a94fd4ac097bbf79a1a49af41f89e1a8234f0f1e409fd14f208813685603dcea49eaa8d57e8835b50f4965cc554ea44b3b94a2f188930c9bb8c1e8ce447942948d7d087eb088c6118c9fb618cec4dacbc1fc4f1b1ff4faf45d0032eb35949b571ea98dfb0ce1c953f5904a6adca25ce771de4e2f10d71fbcca30774250428411c760aac4d28997871ffcc10c90b97564ef89c0ac0bfbb362f6a04fa5ffed3b070930203ca0238bb7b935ee5fc78febbdc1c0affe845e19818d544693036e77d171f688c86b02a1ad75d4ebf1a59f2ee3e08fa43eb027eefd9c4370f6df10dda8869e4a3af68ebb0c621c650bf7e83e72d7d671fece1290d1699772d0145d9f3e1092142d1ec3e3c3950f8a5baf787a00c8d3c928fa0fefa87ca45fec31378c25dc42703e2890f0d0a07e25933168dcc090ddb5230d3d7d2011a75e7c7b8ca54dcfcf370104f7e81d40c65c7ed6297339aa6a2ce62ce1e0dff7ec7367a400f37e03fff833807b62acb11cdb9bbbb9f63138a0436ea1bad61987b769d67adc070f44b6c83de171b8b4d2dcf83729fd19394d2fe476ccf6adf3996f1dd492abbf54c10b03c006c6fc11ffd263fd89340f8f2ce03e3d5a984af792abb8b5756cf2daee9a6696ba56b3871d02880f239e03e7429c6074202424a5fbd7b6f6243c22011c4741c9be8d2372c9520969b980e5691b00b8779e72aeb22a1c471bb33ef67d5863b382ff44960585bb22cdb491083bac59c9a1eb4a6b602a8542a43bd5515f2e7045e5279044abc53eb6b2b1126c6496c94e7cda3eaec2701a00abc52402d1f707163d5548cbe0ba865c42494591d7f39c38ddd7f55fa09663fc7a0e2662cdae611b9ef9647f004f6813fe0a74859aff3bfc7a1449f9c4040cf77b252047cf2736a053b9b84c0261ebb12b53e4520eda3a0c08ed3448f7cc7a1027e883aa79b7cee42e1f4a2a8076fc38ac2c8f35c99521ef0e5ee037f119f94b7762e20dc79e9d80f43e3d00ed17356890c261c9e4397292f825955afa96a6d852d65e24fbdb32d1bba452ccca43fa79cc805590d38599bb61fe3c63e908bdbe3d9b12851c57c37d6901892aac3e7cf1a3674445de80db8620a730864604ff85ec3340f7a4f9f06eb5fd4e330e233128097a1c1db34ca29d19c473e5238bbb78f670b225a50c39cfbe3733d110d5b9cbdce222e94e2337aea80272c332624887571a1b57da7e9e00e785ec23d2486cc2e45288b4f649daf86b92986945e81db3f3b9bcaca0f9da7024055ecf94f4ca3da769c3094a778ba5cbad8a5a53d4319b23293bb1384dfe27b98a38a00c3cd5b70fd43f958e28a1db24a6ca8af6ef3e350c832c9aa999cad7a759c420a4c9837fab209f81ccec4844499803cc1ab280a56d4f543201c628a89a09019f83084ac35aa26528f30fb2904dadc0ad1224f6c649ef4cbe86694f46becbc7d900d1da5db9fed00a30842ea3682c17e262b7b2a511e142df1f562172d7fef09cf1f701da631fc9395877a48592d8b49fd6c2eba996bfc984f83b73ac8c3f9967b60155c8806f3650e1ba362765a94e1d3d5a9833a004db6329c11e4c025b2ea78bfd016333064c429c9210ee30bc7a8ec19d1fcba260c4677d0dd1eeebec1a47d88b02d7c2c01d81e2fa72b30568906b619a31865b279109ea26128c0286711ae12b50b0b2ab1ab4b3aca93d033e77ae2361eced542db661bfae6452ad191b70724a7d2671527023a8fd81b0c8e38e8fbe63dc5815ba2ba7559d795442e00918c514625f8e066a24cf01668d61f21a9e9d997b9a5514ffab0ec7bbc7f6e5057126dca8371261dee67a05889841da7e3f6861ac9ee395d72b6bcab356eeaf389548bf2a3089a082c3f6c84593a94b7c1bb9020fb3ee3024ebf95f663171be318f85278501ef4b254193e5072d439f6cc7a85cfa1d44686a1e019a50f9daf82cb487da14c551a964cd000132abfcffc46b4890046caffdf8ec409d9427a8d4dce04e11f1379a05dd8d5844af568f2abafa98f0c4fa85f8e8be175a0b84f57985e533453c938853208ebe58bbf9bc13bf235a7452b4ada68d0af971089ba4da1f19cd9c42e058b1036ca203b344600308e8caccdc473b100980c904fc079a6f0ee6d752d54448860a91be04d0ed72e157ec39e9655691898d7cda78eea405cb28183869fc97e9a50291942f0bffd5428380bc4f631e870c60cefc92a8511709efb57051507a1c63e0f1d6220fb3279553106c20f8efdf07570ec9a528cd594aa0900af2398d2318b40c338f6e1403c7256dd603465803dcdd4cc291995c139b806321c2f48cfe3b49c8c3e531b42215b841d78c6cf0ab4b1ceb536bc0a6ec47f89adbe0dc51ace986b070d2246477848661b25a4cbd7b38c7739c4eb6b2fa5b9beae7752cf06aad4cbb54b61f933971392cb0d6ff0d2f466784284b9db87af0d07eb93e8f3f8786e080f19a8175d655877016316e1d53a4f5d1c9b452ba2d82d7cfd2b9fdf6d2a36187b559833bdcab1a1eaa5415b9f15211b4271039b7f4135fa6e144194e388a7619f3fbc44bb784721bae75fa4132d94248e42a1c573d9bb78113f1535809828d07cab13d02c3a8177dadff233e8a00bc2175a14ccf435d26061e252345d2918cd778c7ca2b9cfeda8d0692a144dc6c1e05125ea2e7c784effa5f48ea5c64754102efa68a080b6cfaf5df77ede3e08a840126135bea890bb2b9e4fdbf80f9a3d8fd102c53159d939dd3ca99b5160df90f4866c85111a2ee9c780e7a347e8433ccf92fe7232da91a3f4f6f4500f1796344fbfc6954b69d9c323a63db310bb9760ba8460a1fd4d4a06a890fe52292dc2b9bf4d40b90f67152185dfb92b2ba515cf16ba1fdd91e345a232d2084060928fb15565cd65cc336a8cacaacc24981f1d3753d603d87c9414cecda820234a46997012e42fda0c5b291b30722b8b6a125c4afd02dd66691a080cb8dcf7b24de35f05a091b9f171eca19088643e5a67bd2d1903f24cc203196b641b3aa5a3e754d35fa6366944a9ef896fc8758d355b42d6d270b1857926df51a5e1c47974e31c5a589ec420795f9b49623a2ccb258ed152a69e7461c7db5b33e642fae87043a3ef114a3d096041c0c7a055f5cd640a031a742232f42bc1cb453cc33da1f23094b51bea1020fd252f0f5b51d2191da565d44021cd6814fc4f366b0bef5c39ad9ef272bed92d48e7bc5e295dec97d1853607bb1f5f693ed237687ecb4ddd5fe0e613d9f8dac4a121d2eaca049eace1f40eab40d08d17d621ab0cfc5d3f33f1565c7512dec3fa63790a40165ea0d8434d90447c3d72f23306ef660da99783f73cb15646c5a999098f863d1e706f80e842c253e3dbec4446e8e2f5c0d89f8cd7b6cbaddce1cfb9eb3c17f5e2a2fb8032f67755278732a23b55091faf88d4edefab0a0c292e101c13efbd4c0ef1ae6605c44fb9b33bcdc96f05a97662bb13dda9df96235cfae220d095634cc6ef64f01c8a3170d845545d01773a74b77672049443f14443afd918ffe7e32735c4cd886ca118443ae4d8c02413395adc3ea5f409a7c71904d998a1e5ef00cecc91011e2f9934059e06c38a5e621779757a84f200ec22828b6c1c15bf572a8810d1fde2587010af87471142e10b0dc48025b67d96fadbb1a2e2882a13e83c1cfb9f5962ced4b7291d34b25861ca5f34907a37b95e6076fac5c9ed8006b5c31924b3f6128b0bd9299e8abaaf572b692f537b32a0d5e339fae2397d543d499d45c755c35c0f515df164be24724e7be9b19486581e788d81cf1eb995d73e432f2fa3dc1dcdf925e42119d8a726ae87fe9307210c2c687c6895be27724cb28e0bc30f450755fc8520a73752d0314badf3ad2cbbc3a99d7a81e1fdc032c6938355b2be1cf415942ab5dccaa101aaf904f72679893c5928a3ae46f71eef0b79a5dac8980dc309548f20bcb8844e5519377b3f467f11a9c6d695fd4eb0d0cb912060c3b74259177a1e3cfd7cb050be73977adf5448c089ae2d62206965970638bd320d1746877075fbfd7b9be912df986dd26fda09a94dba8d5846f09bccb242510ebf890225fda6c7e210ebe737459ca5b59d988821c49edf3425450ef65d9cc5d042b5d4a40839ae1f91a9f544ce1e5bba6178a633e16fcc4756623367e65b50e2e3261077bf8197a82a4e5b6b144d03e83e54d45f029cfe8abd32c8a0bbd940ce021a2471fe65a52fd211fe976d1a1c207a08796a95a66aade64bc190d99250fc376b57208f73165cafea67a6d40aa0e13b0321b76579b826a94f002dfcc37f716b49276f922a8b25a383a31d2d75ebf987bd588503720d8ec891e4129988f9a1ca4a93f5cc4388e97ed09fcb198be5661b4786f2003f0d919f8a4a512aa7d9efb4b844ae6d0e68c55a35b7a3f24eb79a6acac136c68d90425bbb91a91e88e01f28e5fa087f1faba16df690cca5046e48a7b9f2f994abd46db5a20b28b7f6a574b6821efd46d76f1a04cdbc0e7c954add7dde68acc308d78e3e0ad986c8896ba0cc7aa64561b090e6051f8a0b1e97e3e0ce48260560721d4eee018c649a3818574ecacfa4f52d6024ab1ee9ac3042c62f2576ef85cfe25a78b10193633e96db8b82a65d03ec00ad5f909da2e14b9bd8aa71ac07b7adb851535ffb2270aa0b05f2c22971780ff2fb0f92a704d0a673c9e0914617220a2132eb0249407c633f9bde9f3d1ad4f75ee12a40c3d81033abb1355c1cdd4afbb3403bcbdd5ea48ffac6d7343e9659a7b8a507585a9dffa6579420b672e4db4d05eeffa4d6ef314fccb6b8d38c4924bed8c8b200ce0512bc88075a0539b0f10f51763c05e8abde9a7773ac262ee65978c0436cacb590d2e09a462975be120ed4a15d9c55eea252dfaad96de6c00cbd93a6c0f09975587d004e9b8da376f7c06ed69c062ec446f086cb3f7ded7f8df860d51ab517d9b5b10f641fb253aa2791103d2e2607734c4c3d5a2f44df6e31f814e52e488cc8316a1875ace12fe70d3adbca93c3d353ff5d98078db7443fb8e25c827d061cfba88731b6021dae42b73498877e060ee370f965830fe0da067a6895f6a74eea05c30ee5e4e9a177e8d0b42c1c730f25908f7b53636e4b19bd473b6ef56e69054f0d1b324cd09bde08558a2c94cd9db61a50f888a54c599d1a9bb9272f34c675a01f04e974397a8c126ba26f07316acea53bc1cc4bea6c998adb41ed13f44de65a4de4d6a99443f430807fb24ce0a69f4e10000fd2330c081c958da374df55d136f4e69c5bf798398331a8553fd9e475f990119a6dd090ccb573bebc590e3ed6a08499968c73e4ed270cfa45086125ea659d331fe7bce5c579f2edcd941d5e7c6c795d6841fdd26da587adb16d6f3eb6da8407d4012ad35c661b120bd22b6051bd80bc42350d20101f6ae9fdb74cdccf2ef49e887a4b53faa52a8d52a0a8859e7119b2fe093399cafdb955241bc1f65a9fc460bc19b004ec490c8c1db38a02118af887e3c1ea210e941057c69621a1b13df72a195d7c1ce9cb4b50f41107aeff140a5aadb366392294e792ddea0d606a439db5aef7189b5eb013b6ca6bffd321e69299c8ec9948857040acc0d9dc1ee1dcd58f1b6bc5451a99a86c41412b2ebd1f189e6f417adb869cfa79fc4599be143eb63c8ec411b790a544b4ec6019249b5b3e8d8c965700823fd7dd2acf215aab5ff149e543c04da88b88fd4f4fc4b1e9e4855578a059e0b0ea6469fb6217894cac63618ff91ba114d6179af59c35be8dd4dca22e0ee876e7a819beefbe47da2d23b084c670f44fdbc185afd973631c943982bc8e531bf467485010444e71c7b00a14ccaa3ce2cb13983c99bef0f27df0c0666b05f754b07d1a6b29cb7b8a5e13e1789993447f4b56100d7679d28ed113d58103f79e95e74a47b6637e2048b0fd05cf0dd515488c6fd0f387594ecad1ab9e77fa1735f0674c0d0be7d35391a1e7ca6a054e0731e4f9c8a3ae80c59f677485b16d057beead73b59f2835bb214115cbe4da438d68b7c6dbaf34049f2037cb3a2ec36e8756f2efde01baa5c6bdb4b0141cfecd5afc2e31bf05d4721b1ed077516a9d2261c35e047ad17877ec54e5f91c78cdf89bfa930c6d2e49a33c39a6880c0077c5040b9360baf081875ec47e4ca2430ab0a130727e9f63b89455d46e1c54339793c90ac887000e7c10a3069a5a5038ab635f434814120f0d0789924299f0981ccf95a933a5ef0af481e5e9aa1e6b75aabac528164f19adaa211ea615154d6b118b7d453afd4fe46653c6c8c62cb809c6f725c0ebeafb1ad091398afff77927268c1ed4f8703c4e9f9c747335572f3bb768fd1e06a5c7644227e257dc477361c73780d7a3de41cf433e93a53c71fece396ffe02e1f12f3a5bb92c0d171a0e3ae2b9a7d05ca094dfc25ccb9faec38f27781ab7e6dfb53deec6b3ba92aba7839cb9cca441a9ecd0ca6de04b8a0d515413954b519b638f22d71cba99bfd4ac528fa778b791b7bac502383b5784944d2bff348f8a53e0a6f92b2c30ec0e4f7c1d1e05f1c4e9957d8ce632609b8641292ac445c307a3f3c0785e253c46851a2434720f0aa6ed6f485a7d49c9c30a81c944c38eb84675fb340675ff5b97b502e0345cc5c070254df1dea68f41b5c0f91a42b831391514b0d5241a11c67e2a460baabb512abcd7d7b4e2e5f6761b63226ab823f7037d569a90aa5eaa269a24d7822afbd24542ab93bdae0f6f347e0412f0f7500fe4cf347689c05eda5d144c343924e81ddc163a538f132f1ba721be26e36a896c3634d676c41c4c2c0346a65c9048080ce68985dadd31c15c72cbad362513fd28aab986ff052aedfbad8569d037c9f8cd428ea74a70e9f3b58253328a4107173d430468cddf7654e6e8aab0d793dd2746df4dd0522529b34959956bce87a6435b4a9b25909d6372fad03faffa4138e64633c71c3fe7c187a6758d663dd71865d3557d4acea458484c91e58fa113fc98ae69b50d50937d5e2f6025579c6e6b999ec3393493a8ae933bef13b52746f10ffe643b16a5ac7046252b7e93b07d9b8d14f1c937673ecbec7dc9536279e9af97d587470043ee3bd30ffaf037722db4cf1a220b172d5e9d1c50aa858dfd00c6df3de1c2a1056ab024d6a710b9af5b05dc46a00fafe9f4dbcc34776842b5901b570a24b5cdb50c34c0c8cbe5847206dea3ad05ecf7060fd6a7244401aa41044fc36fb536aa4f4057dec00be33d34478b26e1e36741de1f4714929bfe7e6fc5e9d4b19e57a176f84aba0b3ec5ee87997babb9cabcdd0ef0cce837cf2fe2495bd4c06e4632015061b93a1f782079ba9d4b7451a8dd571f6c8821e1da256e7e49a20a78484039a234fb271f8733b57ee9bad1506af542820da927d569b4b5c630e1ec5ecb56df1aca97e8f75229a07dfb7953511a6d023763c9a83ead8bc7ebc180bd0fc56f55e5758ec8a54b934f7b53f6cc266bfcbf7d5d27aa4d5b8f435948b72ee300d02bfce3ecfc72175004fa1bd59215206117b40fc20a5c0a249dd466c56fb73193991c0df8450cb7c8f8c8e4ee5a56c37ccdf5e02f0ef57312c321f18bf0cc36fd277eade3fe1f8611fd818c93355e67cb51b3d19b1194ddbe9617b7a309d94e7e39b4821e0a0322d94d874c8373b5733b17abda736dac19402dbd8fbfe6401ccb7d3bc3e36c1c0f830767da70b3a4653b6694b2155ac63cd6fda64dbc18a421ecdf0ff4f5e056572a688607d0c4af800a7031d172ae10b45169db872e68b594e4e35544dbcf204a2fddbe8745afb529641e60ce5f564c6185a7a5a28d35115e1542dfc297a547f16e51e2e498ced96fc18925d398b9cce8daef226d2cd8b949cc100f57da23558d2919910a0bde9a8bf1341cde1e8a5b0c0487fb5b1c07df995afbc1bda4d7887169e443f8a22fbbc612edace0d2bb2ecddd0a4abd1b6ea96139f6eb32040d15ca86e2fdc5db202afe2059bab986a9399aa4d42cdd2233d0aecf468ad9291fdaa7f8d5f11775ec0fe2017aa15e63480d53cf1bcaaf89473b3c8bd0e268cdc79fd2435ff0baff14813ffed5c4f67540ecc4dafee651adfcd50d9b370686def7d9c6682fbb63699406cebf4af6211b9ce4225f1b64939b045b8c0a553565d004b5ba127fd5a3491e6239094df71d65c4798ca6fc989651e214d779d47ce1e7fcfa98b4a69f9ce9bb53ab1c7195cd4caf3f284161d51ad4912506d0d31f24ae09db4fd3187890e78c4119f38a6e185effc38e163df6addaa2bef369d0509f81fa1e6e1a13ba4654c21f42a44e69beada8e3237bd4e0a7ecfb5dd7b52717200f279037e59735c84da033ec52e31ff311da8eed742731251f5e43febdf6b034e035f95c27fe5a8739fafd733a879a1839fbcd831779977c686776983b1ea0a955bde2b56176e89991f810f40b1a2bcb0f2a07e9f605621332c2cdc3afd6333d87de2202fafaf2a96cba8082b98848a201b10199b0f2252e01f2d41eefa3aed457421ef917e709c210dcf5c2cda3c2f589b912d4cb0aefc13b6f8426ee271d3909628d45a81f47c1f44b82493f53bc2fd3240b8a25725b651816d2be688e7b0d06601cffd037c237030918eb3ac6010473d7aae74e8bf354f530ad2f58804bd4a218fe90193eac60e9337719a7ef820bcb5086a0cf352b7e99a6b25dea567c84ce4672e2c218b9f6b735e713dfdf409bedd124d0f460486afb6b75c819bbacb3b5d58b27407e2d250bb3cea91b90871a4bba1a4f63b8de56a101da9a41856fd2b5f5b173611fd52471f17f800414e2e4e76d5620bdb98b8e88e5619420e152d740808176329701bff48344eccb3172b67b90ff7ddfc5030d20592f2266f1d3a0d937281f9b4c4a50ffcb1eb1b5da6933b0e84bb2df5170c2ba30f0f5325d27ab88b97e8f2b4cc5ef97f9082f42795c22b9179b51135a8b7606ba9735a0bfb2bcba48eba145126959eda12de0b014ebeec583369708fe12d79db91c12c58beaabdb5b34bc180a5bf7fd72531fd894e65c88b5588cedee2caacad9d46fd36a50a566901c40ceac761f57e7b55863280159129c18047b06ae388922a769b9d279d9b1a8159e865f708afb7e39b9a23b8e24909b62b352531c979838b4e617beabe89d849999291c039c7a3efb1d7275590936e9e473a6888065f2ef2f765d232c654d59e4a87836534d899265f26b30a00e848e73d8d731377e236a7a5f5316c27289a9eab0d8b206d2c8e7bf81fa5d5773d11857e50fdb260f29924fa588c8418a920aa2add35f2ae5cf4984471cad99477afed149da03bf42a480b014af1a15c905a6977095990a11f613617478195af04646dcfdfdab0d10de33b75200b0d20099475f3af4d066335fe7434ae639b723afffaad6ab4682f726345968a3875b68b0fd73873d74a46482c0b99fd99f49fbaa5ec42102beec604cc57575202e595667884b607d456a4b93c7bcd9251074ec50f86221d1b7a12456ba9b0380cccb21abf64aa152a3feeab908757d91f933198e8c49043d0c4bddac637a26819ba7008677efa5978382308a14b4fe79f94be79987b111a1843eee98e4d86a5589811ecac334882bdb186d0ee0f7bd784010c409631d479ad1eb88554ed3e83c0ee3b68a692f7000a110d760d4f5b1896291507c385b34087a38ff31fd42f397174200543f89ab9f58ec51333a6480944c9f51465f94fa92677fc21737878466e642de58b54d28e08abf12856a4af31f3eb9b9fb5ae7b99aa9a4a7843fca373696d1824f476bbb69c0cb159cbc5d5cdaee3199a8a8af366cf3cac088f504bd1dbcc9d2627eab80e56de94f3fae1154337c488f18b3e49bd30a388535f69c5d0c8f7bce78e794532bcc769eda200140e5e708156d6944519ed9b2d129a07ea7338396fb7b7d1b8559707d7a1a66831fdb7f1996e10fa121497d811741aba53c88abf794d9d35a6d09c37a47222aa0613ce34354004021d62dd4d4f383ef6c2695bf4feb0ac9d41beaa9b3632a7843fca7d043c2daa81f260e6b518743095681c9c1e7e25e46b16fe65eeb802b14af2bffd9c4317719f8ad280edff9a34405b2f33befde7821c94ca7d5950d4617d45eb0fb9100651e1ffccd8d98de7c1fef8f91c59177ca5a3be743c981f974ca28cba1060540cfcbbb4ef32a27e8d8988908c54556b6826cd797fd27ee48e6197e54897eab540b51c4aca6c1ead59d8302ede3c48862523b1f26503fa5c7fc562d8d6040dab70e50c05fafe8e7e191fa0f48c9e49479b5f4072ed780e8c1061f9a129dd9b3eebd65cb7e4c680850ab085904aa97ef4051a50088c8291beade55a7aeab77c3baa809794a77519cc7a30f250010816037c096917870014858f27fc7ce597735f128c272f507be9f500db57ba2d9f38106f4a6e323cfb3a7ebbc3ec4e979a6f73136d131f88ef351f4b3d905673207fbad102bd706481910e71676285f956e2e95a6144a166f5328bd8816278cfb371c9d2391a8bd00025abb052de17d088adf82e6a23965604d97e5c8ef8fe7526e99f24c7d20e438295a0e1f7399e53219ecd4dc13f3c6c3acc74ad48c28f1f8ce3deb7584ae050a57e012fd5fc50fab9031886693d5d7d26300ec8791bea916fa458e7c67be8d44c7698b98440af92782aa3542473e875c95618f2fd0f363e9b1873c74ac88e5d0f98602e00bb6bcf36bf18ffed53ac4b8f5c26e2f871784e1525822d1b80e4647c9fb06332a16dacfcfb54d7d0088931620e057dc53075d0ef28ce35b8f517c06b6c4225848218fb162eb3f4e0d2262f42167ef24627d3a91bca958063150435132f8707fdf8d6a3f5ed7e89309112270506b151593ddce9fb019b6c88537ea80d90c57f707a9b0874a5993429e5ba91d585c5085f368e687a305a99777168b0e49233ce2201952f7b3b682ec06119505b517d10f9d9401518a979aaf8387671364111f418499440f4916459ee0031858cfd6617c3e6ff2540c91e1c156efb925e4964c869df019730ddf71f53b550233c60809135bcb90347055052d67e5c06fe2597e24c8e5a4058ea2201c308f5d559fb9d56539a67c006387bba8348848a22a886aa47222fc767cbf09747432110bafd69f087dc14a29c8c23afa844566708825dede64acdd0b288c7b36408319ac884909bc2ae19038f6a091fb3cae15f473778ce30a7bf97fbcc70e652166dd1ec3b52808d2b3b323d2d690fe70749f65ac9277201481c0c31f2589962280d36b84e58f956ed264a84fe7d63a77681f98a1974b6470e402319062db6bc16e6a8dae6013533241d60fbc3d63d44bf5442713ab1f1581f2f990b8281ccd74a6afaae76661022757f4c7ba038c50e7fbc62358283d3c9987059f50915f0311317d7fdd5aa273569b3b023f54ea18ba405b87dbb644128062378119dc30cf2652a66270839d9988626e8e532706c2920cdbbb7dca8b48773a060998df4f029ad2ca282088ae91426568be56c111d2ac8cdc2cb00666190967480ac965d84daf08762be2352e86a506596eee2cacba25c1a0b9b63deb1ece48bf01fa0d5e4166adcd08b0696ab0edcb8ff03d094372b49550c4029bf5b7a0847cffc2bacbc62810756ca6b6fa54c2c2f4ecf53e2bab893b276c811f6b83c7ce93852d0c73f50eb7900be56361cf21c2caa4062535f478c77dc78d2dc356a4d920f65fef8512eed42138437ea61542b5a62f0727a029d5027d71683ac3a1d26b6999b86b24550a48f82cd44d534b50be371a5a58f6a82c152bf9158c2387790e3d9baa141908018194e66978b42748704210914a6ed1101e4f863ef5e0b6201e99e0d50b8b0be1c78a84f932f83d2ac84e45d82edc2dd717ab3bb2a79b99b3914788989d03c0ed63ec882ff4fd1f8bbc0fca52d107aae804a45b85451562e6eff00e1d6ab25f345308cbe6315273a8e1b429f54a69ba5af10d2bb3d3df11f205ba770dc28422aab706635f926046deeda25df762e877e0448cf040a9ba241997ea6f3af25beee9aa2a1cb9513f12c50a1bb306d9091d1dba4c3398cb925dbc413820546fe239e30f9e0e440b795b8b33cd63ddc4366b28492bb49c928aae1f76a666cb09a47b744af831399a9b4de455228d148de53a58aaaedaf8219e3992f05109cdb52565ada2e4172a71efea45aac7b0ee244e9c4fa3048b54195a32220ea6bc97e53e371134c33199a68ca9eb70cc399f1cde667a5ea485365aa4948a97eb4b327924603579d90b2ee0744c4618e43c38f7681b864cdc1e67a89d811e98cbbda6a28c5f95387427715649241f86d8a4bc7502e564556309a1f268b49278f63e72d98ac9815d58481909439c7dd98b9245982f3dfa679429e27066125217bf64fca379049a069b64f46b407374ae8e080b215a5f805ee9a81add46828f582f66190d179fdf7530d97e1d06f6f6c77a9992be55c0980c5c2f9342a589605152fc24b0c3176b5191ce70a960e20cf8814f79659ab205b45f9d5c9f3813c11da20d61227f9bf9ae96416fa4966231f29710cb1ba5c961289988492f934d9486d7df902fd64ba2cf0bda5a3fb6335570f25b43b17e990a3c4ec393903fdf30d3c2e71f729dba12b68491b5f13ae15f4bb42b133832514899e82216bd4783a230292b06f54f685d62fe02b3f8d56e54421a2dcd8bf59435643e1b256e78b9b5484d5e1309e290092eaa613c89f91c34c8836622a90421de6ca960107b30474f88998f1ada92f5c6726a2f6fa2c1123c1e83abde1623ab7d7ea411dddbdcb0508f9f52f052b5eaf63ef0b7799f2ea63fd29abb1e98a47bb1ac299d654c63e4aed67123a0b16e34009ef47d99525e92a3f9ac7ee592cd52349b02dc09afae2dcc91e94145efd2670956930016e3739dc4c57f109c74b601a56f42f63d72b1813abfade5483ab0d621c71c11dde3aaab5f01846ad1d8a45285e4f0c5f2f03f281b9f63211b48f1257c56aa7532fa090d5f5992314b5153cf92a2f1c5f5ac852d39023aa6b19c162e0995f58ff967cf17e575043ce5f401d2e66f49a9a4ae0c1d06cafae31f986328c464c94a95c7e08614fa2472f5f5e8ffa0d49a36639d40e633bd482a2e1723771009630739490832d487cd5bb8aecdc4bb7ddd7076e324feb2b03c30990eb1ab3a1e56a7a81dfdd36dc22cae5605d2156a4f4703de46780c2977ff26870c1330405a8c20e82ef041fce50ad0a264136cd3b2e6b7100c6460f23f4ff7d279aa289b052cc65badbf1581220a22e3aaa72df592b7c147a69d587035d0d2981510424c1912effc1b4812928291c118f45136c3c9e5ebaf0b71637bcfce41c8ab37b6e0532598f6bb4201b12f9c6a008f306c115098a5a1d4aaf98aa1aadcdd8e33faa828597b0626f4bc4fb18def79ce07d3dd2c17063a5f423db39f22fa609072858fcbadfe3f167af5564b0a2933d0890a0c758a6ecd028213224f2ab0093f8407a80e16c79f9ec945f41feb5ae91ef09cb2594a143b772b960c1ff62f48d5cc7a09cc423a437de16d643151624c8ac3b20a03e8898bee6d6567161adc7d1909b7a1007f544598aa327608b862605e7e40765c4a96bb5d5b601597b94b2f663b0e956d6717b993c7292602e174198d52c91a9c785b35b28d5d23bcb772dc74f644b2ff5d7b9664023a4af7b4707ac9c772543f9806222203accd218e1a12a6314aa1dae213c2eebf2c8757a211006c88d714e2281737c0495a5c5d93cf4b37f04e2942bccd4aafd84de0bbeab26a4069b47555ea3a1c3f98082130ae5ff888d2556f0c6d1b8e574c31512e8dbdbc318bf1eb7cbcbd06c84e82e23f832cbcb01af3298e5d45f9fc75398127203dca902a64ffe90c3f2197da1a98d7b8d70dfd9fc9978ce2c5bf149c74af9b64ebf39774dd9da6735e6eff5fb7f70a36ca20731ffaeaf5d738e7f092b01a8e1f40cf7893cefc923104d535281b9aff5929ddabe35a76cbca6a9cc7fda3ba95235a16a16b55609c81580386a656f5880384ce7baf4f2c4aa3c1a3ec104e5c9ee35fc952e867635210e5564f6723bb6047b4378a33b0dde568e9eed49b50e788dab9d6ee3a49679638e285d0b1a3aa755c56c60153a7923aa3a3320d4bf7e2880e86c689073f9928ff3b98748f21bbeded078408bb951918082cfbcd86e6761257fbf9aab8a55f78f4e17e1ac17bc19ccb137d6522e733001a2a861b58db8c392dd05a997d0b38c20810deb3dfb6ec632cf528d75a81ec1a92fac90dc780b01c317c176912014a677a274e22002b95c2189275c49a242f4904d6a34599a8368ea5917c3358e3f14736c2e31f7f99745043d5ad44a30443fa9607ab123fbbf0c8e9194aae566d12a0198f17dfd7b48e08d79a4d077a5f49f8ee03b98ea9ef49e0b60ea3d593ca1c25a7f1f465529e22fda6374d292cf8998f808a103e3fee230ed7a25b8b8fe91171561c3498b94780d182099a8f78c071a1a19ee3e98eb9525a06ebd477601889405fcb3c0778e8b7c3e1f8cd2d5510416fee3b003860c8ce021aeed8d7099b7b7cfd7274ec7b87ece728edad9bd159887799294a13f77f19c442c4a44193debf812381c7e5395b15a85b307bab9873f9b964604d63e845526222dbf527c4e48e2b225e334f918ec4d1835b48dd1cc6ceb860b3a5634e49d08c9f157854b770b0676cc5fc3fa6b28a7ccd8dd49b7aa5577aa797532f6e46c2cda8bd006e661ef26502af17bb5c3ac7d2327c19747ee44cf2f47fbb258a5d2e1f24981ac4429525c0d28200fce76f2444d520fd001ff43eaa41ee8a058464cd3df4471fb4d1502264058f695c7200d8ea2ee02f6bf4eb4cd8d02dc693c0fdbb2eac8b3f8d30351bd7b63a79ea123f1711751d7604acefad5d742032c2881d171044a7618ce48476bf4216768e9066e528859cde13df9739261f75490ff2922115a8f86d174c646d355a997b4e167f12be6700c39ebdf6cdd664ce70fe7aa6ecdc5a5bd3518e60587778731f81b78df66e7240b68474048df56029dd70edef61b415ae4cbd8f1548e03333f8ad692064e5b0444a120eedc4fad454bb3b30a0a44fac87c4711ab8b7428298f47bc6861ea7b64e65cdcfc8e358174edce0ec68beddee08e06b9e99bb7fa9fb138406c67ae521b2ef492a917b622686d529f502bc90069626c729c9cc3c8f73f0844b30d79cc22cf59b09dae580a27054fc2c8dc56790879908ee1c6620462cfa7d950024f1d3eb13300dce42d72e6e661998760bd831d1616c79d648c122366423708b6e854a45cacd6c449ccf148facdd96c630db9e47616c63847ece575b076d8f0fa4360ed0c822fed8e00ab609abed7b5025d3c7d87cd692585c15431ee6fb98e56d3d228c58cabfa323549efabdc7508aee2e661c50fa2cebbe61d381c48acf84d4ad5b1a6352b42523d36d662dada5a343f0ab148915bc6880c1fab48722e51863db40350b13ced7dd3d54469fcb88b2a143f4dee463144eb42e2cee0140546b0c4561c921161a1897b7ed107af07f30d0af247bbccbb2f1df2f00f827b16799ecc42a0e5a08c88b4254db740a6a2cc61ee95aa10cf51fb86e260911f1d258f3ec49a2b6f3cdac3a0e0a97fc68b19f745e1ebf96f9977408b3266663312c93e2c3104620e7279f5c63c4274db6a169980454e2961bbfe847ba8cb28109f79f0adf551300966cf4718b710ce11518afd762c5eb054d100789d7194f4a14f7036087e4291abaf90b2b6e9c8548265f15943e9adb1061ce6e40f4d8cd840346bce21769eec674a7cb8649f006e80fb876a69f507c43fb912677cd371046643e487239cd3b3f28f773d15c3b14abcd6200f121238912740f5356ce88eceba6ea0da1233806945d86b1628a4599300c55d672a09a57922f88985bce7c2c9b915a301c035bcec8275cb2261afb6f64f9e99f99418bfe19e7d3b6ab626c57dd60fb4777326b290ce9cdf7de3757682ae4c6bc3f33f4a57c536b09bc25e3133394c01eac8d11fabf96f5dd99212e075c06eab9304fac5e26b93075e708a511f08853fe8f3d6c8337b2fa4a81318a7b460dfd6eba0847d6fd62c6132d7d9afee9b513380ceea9212da481006dd0ae8bf0b11fcc054ccdb5400e5324416f2f184aaff94d780676d3223ce1c126f764372e44d80652955e3d66f906dd9317ddd9f2f89a013d0bff526021698a961d13bfceac6546dc12e4e0d469d35318df8a8dc5a8a880eef21dbc839505bc06f73a8fdb76173f25a29dccde20ee5c27514f239699333c7694aa7a7ec864b68139ffceef5b7d654970030ee3e82905b9faab15f8141d1a3d15ec27efa26873716d4b25d6cfb27cdca24a11dd87440462f8015611c0288e112234c5fe4f17bed55d779d882320bb625b41a501b1b297863f3f7de4513ec286b31c5d140cce10f3e63ae6efcddf99f8324b061a322ddc9bf4a2666c533f6b2e8e9b0775ae40b15f53c57b8058a30e64bc77eb7eef7bb8a4f475e452b8a236eeb6a8b28478a3c5f1d0fbe11854fab129c0f1a2078cc2371c66d6ab96860f5fda3c2612f31cfcff0c18ff187adcb4a2b554cb9ad3d497784d96780bc32a22af9dd888c04763e79f903357e651e2b091bee497b26f8f3f49b93127406dcd128cf0c85af574febf15525a40282808a210ee68b7961452f8b4ca320a2114e059e02a4b8803bc404998e24fa21e50b17c13e4439171658ec3a34286db19efef4d5313b84120bc4bdf38ebbe8b22f12c7174999e5d5988c10d5a8c4341e588a3ed75250817ea2c9f6fea301c0348ae5262b9e893e4ed9feb18e5ca8ca8850198404596e7ca20645f5fc1c2e6b84f30ae344d3f7ca828e4f79797a6e5765330c7a245249c3643673dffb0f6a9494faa8151d1c5424a2424f988f43882de019722aa9c3cc8ee55018d30888712b9faf40ce362f1157b96a7db2f3d915ef6543de293c280f302dd6e98a58245d860842c07058707aa53297c89303106eabfd56cef452f31802d6e426879885b0280665f8e1a332509c87ad0182baab547d42a1714306172959ee85fc8c90fcdf6ee6d07e592a5630876570843092872b6140bcec8c65eaa2732f53a0c4e5185551a0d61fd0906a9e047a6f40c9623f58d9a81ac6f6488c5683db3a03973d40227ae5656f438827efe9032e8573f7d0ca9412f496e390624f11d1a338e7c8af008ceeff80731bb9c2e0ac84c3df2c750d2ba6816059b5bff0b96bd50842679bbdd3b2891290fb1648777a6da1fcb8601bb5862e7d8fe03e1d5412ab806cc1c44ae1a51a047638f985798c00948db372a104c8f25f6f8f0a8f59f68aabf690e662c59d5fe0db50c8a9582e8b4abacd0a073906005ceb31150fb37b9c333a7e0292d886091f0371f1a354327db2782004d6163e9452edb181d1b29c248be634da4d36d446c1cbe69114e1d2f4aa9b1d6ed9adb97b09600b1c640f6f0670d9c3314997d5fcb55c35d33e910298af479eb79566423014346b14978406be4f0d1130ab9d172acd4d64767c9cabb10f9943a041ec9a0ebf0cbb0bc59ab34a97b62c9c044b58c621f10bca354eeed6dcf8ed533823e41615046a4a7f266b3e39e8746461e857d0fb849b8a0d3c88f72a1808062e08d7b682e45cf6069f826d5c16e61bd1603716541604016f5f8e1c54814d6879fb708b9fa4c3fd4a9dc1f834c94e8c9ee5c80227f216ffa178762eb6b3efafd4267d951c9732e2e9be1f4df1086a6794e69ab6e7afe68690e41868eec3819e89514790ea17865bdde5f9738d1b53e2ac253acb3919d3c8416b02cad8d635b2c40424c0ca7d03fc9f41cd4a19dedafefaba053bf6450f5f80801e91911b075f4e80703447b6e416b683e24896abd0047abbb992b1b283c51dad53b27e48d8bd5c5c1f40011afb6663e1cd401d17919edcf9046d0b9617363f4f49dd67f74d3d91906ba66a1a3f02f5259e6bb9b9da9c70612e6171f20953b1f39b4e41ee8b72d9de4e918f5209d6716d7a3373395bac6ba641758f88e985b23e6bfa11929147e307bffc65c887e2b1bb2dc6ca1e03e0ab388c1b393f839ac0359e28184968fb9854e59bb25a1cf8e7db65430229f9688eb354264806e26ab0acf073143d4981a254fe06117da3120ad873481023bd26446f488451c28897a20a33bc666cdc842e8f29980919034730c2bb9d677205f73224b4486b0513c3f2641db146a6d7a68ff5a09279e3d2612f97963f7ebcf39f9151bc4a2f333cd80c117bc98be77ad0ff225f66f87c352b88a76bc1c80e197736496bb3d9114c971628c963d29ece5522c4c64b5e1dd97e2f14b68a1a75fe0112b4cf1b4fd4bab12406a5f9220a31374ede0aad495c34d42db0b8ffe6940b29fcb427e93accb9a8f443319a7d5d7dc1ca881620de806760f355bd995438b99c9750501c52916b33d09c1e86da525c5a1d00d84e48a6816a854c1c3944889adf68b30049bda70e3957710cba9a4334062aa5b1e91e589ace0123b83149248da7ff44d88e7b614655a80079346ff9183dd50068fa659fbbd5813f83e943a5a142710ef543d4e50ecc062ce6780bb2bea8d8690ea97cfeb52098012c8b5984fdf08517110d6b2157de3207f089ce100450165711e268b91dc2a1407007c50e9e51fa228703ee35ab0b255deae8fab854fa4937de5719ba73e3f44afabc620efaa69577e9331bcb18528ac07aa25fdbbd1998e66589a94ad4413d6c1c5f1d23fdc3e9f07ef8ea5601097152060701892341ef7b73d0aa030af5c6e2b127ae827aacc8f0b392d5ff152a98be07508a3a86b1de8c1720f3907984e991238f25978cebb54c7841c6457f851da84e428f7fbf25f7398daf39c324a89d7a62b3d9b9ff383bfca851856598d711a1931229a39e680c695262a14a20d363c3b2cc137cc146d09a29a2338799eed73ad482101c291d4160aa748e3a804447f99a3e849b68dbd547c864f34d00c8a9b29b92e683e60e83a2a412d24cf5b0a6bbc26e40b50e2850195214c6bef3173738acd00ce43114c68fcff0e6a07e44abc7e83acbb182454c0e43c92c315250f5c925ea995238f2f04f3f32674436da6405e9cc6e25fcec32a55eefc056b6a680ef433c91592cdb38b635db61a33b0076d4c9e827b7222b1b7ed21d602c3409ef0ecb08d7ce8eb2b9d9cbaa56a51d6012009adff0a2e67b969298f1ff292b728a664e57aee02e8a1670f5fece5b39286d7613152628362b4276bfcac744f444ba40743dbc495fe4ce61848117c05d5a07513cd3b62b9e0e71c3092817c70608f340edc90885cc31112285deea218127150a0e9f3946060a94fd0bd3b8d3130b1076a9c61ba3170b20c12dc61ba6f4060190cfcc31acf80680c9e1943347e986c1a24188617ff70c130205b06579e218d1d20b706689ce18d3d50b00c928e3dd73c005b20733891eb863b4d97b7104d8aef18a13e76d40f7e4151e301ffc1450786612f3b9e7120f3f483225927716bdade4755f643f9bc17158c611606006176c2d87747753cb232eb4ecf027dc7de5e0fa0d78f219bf9be359128074aaca2d52653f6d1371818fad7082f9731a6325029cffa3e89e2ed396589ca8e330455ffed9339986030083173545aab089567908087bd995f6d987ebacbee96952e8e4f1b3063d963caaca9170249b1abd5c4ef858805394bb32d50dbc54398f83f8c969f85e56508225cfb69c1f40d4cab6931c816e8fa5be484ec3f52e5251e93e621a03903d47634e852ca44bc5a270ae5445dd426c0f5c9afb073b5e7451e8e710687862805cff49b34c6db9b0362a0919337761743d6015018b080c39d0d7b9931c17a13de7b591a16c128f40cc07168e55144e9e3a6b5e90216423cea951e5ab547d63d5e4609e343615896ce66921e77cd50ce825975f549980bebba6b18daa9835c6eb81d6200c97cf0a450bf58fdd44306fcc04f7f32486b49cb1560ac7cffd4cd94acbbf8b07173be9e2f09f46640a9c7aead5d4732ab019bcebca49123952ac032d800b031146ca65f429320ab368f8b63036ca5aff8ab21849240cf8ed93e564cd33c8e9c06739e3cf91358f3ffd8741c84228ef1ae17c776d22889d497700e9df94af0be1e6248b024a6f614e33da05d016e8f06ea69b1a347b73a6308fc351335f0b0542fc0c87d676086594000e8ca31823fefac2d42c63309e41d88c6d8f370af4ba857949bed5ad35d37ca0fde39ef4aac8ace017b0db0b891c1e3f834368c7e5282fb0c3835b8949deb9b306115b87624d8d81dbbc8ceabfc1f4545cc458647b1608dbe700326466ccdee2ec210e01d4d341fa98f94e4ee78e14a135be65338491d8ed0f257fa7e58bba482e751870b20727855164a38a3b9d097829f95276b94c4c126ae2db42fb645c9ce34f29ea172fa6a44e0a32c2f6d7588007cf279c1de170c7db769ee7138c75a714aeefdd4d0c4c69ef4c2e8473fa0977ec202002ba26eba6a4fbcb400d729ce10ba508834092b8f64c5ad6cf59e6bc8fe10baa9415a59be868a91d6b916be049cfae0137d3bc79cc0dd2f5908ead0d79f06b90807180441f90b321b545990fb6d10e320da1b1f3d0cd26b007ba6eaf2c7dfd0976b0b1a5e23756b9d1a2b71d33a3030e84610adea2d538c006d1c18e046ed7828370557dd4f3e6b0536654bde4c9bb59da42e0f45a808d3543667ebae8c3470b0781f689b7d0d113ff7dce439b09ba2052782ae103b576854d6a02f11233da2c4d533e092cde94923296730a57380b8cebee8e14345750ed13b45d6beab054c6755066dcd113fd239fb7d1cdb8e33af3dd74ffa07aa9b9a6ff671c2ea1b5309d2ca6eabea5b635573930bde878a878daf093d2a9e8075c888ad6295bcc6dffebe4c09689a5c9d3da613e680d896d5dd9a1e91e2a2a32cb01fc420070cc2d6f2790834b555cda0cbee1284f19d52e58c1781579100bf1d8100fa5cb8f2c2558da05b8fb8ddcad7aa6e3e8acdb94db6a39d45c933b7b6b0b53e57abfb4db37a31578cd7fdbd51274aa7f94c98866470d0bdeb2e30bc61323a68a7278eaf719ea52015583d99b1492c15623ad52a339613d3300a81a41c91d21eff95b0c4f3403b70e16dd65913bd68a25cd61d71e42e6c8248d6bc13d6e4b3e366530aab923f0297009576dd18580587eaf5d2d8d2e6475810528668d01368e755ba774643ad5d1d7e6b9fcd39215d07ed2ea5b743befca3f93dc00cb9a35d4d30270dcd67ec21839ea869d768d6787bfbd2ce16365e146ff0730112652b4a5cd38eefb512643b795d7a46e8af363727293344a0980f28559394d85058df912ac06e42b67aed2f00060837c97cabc7b358bdd4574e4290158b17a47cab2fe46bd53805a7622d1673093b2f18cb19b6cdb4f17cdc2f200f9783c5f69d8d926a96d101876cadac50b694d5a13f53dbc2aabbabd3b519520c246a57c1e029abcdb5150b949c97ae0ddc9e2901e15eb3fd198fd0a1ecc04cdde1b432e0caa122516ada675ce06ac4445e4580138f098b3fe4e2b2937ab82fa723cf1f0c1947934f08055179375a197e82906a66de571ab77660a38758e6ba532654e0cba640fefced930b3b134ae2cc2f6975876784099989a97d539115b28f5dd074065928fd5ec3ac0c44c81636e82550ad9f9a69c86b2b4d6f3723ac358abd650ae4f010d8119f0c08543a9d0feab4c47e6644b32eeaf1414dea1e330297a26130d71988e61d5c377e1d11cc4c871b945ac702b1c9ba311ca0c1bce7c4b072da3c7925b377c1e72e01d04738fedeb959c7ce966289189eb73e21b30fd8c8c99a8194916c0eb6448c444047691d1f009560f7b6bee2458c22a33ecae4489b825811683ccc71a0c0335ecd0060317e64a8bc340819aa10f0b075f918aa40408cddc8f605123426c432f554b2a249be7de8766b7ab9015075c4146a3f52cfec89c50e287aa4ae4dc031f4252f73e98df4a926950e2b1753356040497dc316b5a05be3e61af809986e7a5a381f7975518d2a6091b73231a8cc3fb77585e9369e5f417f56da89672b007a2cc17120af8f54e0cf43d4cc6c88085679cc5e117077843fe1e9ffedbec94c3864c220e1c9fa35e38ef3555fe550a18f5fdb04ef5e25a0b1d8bd85b42df221afe11e7aaa966b5be1278890345fbc89143ac304d322deab4570db7224fdef7b69613524ee89b16d3b58f75478f14fa36c8e8843f901885d75c624609f3cf49eb5c559853cdd676a12e390eded62d32dcc2cc4690904d4e5af782a989406e4d5f7fe487feabd9e1ec10b292299294ef8ea01c87bae938eca221c267ff968dc277db0090036265ca07d71813e83cf8bdedbd84322ac3ff13db340760fe631bff59300f4ba3c3ca17ac6d2a781cf9c51e99369c172500c0fd669c21b0993faf0409949468ba648acb85f817a43b4f726bac462e102c1c1b65653d351dfa8b27215eebe123a3cf424c8ab51ac99ae93093acc76663e979188a38ae38b4c7f12e17c65570af295c88e566ad36bfe82fe082c8ddbd530c36a9dced2301bcd1a8d72d76ec0bef131baccbb81d1d938cf9f4122128abafeee90bac64011ab340e4b629b7aca0165d0f406334c21ddb285fcf3dc2113e7338f918907530baff63109c1bd03ba2e438cd04c655ab8e5976cdca1e1c604e0577e4e88f30258bf78a5cd82d346881df7f6d508ea7a91cf7c90e7e8b2c796ef3e4214b912e2dc90cf80b7fc0f14c909516e642f1a237558690f5f173d0e401ba2f52c9ebc5d1e50af17c03008a6a4eb5af57b15f445fccd5aa8e89ce34d618a811cc0c82e785bcfddd2b9f3e2c8ff0b1cb59551d7c9229cd70879aca530351376daa8360028cd44a05c0f010b13c4831d132c411917e4d7e774241939d94bbbfbd3473785cf3ae2311a07f1c0ead3bb2e18840df85a0d1b8baf722164c08602d4b7ee6cee5d6ff4bcfb6b78f9bd34ce456bf29c9bfbaa05e332f7017a72c774013792838afe655d47b6f721b1dadb097ea02ee24388ffe2649fad125db686c7af8dc363a4e34389f4367416c266c808a6a922f2499339281b69ec4987f1d8eedd3f83dad6892f24bd8a40b75c58bd66bc097f4c48ecedb6226aa3c52e0d79048d0d5184705b552adf41c4b985017ba4cb5cd245b217bb18688b3fc8089189d4786d065a6feda3e209c1d1cdd7e443095510c2f6d647159b28b180d135412f7425a8e45fb194812a1b08f01113cd0daa8368bca20324dd7f9bc44e3a5b420aed2364a6e3e4b4067c420c0a28944004772fe3a4bf2854238c414e03b709c5be61f8dc5ac6c37d5b2785d46517872a566b256fd03772ab0f3ca8772406a49f989c3647222df6fb8d2ded9fde2410b5a6b5af0d4a4049a39d2ca60dc98f247682f30687f564f3a9f23f2ca6ea145b065db4b59bfd6748d3bf905c166c9e702d7bddd187b7f6a04a91cfa180fef27c7022790dc1f865465a5ebb0cf3a70ca795f2fa81f669b50090d260df293e46fa0a42984cd235feee0d71e5518ccb8d329d9344592e0f700ff159a7038069e099761a3f73d8f6d0a8fc571aedfcea7fc13835e5a0c189c8fe9981b2ef5b93701bce27518e3f9563b451224773de2e56f3c1dbf0d6a9ab415a04a17a3ff0dece6da12ee82f1644ec0bb9e7f3b23951558ed4935e7470b45e2dd868a11db5d904ec451e6a2a624977bcd9a25f3bddfc75c5c2360ca971b64f81a8a069b31443690d62c801d1e9998126db5bc075838da8f1e2ddd24b121413e55f556b72c979f551cced2519e83e517746871db82b2d0d3f5843db25502f00771bb06a9049327a200be6dae0f91410381eaf3ecefbf49fe811a3b6230fb6d220e2af0854421b67d831fd6907e3443b4b9cc65f2d486b849c2f0330e9c8140927bec607df1bced71d36f1124eb11d8896a0f73af3cee95549ef240d538a805c13af8b8023572844241c47e1169e6bd2881596d84693063dc0f83695d39fb586e760eea340590e7afc2e3cf1fa0d561830247f182b4b43c7eb26773b4281f154bc63809d0f5545ad087456ed66153e295be57be3760c0a1fbe39e35674138dec96c849f0f1e01775df0018b44b727e57f7f95095a6eebece7196e928c19482ddb1c2a7ba06b6ec480a0ef39c8baf7c5146491a8a5831ffe72a616299ab64d71d0dbfa758dba4a6cebf0dfe769f39098e029fe06316d8f01ac600072998190f1b20e088e39cb16193faa94a0a437145508c66aeb19a30f2b8a3ae811b8598ac7a522ff11c0013eace8cd293be6e6becbb5b86662a882963792a3e8eee4355d10c4d8ec24b816cc76527a043858632935bafb408666755e4a6921b2968140c1109defe75f0465afb598d168d7862990d6e76055eeb654d828f6c19252302e88baffddc82f15aed41a457c6c9a87c4ec683ebe1e96433616c045b19c849bf372b198859a75a2fab4b459ff045827ce6d868cb1e6d2334b5d8762c414995734c10376b64c5afa3d4d4ba28509f34604f5e6e2de5b6a36282ef109164e7c07279621be16017cd274812a84c7c02e52460dad3260a69b21198332da930fd65c22ca344d7fef9e89d4d528424f61892398c49468c1f86d7819a49f7e2233f9e795cfdbb927d9c6ac0f951883b4f26dd7a44af24096fd1292d0fd48df46d4e26c04ed21139158d88b573f263527bff4a02e3a099ab2f65b725389ac0f827137fcf6bf980177d1e2eb2bb1a16f1e5855b0afe413ecfdebc59ea4f6c334522b2b39c84fceec51e3861f71cba404c9717eb04779d7d0efe43568473af076eff23aadec24860b87aa13f9f4098c452d42567993cf0d206353c97a95bb580c26473404275c19f2bbb37de79e82542a6565bb4fdc9670e9ec69c87f2050db926eb2db83424106c56628f2d9f00290f1a458ce872d493b79c91c9bb101df1c1ccebbca27ae905e5313f2f195797a4f8065179b4a7453d1b1121602316a267a7933d36779739f37d388e845a859faa7095217b3d22c7d50f41914b1a2651c317865c7a4484150e1dadf573f0efdfcb1cf1df0bb6645a4aec6edd8f4b11f2d614f9dce3a7890d350024dc2bd1c7de5f855c2a2f6c43da388a920496087dbde533ee5f0e197d27ddb69f9cdc171fdc6191e2878dc13b3f8a1185ff934a3ad69219350bb6c56dd651ba265b1ee938853b040b1465b9a1c32141b62d66a61ca423d96d1cdaee092c976ded031d37a9bfacd5e84e0f71d83582fa2d723881668de9f4db2bd36b12914adb4f1bd3ab34675985e8de64b1fc943ad274b6d5334e8feda6307111c607f687e31c500e1442af9eb368d939ed86f651633e7f80a39783eefdd21e766f6c93c51c57a7f0ffbf079615ab0bd53d4895343d45ffc423295ca31d6db82eafc376d4fbf9707770477fc40c727783820baa91a6bfa334b34dbe745659343ce20a0108c8173f80c8d8cbf345a26351c3f74f0ea79a6b8762bb7cab5df7c5bf79d031598084596059bce7263d3f3a46178e2b20f026c494ab0b3023d3c58ceb9a9c2e89e14fd2bd07dee16e2ae3c0ae1492830ca8a41218a60d785804bbf5982cfc3135e0a2e0c03c72610669b4b23a5771973cec9b068e3e7e0e2c3a6ccae06148bf30191810f81c0580fa20af89543aac31c45bdb75df661c8f2d9db1ae7e051d56661d9bd84726bd9f19a538c10bb51d23df53e28b2350dd6e81312e630e9a2bd3921fa19798f5b2a5f43cf65dfc74bb5ae05833d75e089dd6f4d0c77c8ea0a1c295956a4f0f6b442410eaad1f18dc468e151305e285dd13027a8c4a9d839cf50b1751ce86ac5ebf2faae85f23fad1a5780bf8569c9ce36640c2f84dd63701550ad42f963d2a034b7267d578cf5e648ae6ab41513ec43794a8505856d2ab0a4126a4a719c5be7e6ee9b5da03534d110d21ac177783e81b2760c0447586c060294c4e4662600eb8250755f69c16dc23b27556c327e16a2c1b09da2a9f3ae917e0658b0c506def67c13c3a50376c6670dc2f866b6d8f8b72219b74b916c40ab68430ecb071bf8e39aa37a5a0b510a1d0c18a101d243e1b2ed28216dd5297510e79ad72715876db0dbd9b7f1c7f3c76a210c8845c428201bc1005fe1384650c54305c55493a6390573890d52e6bfa64a77556d517bfe772a98bccba9bab029058c9597043a2548b91ae763eb81f3000d978df506c576ddb0188aed2af081d09607c2fa6f8a88acab78db44608216defbdf7967207080c970c1e0c06b0a205842f0e1ced38feeae6c47d8f3e986637be9ab63171b7994f1c382eba1e8ebaf1c5b159f7b5b8fc3d1c9f7935535f1545ea3bb283c51419e250a84f337f4243e8c4fc3dc6eaf01de2d89533c49fdd86b86412f398984b268fb152a8b3255d65ef59298433c471bcc5a5d2ac5a52a84ff0928990f4e993eb475d37efd475a3bdd2344dfbd39ee63a73a95a4bcce9241343f3acfca9b95c2297e0a87c6bea139066880ac4075ec6421fe9a37de63333877d8af9cce7753353c1f76c905bbd7a01d3edf1def2534ca59dfdf04aab2ecfaa4a673fb0e4bcbbdcc56e1730dd1e3fbce541eea9c6d42aabb43317176b75f6c3a390e9fef0c35b1e7d34cdc5e5afc6544b5e37dae575e3f2cac5658aeba2d921d725fb3bc9c4bcd2ead334ed652eefd9b5fa9e697771794fd334967778639e59d7998c6579a7573b599618bb2462d151a84f3f1c3e42bb448966b798e4d462ffc3b7c8e4c2b873e15f953e9dc16b556271042c8917809a08ee1480c37712f804c4e1db09ee14c4e11ba84f2f876f257d12c0e11b09d70871f81e82a3b971f83e82ab81397c33816be6e11b0aae861e12a000df5a0a17de479f363e729b10a216a0ba9701ace1c6e6dea086cbbf51cd70f90278a92e03c2b1e1f2037086cb8f2d0880954bb8c0b26b77794b4b8b7697ccc5c5c5c545bb4edfeceeba71d19efd55edd9d334fbdef2ccd2ce5a5c587c3c1b1600d55d5bddad320c17de87ba49305cf81a75935fb8f034eae6c38cbad560a91b8d95bacd9051371653dd5662d44d068cbac57851371829754b41a91b4aa96ea58d44aadbe86ed2c7a79a5491c882cd35819fd2c7e78979b72774e19b70125b80cd9f033c0958a15d19eefbb301d67767c2d1f0e5cd9581d936f9c16eff1401db5c9366e2c9d874bb9f9f1f167409d81e32e15e5e3761439ca2b100217c8c147529638c51fa80a1fecb588c31c6b80387a4a4949244a2e42939232d77e160b3799090de3c7df2596924a451ed229d55d13d11dae6893f08821032714b5c92191c414f662ebbc1c064244bd98804c90582f0ace422190ca6c621601b07c5191b16e29a2238887a10a4ec19098570449a6f6c8455d132d8e1b90856852e55f9880db8c8858f3ee02511dacc74061f5f80f1b799057406e945f1114648dd87754987573141528cd5a2aac72a56a4289b0746498a91225157a44e22914ec548d92d4894943584a2a4b4b033d2a7a524cb82e32ed1a79185a3dbf4129d2d00ce3c190ee2199e612eb08a7f6e55cdac5097679e292e9492eadec16678496bf04c2ed4620bc772a00e8fa34ff3d4aba62a5f11fd81c38531461883669a041dc83403238c30c23883f54f0c241042867d7ad70d6699543e23b30113c426c4c5a1d2a78daf0aa52d93617dbac092eeacc9855af4c947137e0df362741bbd7cf168bee4212a9dc1c718b725ae0f98fb54b8babb0352535a232084f6ba4d1bb92c4482d11d14e2b850880b83b8105a7653b9101e4228210cc29021cb0c95b311239c5362989452ca22f73d189e2536984b7dc00cc1215141334ad1a714734eaade86e9694f255e46f48516fb01b6f11026d2323b9e368493bc2bda0aae828a29ee90ca3b1ed07d333a24589f23fc7b11d5b364e9cab822279c94dea6a98d53606f889c7c25948f7c77aa180166fd827f9f78c0360c53315158fb8e16d05975581dd059056d129d5510ced0bbcee09db4919e5229a584711ed6286384105a4a2d0b13e98c8b1411e2be731575734b6e751ef264763cedfdc979e6a23a075d955a44b0ea414bd460819c1d4416c8ee40c2437808666128c51ec47808066113ab55e85099b0ce602e2f71df999921b4ce07cc653ec200f2b0c5db81309e1d0df578c8277e3c658b4ff0ce45139573c6f8c309eaef5282a24e451ef589e844139d49fb836fb43c45674d5d5297f130e6fc709b78af9a177dd56feaa2f73b0e9535af1c798a7f906e7551e52bba9490a74415c54cba4967f005d8d6434eb8e8d310d7b83be3e0687e902e176cb77ec347a6a2b322d40a207cd972159d317470b405b9ac020c7bfd26b2df648a4c74663d0b5940a1a1727f1fc2a36de21a8b6f3c1860f12f9894f51ea5b4fa50b9914f80356199e88c27c0068c8909482ab02d9354601d1b7237abdc582fa0c24b3848a8837ca858f091de241dce197df4f91e7d7a7783c4bff7bca852faa4d2279473e9ac040a2876fa34a90a4a75f168cb422cefbca81b4f715d5395ea52504ad5755675f73627844d1b52dab689ca849d40671ce8d3c85a93e9cf329826d8adbb96b1ac6395913cd21f899e22f1a67737c8e5eb869138c1989840133efa042f3a1714febe37ac2e32cf6df9b664df5d9b2529948f540abe11240241f08b584033e790b579666d29f846f729b3749739d01990bef4a22bde590459be4b79e5bcd3bfdbf44ddff4ab9b1f24cad481c09ba8e09e22dc83a44f26be028928ce702ff4ee9733cde8d3e5b63a7c1fbfbabd532ae965f348b95149695f4e00da6754f6e488517490d1b33df1ce39e7ac2a8ebb73a8b3885555555555cf6a7d5a5aad57a3595dca39e59ca34f1ef2167d0402465f355f38f270f44929a594524ae9ac2657555555973715e429690402366291a71ea45580f545ec537dfef17c459faa1caeaa47abaae4e81b3d82a388103d41f0d8183263b459a3bb91134f86916cd985b94346f09d91cecc88ec060363d92dcb4676bb09b33008582329e2d3a7ad77ae682ca6d52383279e9d4cef3c2dca69d3315611df3b15555d64fde5a098297e4449672e5a86f4781e2255f7b4217e127dc057882c896361967616e9bb4d8fe0074edf6aa77243d59de8d3e8f13a1c189dafaa5e57e9cc7a554d9d5995b53ab35e5557bd77e647a38f5e55557e56d594b3caea734a595595859d8d4e2ded6cf4916589af6c5c7553b9161224cc05665596eb2cb614583c137daab4b8f1159cdd3bf38ad6e2b1b831729218590ed8466f9ca7af5a5eca11c1a67558e01d931da2746b60244e8b124628e833574a29e59074424adb3f54ff67064d2425dd7c9c3d270f30781fa62b625821144191a4aa6afeef52f48b2485a9741651301f1451078f3d4a9dc344169b175d3709803bf4361d2354e92c7e423aad93d0469439e0a11b8180f5bb795432927b6739fe00eb5fefb021943ec0f81b7fda2c0b62561f9dc937d199e41d2747fa947566c57ba7d47b36080bd375c0e2e1b32060989999298b9be0101222280867a3e5b719d2ca9e733f377b324dd0df2d13c98c8f3451d96d6686b21b0c4c46edf63fdb76c36010b0cd74a569c66d50abbb6f9c2b619df1f9889c76a35cabb8569fdce59d744988f8f090ecea8873b772f0c46c04eb6f4ddc6dde8789e794cc4364270b301624faf271e859d7bbb11a058e1ec1de5d93b361074208214386b106d83b941747768e59ca88bd2ef0bcf770dc8d877106f2468b5d5867104a7aa30fd38dfc8e916d8700eb33f67e60babbbbbbbbbbbbbbbbbb23f384e19dc286fd3250391bad026c83a1f1308ff6218c30c2686184114628c2182d8c30c208238c113ec6081f12787844804198268209411f142cf12ec70fdc671c4cdb2dbb10d277065d78c764070c5257860bcf84a371304259d0814cee070686520c73720f63a34fee3601a19d2cc048175af72385275c77e5902eed8c7922122a6723de00738f1b40459118638c31de7dc6e69667e6d91c5932775cc2fc637777f76b56622783755fa7d775dda6a9eba629b5402ec7c5b688cea24d0f30f87707085971e323c0575b81c130116184c0a4255f51ef0be7771e8b58754d277d9c58f401b66137aacc0073805da25f8041288f208931c618638c31c68e31c61863744ea07752c618638c1d638c314afa8e8f31c6c827c06494d6aa01068ff5e96a19a53ce596cd93e7ec1060e73860b4b396910aa1e227cbb2ecd900a35946e993d1a0132acd090d601bc2999c13e4124f267b1a3ca598917959f9664f6609a7c1671be682326bf5edac219c6fa85c86c1303373859d952e9f1d4bf98ab19ed70d739c16f6007b8749bc3074e14d17c72160f13083e97e496610745d16307872afcbe20878b8434da0d57306d8cbba63c4e665ba10eb2c9ed2a7c598b6524a49ab253b04d87bb487462a1bd98db02174cc73ce763c49806d8fa7a19d9d1d13e48857e9d38b335ef7b8ccd94861062e73777b77da884f06ef3388a8b60f93c9d452349196a279287e4af8998f75c61923d7017ba7a2084f67738acee6e7a13cc5cf33cf93e1c0d3e6e7c466cfca14b51b76ab27d4658dcd73a9f791f8be7802d45f0de67bbeabb8f3fd8a24b9ab7c02663d017b0e7170357df92ecf3b320a58cba12fdf43f22de1ca4b286c8fa7f29defd5a98b07f577d195f34e019983c3c395237034ae7c387c99bb7be80d51fa308c5ed9113a916f280916ff580e3d19d772e8caad65cf133a187dd2225bd9dde897b69b8f4b89fe8f8def7c924bd5b706ccc271b9b2d4b40eca2cb0ed0d0d554fde7d7e7b76b8437d9a565e3ce67be871f19ee4f4e7b474e8c970cb7ef7e74ebfca0bd68c031c8d931199a8b375e2c9507687d3e0a9bdfc853238f7e2848e126c9be12781848d1c180f9d98b02c883ebd57f436b8e60b97ffe4260ec3e56f2d173ac0bdf06d1a06791db37019baf9b851f44abac75add8237c2be5e41ebeeba2c28fa8aaa63ea2ccce9cbe720f1751d2a9761958b4e3ae7c4c3e0a12001ccd32a7a28ae93804241828dde2c0827749d134fc6fab4d16e4e894b72dd67ae57afaeeab2ec129588678967e2f7de6b1e1e24b0a7e4b94f054208211483ab39845de01a1b58c304e49a0721ac2cebba69e8c4bd3c1eb2e8465b491fd9e1bb1c3fe8cf5c1a21e43a79f293ce30a02682d11d1848e93ba387406a008236da265a7476d33b58a07408889932d7c19162f8d03e70d96bf9d74170da93d687bbf591ad8f045dfba870df515250526ed34b2ce93d678d4b5a0beaccc526518b24605b1c924356acc7cb1d29a44fa52b89a13ec59fe4fb34723425482f20267ce3fdfaa8be2a3ae3fb802213ec4c62509f822212300964599463b5aa95545560bc90b1629d59669c44e3a4fff535b0fb70db8fefaa7a94757382075b16eb7c182b8bf57ebc2c8b658d08024b2c39d6afe358bf4a16844edc082fabaeac0e84a1f2ee57d26990ce9147756859e459645b16698d087259c791b71ee45ad80deb268fc275f4ae8dddc2f86da714187f741887570ef6b63db05bb6477d5f561dccc2cefe513dca6ddde0adf17721a19253adebec5de33ed490416212891449a4cb2045bbc920f50c929d711929d70d9c71529dc1325ead54206fe532ea53f2821e54b2f277088356e0ca5f5c392b2ba4936ed32c55bc2b87ada572cb3a0b8c3e58e73c18e3dc1589eb86e510a89abf58ab2c04e2cb6e34c6b91e0508dfb63d586ebd2f24546e9daf1c965b2c2c12c2f32d96eafaaa3a7dad1e7debd575ae90473cdf5df2d142eb2cd55d6b33c1eee3f01b32b490c56e515ceb2847b136cd729ba7b252dd9561aadb1217e531eae6c445f9f5e2851d5d3840f8aaa838e183721d78555454522c94ab5f35cb269d3d19a9ca515ea55420307211873a3e913bf76d7148489f74a01cd227d82794cb9d1478fb96b3deb75e5c39fd4eb9bb7052ae729ba6cdcc2a952f4308ab67a9a45420404fe60141088f82827248ba6e50baf2b10b27c73a9f83dc4a4208e119328c6f2965b48874843d842dcb53f2646c801ae8c89123479a870a3a459f5ed5439a489fe4d0e492c0d5340fdf0881e33d30df81b90eae2606f18d39b8937c6cc237dedb04f775efdc176487081f50f401763d2a3c31b81ab9f305d785a7053ec5d7d8f49fd07d2f0b434d66582c17fc01e29a066a2a4008790742de791042d8547034103ef820843420a401210d0869404803421a10d2809006843420a401210d0869404803421a10d2809006843420a401210d0869404803421a10d2809006843420a401210d0869404803421a1056258b876be2503fb913340abaefb149f7602842b903c100212cc10b5ab07be0682084b00d3eb0a1c61a683899a1069634aca0418616a633c430038c32bc68a242869431a088a1c4040b03090ca32f5c429617aa2e505c102da15b985a90583c841062c1d1bc87c5436885cbb22e78b943b23b3c347a1fe11bef25db40aeb25b33519d61e881e131e1a1b785fbfe1e17eefba8abf0b0e0b2cb2786fb1e5f17ee3b8bc0d1bc2bb897f7f794f00d7702aaecf6ca70dfdf7d68830f3ed460438d1a34d64083c60c273366b0a8818565250d2b2b32d0204386490b9329c61962c480610618305e94e1c50b95262a2a296448494119030a4a490ca512c604c3486120914660188dae2f5c972564599517aa8aea024589b82012d12594ce2dcc29b52065ccc28def055d08b1e068de7b577034dd6d0547c346bc377aa4f79ef5e2e18335608d59a158d8755994d253da16ed1bbe28bebfb86ea28d71dd40fb94ac583cf46498704d1e3b7936b6008b3ec04cf54f86b210c8029500ebee1060d19a307ae8c4d1b4e538d8ca078b2f1c20253e001d2ae90c062db9ef13e890bb46430b00eb7a3d67336496d6d44cb8176982110235983f3f00e0eeba0140b55b13b7bef7ac3b05a06472a71701fc6d7ddda7ab696919b99a2c7be16a5ceeee5cbec5b8ee2b472a01d47ea90dd4197c10b59de03278206a278133f800d42682cbe05b90706fc067d80d781729dc1bf0af87e05e6ec0cf0cc14fc45c88b7d4275a0ef3ac3e917ddea53ef14e354dd3b498aa83dd1b6fa93ad81dc0b3aa835d02fc551dec16e0d510447848bc4c8487344f4fc14384ba49ccb33f2126f2bac932d12bf2aae853cbe1df911a1a97bb7639b99c5e43237384cc652ef323685a9ec5b46447c8d42df65cf8537d82ebad7ddde08836d0a2d7cdb3b5d6cd74eb2bd74ffaf415dd48da676b246c051fe9d30f9af677cd7a36b8f4b12c241500ea054cd70a46b2f111fb8375a94672fc4561caf10397bfbb7c74e5587b77e100e016c9937905b866377a3d30609bf491d067833c5374061b89f4b93c1041fcd5c902ecda35cd86f6ea592620be6197724e46fabc30b80c078ee6699a7d427c033e88bbf7ec03837b81dfba6af820d45e45256036ef098ecc9f66d3558efaf2d0da7bc2e368a6e893f621904812b0ed3d3922378864a5e52e8747ace89376f8aa74ddb85887692a873d7d72393ca4a24fd9e161112cfa747234318702f866ba128311127d84f00df8f9538d53c454bed1071e0a81f402a0bf0123e4c2bbeb78dc0b7c92a3ca9fa7412460d95d5ade75e33273997aa3e3156306b8bb6e9020e225e65a0e8e216e840e23740c81038786e3b7e2c8a95e2a907735edde7bd39573af5d382fbfcfd1f198bf1c1d393327274747cea9e5d422737274e4e4e4e4e424919393444e4e75f73d9bf39caae344541bb7ba9bc485c44b489474bcaa5a07ebd0d18262c168963a74b4643a6c20150c7b601178045aa1e3f010093c028fe8d071d395a3e3cf6eef4fc7dd8563731d6fa9d4357dd5ea4c47e5ab49297568370e844bcb67660e49d7cd8c7598f6575fca954490abd9940b47fb0f971373ed310f72ab964a3bd35cb4961697160863ec16e4f2109877c30ac03af9848484dced01bd224f8317c26eb40076a304107a451e107c4101380cc05f92f753e1a008d7c81cfee5c09d8e38fceb019feee19f10dca9e6f0cfa74f451cfe61d1279ad337911157738af98601816b620eb56f315e115c8d76f872dca669ea115536c165f0b7ca2870065f53a5155c061f13734905be017f9259b81bf0329509ee055e62c137e08ba84f00315dcdca2cb80c4a2eb81bf0da65448dabd5d03e838506cbca8c15192c324c2ba6183262c030c17811e3854a102a29305250b477152dc66e2a1829853442195da5cb02c2aab08a2251a29188ba97f74abba6a4e4d5445793b0098ee63d26389ad62e97e068d8bdbc6b9758381a97c3c69f22f0946258f3bc1e9e2dfa04e0dbe36924b2c56ef4663608eb626fa48edf227ebfd18b739c9b236ec473b457afcabc524246e62d7573e2b65896986b7779cd6d3aab2c317fcf4edfe86db96b9698989657313431952527e6a7e3c4fc4413f3d34f165aa8dd899bb9bca56e2d3f80cb5f95793256071a0007124beefb8efb225eb9015c71ef351e3277b12c2d77f986b1b43ce61b8db12c2dd68820b7e5af6a39b1e4b43ce6382d8f39b540eb2253b796cfbc9296566bfeea11473ce647687f764a8169afc939e2cff638e231b6c78ebfb7541da8591d788fb0b0339cd7ecf8cc73ea06efcddf85048e9c1dd675867373232cececc69e88f3a544112fe2b788ba4571ef2bbe7234ed5d97bfecba5cfb2be29e880b6d663722aef3ee7d3aec16e45eabe344bcaa2c52ebf8ad3aecc6f76a9add88786553813c9b135123161c7d5c6afca924167dd279d7e6f0d2a74f441c5efef409fad8e8bcabdd453bbcdae1d52c0b12da5daeddc5eaf0b579e9cab1b9cdbdbb8cb0f9ad625e399a8d398ec7c45c52f75dabf0e2a13db3d1077bf6d595a33de636cfe500eff0ba9199dd82dc6cc3ae76d732d2e5ae65ee5a26c74f2ed79ea3bad664ec46afcba58f766ab136cfa56e07b856371de8ae9bcc02e198f785048ec73ce6d9b5ea721d11e4b69c878b8b4bf64e55a76fcc7bbcc7bc3a5dab994bdd9cb82eaf5ab296ecdab567d6e5a7b7c4c4dca65deaa6036f4c905b5976b8eb72be416ec5dadf71b43f17edefcf6a1676a6bd25e633779d699f89b94d4b1cbfd55d9bea2e11b5881a5cb12d71677e80ba3971674eaf9bd4c2ee14541b5f1ecef9e09bb3bbf9f3bdc7b49bb4d67e720f59d28ec6b1e4906e3ce946fa3477f7c73cc8e2064cac0725155126a7f16d5c079b055707d20b29119d32420893d0a0e751d1a47a2ffec5cde63ef7f27e80cac5f820dcc58db1fee0eb5ce51b6b8fc762c4b32c3907b8ee07b85ddcf707915422672bd1932b604e5615630fdacd097e8755a7833ca640f56209159200614eda418b4bba2e8b2745b8ae54b918058c878f0cf50c61be6c24c1787600832e14428960533015d70d6d8e0b18f724e8403fced13c5cc73bd73d8b2fa89c657aca555868cc697be5ae5746dc23da3ca2734e9e4c638429358adee323d6b3445c8d944a568773447f76135d64a57cd442554579beb213dea2336ac6df167d7a379db2ca27df19757b65adf89864d814ab32996d2769eed91d638cf3518eb1cef898ba80e9be1725f8a2f291a7c197aa7b9af54a7fa56783dcea59d70b543a8552b9f8088c025ff198b4069f165c949e4cc94eec55047fd8c03f530aecc9f093b7c585d3467b1ad4d3c34f7af849759f9ef8f84ed2d0c15672e1ab94f79ecabb4d79ffa5c4ea29effaaea29252454ba2ca7b29e7eba6a380b9691dfec13f277dc20e6135aaee2c9721a2a8cfa0ec8ae9d54595cf7f143489442211f54a8a28ea8aafa8458d4e8a8f31dacd878d0a466d269d759320d1b7168a7118877f422f28869117a2c78b48574e8c47bbe1c438df5da69188c61d8dbbeb4624a244a72a556b5cf498f820baad2c5f1f6a908a6559b132281165a1c89afe5e164a5832ad1830c0a8d1210c92c5cc2ce2c71a49d5a633f9afc66a5aa2c8d529d1957349312d52e518f502366e149a11040308c661c3807151bcf5e2968dd1e3e34834aa7889b546e751ddde63129fb07d416f499f78447ad23d4fa67d7c7a46a3b70ffbc4473d8eeca633afe8ef940896507cd1a957d1627ea27a11e11befd47b96a84ac137de9fa83235a2620fc6a38b9847947d4c3a83fcc34978c985bf786e62acd8be255c7015565c66a11794028f529f93ce60d767b50e3fc1448fd587d5300a428a6ced737d782e7c63d127d8271705214c7a8b0bb34043931bc47559a0e18a6b84a15b735d164618c2b5aed3cf52e9ba9936cfaaf4a55a82e7f8c1b42fe8097586596f4967b01f139b20f84381b0a0207898ec763399dc4d93626d37cc74f9821ecf1a5e0bb510ffb4d07f7e829e8cb31b8c501664b79b6265b38c522cc864fae3e24226dccb934de0839e5606ba06ec99e07b5c03b6b5d0852df464f8e747e847e867091874451b2844e18a7ec54f1c0dff5c97c50c765a8aebb2e819fa91c290eb7ea2508513aefb8942928be4ba2c7a9adcada1705d163d3d45be84a9b3e7acb50047c30b702fcf8793d23967290b5f0104af9b7746f2fe6c129d4de168788adbccccccdc424fe311601bbdd1060b71768685d9cd3dde870dde99d1a6e39d93b25a769ed66dea74c6ce49e9c3146b139d3127c120ffea1560dd94474fba0518b51e74754af1aaf93ef20aba05181fbb06a89a07a3aa7eaf00cb78c76407ac4597454ee386696e6e6e6e6e6e6eeeeee6c603bc6e1e166f1aa19ffcae19a9bb4dbf4f46e8f936385ab22f46e2c3ba428978a37387f1bebab14f8c0ec203a9c016c41dbac38a5dc502c65b4d4b36c4c2ce7456c10bc8663edea6a18a495a6bb36e958f875524045d94b0c64b77086374cec2071f33f30f7d58d75dbeeaeb9d7581f17dee361de16557a7e4b67541164fe55ab403314a6dba92588e59b135655efcc528a4b587e4926ebd7297f4f9e384224042f28a423a7b71e7260a9152486beff29bf5b853ba247dda1ed6499fb647e9f3d649360ec999275939a4f459faf6de4e9fe6df4562dee67b582fbd12ed01b32e7a2591e825abb2e4c09d9d9d0bafbb727867a77f44d6aa7c2bbe722ec9b2cb4aa2935e715f4a94ceee46e97de5bc2b22fd91ec13a4d2df752302d29764dda62dfbe35d928d3b9d8986602eea0163f88e59fa494b16c28a3accc621f745214fe0f08d3b9d3d0a2b9dd61682b1832a7752df745aa5b369dd39dfb36ef45a157c61b71715abb4b3aa74e9f4bd11bd6acbbad6699f4aa463c7ac9117277193a091177797e8054d22f473e14e9f8c08f1c1e2ba2c7cacb85bdc115972e7690fc21b0821a59f16563abc8c0c798e17360a538e1f60d67cc9b22812f4f0588db7045f9aa7f3402a1024877ece0b8742cb9a15bec4d39a165695be1a5971a74fee0938a45aa171dd505ada7cf8305d68b19fe9bba8903eb1c0c79d3ef17dd04a2139a2dc818fd8eb8fd2e92bacd2ce2c0ba72f852c2379ecccf294e59cd7e94b12d529e775cdeb363d256661e7215c43e209a354b29364e769e55bb28c820bc7f492ca1d0f71284c64c675334ba2eb4665a5c2902145cc2b8c02ae11c9b82e965f2b2c576945c4a2cb63cc6c329dba7058ae8b58240b0b85f1c930b8068b44a28b74c9950a4346c56e322141b22c259b4e82515d673060d8cd87d526d2994996998589dc4a4ac9226629a58851ee5478c428b0331495bac18b92424723792aa9957062a775b32e7d25382263965e559555fa1c51ccba37a91dbdc4e382f151f775665f9463a3128ace1c3586612818a604e928b769acd25a912cac8451785f3075f1a8eeb4160a6ce49d55449f2825c272ddd012bd6ee6554727bdf4499a250b055c73bd84d2324c32ecd6976411b9a5ab6e7c27e913e5326ed328a59b7e1db64c8c5f56864562964eafbac15bb22cd747c7fee23cb55bce69e956c9bace304a47df2c22177b4addf8a65c74e1c838b53de8514e65d4d1fcc6b2322f9cf91e2519f32ca352696534658c685c3718ad9144ba2478afd1e375c3b77748d74795dee699aaca63d4178751b1a7a45c3b5467eacc127da552c9ce935e1abd44b2160a46a5d1af63efbd477f95607ce321172b3de51bbcd8f9c229bd07c9a2940ec36e12b646ba4a8adde0bd4a76cb40904b8f8261b7b063d70d3622911e2fe99452aa3375e69cd75776e624914e49d82712f452fbac8bc81d8d46a4d2b1ca38d861093b3c3c6619314f7297542d14f08deb974d117dba2e47d55d0bb3885c9bcee42d0bcabf8b229c31da20eeecac21eec0041d089bd9a10feec09dd38edc813b0f251a600595cbb017d4c348142e28c70f685ffd2386292e00ae7b829323b772d77a67e1048bdb7f5938b1e2fe5aa7eaac1bb51bd3ba7110f3ba69fbbab872ac1f3108b9178fea7d77e554d687cbc36d2182087179c002db6cdcc602db60571f2e0f309d55dcd3990ca9d710c301ee0b5825d5430185c9c44076019dcd924a67d5b38d81b8aa94a0bc62ac54f3c475deb9c772111e51dcbeef15e3d8784274ebb35eb5b2ea7c657deb211ef55af66131c4a358bd728f7bb405b93fb88b6b84f47a9e0cc9323310500b3095ad81aca77cf3c1397e751815ca2660d7f93a27305418a833189552a92ca4621bc8d1b435348a291508bd2267f115a17c54371aeb66ba2975e8527513bd9e0dfe5c94575d056ce31e8b56dd55753abb5f3517e1734f67d5ec0ebafdceaffbb4aabaebb35ca496acb7f5b65ebd72f10e58e5221e30d802ac978001b59296c1de4d963401ebbb2b99806defe772925e72f922259d314acc0386f247459fdc7d317034d5b769ad6faf4855f18bea8505e312bdaa2cabbacb4fc675b15cd74d759e292218a269c5b84477d5ba6eaa39af6fd3b24422cb12894e658844d6e7b44c568cebe6baae9bcab26c9d7be6d54a803a686ba09e3e71cfa3822fbf9eeb3abd976541627ee5ca99bf2e3baf5beec5aa5ce4baa9b4806ddcf37ab8a643709963d8ed5d207c2dcb92f3bae8e25a46b0dbb40e575775ff41129d5e4af4ad8beac659b8cc42d695cc9b862e334672f035c751759b6ec287bb4c2f069ad1d9e8cd453fe11ae6826ff0451cd4d993702e77732e572432614d3c8d2f52e268464fa68158a5a7092730f8857522e36db773cd0b47fd45b502140ce0b4ede507a027433a1fc5c630dd18b5db6e41902c51dd010ce468f856e7ded95ac86d227c5e3205573301ae02176e0b2da863e284821c6fd13249301779b8dcb77db8fd184ec6e6696ebad3b464486d17d059c9c2a64f2602d993d9e1b43e172615bb615a6c74649dcb5cd6c72a0ea7f5632d027396a34ec6e434ae81b9cdcdcdb77a3b2d94a86ef5fc555993e2b87dcb5aab73e885f7312f90b765ef13bcdbe285e72eeeb3aae80eb8d7dd12f7baac2afa559bb05efdb02c1ef356bcce0bb841b70790779ba0b15657edff07fd16e4529b0123ec6537781b043fb77a052d6bbedd455f0b6ebcf47dd62d06711dfc75365e908ca2838c6001b840fd517f01c7113222e806a888aac3e570b756227a0ec063802138766a7c68900c7164a6888cd029280648889f023c21c0d00060ea8d1e01f0bc0c096207089f0020d18e64455c845a827e00b2f103802776a83a7937f1a1a7060f8d213376587c5690c838622a12e307469d7981d90d46a566778bd1e39e368ad1f3645e84506a8c9e224fe6a5c9d3688c224fa38f71e4c9bc389135c691a7d1f75863f4f449523754a9be276c066cd3865c7a0ebaf49df55cfad7e4d2439723973e0e5d7ae973e9ad3603b6b5ec5c4ae908de31d6ed5edc83566052c2b7655469cb288c0cd80f4f5e7c3aa32f585c7a9b1641112d0b032408585e9abc38b9394436480ef8fe02e62374b7183d13a32084d45d9015276d05b6c52872698a03e2a52509c588d1b3e46ed5169593cee89f1930eadbcbcad0b3357c3aa39726c0b61f9e04fdf0240e97beb01cad2a574755a31b59028ab405490b92d0a8f422446135ac0aabaeadc0da0a8c5e38322ebce2c21ec23652d584244431279792b6b874e852aa7a0976816d2f42161572e9affa8a07ab48332c77e194a8ae6012ac45489f5884fcf0e4873cb4ecace4a133fadecad093e97e56f4b0f7e445a8821564b1a457d80f4f56ae9b77aa923edae0b33bd58a4555be95eff4f19edcaa79401dd2bb4a8bce9060b44ff3ba4b9200dbde13f7fe91cb815523b2c6924b8f3d991a3e35829e4cb45593a7d16318dd6a08a127312135e953e9f4bd4baf9a544e2e7d89aaaa1f2c689b07981c01b632f4fec3932723c25e849e8cc8d6f0698d5e52da357c2e7d11baf4d76504dfaebed5f0f9e14967f4d00e18c9a27d42711712b2d4e7e26e55934b5ffd603d78db0a5dfaea06c590db070076aa6e6db1af70d1322e071dbaf455d0a3a7432ead82f270e9b14abfc5e8b9f455ca4c494989af2564578dde907ba107ba5b76e9965dfac3934b5f358ccb18f5b602b3e21eb077fa645ee4707d25807340ea104208215400cd112dea31c618a302660e795197524aa90099238ea8cf39a702620e4aa24e295500a42c11465d2452c0cb515160c04aafe22b6ba323fe55b72eb2b5d0bb70f81a89d4a5ce0fe856f27a8073ccd4ea6b01f290e769d49bead72c6240bcc882403e5a67a4fee046087b466c50db63004558860842a3e0203c7ff8c02cea5005076dc1046a47b41dc43d90c10747aefbf141cf45b9eec70724b816a4cc93d26168559bce70cc74d6c76c9edb7426bdac33f5ab52547de51e47e3543a6bbefb0ab0cdfd6095f60e16609bfbe16fce0db75d3b34dc26c237fa11f8e6d270dd186edfa6884ea24f514406f9cd0919d2367ca312d26304dea68d40c1352c8487f08dad89700ff3b44048f310aed1c292cb436680c3ce5d8188ab8211ee85876b8ae01b3360c23d94dddc176ebf2911ebae5a36eed5a9f569d9cd19e14e7de0ba27e0a5ec06c59da79676266d3aeb17d15adbdc00a356111aaf1d54cec63bd36f7cc957f5ea55125612a3ac0ec733b464edc197af44dfaabb0abe6bbb00db303eac0eb18af9549eabc32ba77a358f399aeaf09594379272dc439e4f55162324ff0097cf6f9bec5ef8f425b2810a27446e761d14ba10b2513184948a75fd707649eff90b091b246b65943f1ad51faf8b2e6070ec5800133e382084878a2357fc2811ba2febbe90b0b1a96498a3ce69e0e24e254070a939df4f31dc6cf68e0410be10c23eec43fb83ef746e4e0bce4a524ad516c19df575d1c51dc18576ce597bcc530ab33e41782fac7de38543c49df6071177bea23b97fee752fb837fee7cb419fc50141da45fb505dbbc72314267dd901350d83c9908b33f9b86bf70a0dd4143e5866a8510d6bbfdd7dd0be42360ee04ecc345c0fafc3f19f7eae0207db05d92cb7ce641e56c6c2c2832c64bd1275b20aeb878c0f345d7e90bab1449296dacaac78e9aa78040f29eb84b0b04694f5d38a3cfcf21c78ef9402099a24af4f9574587f1f24058c1354f0271c5dd74800002d7c0c7aa7a4020b991deaa3aec13f6cac217232988a36581177dcab3dde6e381b0620281e4ce8feac677c4b607ca147d4aeaf4c291ef11513ee59c53245144afc9adb8c65f5889fe5ea95ec7aa7552e5949fa0db5bcacfedcb4b5969c19645f477381403c96d9e5260547c0fc8f143ef8955a18f5859208000c4112080c035ee5231c61b810002d7bcf744daf7e4f688e76f3ede13c91608206c9516b7b7b81bb4de134cc9ed5f33e8f6af7eefdc0dee3c893048bb399f340e30c9f19d81380204108040029f6529221f4a1836172d14b8a0c271b7e2c21292f4732ff68a795d164d10823f4bb0e2be7e4ba0e2093ff8c25d820b7a0944aea933ebba9f25ec4419e31074e2b01062110d165ab82627dfc0ff100c7b74ebc85307563ff81c94c2f86484f285a184018c312748a32f907e8c2ea1d11397e5852b0356d5054ba7a2b8506980122da18088e81644708716e08e2cc01d4111422576c02476484a59b4013a9fc081299dd00139233d108980711e60661a6006c74c53bbe3698f1f8008105d37f24a54d5bcaa1ff678e5aaab79b008e38a73d8dae8eb4a204539e19b11cac7b5b2a8caaa4ad32259f39aaf4ad6bce493686979c74b51a122110d5299f2f1bd1723a8e64ba2b5be7435d537128c778f47651d0b41e368441601ee25da24f8c6e936840e0c9813a4d117483f4697d0e889cbf2c29501abea82a553515ca834408996504044740ba2b7430b6f4716de0ee981c8e3c60f4004389af81d4a389af878f1a0d7c8fc8e2733ed4cd32c44db06e87c02e5c0944ee8809c911e8844c0f801780047137fdd886e807e20b8afa2228b0a30ee7037faeeef55d57322fbce7a209a5484a22c880a46083eb917ebd9196e9fb24c6e103c5c8dcbfaaf0b229893a341807b11a2c69db4989171db71a1dad1a7caa2aaca6e51dcf8049c3b927034f1a2e37034f1fd1911655d16bb030ca139a69169fb0ad8f564a8113a8a9ff1a594e036ba5910cd80f561cb90726c340b2800dd0d5339b93b21b0d8891c3493686daaccb8bb656d71a7ceb5aaf313aca26e55739e7f18689e95cc339279be624e291f147ddd440b0592ce09743637074480092bed66b2300e8242d4d368688a38e212512323733ac5c46835451c714f27191a2262b4182d468bd162b4182d468bd162b4182d468bd162b4182d468bd17e8ad162b4182d468bd162b4182d468bd162b4182d468bd162b4182d468bd15e8c91a29ebbf1de7bcfbdf7dc73efb9f71e5b1086ca659873870093810ad6bcf4b44fa3d35b7d229d1eeb1376fa081d4d44b1deb5fe2e234a524a29b1ab8cfeb0ab5cc56229a7280bddcbb3dbbb3b659ff5a172e753ea0fee62f37137f792c5351455a3bb411db32755ebb27db97a45d58db21861bdba7ba9ec7deeaaaae358b6b2416e3f56aad247dd95131fadb4ee59a792c2d28aaabab3b1f164fa0e09c035d44587ef6791e4c893991f63e422f2d5f8759afeb76991f5fe70dce9a364da8a52eaf84dd1a77948a7c5765a1e56d16bd4d1ff644e23e5eecd7855c5433829ad9fd8e12461f44d71e745b2481429d25f883bcf452eabc6b76a4b5c3abc45621eb2942e8a711276265e985672f89007cfc3700dfcb4f5a26f6f8afba80b67fe174ddee9488079ec554bfaec6b627613e28a4e7d544922868fa25209ded22d01f886e8f2c29997578981725a61f806b4793ed457a38e240b8dcf48b11bb6629f66b22f2c01449745c51885b02e1215758a454264a9491ddea19476b09d260025fdfa0671e87b887858978a9c4ea47ceb398a7aef9d1f13a0b2eff389243c17718fce8b2001f8069f62aef20f731095b962036a891ec9a2281c8afec92097eaf473f0e639ca0d14a4f97613e0bd29ee4b72216c02f00d96dc53c064dcd328a52c23ac5b5516c5e57ed44d1ef02eda57e77b33e0aeee3ae79c6be72ac7dbe5b9c2dcb6eef2d171f3157d57f9d0b92430b91bad22c9dd28174960ce0946b0e26e74832d5872df296d6a812082e8ec61c7300ccbdc1d0dfd0ff90d8aeb80c8b8f39b3b7dd6a7f74a54b3182fed2dbeec9cfd21bf89a8534ac4f587fce62eb20c2fad3fa635022fed2b0ce6deee33b6ccead393700c95b33100adcac0541c557a75d1a8fe189d54a9976a1332db0c152cde55ea582561a72efa6834b219b0a8d35fd6ad11e936ef87e8238ab219b880c8b8d42deb5cb655f607658d447b027812380a312c0af9f8e8e8864d4b0269a3c572908004f4697cd3a92864f4d2a994bb96211de515958262379d9492dda0b828969b4426d84f27e956d2cd8352b24e59cdc3414f0b03b635cfc641b0df9b6296821a49e752bf2af50e9ad53a633ad4ad53b589f9cab2ea8f397988ced7c80998ebeec65947afae3a3fa23eaa3fae6b4e4bd9287e6e9cf31cb4896a0f2351c0e4f881e8313a003b13fd26b025a0208113d3e5e1363fd67e0dfb35ecc741b7573ae8761039a92574777743f8e21f331040e0aef6a824ec9769a3983244230000000001a314000028140a878462c16834a2eb8af60114000f91bc5e724e9867414e31630c01840011000000000000000800089e7bfe401d2104d9a74993abef026d22684e619579aa2981f6c88cd510edfdd379ffe832cf427528736be4475c8b57f5f736410f2adc7c09099ee1118d4f922ab6b19bf2a9bac4faff34fe17bc06f3be7a94513ac5eeec25c5a3dc24dd08954e494c7188ca5484dfb2e109c715d4941306f2a32e45a74ac14fe55c50ca7263ff914a29fb341d2ea6cc68c6f3af2ceb4347483ce9c8ec8734bdb0a03475a8f49fc89e7955be72aea49d837ee390e194bf58553ac988637af4308f77592dd6c50c45a673761c6d667f7b2f66365e35138134f2d6712c42138abd75d1a311b8975310b81f5b4afbca11398610c7487b9a4d05f5667956355ac577c912e9944f6b3a57f82353c6abd862c37179eefad92cd17d9cee505587f10bc65d100fe505a53a4e7d9b08c0875c7afdf1d08d455b81e81f1eedd9e25cfd521cb9039876ad5231ff6e62dd7c4de2e2444d670603c485e8cac1d95c51f4c4100aad053a2c90a0bc5b839136d835d95be9a193dcdf1c7621c74114c74fe61eb5f5a79b4e3221d1a4d21fa35529d7e26036dd6197ea0f488f0cc8c98f15dabaeed8f6e86846a6a9c91b01d6cd50fdc1e1a1fb9f59aa5c1b85e6d3995080cd84b4442832b6a2f9a73a99ac899a7b31977f3a24efdb62298a2cb7cefb6f91bf874a59416f074dbf684aec66e6940890e1182f8bb74972f093a5ab78de528d1e098045e51a9bfbc8e7f8322a78d883283bcd680276249451b95b36c91655639ca0f01fdccb777864e5109fbb7cdb003291132470f6bf9f1d1f7571e64ffd5d3e8b5617d52eb083abe14d51f3d008e8ffcd06b44ba0958506a5e3bb2f234029fba8d4cbc8e4fe9165b6f03f31580f1633c90f139df384f8203d886468bac379f817c45fa7896780d3135b940dd93797dadfc0e01c8e353f97a5e17e4d7163201056f04e7b002118b5e120ca5fe687b87fa151073c7369f61e0b57c562bb52f8b3544b8cad8cbde87cb512ef270fc3021668e39c04d99cab5fcb1356435ba28449405efcefaf739e41856e3afa5098a345be51f7439567e9c03cfc2696543f77962be7ec2d98f220b9ab3f9409524afe25dc65a400e43d0b5a7cda2b36f277b44e7e9aea126e7777af27f8d786fcaa98251a9d7c02382490ca523f5410eaf85ef3a1037df4dd5598526dd633e3d23262a5babf599750070388c09c52189da10050eb1949818497cdfc5774ab12f6450f6dd4b8b82ad2c4768f8b7a83d8194edd7a0047a250740cfffb959248e3310151ff1690f1093413dcd68a86345d11968b6d9703c4f0d941af63b123a7cd8aa6583f56ec6d30694b3c82a80cfea07be1f8b27e56068fa32e6374ce7fb165d2bed9929f06884d7e77073bb2befb94f65550914ff84daa822a4d215bb961e2bbfa0e71905e80c3aa18fbafebcc5f72078ae965c0b8823ea5c5d29c0ad582d7efc7e9b4afc74f04694bf7b84ddc8f68f7d9ce7552242afc00e1eb8376159fd45577db4fce3f40937d56ac10eedb14fafa56a025bd5be0864ce78a7b5c7e9d2096f8138565306c1ea6a68e16a7d83af8a9979f519b92f93859b4b516015e4d3906232b3802e4a69d521c8d8acbb7978c9523852eaf29602d82646a178a618276b2260bae4770e891b3526b03ade9e812ff2f39a19e98123b92ff4b521af714c1f74b9b7c2d4178446bd42a287e2b964d0b0b882990137aa0a3beee071440ecf21fdf6caddb6ae7c725041f566791265fcd55a40760214d400e11e6a0968f0469a262efe19dc3c73fdfbe2ec9cfda81589393864cffbc9a9795b7aefb2d45594fa72d316251b774543fde223d6a284eea6f564cfe6a59148cd98b5f4f95c42a2632e90e4e52a5d955f12c95c0500a8ae615f6ce6c42b1769ad5f38c91fb6495f5983aaae312d01365342bd09f242623fc91d243167429488c4dee96da77d1838c050a11caed8dc29d8baee8f3e5034f5c058801e574ac619f9c94bf430efd058f5ffa5dad4a8b11413bc8f603c492ee2303bb7ac6e2f722ed3355985b3182239dcdcc54266887c8d3f4ee1602f456a0f734a5cb58b20cc26de80b82cd5fb7168b76a231405fa6d15f7aa846863568a7f86895261d29350c954ac180ede42a54b20538c5ae3bf4833afc22f2795b888d10690b55c895bee46011ac5bba18c5cbd1c2cea64fa855d3ed5c12e95f35fa77bd5bc380761c49f5759c9377aad57a5c8a70d11b2c4c559f4476bdcf4a037ee3fd8d2ec2c8796b78e1caf36c104ee91d3703a55956b4a05b1f7f1242716f727de76d836529bc21f6d1f34249cb162af861b365000db256735dc74a0e4734c56ace2c36816b58da8b3e15e080be1725a2b66b2df50c7a6a637fbc52c256c740e3e4d83ebd3c400d8f6430d2aa63401fcafb8f904f19284b1c76db34bd8d002351d9e9b626b710d4088e664937a664170a7594bc7055ba4538c5c109a563de82a4a65c396acad1eaf92461f94a75d64f62a72458789374ac192e9af0329e89c70fcf3d6e897761570b2823aa486375921f999ac5b035a7a42b6eff24d8da63a4140130e2fbcb2a4da76321c98c1826a3b1022b85538b7c8049dfa045210449cbddf381d246f5875309576d4d6d6f7bca27f7886f8841e68c8e71b799d892436cdb81a50df2fd118018318ab90bb88019e221e315a7717634470879cf794671cc4214df34d6c8a7f73e623db18f156cb4337560cdb111b5844de1b84f73921782ac7c3296abea5068278c9b7374e0fd2dd51451e91c30a9bc71730adaed435b6aeff199c7134afe2d4973f4e97c6f322fa257ebe90d264bfa92df87d5282794ed4bacc40d46ce8440c6853733b136eab30d44a6f583a79894e97a36a2a5601bfd40c3fe35fe9d1d0124d0305b63e399c0c4ba9a0e80d152086cacacb5ce898fdd556c5b83d805c6f81414b4e3137031219202445e777d4d75dcddfad620576924e02cc3c93d89aecf36019363927cad7bb830b9fbfb55f3231b32212f44a4aa379f3964bf78d18d14bbbe3600ba4b9dacd3a6db5b5df2e5dd88796b30d054fbeb520c6c1ea28f1171ef37ee9179ca1f5d009f8b3c69241e86aa56dbf2fecaa401d6c1e0af17916428ac9b6800e3d6dac72c0bd1a8158aa17a91cdb363b29d37fe7ff78756b530aae04d8b0353ba2bdc76f95d4571e563949626bc4616d31d23f3ff125d93169c40bbd7189498f3bea068f673db60902b44f2a6e7b8a66f536cbd949fd37e6092476f711d26555b00d7115cd840bce8477cd08368945e72587477f56906e656b9f39d2c2f25207fc2059be946980935b264bb18791a0b7beae953162cb9fe054d5e387ad74aec98e5adc813081aca97da70d3fe5fd6c4355934b79a217754841b411ecdc24d898c436b4f55d937c2c200eb2e81135ac24a91aa6749b536cabdac340115c0cf1546c0cd6c5c4b114894ac48d40d7a7eb062f286c8a804c1092ca3c28ac71a799bdeeba4ad603ac2b6059bf08f06abd98401f54c9fecf34a6d46fd52af8cfa43cbb5b114ce9b1fecb3d39eb79a87e96d1a3683e6acd6dbd41e5c4da4d5a770cf3b2257c4fc52ba6c9f37a7f4c7d6a98e978fa8dfbd6116528d487813fa36253fd84c39725bad436ae7ff5bc3dddaf112c06348da40eeaa8973f11cd416364ebcad9dc428671dbe0eac24ef00828723e77ac28d975870fc75996e0ae002a3f05b8a44bc31d7ad83911f936cc8b1a730d57d267ab756a5e7aa06e9fc9533e8b68eb1bf41dd2c650ee0b20b79db8691c05231926b87f191389a4d4eecee823b0d03519bfa83e76ee56b80032dd80f6c79015e3f948991b15fe789c3991295180de686020ac7049cec051a1af3626bc29d20bdccdcf1ab33f38374f6be5e8ce14af77b91c9654f0ac61aec2874c12dc3ce5b39a08be5a0c075ca9dd55d95a4d597c595c2651932b8626ef2490c06d16171db03d121b6fa2fb3cd31db6ea2a4c20c9e3bc7352c2a62f0ab170d9d81976eab7474c8493c777b22aaecb850b14156d98f5a2fe39f1d04daa5ed8ef5c52883613af3fecccaed8a1a9e9063cc41137f1573f2f62636dc7b198cba4329d7dd0a30cd9cd46cbe6ea6b8c794d89f22d864e4b957761445e8bc9ef7e180e77513b557f9cf03d34e74094d54011c6ae00388cb45f6eda22497da7611852de11543360077c1d9e714a72e2d85bf61fcbc5c43e816707e2b37137dcfc24f437a9f5948a2e4afd4bc069b371ecb14d0739b45bbc5238d3842525ff4cd56dde2ed9cfab7a67294516399f456f93c2d53f3b5494d11603a1214451fcde337d79270b49a3d74656771c50f4b9cfa607c37ac554c3b14dec1fbd372b2a6909cc60d177c868c8dc4f075e7cd6b865d91cb3470cf42bbed45e302c4acd9a7dbf67d9931dc1e0fad876ad7055be31a472fa8308266e5eaa9af6d0fa68e079f86d661947fe3f202548d1c27ac1f88018177999789498f27d1a535be3b75cff6fb1829d6c5f3440e82f07c14d318f6a411412fdeb5e1c7fa05a46aac4b2902f7d0e1621f8c62cc2595c5b29aa6101f1560107c3c24b30563d56b3045d6229b3082c0e30de2817b4a07a11d7de02bff864db7bede0422a4439f2adb00620d043c265ef18b0786c8d8f663ac057973fc211a64019259d4d7182ee9ade1d34e636bc6369533954f3f9bc32d96d55dc6fd10235a85213112f457060714ee1af9d11d0067b48da7711148e2cae5d69ebff3d7dd0cdf4b498dc3ac1cc23db4e7ee9086592403f376a1a63429094252a2b54c4a882d2f7cc8d6972070526a0ff8505f834e6f165d13b069a89547d3c00a46975a8499b6ea70b23e669fc4be4a0711179f03f28702a7480b7e1ff0c460eae487e55dd73b704aac6c78ef5206db706a90baca8f8e58ddade576c4b908b9cd8b10e0428b6e2cbd11bef825b40376084e5cb43b572a72105ba9cc0a1633bfba560936a1309d34868d650aa3a655374e127179469b959880146439b6129abb3a0ca771b1ece2623d09b84e3bb19558db4293e2f77942f0f4c74844005699f7cea144f9d2caef56d6584aadca94be412ba14e0fef5b60e41c2166d59569fe09b462b2fc1099bb7b17b6ad2a2fedeffb302dcdf7a0a9b79b006c71838bcbacfa096113d181c843d843dac6a8af3412d1d83fb808a1d5eae9a2d0c493373a5218083d5392c446a2746e704d24b51e95e6df9a5acbbf2641442ba648bcd62035a96659e3fb83afb3f507d53b964975df27c05d2c3d6bd45e796af48a5d5270449770d5639ed7892a17a7a0c81c8c98746a3cf69761d3d635199844a5962267e480bea22558f70b88a1dd805db035a3e3ac7daa44bd0c11155cc70758aa4c289266301f1db93e9c60373eb6414d5bc8ec3460f6cd601b0ca82a552fcf183e0206aef8cbb81390e98d85df4c43e5e99d7f6a33877f08c4b88f9b72297b8f558be2343b2a0e20ca958268ac78db4feb3b40dd282a758bcb27aa2321c04ca90405af584102bba139333599695146785385697590976e6176113a77f5bb2ca910cefc29c5768d74068fd70399ef542bc46d3b5ff33537a7867de6fa490db6ef9ae29cd78b1bbb4bf16246178e0b0223cfa6f0614a05d1a077f7f43a8d1b2156e035588b774d7ba5ed55a75b37e49f6746a9d451cfdfd26d4876fc6f22316af211891ae050332ba7cae148335dc5bfe570c5e5ad4bf35a59bc144ad4dafc3fd36edfe354ac3fd22ff3bb853b3f6e02a9571d3bdbd9b856e1060b4a9ab4cc4d4d628d2cb5f18ebe26c19234098e4c4d024756a01eab480046c842af7ba913697dea4101df66482d2661d56e0fe41d69a95a850eac0d46d1522f5a246ba7c0f8de4f7f0d35a56f08b8a5ff79dff19befce35f81fa85efe551073791b94f076a8834dff20ad844a9a22a24e39f942ea8413f8c9f60a64417fbf24142772418cbb14a244a9259c59686befa6734a9d76dcc9b77307325de6fd6a5b33dd2e666db84413b1f47c3430dda6732d3a0a90839d3bd6aaae9904395d8cb2dc70942db160d66a0631c23533779394ff59fd1e8a41a46a46c4c04e6d7a56b04648f84b73aa7a65fc47d46962dfa87a89238f86282903ecb7a5f476d86fe9249b5eea2492633bafe67b1ea90ac8fc9762fa8ff28707db83ac4fca13f46293bffe989386fa23871d7ed0c68abdcbe1035d42627c1a39a78f918f6e256e86c6e8d2e1d9ce9e86ec972dc69a88ae8fb43cbfbcf99db488b8c3175e0cdb8e9d0786f02a6c98d443e87d7de0a2fc2524ed23d7596f98f569dd8b22612f4585a65796f6a159ef38db7f35bcbc718d4afba056cc1ff17dcfb67595c49027718b31c2dec3e37fde367ae0d6890c9f2a0150568a58692b09ea1acdba11b47b9cf80242975fdbc24d18b8eadaefbd92d2a014e2495ee2ac61787dfae3b98dcdeba8458cd01a97289459b4f8fe8a782e8e373e3f5785d2da7f46f82521b0af1dc8cfea719de3365e37c6f3a18ddad51dce93398c0a8ce2134588e5185f80f7884866c92638a329428f45ccd8ec421217de86d38bc391d41d66ab24a71b8d00447d996a7fc8e301ae4fdce683018031f0a35ded89795e988d037a4dadd682a9dc5a459b085c4602ad206402da0232b72029c0cfca0f7664af66c659d060e3b3a14ac893acbf02b1e371200bcf7d68e56ddabac2f347a82b253c7d4a17fbda96dfe960bdc94a00588f148f878a6d9a13b3f8a31a3b43bdb7d34c688097cd37315fb5202ba346d7d4901261490e0f0ad4180cc38269e6f4e3ac8bbd7adca33629b1120d9d0eec785d81eda1dee09bc576c8433990b86ac146429eaba030ba148357522bbc54dbbb141992c2ea3ad8126fc2e6728af3022d2a83be31a0d49ff625e71f613b838654d406cebe32a5efd1337fc8cc6764dc591b74ba9b306b467f0c411a510fdbbdac5ec9c0a6e2065506b1f918f2b9ff515df15ab4ea96aa31812a9da7cae1b29f135e6995c4b80aa2c63dbd09a7e0448c38db40e37faf7aaa11cddc8a1ab6bfb7379c790bb732ebe1a285387ad9ec69b53c42ea4e93c787d77c5103d3df735844e687e70c527032e7c5205b57b0bb82ba3da78f1d35eae5ec7c10e6c58634192c1da72104e34a04faf6e47cbc3df3749028e69429739fa3978cffd877c5923d1027d8475afa0de9a909cc70cd3e86bab2fcfea395d8fda1e8cadc8121bea3b7492aef839fea7a3d41e115db4273eca8cec8b9fb79f429151b6664177b3bfb460271adc04e232afa0aaef7b9be6ad1b38f9aeaaa7bbdbcabc8a42d3cdb712ae61f81f75759f88d88693f178e404a6ee27268e2fbd24b8573684e514e1ccf035cdc05d1728d54d3754de0880ec36bc02a659c38cc49123b4bc22a77f078668738348231a513d373fe1989ccf0e6e9758533bd4cc6a957e4feaad7b4fd5eaf73211975a951be159cf460cddd861bb841b0aa5a56aea65abe912890c22d9b3ad5c6776d2d19b8ab68900bef7e6012f6e19228041522b1ad82b63adefc52088085a406a91fac5a08d4884a64f0a07176b2e2febce6d77c817b25fae33e54e1b6a61c7985575ed69531f895c2823d18b22e206bee5a03960d492de879c54c0543664d25d1958b0c0242b56a18ddad77148566460fe56ac4c8b6e2c50577e8aab4b9f46aa8f271f76540d770cba663a2730a845c3ed6751c28bb424928b53828824a6d5faaab8c59e8314457c2db242d4edcc4e877e99a5495c638259ee6c9c9ff66a125e48116bfdb99dfd1069ec913528275d903f96490a67870692ff0270f993b5442ac72f3da6cbee060d3eb3f478cbea85a23dcd5d514dac4d045eb27f48ced746fb84d0c640cdd367bf0d02b5947b944f821b112e4db0ed27357be34e22f6aef5b10f1434dba9a8bba5d9dcab3a0bca1016108e8a5ea34b16776d8ea1c268dde98a6d9e11951e560555fb47517c81838a736e65286be86146ad613710765c5082d03af3c9e6948b1e98372fa996ad941e22f470c1004c6962675af005cecff7ac048fa806e760f9348d93e6108f9f31b363a4f94ff5ca402c98c90299f9ddeecbf88b37c7943f8c487f0bf0ef6e56062d01628049dfa50a5360740034212ab3101744754fc57e53dfefeecc01f3c8b14438f20f5657878c80cb2404852093cff2d1809913248928a9021d02ae80f5f97cdda62b7204905b6dec12f59c9d80fe6ab8da47725dec30d4a4ee0d9552b12c13d30cc23f7d55049fb1e49f8092fd1825a66327b00d652573f57de63e2b37805267cadbc8a0d9551c2d50c3cbcbc6055960d94b39c5cc3bbbee87c08748ad0703c0bb5356c3375f092d92e5d65b4662c7ef96ca591030a929338d53d4f69ce4f3dbb5a84ae0feeb353bfee7990ceaaf82a328c2fd8b0087778c28de49e35cd8741a9737b9883e15075315cde1cb4467e5461107064cd7b86519a247a05658548708be0758819c6e437022e687d594cf33c68c799399056a1974b9473e0d31d1f85a3681cbd6104523ad50b59a9971d30e43971b3124125fb9a957978e56945fb6763cad11e84fe4ab17e63a1d015e1e1008d94fa444e01ebe33a7e3bc03aefb9fdf00de7d58269d8573f98cfa1fab8c6a516111508c171b003c8927acf6200511ca51ecf4dd7fe30a1f07a005c665015d4906c0e7009a8ca59b702e315c963665c4e7cd426c00ba51579501f03b3f30a4804e9310a7ea770cda37d0aae0e64e0d866d8553e48506caed0abc6188034df4a3c1055ab22d211fe330b0dfe2bbed5795ccdc0b775165dd4d8f38234bab1053b9ace2fae68a4b6758f93ef2ecff3ef4d8bb855f7641c318c4023206b427dbb38b1e70328d39190b70d680313f7d7d22a89ce0a020574f39403daef0adb31f0307d3b8e1287375c405cceaf6a455bc3a7183729b218a3dfb98ff4feab1c0fa5c9e81a2e53cdaa01a4e168d1343512c68591d99d23b7efedf5f1aad795426b295678709c7f0bbc19b17f026314011f88eac0e4e9cd8cad44f19fd21b2757f0a42497163da1e1f5113348df8532dd8d2f710c3d29a4431468f4ffc1b8879138ae5f06bcf307a465c64075b446564f0a4f0c95dc59cc74e56bc0201a8254cecbcc458df87cfe157f66060da8bf276843fd5de041162d771dc4ce0bde89b3bd340d71a9781af28f9cea67f8fdb8d230ccc0c8c76a6961823daad51d22fdd5a95c3af84a504d79fcb4da17dfc46a13ca02de1098b53c45b1c9f609ed8916de69e1a8aafb1e2d4f3567b37efa5418f263a5e53e8e0e11f811b1f234ae168f2bad8be2461270b255b216d3c0bed5ef7cf50c31e0e7dea4f9f677143215ac1024f68203032bf31f029ca76b62d7da1d1eb84e0db6e6e1e1f1fee3ce0b55f27c5eff144cf3b5081ad5cd04e90ba611692c65ff486bffb2435e74ef45c0265d44b892973a72a1a02ad9af9dcf653dd55efeabc04938804d4f488625ef75105d221c253497e51bfcb09947ee3bb486bb6b09c94e71f7734215e11847aef028623de1a87754200dcc871e79b1b2b8feb0ca206ea70d5827cbacf32065f3b6ed1743114135de8ae88379bcc9aabf61226b618355055d2ce12211799afc38bcb0774f4bf2a2ba24569a3ed08cba9e747420b7a25934ba828c25f4d669fa6856948dbc1cf561662c5756b8005e806fd47dc2da531952ceba40f2828f851b92e0d6e5f51a92b9b2b7c9fdb8ba2bda6e61b016c10599b95474d734d21559b2739952062b78ba18d070eaed10d08201524eaddc0ff2a4a8d4c7d2dc3e84b04725ad0df50b31763b59aaa3b4800c65dc453fb823e473b077d87c84d4fbaa2d9c66bba93f01b5014675283e1720a148ec629b586d3144e1388c492e357e474a72b606433aa32bbb594beffcd4178f61147f923429bb9f8e5837232c53fb49d001b9cca8cbcfcdcb8348b9c1c39c23485a021f1c1923e81cfb19718b7fe7d647346bc2b3cb7c512edf077a089d2b578458d61e045109ba4d835997427a8875a063801a2aa72b1b999d83d068d61bbbb84f8a86fb057734c603b7ee030fbf421a4189a0a754e2a716b6f184fc668c9188536c3a9fdf3c2939465abe89a38601621ed59a3d9d750c5a6dc3455bbd7bc3627f1f87d8df893600b5479eb56ad01e9fb86bcc1ee3b5da59917b82a773c3d03a8e90f31ee5fd26c0ee51c25d0219b4ce918e7a6e9b94e82f13a9d7b953d01e51d021c0c93a272b2e9c5b36bfc7a674edf32184aa449d760eef3ee7845736532f05ac1516c3c12df20a994473979567f4ee02e4602193c134c0e4d30d96489a4d130503b71c120d2f9551547a6d95ce0075adf944ab42138e17a7a38ac7038bfd788903aa6070c02bde661cf1b5d30d3c55199ae86a6a16bada2b70b318ad9f7d5189e866d0f6aba708a57a10935f289cf53b124b892d52dbfb05b2f0a690e780bd0c4a6267c7e4b2bf5c09852fbf8377cece1dc1803f664f2b6cb52be5f82bada8aa0ee9946d08da73605348ce3f2a8680fcb680ea1d92cbd220cc41b01bda300a70f89ed5b8b4247c7462cffb361063d3a02a1ad970f509504341d8f4b02aa11ed594242ae45257a6bb6ca8b90fe0bad2ea3f36df222bcb209ab000de7d0f88d811908f3a804a40beb232e3b7e10317ba1efa7ec9e437d6e007ecc64dca4fd7d9f5cff6b06c5ed9470b34dc892f4f1a157043b00291aef6a354cfa630435cfb2edcab491604812da019db33e7f2d13289746747c168469bed09dc3610d08714dca8fa0c20f9be7d14250752fd912d76998eeff8d2bf7918341f43753164fa15bffefeacc2f149cb071581e48d5546ce1c854b2e9fd3be0ec0befdee11bd684bb37f677ecaa95004d4b180627e87a48073df36074203daaa7b3149b16ac9c0d58bc9b349b4011834b081b793ef62121526aa605cacbabd1a82969b2ce154d53114201551d213b85a8cd3f8495c1c236d0c78de604fd2a24f04a87fec740508ce40e605a68d4b446a0a7c2266c56c24623344827191372e891b5119aed0c5b93b02755015230c4f4b74ae829f6091587cce65e95ec441e079cf90db87631d63a05458bd7275eff08d6d7ae0ff13f71dc16baa0b5052500fad5e66e357243563d57c9b313f4395ecf71e7a859d7255379ab227a398dfc7d83f1f81055dbe65e102b7b9abd3941491080c180e39b6e9836caa66f62b9afd0c8bda776b80a53ee6187adb9ee45ea144c7a89ce08381bd2e521e988fe2b05b6957f02a13069700704c85ab8ff8c535b42fe60559f8078eee664b8c5be5a8f6ce78971b557977935e1e4aaab743de34f6b6163d8cd09f5395d7c794ba1f8c701abec5e99a25d58248d8d031f3b0a04108817ab2381a3755d0e71ed5bc37b0931c18acdb0e5f3f4135c886774b53fb04a1301b2becad5fa59a63cba40e8cb6141ba663b7ee03956178a14e63e0e6498cfc8da65a12ab779d896d5796da0f40de9339a6e5e00a50c1b6a7083158f16639d40fe1171e9621f0c9074ac4477be3f1c7ac80bb4f20b036dc988cfbdf9bd9a9f875a7ce42a3f55e6c59ced8e260006b88712f093a6244af4400931d1e409650fca3ae98969eec0f7087899b4b7dc6f171bbbe55d62911b5777c9fe3a8f8d81a6db15d24909fe3252e24b32f65cf8aa579e99a45901b00e055c421c92fce8f4f646734e812f39fe7ae68bcf9571f0db33b28f9efe8452dcbd72026cfa794b81271d30f9df38eb62b2a6b06ebb4e6b2e5f6fd4b598f0f1e64037b3edd4e9a777e61a3bd0c5a200c53833b2b9f9cc47b71fe52899838822262d16bdf9b9a90f51945bafa49c7d63632d4c2096b2848bd1498b31be7f9391498c1262e0209b4b3e6f2298cee83cb23036b58e73f8535e49064f07d3cd8d47f07be673a0462bcdd48ff75ed685cf0bd0efcc7a828fa2921e03f4f691b97134a7d3ddca11c852ae56f6f6cb0a6349dee75e6f5648d3d86fcb085cd9903e5dad815c9970965c4a38a6a40a5955fa7980c250bfb441bd3d2f34218375f05b45672210e1cd043b6746e9624e862904480dcc3faaa122f291148248f66862a45f11d3adbacea205d072f7183b0e6c318ea468a421b38427e8c9d3c09e91f0996398eb6c57b6911f15ce9ee7e5724410e95398ceb071ee1b052ba97c81da015e299fe982101dc1ece366456a92fd26d7c13dac2608079a7020eea9bb0859d20b0a0a22715a302f36e69a770216121ef0a1e6c66467b079ad6107d557b957d54d9e9275a7030253fa33dece30969005a6b99cb055d3f6990bfe7526b57b5675ed810f7e276152d135f8bd52a155fca1427905aee57206f10ca808a1a24e4ee34d3c5e4518c92a96537f5a725f1d9db409cf73a9f9d45031fbc0d2b411625a8e4927501415534886aa170c483d4ba44c54e83feaa60e4cb7cf1bb6a21185f44db104321de79054b85a5339517bae74972958e63c53667fd103cc1a7f134321f8523d2ce78b4c9a52a6b02e3f180a3f1009f34e384369ba1b5745442dfa47a3f17c83821e8a2ed07c7091139ff268492601a9a52ef77a8e0c6deecd70ac7eeb352e7df84e62823036dce7cca042a36f82cda80871d0b62c321b87ec0beaaa0ed801436a46476b83b2be1cbbb47a3624730ed4720b9a6eb48b3c79c99db83d4518a6c702a70badd5fb978f54ebcfe19ffe9468a39e7cbc7d7e37de679fee578a7c82b6d8a047788ddca3f491de8078c334683a09127b46385860b2d9a3824fda493912b588c14f0342af475e61e3285fddfc81f007c1bbb4c772c5161e17779e34e027f78fe2df2ba865de1961cbe92ce3e20108f8c7e7223a01a8f70c23564bff086525dae0aaafe0534f8d0bb441c1d0cc7dd1c159fafe36e798beeb00e18e29a41b3e1a601fedf0c28bfc09f2d94394a554cd773f6f5149cc0101e01cfbdc014c3b8b38f439a0abb746d7e6f33eff295ca8600db5b13191e6566ce572a71e29b4080435f70d4d939173eb618f4befaba944015ca7e9d6c92c4a7964ac3c299e3ab3b60e187d97552db354283a1f259fbe15e40b30e941e1b0ba8c68b1a520c586cd0e14e7f8eaf26f372b37ae7a59e892135667cbb2543f3a8134ce6ee486d811fb199d515d0c4f5e061be17531419166beb6dc6a5bc8a63a47bf06e2156e165914e888ee0a8790be238885f5d202af40cda9a9ce2629e2f59ae20785f1ab8153690b2edf4ad8c8bcee184ae6797355066399d2a96c1441c9ac4be2540467966f4848a1c795386a002aaf4d5acb9c025d359a5d4646705b773048f185893f8a396441ad3b2bd278071fe0cea1a18fa209722f1ecc967b14d0ea955700fb76811e2c242ea4f2306c3f561b2d1f5ba0c5b95ba35ebe471190adba37e5602ebc07d86a66a3d03489f02f4b8f0aea818dbe529722991ea4af37ce41bacb48dea8d914a9958025450c3738c4197f2905b5003239c1afcaea469d1ddf22835364e5e043d0aa39ceb9bed216540eecbe3c51ddabd99673ce6e32b5ca4816f525767b397cb7c9a2133f42cd2aa0c54b39a13708e78c3dd63666a1a0f65ca0e50a969781419db4c9cadc624b91e4e34b29860617d6a0506011c6bfb9a8ebb78f9472f9f8e3d3fdd400129564ee560b057ede220cf50f3c0c7ed2ffee8615c12cdd7410eed70008ba3381903708f236d232c75c25664961d9bc0dd8981d82013f3fa8d4feb41e4c1966544f19892103af6294b0d936027c503233681179fdc0f86332bf298b517426d192e433120b9df5d4843d4d8de128ba3dadae0ed28de7bb41d614c9b000906374cc0b648f03556d7440af8c463ad0c5b9be195509393ebc14b680b4095c895e94f7426adc65f6114084630bf12140338fac2c2868f86d4777b76eaac2c48a32d75442ae07dc47727635505bd7dc7a7666c2b5bb52f328c61ab8ede14008f22ac1de326a30f0672b24ba6afc6ed0a229f9e17c57a03d036305a659e08c85d45747b51247158b0eb6709b8b55de9ae3f61b50ccf5fa8ab4125c30e4bb42f7f2ca20ab33d1848bf4c823553a0e9ea21d7c14ac9497dba5aa15a63b69313e8febd4760427c871b6c784616b605c8b2ed89c6772abb6dd33ac89266a2ea9ca02407d84a56f35aa4fedcbea279215edf63339de0ed00046579e5913690e7669699d1fa824d123da210777ab2b2e60301a0de9befd8cca2178caefffeb4919d56d5a56c4f32c246c8a073931dc67e2ce471d1fb6e8ea2fa2a873c5d1c9818e51cf0186b1bcc215ce8491f8fe49146fc7c761fc7c249763ec6361a1a5d87ff747de2c7cf0a465229b7c81f1645e2cf12b1faadc2744b0426e43836f3e544e9b1f64110f69b15f66790ae919aa0e8dc26cafcf14a4533334f00490a5533d90533014c2658f286c79e58d21e9024920460931ffeca2f2a5a2089314d9149ef48df18dcb4d6be22f88e179251f544d44218c34fc4a41e454c422a07b7d5135fd12f8295f2fa49a1f75d9b65df940285f7258d8a39ff7074418f62660548825f0ca29ffb3b439509959c39a57c44c69ba3730f0e31ae901f5f63513124832cc7a84968a0d94130995d8262ca3f2230a18f27e586c14251997210fa92f82ef5952efe9b0e40a0525081fbff5bb3544518e4ef022caed9dee069a05dd96c4cf8be177604226b6721461802d4e08fbed5535881fc98567fae43fadd95ccd8f70b575c6aebbf1e34ddc9d09a6f4a0e43bd303c4d2ba666be869d80cce928b62f7d1ec28f6dc2b0e0b6ba5f67b0ee7e974a31856501576cbabd42d8976898b39ead71be56fe8637ab01c93ccf1d754c2b4fea975d247e3e0e3fff8935177b69adb737065199716238ec780039691865162a7941546d214ee353287de92d0d3b3c2e3ad508ee014ff6cfef6938f010f15b24fff1ab5760136663e3b3d129a0db48c93a48d34fa603f575c03858335740cfdf24f45b22afb07b7df47f3100b2a17b078064f27b6a06eff91535047252eb7ab22425474566557c8169e99594c3015fb09b8a1e3747db9002c689f904284033eb01503e6f9c60cb89b2dd147f8f85af43dff654537fd6e20e2169f8d74eb443475d7ee5c1b742edb98662d31a7d0d840d59c307b120fb4e091a1dc7ee81e5340c034b6d0698b81eaf67997f7a2335a621ec3e7593904f189dea8dd6cd519aa46ae889444db5ea1d97e45e3350db0cdffa6d55f7e2225a3935f4c0291a413906bb2120b3b4bbf478eba2a81acf667d0fbb410312cb3bc035a6ff8f64c78e3c8b685a78da45f66df6857afd4048e57aaf083e5dfb4dcca7facb183048862560bbb007fbe5f7056fcfa120adfe2adbe19374411764c64209fac6d45ed4872c3bad9b647119bd3ddcde64382569d97b52b5ec4ab8f845df9b4e184ca39fc52e2ad9932a4f81cfc339757ad88455c0496d0982ca205122ddc8865eced75103170c09f1787878775f5bd24a578f9b9b62df3681e84a1b126fcf69aae9790bedde7a8374ad7a0a282bd22a02d1a1f53b1e9b275c91ed110aed2496aa6db754e8075281b190b9ea3cb70d6555643d1dd3afa39bc04212fbd5bac4117d14c06ccd856da22b0552b416d55f59ccea21a09647a410478ac7ce089d822fb002cb7a84b3f1f022101057a3b5ec9d30cdee937d7dd6c6521e74bffaf2285ae61516330cb0a8595c2dfc043c8a79574655f083267d70ce956d573f3264a7dbcc538e2445fbcbeb0cbdec0b04909773194fc62b132ad72401eeb72d3f878eabd59efe46c1f8b8cf7918ee2505afc56d9292872c46d4b8f159011861f4867913eedbdcb3a3f2b2158e4e77ecf97f6ea54f37c659a36c5c25f83c4caae30abe6c4bfcb9179833441432ab8fa48310e98df0724539f01ceee63cd77a8c829d1908c4b72c33ad6c55cec914bfe3d5a473ca33669bd3db9f21daf99ac0f75b2b01219c6de4d9a8b183be356baae62b8c58c987108bd127f80370ec734e210e0dcfad6d5867d961363261e075ea3b8e914261ce69da71f074f40edea3f1274647eea5f7ffa93c199f52e4518b2bd6491c61fa2550cb3b6ab6ce1ce9d185f181f1918d845e6cf0fbf0f3dc8f0a512e01cddab7d72a1bb21021c85a032050caf3343be3d53ac11659238e0b274ea444157086e751e4a1d9df4f375382ae9147d3f73253f24e12db7f5c9ffc466e9bf4c95ab244c16c05603f1f95d7aab7c122962365ce03c5bab36572bdc2608a34b2a6bcf92c7b4aa077a3b4c9d135899492cddcba6a12857ac265539e019d73ad674c29d4bdfea40cd6cf8fe52a207f7b9d902118934e8efac2ca1d8686730a67421e819afb5f76b4431136f4ad7a004b02de266e176f6bfef56f836c0f239f220d72d217804c93e45ceb204a742a58a16b4dbec7cc211efbcdadc517e9d3f966b5840cec94049f20f6046584231ea030eb8260c3556d852e431997cd9565ccf549805a23cbcdff2b359506d2d4dfeacb0abe241726a60866600c606e7a5c0709db4fd127dd6d94c3bae230484458b4fd0edbae52643c1e964f80a449f7f8a6839f4085e5ebdcc8de62a6a56a4198ddf2a1e952f5d9f890441ed75ee8ee4fd9bd2d6ac4f863d55a866991df1dc0d38cd43f09804a1f387a0e1fa0ec0ad033e5ef24944961ce01b19e7b6af5e77637e4e4112be6a1417e49d55c5b26860b11f6d58a1a62f619a86899b631874b8cf30eca4cb36f9ebb4741b66f755f761dde4c81cd73bdf0dc5d907d5c02b50ebab1ed56c62d0adc6014e42aa688d12acbf922a5eb47c3de17e6e6b1e0ae2b65dd0d76503590e7849237da8c3fccd6b00b59461817a92238d8d1697b62823211a6dd8b15497c2475b103fef44ff24227186f4d845863de9fe95e7372c042c8e4a3fe39577b76f8ad6f46d8e8dba00a806acd862f8a148df072e4af73e3c9746a410d7b040cfdde7f6fd63827f302d9059f9aae74525aded3ed01e7c6fd0bf0f149c2cd11fdc1cddb1967c8eb288b28eb7a97f42db46a13fb259aee14d1211c67b004f05713c3e405be82e1edec9b77d489e4d78e774dd7870ea3c2cfdbe368cc8ba37bb3f7fb1cb0218428a82f1934e8363c4da2cfac447d3eca00aa4250169c6feb0ab8d2ac5e7205a05704ca3e5102656ef59808e836b6f69c6006ada4d53d2f410474272b8154df209aff07b8b3e660d35b365ac37ae4838200e9c2352e06c100ee54011950fec598e5a6135e57da42c520c17a6fbb51efa123432d1d64871f5bdf71da3037e63e34909fb24063da742573e89d88980111cec1358e411f431e1b6ab5057e703c97f113f02810f318f97d10ef7ae637411637d362b7c49021bb2101ccc32c170486a3588a851d44ece3dee23c83b38df90a765bd2d52fc3853f4dbe711d729505bd388858e76d2ff26453b900ee4eaaf86056eb78b25cfa059c61f53c192ac06d64fefccd15a6f7bb655f4dd9fe8dfe4f41d9acdc3ba151de03c6a06219c515e649d2dd7428f1ecc013ed1f769160c2dd0d79a04cf069149e54bc55424f10eef1d70af9658bea34680bb52b44fb3086c15e8dbf583acae7a216457efef940556ccd24f858ee429d7d05669e8922724ac16799280be7bae4facac07a5a2a33393fef797a4cc2c6c72443c95ed4d6b3c5a252af291ff9ecddfb1a61372d4421c76e64ddc99d4ec74351e9781d62ca8306fb8bfcf90684d6f514770dcacfb847d1c833f2f0c86092e748bf7e6cfd5fbd51287e0047510d1aa869dcac745ff7ceab2e1ee1a09ffefabc6c02a6b396d295598fc0bf0e630bde978fb15915e4ba17c71ddaac5b788402d3546067985a59163360e15fd685db9057b3e60ac99beebd42875775e75dc2a881bed29dd08daa1d221df6843d4009dd2c1fb7bd69b7937704831f1c557cda4213f53dac3bd74d8b5768d1a30b48b1b4a59b1ed45fb74c9cbeb1fd6b86fc4559d4562fb5764064561e9e38001197142c70d71612e9e184a40dd4ac725e425a30bd263f1f81b1a0cbc299b00312b7154ed28ddff0fef69da4d566ee38ab393da1f0fcafc06b5f7866c7a0b357f91f683ba97101d652376bfa525a3c27504b840093c906114d85a7db5b85dd5f900615277a2750b5f74384f438773745e5479fb9797bacb8467ab55e858263d25d761c5395b9e4f57569cfc118ce878210aacb35cdf3c7a4e9f977fccb7870c5084271a263ece694b3341787041430f13828435a1818c84a6fe43801f719ba9bec7fe0fd28c685067471dbae698aa74707b7bba31ad1f3d93236da0126106a1126cfb3f384372cdc35136039eebe67e7bd08660eec487c169494421e72b3680b9d1c63c683a398fab4be223dd3b90d40b7525c22f1c021030f737d7bd0459e7f107a307b030c712d417ff7e0a41a88ea689c4457adc69a321fcaad393a241f26539fd9f4a0e84da4e04ef0db2f9df1e068090aaeac5731bca7fbd96e23b177aaadb2ac3d5beed95d476e6bc8ed2e3a206b3d6a226ab0050ebca020f8304e2996bc92852ebe3cc7cd2bb8a539c8d9ba491a14b1ee2ad23249c2b4d9408adca16465709ddacaa52286abe6c0af9924ed42373d33ddac3e3beef51b732a4846af4df82d5406ff16592fb8900fbed111785bd2a202b1326d27fccf9534cac19beca35ea65ea1121718302ec88e3cfd823d511afbd957fa4ac08223ed62e96503ae8d7e2998fdb31cd397607011d2b2bf1da829a1f8400170c0ce307fdae4388e75101415ff292641b121450d4ed723b863288b03c26cadbe8361727e1b5a90d6f4156b3b52885b6abc512a042f6e93773d10830d8aa02a712fe53712829a7bd8ed17357415b6d22e6e615095e85018ed16047626e04585295fb1edb0af54352f533995d43056d56eea67165b9a3044ae3cb7f0dff4e40794922525cf1df03bf01282e2114e4254d3e71e2224a548693a6e7d9586c69fc5e0f218b2e18a22a220d1b84ab6ef0e7a6179e2d1489548a0da9d7b1dd3771a2ddb4e2a7a21f5c9c44bcb7546a510564fcef8c801d9013b6e77ce6dffe31d9c4ea29f32d4561ba7767ec69207fe785a4a2773bc726e57540530258a2dce10649bc7c73d8f93b0c39bcbd4588e239c3566f2c88e8617bfa9823143fc4723c1a71c599da4e6ad0be97e45bd8f9ced4b9503a02de4541e4bce466be47e793c5ead99ebaa02056adab6e84aaa6920125087d44007600b6bcabe49c1d604ddf9b2de9496ead8d87b5a0ef3687cac54b30681d1e68b7699127d91438c383fd9250e1e262f80ae5b809c0e11760bad1b11d058030ee10d776cb89ecdc894198b0866e487054d6bb988487c0714d36757dce023988e1acae4b9858e646735626053ea5798277dcb31250e974087718bfd3a63b8a878e368da01cbe00b48fd0b234e1335452042272881f1fb3a0a03642d5ff12d079dcb1814eb3cce7365812213c5bbbe8154ade7ed24a68589fe0a1f7671fed29f0619ad8f7db36cebee82c770bf3b736444455824a39bedef2fd0b048725e17ad3a845033f2be27fefaaf1fcdba68df389c66940b14c48015e9c0902fce72632d3e0bbbbda8753c0c2edd9f76461d9c9c3765a2ae3e4a98b9b510c8e1141e9bfa921237474ce9513991111d8b308a8a9ff1e40deee48deb2f9d045714ce5d67b1a787a277d9d8b5b54064f83ab5a81273e1b6f43710341ef3346bfdddd893508d79a00a815b62752ec1556d0200418d97d29aef762e378161f4df599b731fec7503b743a7ee7fbb6aa7d347e06330489d83de28d37d1343a7d77cbbed851b0ec91269a149c21e4e1bca84208844f7934405c81d5a627a882acc1dfcc08e089c19a4e1825d8eb0d849f822f28018183eaab3543196ddafea7d9a3f6c3d03f9b66bac31ccae0734a84a2f98a2f8cfc705781650f0acfa0e3148e320c7072591b2669f13d153d0eb5247021303e1de6388ff13c440acfed9262398c54bdbf28e25653d46139827b38935d56aec0b2dafa13f8b9082a82583db0c16847268afc90cdba3f5d508d8df5916735df768cc536be057de5cb22b935fb4496736efabf9bdf1212749aaf66c62752afab4e8833acbd88d89e2ac270c4b117961a630635d3d1eddf0c3771b06a93f4c0799755a8a86c519341a56698bcd26f3fc65ebd3c73d2db4c1a9faf54d37a7d2d4897a9c6f54ecfe341d501f05fddba91f17adfe6c69e3ceb90837aed8317c288b70c4ccbee7647204faf9c647c04728427ebe517b19e01b9d778dc81f92ccd85e4d8591acd098ddfd18979d9f9fb1c12a7cf1ec146d1c32a1b09753f69e0b1d91290e6b5b978aabddbd03c12250fdbfc0c1a2dd02699c198316c857216b33bda88dc95ad3561c5d221ec8bd453442d4a4acd7154b01e85795e58bbfad6f82c6f904c84eb897b01ecccb506b2247f880ae60aaae420b26e88ad6c3aa6cc9dd8fb93fbc612812d191191829dec6110f1dd03944f20d8a1e7d66763e8d2605427544ea0fde1ee4665924e655ea9436724f4b942084a2e70b5e71bffe548b9f638f1b8ba5e4c1de1dc6d0736b25916753600c91ae9fcf0463367f6d79b90670009718fd26648713566ef0f008352f9b5da0ac1a36271d53e88fa623b4efe4f3f574bef2a0a9b7df0458ab3fe808dad01ca87a63aa9bacfce823c70ec0c3bbd805a291d74b4cfc55f8ea1c7a5c6e19119cc337b5100a3c002cc2f8de785dcad4cc623d5fda67e5069cbf544513a9ca2fe16a5a915be56d57be0ef8eea269030b41d95b32a51b0506b0cb854b268dd4bee22d4bc8a1b47b6fd6b57d910b93bc0c5c6dd24ab8b74689aa7f5d2db4d8241de1b1bef32b5ce691c4882d1e66a573d15e72cdee37f23626a792d8f9d8ca7a0f855af8a1ed4a99e8da1b70c016dfc806325943eddd7380b55913cd0d58f6d97e74037d4a320dc58f58805f128bf24c4cf7e50dfc4ef34c5b4d076a161086b8d5474f0e84254c1f9440d65df89e0901b7022adeef3d73ab80bb138267e86020682250776e4b0ef8ec72170c0b771f4c5770e7db4e063d705a210ec34d101a57debfbb45bc119d2225d288093a07d250e174bb710e396ba7fd93541fc3d46569683498c6e08ebb8e4facaecba1f6a3466b727d468173a4d567ff7153c2567e372c2021ac57f7e9506e1afd246f5ab1230a7c6c5a5767b9f110a70da0c6a9b1a74966afaf470b0a96ce349b4de28731f313cf1095317b84110a24b3bbd5f1858d2ee0ca461c0f809ad3edda9cb15c63957a0ee867ae16ccba7d91bf518bab32788ba7045ad4c6d623a656eb13d7a349014fc67f0a5b5f290e9f719498b4ff6d4154920e1bbc7e64146eadc69a42b8c845d29a52b6902fb0e05ec527627334ab630878891baf92b8c37b6deb910fbde16f2867a23fe9d3a3f09f737c61c719d4a53c5c06b50296101eba705288621b28a48bfe556f6f985bd32ec6751533b77ae9a618fc87e304b1544bc967174f0c2ed8175080faebecd83983410218e5eb2b26785ab02480b6f29c1e4b7ce94aedc2d9790adae10f2e097cd566caa13c37ea82f79c69377187105391f59d3d45157f8107bfb582c148f87658d4301859c0eec3ec14cffe9ae4d19bef3d763287da5524cf6e1b355d1aef445fa3985d256b65c18b8b7dbbf4c4eb6aaba6f6e9062bc3553f76398323e0376d6182459223e39f394302f776d8c27ac82f36cabb50559b4c2b708ef95f24848319a4cd7ae55b5fb7b3a9b0b984f3855a1c70b800b1aad164e6a558851839866a5720a7c56adcd0401a6f6e69d49d8ed8e789d77196932d578a525b7f317be6ce51e2b97cd09023a51d0b4ee6f35c163a72bebc39803c58df5bf644fd35c1b4965861c246c5b4deaf8d94790d223cad0ba75477041aef01a6ee0175f236dfedd57e3907c36546da5430046d6ca1311bfe782c558e6a8284137b1231d4ccf7e96d1edc6abe38128263697723d6194c619b9471d2d1aed3e1d84fb5993ceef0f61392e6a38fb107f646e2a5a696cda3f8d65ec070e7038f2b832af3994f6ee95c5df1f4b65431df1be243a8de195ff709310d362d1789983a64b0cf4480313695301ccfa50e171708ca0fda6c6b33102644594c027c7fdf34066bc539d161180b452500424936df5af60a9736cd4ac4fbefdd80deb871f7205bc2d1f4a05aee833e69192c927aca50875201a54c1bc6b595ae0f227db69111cdef318663b6ef7b8c28f50096c64fbb327024b25d18ae10154f5b8fb3fee69a549163ad78c1479c48fa62ac418ab877022721028e4a5d24ea19b74e58c72e09b5383474bceb3ab202a391d41c48868d2842c2e58459e0b62573c7c76e6e934dac93d050bfe4b4ca0c60ff8b5cc1c1a76a29b0158934a7e141cb614ece92e63a677f102d92071490f4ae112bb975895bcc2c095b7b89c512965bd102da9e1a226d2c7584a22cc04e36b34936ec36b83fd9989695e55fb87cc348f6622dd3168155b9cad4a7fbeb90f523495999fa85c78b4e3ad7867362c7e5207018dcfd74ac15bc5974610ce46ab546b6fa8935fce3c2f0902813f73432a82eab1771bbb57368c3177cb88529436209cd17745450ecc0733bc47b0fc3030cc5c6fd72ba7c6d9ea02230b19c6c07826d1532c671e4a2223ace29313a4944d7cb88f83a25cd1db82000630482673d38f21f1dda02ec323d9305a812bbf1c1648957bb9dc607c798961754a905b2df8137f1c201147ca6a4fce6a96d5399112e2ffa185f15f81b78de106cb576bc83d64e6538773c42ace0e939fd24b65137cbdfe4e97e12cb3ceee91e054c9eb59782c56f88ef1dcf8421a692a8f283aa2ed2d36da22fa4786a538f00f60aa9a8e485417d484db7acda49815b19c335cf331e0e6c7650949ebcc205d7238d086d3c52a5032bcc00ae3be5ea6dc973cc817f3c075f12d3c7121a5cf07981e454645fef407b263e9693377a0a431273b007e62035f7334f580224c9906ca107a7251b511259de71f0abb6d0cf17e9669ab96d3694614d834c93e2b740e2c14db038d7f46d02266a730dc6b4b6577b186478cfab9ab8a8857da157c3df2b289a471088c879b7ea99108fefcef7d81d46c0511ac6c217d7adeca4a3f1911d8fdabf73daa76071c29e744a7701f2175f2d0185716cb29a8ae58428a9e4095c611f28f0861109291894f1a341149f1ca37c071828477d285e4d1ba9c66d7193497e2e8c579967c2337f91ace0edebc215e0df537ba10e12d2e536caf6e1a8efe8340876b8d80dfc12393a48015cb4e68250c22dd6808c4bac47eb0d0d77344fb82359d24d8b8b76eaa9604c1fb58252f60a096e45147ef21a205787b3d6259943b149ea246a47fcbd7b699dd4d61d8c0abb17c592604101854e3e2580707a7a2148a88fa2e16027275d02222c11a7be22e6a87a1c7fcbf6f0285ef0b3fca0edcc5e02957706fe4347eb5052af5c9ccacddc665b6446ed02877d021fd23f9cf860a883e4183fdb6c37e123e6a890c9a4a6ec7dd71354be1ac61dbcf77fd9b299314aeac6f73f99f222df38ff8761949d459c3ae1d1b0d0b2e012596dc15d3e79960d8d7c3c40f9a4eacc83cdd4427002f904746653182e651e668a29479fcc3105ae17155dbd6dac7d543a5af445a801cd37a976ae7a37a865494915ca39d3705b1324c3a98f5e9de8e5d4e03601656b481c47baef36db3360fdacaf0b652149441ddb133bf8cf239cd886a85e4b184a8f00c0f3ad4aa7eee196492ba640c3fc6b0921e6b9f0f912a21f67951fb3477411ae369410fa1eaff1de37303c9dfc33c9f5ce9c6e3941a0e2ff501b81d91546c6c42396421031b1c25c477160c62026296ea002d312a2c60186752545cb7706d8468beaf0690941498265d1215f34b386d73c3ece20e2fa46c96138e238bec11b0652a00cebb781cbb684a0116c6c9f3b75afda40d05baf1fd0ab6c73285a789d7c5542c4e4c51ef2b5ed08174d6034f4814cfc13b91d4dc4c10b444112d7a5b163e151175f6f71cabebdb0d02ea0037533a647c1dc572b574260112b3a37b061b16775310055320e0dac23d7683cadb9bc1eb34e70f6af7edbcbbed425440b3be7100ee4893219d18370ae2b4e557aa02fbe1e10df0e457af366cc59a935f302dcdc64afa7cf70fb5c428844340517f22ed664c9952dc0630f1f9179104856202874c1ba97da8040fc7503dc0bf9fdaa50071ace240a9a1ee582b102a193bd4b2b0e775958033ec1842f08c64caa77a0b66bddc28786ab1c3ccf1ccb23453016be7bc5f41d8eab84a06b05b6353a80c158bfd0ca8e1b3ab4272dc51048ce2ea3d0807ca2740d829e2080ae9ced7b25c4f0dbde392250cf4300e2e6b386d930bfd0532367ce95f2336a71fb271d11de4b534288d2351c5b63c7559cdfe9089015b7c373ee96a4f74a65fa9ab88d092b08ba0a7260144975507d0b8b3141b12ef3f71d5f7449af0c5985100fe7d7740a48df170e2fcb0f97c6c1609cbc1041e9bf1278c3123f30d95f1da4d95f856943b42b1fc40d5d6a3829292dfa938683a30b4354274817b405aeccb1efe8ff597d7039d8d852b2c1e53023f258b0cdace48f7d90586277a8214c9404b970289c924aace4f99c3a87f77509ce2db5ae76a9c3661dbcefd53254ac291a936d7ea4b51ce86bb0abff2784b02ffeb7968d353903117881778df40126f079b5dacbfb57ea0bf7a4b7d9b120ff0373fc1ae3c413ec538924fbfb3542747a9913af69d6f7e1d474a864e298a0f8495cf5348c0e3afb9c6f3de17f672e2ca81a2bcee01482d10d4dc52a7fed3b90006f7ccd117275c6314e9036fb375eed2ae6b7409975ad62d0b3b515655e7875d0cd1134de790c6d58f5b973692f391de17812ee33fcd33ce4dac15a4f3250e1d3931eca5a767b9f25d328adee09479017c130d94f32dd8a1c24263a4da4a2cce4b34ea18807892520094174c747b8a9fc7642591241610f421f609ca5fe4e3f9b099bce0dfa76fc60dfbc27e84124a2f5142abb3cf4a9cdbe90aa2e93728669811776866175f51e69cebe8ae163f0e0a625a8ab6e08d0bd632b6e96351cb3105a3b07d350443798b2459042c6590611a92a8af0159bb15badaa07d25c0e26f59849930da784080fd5200677643602ac45fc7c392819835f52b7a5f90d680d1dbfc4dd2ebcf524c40413b68ebf169fe1f8b5f09f93b5ffd64c34a0d887678cdddccdbc03e12eb6552b2b8b748d323c25e22a65668f6f03f634438f5e51602ce81c55b2765066960a471889a28d08c468fa8c25df04a1d098afe6e639ab53f597916c10095d54c89cb4d13cbba7459de481c2d6e49be4b94d5df4200b3c5c27d3aa9f6d94a20f51606173b246f7fc2e177590070859936ef267f66a919324e0503149ab7cb6d78a3c458185ad935bc5f39b54d4511a1764d3a62afc58cca81506ad90a0b13c9324df762809804bc175498f49962e4c873ecbd91ef48ac9e0639f2247e445c31e58e3d52d9e39a5a921ca27b805ab54402cb83b763cf4d2fed9fb75daf1dfda1b4fe37cbd299345268a22e1c7f75f4daa32ae1dbdc7e3e7fd2fd524613c06039fdfbf35a87b6c23fadd07cfff5fb4625271108cbfdfe3de4897b8ede03c8ebef67769cf446339287c79ffb5a9d4a35ad1f13efedee7659592c66664f07dbb8b86ae2031c83a79c6b081e8a71a30f096f27717b1639e8bfecf1ca9cfebfebfa352ff04208bc1cc5866a606849ef6527fe9f168c88319d10d92ba3f6436801cfa1e181ce26a69453a5dcd9e50801205b7b70b93223c8d98443468a08c65bce2e308ee5fcb2abfd197a7bfcfcff9571506ec3e8c57de8e9569d46b602909d3eb4a023be8e1296a6e8a6006932bbd8ef1fcd053da6312f6b04d5aeb66df7694a3f49f6e56776e8bd67059cf0b7fa53b66691bdba0354e766d77b115ef6b4665c9b660cdb7f1bdf0d7f4739096a18d4afbe4ce76c50130406e99503412ae11d29219045affb46062ffee9d4aeba7715226fab5ab8f9ed45792b3162e96c27ad350c27b945c7d910740065dcfa47dbc799fb3b867c8079bd38c82d1657f7d643155bbee3fe9ec6ad20a645522969ff02ae1b564741d1192c251f0c2365e2d3b2c8283347263986db3586e793134c05a1c56039a5dfc3ceb047a3b0d580a5dfe9929a9881782793142c6157d40328bf16df92066ac62b00a4909144ef574a198398add09fa6490ad6a210106d86b5b4caff648b32bd50639182f56a54149ff207c02dd2dd9862a0b6f60744a5dc320748bd54820f58d29e1e5564d5cf4f329c17d9ae0ca026fad5623e427d3e198e336c01f61819dac0d7519a4326ab365d84dd28c126187486cd442048adb779f2d4ebb027ad51226bbd24b08bdbcc19f055c072abaccbd84365ef98528ead5832268c5a4ae1b6f8139c582c935f3cb376009c6d98d8688766de219f00467718ec1e07a17049f4d600d604c725c39b2b85740ffef4bc034f62f45a6cca98b16f42f3a79c668df9b1d950faf66d93611c1e37fad4e8281aa866bf87dc47de70f062b82dcdddb261eacd3a4fdeff5a994df758610d6b437625542e85fdb30eddc5931939450deae1066ce72b5eb3b0f93597edaf6af25d0bea5e9af4dd48608864c5962d5aa7337214bac755ece5fc559d14a6e41a8cc646805c6e6e0e80595868795b58e60921f0be389fe9e92cb0f365c32cdb07db1e13d457161005c1c9e39528cbaaab926315d06851d5f10b104883456f8d8d649de9925c7a9b1e83d72d9263bff207b262d64db9a2300e297ad5267293a209365ab82871bb636dbcc254b657d8d464b9adf3c8d34726b6ed72442a9b1139bc7a39943a1b65daf93c369f16d9d77855e52323efc7700a2179c818d3194f734af7eed912f9b9d7347c71e5ba6c31db068e5260a6c809a14ad7527a90ebb37816c0120013eb167a3d0f9ea8494634ca187d802839e953015e83eaab365de1508189f43ec6bbe0ae41714dfad5c514728f026acdffbc116e16a6fc04ed6d3ccb741a8ec98b0b3e35f1798e328809603c65421ecc3833398be56bd236d788ac0405f5b5b33500898be6267d930a0bae7bb417b9ab4ca00217e5a5083926051aeb985e9525f644a61a3f52fddf0a0b71d4a04ec29d413f44220f00b523e9a61bd8b8010922101aa1a41b4085e6430733464463db5344f97e18f90385d2c6ab4ff8a2ee4ef3386bb9b8171f7c6fc20f3400eff0b2441d25b68a17344dadecac7de6881bb75304d42ca9fb37894aaed2394ea79f765e1aad063d0efbf2a9bc11c252aefe969e9029b34009fe9d745c1301e1bbd7146e41433403479e47ce8e6e9def910afdca6074634c59027ac6983de27e763040995b832d47e52603650fd72b537de9e1774a91bcd0e7cedb0224228d42b798ad79ec01a61a2554f454d00379578e1fb3700b7fe98f276c2fb199f15011ca328cded317bc1dbd7c8eb178e466c47b000de665de43572a70b07c8576db6947c1ff5c859399f1fa04db3c59d9608276f9c99f42126960754dc806c999c3ad3e4f8cf724696a1f22e39a3061f2ce5d932c6e65682d5e61fa85e1ab536bd1fdf55337ba041318e6acc48949eb8c1dcc0be8b9f919ac95ff344b2f0f5625854260837375df3ef62949b089baf52927ca6822f0fcb8f8e07309aec9385c4b7af5e4cdb8ea656022bf180396735a4f6ccec047061d6445d2d60473d50af1a32a9ed8fdd6878b768d1749ba63f4cf6d5a268c9358081b59a80a0fc21c574431796db19673e51e6d673fa091fbd52b075026fa1db8ec34eed8cf2be94c8770fba100ca312b578d4ecb561164eb532194716dc92859956c38d9640699aac893922e102acbd772583cd14b8fcf3d2779e8b189efcf7b8c0e70c431178c3480a8f3687c9c5eaffc69231ec2d7a1aa2ba167353d0043b59d733fa164b46d285dce9621331a27fbabdaec69ab976585119848c186bb4c2747b98e41fc1e3b76083aa86be4db931dd474c5ef189428266bdb3b2196d029d2dc24b094ce291e8993b3ef72941881850286f857ce7544251798fb45824e7ff7913cc2662c26f152b3da7691a19c26f41b69ab7e6f690ad2c3eead2894df878a6fd7a9d7c0bedf9b8f12c53ba2861ff3e188e57fefa97a5e318f3da3095132889fe3a4432f9ec2bc484fb84941fdf53112b9b0beec9777b61a7c1bfc696a2808be633ccf775d65b8b66218398dc11b3d0869996c1da70212164ee59afd9cb17bb6b891b5a6130b6e5ce58a32b0ec556c61d69b4c241dcc8eb4384311264c3dd874977efd7eeaec05c43b661d6a585c7991718f36533f7f8b38265ba6c261efdb894a0de69b40ec94e4c9872fd87ee90b6b40892954e1fdf642fffd78954557068cae6ef792fca56e111d367205decd25d7c0a3e8535234edd821238c7bf7477eab9e4aae440588303e288025140c7377a97f8ea2baa5c6940ef1237c26b21acdc014e652a49150cb76af89399825eeddd7a7594736a27756727211f7222e5246b8336330dc72998855db64888656588210cf453d1c1dda0f3c4ddd29506f67d0f3d9ba7c0e77b8cbd993f6c7c07f5b1caa3779f0df32eb9c3efb0765fb0920e28ae68d3e4e5f4cea904c34c6780e9d6d6f2091c96e3cf56e7cbb2b692366018da91514f4089ac9ac8d5318b987375ef0f48325064a186a7558e53a626fc985c364d1d8f4c508d4a8122f77c1be13bd6a9da3eb7d3fb9358ad3f7bee3f909e7fd613c0c46cf00454875bf0f9e0b848936e120f2c5a5e108a0ced1f35bd53a7121d73f5bf91aa1fc7d11fab264d50e4f645dedef67f4376073ee38a44aec0f443946ccdfb6845301a5a8b10b65943883cee233af149e273a644528e7c1e217037877dfb528f42d9a69d4e6436361f4cfbd626720ef69911511e7f5524c50f7b1be1e49f0ed1b866284a8ca8139e7cf0c7a94707a73d41a56daf02138ef3297c3f3e032684952268a5b09651e6facbf5239232afe46131a9c768bdd9cbefd2766d3c1c7cff4c866ca72a1a0178d0194d457b4b045c4bcaa7c05ca43b6588ad9da46712b552e3d957afb068bc3fb5ea890694045615d60ff3e5424f4bad52c293532d15f52c187bff33b5aeb45b1eb37a85f39789ffbeb436a0acfb84d09c7e5361394452cb5336e3448cd694fd1f22baf70c701ec35dd4fc0dcc55e7e7743ab83371e3bd27fd32becbe99cc4029401b75db05c3b5b818ecbef36e84317e2854932ec8c338ca0822ac610717ddb593450484d21d21e7f730d813ab3d9c9987cfd5d6a9bebb918f2a57d38f8a69e27802a08524a3ec01435eb97016b9944fedc52e0d070e2633f2c783224c71e07d21110721e56a4f8b90e2b1b485546f6b0fad23c73effc97852aa4af452e8594b043efc029ae6d90d363225fb0a7c6122ee9662da3f287cc8fdb1468f13996cbd15985d297a993b72b9ac76055de818a97fc9a37cb2776dc4677cd398ab7e554363c837dfdb036026cc438ad038ada7284428f19645ddf6d62daa5ee77d0c5c32f6c891ecd867d8f115ad2960a1e849a7f21cb11613f083246649b610bafc03872a557fbb9f507b751d79f6c30a66ea7d7ebf9ac768f5ee16ab95e949e83c0f8759f63bdfb0e8036dc7de3f824f7685c3960bc122d779126e0303efd3bb2264972891d0f87e071e3eb3e441b99dd6836873fe406e7eb2f3e0baf1988521f7871e064fad7bb39cfe7bcc4cf6dba5ede875a31abd55c2f743517a78f3db6f1d0b0f2643e9c931ebf6621f1a258089f29292736fc1001d34123aa35c8a530afc61ff7654e74c1dccd71edadb9f3bc1e894044156ad019e26c016c5b484bd3e741a87becf1a19629970cd15268a70247e2df5a302a428a34ba7653626a32e9e82326bf3c18d8abf30ea660963b335539e69425a84db6400a1bf4122b693ec438fab8ccc6c6d4414c032515c573570206b762f20d7849e4662e02df70d23028dfb2d4de27015415bf382bd176ae71df330d5dbd76d283ea60162e6d025f763ecea593e4656d64c8a4915b7da4406f5d372745b060ce338d5a7efa2e69f6f33b5c35d1abce5ff0e2789625ae7f78cae76e0ce7385b59187a5716601921b9fd7bbafeef5bb180546483b9c225f602247c5a9e38c66db44f93abcb9f376958131084fbf42996c585c37165685f6de85bf6b8587cb73d8c3bb01f31f637d7ff070c5ebe1b1de8a28aa978488eef63731dfaa8e96216319e74477f31ea9d45f00692608d86a3559fe47a961309a6bba170e6b4b89d07754841c09e5c74d2d2e74e2036a9c2e6808488d66694afd736c20c0f96884cf624ed92845197d7612f4da325c805433b6f6d7139cd383af7156578e8d8ab40314328a1324ec987e4c0186a0af24f0e51753e0042beb793efa2350e6f54ac37397aad2fce694f194b8b9ec77b9a46322b93accb5341141ce901eca1d1375270afb0aefeb199f58ebd5b99f5d0324683375355ca18a5fdad0ea9f5bcaa018293e7675741530dcd2648d556173e30468751a0d99d3dabd99b45c352959b06a124525ca4a33f90658c248e8124cc29ab2960011c23baec99116e414f1f3ed198eb72e73f4d8d15d242dc4cbb406a5f33f246f0c98e46d8f30c010f28f13f7a746139458b315ecc4b54deacb92d88b862fbef27a4077ff5ec3d0eeb5a88472cb7ebe19684b8b5da3f60b663ec1d0c651d6e1cba2143f038c7594c5d13652dd0e7820b2c219eb9abd7e1758a5021e4bee3d4ba946467275f426a319427e71541b68e5a17e806eaf58c00aba66dcc59f50f459df1de8fc5518b7b69a4d1cacb42904132952aac21fdddda2892fef2d5bbdec60cdcb18105a92e3ddca65d0da670a533adbcccc43e8f02448b972568885c82a6c24774a35dde5e4522021f6669d0edfb184f5267ccb41e1d52daf2c324c55f9c81f49f776315426ae6f45ce209f8ed13d1b0db1e2476410f9f5ab1109f91bfe669aec0a50442a930bd97a1aa1ef69f5b7ef600481ecaa829522169e1a54db2c2e9af3525e18c8a648799037fa867310c390b3f9ecce835f00892d42c75c5feb35fda8acf59269ede87308e19e5bbac644069b3a6b4fbdadb7551020b6553d1f4cc4983898b86379cc0331db3b9a5a3fc075999f7a8ee1f4f528e5784d1e2f6510aa8bd16e5f319aa8d1d5800f968b9ae5e946d0ebf559aa3540df1c2bb8825eafe8516cea873c626e963a7f7ebe8ae4f95fe58088e0c2bf6859a39c6a39deb0f9bdbd70cbeedf2fbc3fc7dd1946487782791fe9062ee8a65614cb0c0fedade2196069636ac248e4726338951a98c6029f28f9cf764e914480d428912ef028b7f087a2be4adcd26815320a38a69bed9cbd10e3fa9eae5f8b010862800fe609a9da88af6f4c7482f0fdd41b7fae38e489ba3e0694743e0d82978d9e3a2e18a11abc3b43a1f4da1212b220b3606c9847220875192b4e33f785e703e4463a330aa09a9e82bea06f0fe9c94e2a920edd3228fffc230f87069a42f877f7d814ae01d117d13948c41e75cd17231ba0b32df2ea031cc62b6308f4289f54121c45d46eecb2f120966f90295955b662178ecbca61fd4521a2000e647385bda4114ac886f859296695ed49fd13b2ba9bc260e0b663f968965b56cf537f81f83131e2feb1a31af83b6629003af8c73991a7223e385ac51811c0a33bb806712fe6a95627c4fcbc8303bb7c878f12ce2668bef8bdc39b76f0585b10ed188bd2fd62df75d47105ff7255f525b0174b31659a1fd55d61e63ccc5241d7ab7b25139c2d736978ae95995d1873508148bf8db58eed428166c039945a77c6091c14a36e023127de91c00a1806452c03fc99abb4c25326af3f22e002f4d442eeb6cef6772eea264c5e307091deddbf3b64dbd046eb59270beaec76a67724d000c7a40be5ae02d9415e7c6503485c8b634b87fc15116d5dee83e030e89234619acd24d8b65d91b5c6d7d58774510755e3750692245d8c3367a56f2f0066bd698a0ec0de816c58acf0a2c02b1869b385b4022c202109323c2adc3b684bd270d5aa42d40b12a2266869bf41011e64295d2a5b59a4fb91c7bdc3517e2a5f252a9ebf9912598504d5f5ca3feee2e38f7f0c1c00fd8cc0a0a9e2c3021e84e689a2ccdcd4420ad221ab8489de1541f2a44e85442259d1410befb91179250b5f54fac0134bcf289342e3dbe6ddedba8cc836a46c8878c315c38373654ea53e10fcf91ec72eb3179bc0d4444757cdbf9e00de0153971d5d99ac6361fd2192e6a1421365c1a2201374decdf47e5c9ac170a420c0d6b565b5f8ac8c7902443532bb840485eb00abfb7dc67e77be19391d55d83a0c4bd5071f119eb7971dcc03cabb3b6b190bddba9a76fe8108bb723d17ad8e2691cef61a023a9eedd0a8e959f68c51abea62fa22ea5fec296cbf1081a18a55f680c38f4922ef39685910e40ce0ad188ee32b8eeecaaa52f0f77f548c8a00ecd004607548b9840dec69505e0d315f64268ebaba359eae917666ef6c66ce1eab37fa511d6c98bfd28a2cc2fcb9b698a19edf409a1972181d7e7ad0b274d44c220293bfa2b420381e042c159893785004e7952360253755cd8d2598cbacd5139371977154aef07a5d2b7f225d606c5b940f6c2d94dd33ce08c095f01b85293ea438201c7cb86db093c96d796c7f2b7dd85910ea71d7e5d981859c103042fb2fdfa36f8eb95668d682368c889d6089a153b813ea135570c91ea92afaa336b9dd4d6bc23844e566475c13c92733511f48786680ba1837706e3f40c3e75cbc7382b3627b1142f54ab84351c9400d26f0c9d4ecdc274e8c3c3eaf036e60c8043aed35ae7963f297060c7e98ed489810608669a2a3215c7c6a071fe11c0d4e7470a4867f4d38d98f713ce2aea579b38c793c8e71617a8742c81d76c45f8ab937b39e5e829d42b1d8eab82b4415529aa0e756bfd1c957d4ff33abb16baeffc6e083f87752a1bcab1a601e3687eafb75e2ecd360f981a02829bdb7aabb94cb0b5b88775dae9762b30d3629709d12e03c8ea22076eb79ac3ae175457721d7c6812c79b2f8528440eafd215528ffdb71482585f5007c03398f315b10dca4c3cf0d5430e18ccddfaa5cf93a3ac5eef13025ebb703a7fd809caa943cbfea0b809c447710f5bc78e7e0b39141e7fbadf171d73a5f29f912ed8e382618f666ca0d27b92d847e7e07a22c8e0876d20426fd286409ad1659beb2674df972cb6e80710387a302e579ba124f8bfe87f82d7465b74e4bd4b5122cc9fe8419a48e605926019536d7c4c637d676824146ec3cded44be2b19552d7e1421de8ae8a8394374d52f42099b7a60d093857e56f44a4709d37939ad45df9a7e54b159d856c4641273b9506c5f990e91cba8b925f2cb6e65e2f0cc310bc5bf2ee389fed5c6363a979ccc9764727a3d1048c258fef9aa5ea75a5af762a56493bc0ba5061993f15c96af7d80f6521f3156e65da2448c2fc040f0fa67839dff2a7dc67e40f78622ebd7d8cf3710715a7f15803a9933d6eea7b07e57da6a62b8fd379564e5991e1e8ca207a7db565b8dc73d109681ce0c2a201290d694fc1949c46c35f4a90016600cfd1f19cd1a44d01ee613f3f738d3cd742aaabc5398625cc1ab4564d0b5d712c9031429bb883a528648904d1987b22a3b5b7a4041e5f2f833b49ed4149a018f2b430ce3c179388e1dcb5ebcc81d1bb4ecbf13c8966ccc7db63bc0c1c7dda9c8b01fb300aa552a4fb8352997a800c020ba9ab59e4967a62586ff53153c5521d15580cf052ec76264a599a4d958df014cf200b5b4dca5f05c98e780a7af5d0b800c1ab50ad37838677e3f483eac99873900c03d6566f672bde40b35c576ae7fb2a46c25897e14486ba555d2a5a356306199285a78e205dc8f0574a39f1721948f6f2f7c3926061e6e1c02714e5c41c1f037538bd52af1717fc5fa144e6b9993452c9aa4ad9560ae07323c3814316ae590807c260723a0be7604d3ea0b0a3638ec87ad6364a9977e2cb029bb1678dbf630ec72720a9931f742b0732f2ef2cdabb5536873c0d495765eb6a2c665f87cd158f52ca5e9a4abb82fe71c0a324df8b3cd4e86d7ac3ef3ec165d6eafbf481705461be5f94250cdb67bb9af1bb91a731261e976dc4bdb78ae4ff4ee1fec0c2d709207bfb6968c71927b2611e5e6580d8634b77b7fa98c6a897b62c2d187d03fb69792124bc95a4000db83cd583c2224123b0502df2a67903fa0aee433f912ecaa061b39509e279b682a4fe47e780f9916d184be66a25cab29de55e90c91407368962d82184378c37ec436743420f6875675dc72842fb86ecce653626176b8d37c161e3bf3bb10c0228db58c9588699249f48ccc4a845747cb0998cbfb3a3ba910b98e04dffcc0299fadcdab20c82c5283f73e40550d9283c950b6c91ab83fea21ed52b4dfa6d22871ce0486730fd642f941cde21da6eae17fadffff89463af73e23cc4916fc6611cc6c3c9c2dbd459fb56b2526e2df9c58ff502e7bb3a877e6a28544269158a90ba77f941b96b204124336402bf435fadc943363b859115cddb2098e5828f4b376d5a365a8ca9862880616971c93b2039d0bff40b1e6da8669478956d7da63de9194c39e1ca2069f6f7d27e4d7e0b9cedc582ca1d4b865c76a9685037588d3fdaed6a33aac4fcc6720a1c0ccc7173fc55dfacf752f369830b654df830c9af1fd882e08975c1a3703eb906d5bc7fcee336ad4fa5fcdfa43893f0f414b28e8e3b0e3e705914f1f4622ad03e37eaa65e18de5c36527a0599804aaa3e39e620bef7ca15c440572cb48f97c451513801534b26a19292f3352a801e9660459917326645402173661a73d8d18b4fb44e898fe841fa6ee56dba7d1c359982c884ff78e33bdd2d18ee9f0c326ab328dd92ff3fa7311debf6e188a65a099b6ce9a8b05a4ed74778e5680ea4733c75b0f6cf753a6cf8f964eafcfb36fa9fa181fb57347cd627300ffef165a88ac9924e674374bd831a1499cdc3ef74b9a675fc090c396409c136f1f36696046468142185e17a795c9d05524e3284d1649ef311048a8e1bf3b4cc06387ef0dbcc8dce7e3942780911af8991b1417bc5a5ea61c2efb685cfc6a707b4ee4c42a62d4fd3df6cafc32c35eb9abec2ae18c06300cff18b2091a3bd5b4118573653e3f322ffaf43bc0a4f31302d81b4a9f7dfca90b168824ab95c259fe4a8c82468d5bc064c22c800df5e7d6cc9aab1824accce3aa032cd4323f34d53a50e816731673a56e224bc04621fe41cca682970ab084bf9e63cec748a84cd22eccb6075211dd98bea356d5bc4d9baa96e569a49a467cc4ba5a34d93e161baa03b6546553eb790aac8a8fc001b67c075384bb170455f20147dbabbd4232a8248ffab846816bec60c2f2872660fa251f488c457008065a671e342beb0c330d47cf7630c7e627cdcbd451382eff08c1cea09a791452f066b340d2a0bd8c5ca305374e9b05eaeb4adc548f3497324dfd551033874104273454445fde01e560bacd0a2db3f5efc6e2f9958ec2eb45fdcb555fa5ef86200c7059bc234c17485d0915a66cebca9f284f0492f07c9df016f1fe04f7ce6f900a3199c549bf3de4d20107a50330c447010578aa7dd9321616d273735bc22b166b5515e9ca989c72312fc2814fb0b72ae272dfbd2f6f379dbb84c6a29305ca72f26b7b0491f9aebd3c1399fde7891ab40ad589d3f4d126145ceaed3251d77cac8fb655950201bd9e6ee3a40d3709c487449024edf0e1b7613e4df695fc8a1e156fdad896e7a4321ce77ddd93fdfea9112842b00e52bf9be17254dd4175c8842694cc58622c8efb8f19b105594eaec3a744f9824bae13fc7188ab6978483ba15629c3b9ebeae75923c30d720dca92912ed6c934d46b528e4b935bed0d164bdadf01af217a27d87e5b3ac6fa120d854a78341cf361bd9e3edb063919366cd648b345de5e6290a23aeb86f12d0b641bcdef9a0f1d40fa5a415417ec77fd9729c85faa146d10bb8518f9537caccbac470cfaaf7199dd5ddc954cf6b6bc7e08210819ade0abfb6a2b0805fb75e377703a39e0ae0ff2b4570247304f0e4dd8bcc159edd9ae414bcfde8fbbfab36f02c3ce04680d8621229b774285539c364ee0b0d8326fb71cddba5755f41400083ef898cf1c18e9eec0a5d4bff14766a54a3ec8be3d5b601de605d6f47039234add9fac01182b54f41b01c0fc7493958ddff2cff824dd834c2600caff96d9796b508f37b8b1a2ff2508e21212aeb0e5109f72757bb2ad600c8dda60b17358f69fb1a37f8aa7997542bc88f9df2129f35e004350946aab243541ca36d820a4107d84b6aae8288f81fcb3131153566d5b8f6adbeabc1c202ea00851d093b1d4bd37433ffa30b306b4b8f9d73b85de3377c692f0598e64ed9f2ece5660468dfb5177ea8562521e6eea9c711c5aef0702b13a2a7de8b64f98395b40e812f6ebe214c9aa98abf740f4a03b5df6d789fbbb08c9cfbc0ea12a107e03d74b9c3b0038737eafce997f1c7e5a0dc0758b07e259ab02857d1b2ee1396f01974455ce23a7a4e655f2ebcb371ba9744e1254f347d42bfd46d9baac95444695260e5b8c5f1b877607b25f279db5fd48bc960f6e56a8427c70149dfdca8d13df34b6a9f28409e3d35ed52f355871d2552fc5e61e7327058a564287cdd995e42e51b4626ca7738d6e054d6e5d5dff14b1e3448b99d7f2c04062e1009a1b5e6e0fd837a1594808d35887a433d8837e88bb84fc559300db321d3c824d07b24608e2003acd8c0e480116d0dc39ba25ac724cd3961f0e8969c2075773742439e2788a463268cd06674a3fb1b7b24b3b01df32388e35f94675268978e5be2b8b59fe8bc8dc47409da6116e6d9ee142612fbc7f63aabaa1dd1042d24ab5753dbe937908537101f2753d2db82d8405d5b18541cf20cd9e240286a9f68cea4bf65d4efc6823c1862d547ab40b91aa0041b44e16add461202ad02119a784db1c13d85a65cdc43817b6e0794a2a1023e367acb81931546ede0ea12965b05068842206ab4cd0243d51268464889c93b652973ed295191b2274c061663e8ef401c7e47c1728861fc3e99b30a8d77251fe3c8d6de80e7b7f0aa8ca854dc2593c512f041eb2c9c0aa95f5d366effebff21c24b47b896b9cd199ca82a12e4e51d47e2ade813f345966d15fb821128d4187be1b32f48950763d93ba0f11e0203d99748c18bcd76efd607527de1a4aa9993d186b2cb83284133bf0420fc49641fac168f5f24f9b345d0de6954d80f5eee4c6ff67c011ab835c663e898e9bb5590b3a5220454c34f849824436cc8819ab32a4806f52c7907fb569df8aeea7bf07b17136f855c5b3819df1c918428b08443076dd7bfdb72162be15feb15b948634d886674bb144d5d0533cc16f11993691e9fcbd9ae2e554566f1d1a4628287e0bf8abbce300c17a7f4d7aba0a778f3a2c5deb02deffb5a5324df866e92ba76d92e5d8c050f5fa06527eb56a892be8824e8389a8db680d8290367630d2695b52d668b033e4b06fe2f48c33018232e9c50d420857a0623cd797765cdbdcb449548d10b634864f66f23c9e66c1795625c59f71593146514d5e6f44d4ea6b46655104ca7d29e49ff3d57ebfa5e97f797940d0ba640d64631ee1efc7c60661dd56f1201ed5227b50f8c1057c60dedb69b0781952f6440772d14fc920b57b135c38d0fe0e2ac52e5c47acb4183cb9dc978ab69d1af0d99d0d1f2ff58c961189355f6b786e14727e8b6677695456a8a93ada5f46453cf9c10a2f392100ed98c705524caf18867705efa9cca43bde9b28c03e55e17bbcfcadd4881f809628812be2c8421af8bcb5d93d27626ee100129dab9fd58a53c5987265d0421b2826e16b248d36437ef24adc4c9313a4206dc088fa691019273113268bbacf749ff0cf2ad3013b427cd2a26b4a13a1466e1b2382a20191c8ae338ece772e43d8cd224ec8d88e6db18d8d623c8d6d4378cc2a84c587d71487ccbe6623c5de1d2a274f604590adb47081130b07309f9e0787bf40f8281a2b6c07cf3670b3542fca352d24d2f1034ab62c519ff068d6c5c3511f8fe6606b9e92e731e0d889a7f48b530f70e98c2298182bc2b1a7014aa50080e30119195d291be0d5979b3737b55b542b7e65944f2782b125b838052476172a2b4398009956ca0baf4b24a9224ecdf1c08c164e5a34031cfa09c8e45e2d2f7ede12ecd6f4e0bc28798b405a6ba634dd2b83277b480f56d2ed910b2e218c7a3db69483e88f57982a128607bf772f899e209d3884814fd1737565e3f0b628e9feeb4a5d4444cc3c5d0cf379a599bb72acf882921e48a9654a518a52d6d7b6463384d970a953585654b08f0edd4c8742919c143a39b62c03adfd085adfe61c0cc0bade4bac53c4a4e872d9ddd5655d2ba60284be81db30925709238442add444133910ede85e6dfefafc7c1b19d46232e23bb486abd07ed090657e0f6080f96873d9f3e233c700987c42653e8f8e309e5725bf1a26d0451c244cc2a168b906b1fc7d6d25dafbee0d974a8200e4b52e090cd8a16fc7c4714b57f2a90bb934cb577d981fd42a7f8e96735e716e2058b19eed8f6f1e0d8e92d7e8f1f96effc4d1accc60f7525a8f155f42f2583740dd0ccfb77ae082d8d21d60e9834977e53a11ebccc506376a1d34ef8ef40b4e412d29836293e09fcb2272a09cc7dc2fe407917b4abc52532c743ec6916ebeb8dc107a8363a83c266b5e49dac56ce9b2234f731d57d9daee950ed0c04afed46330f8aaebc04e179e48a84809ee56af3c187795ac5c80759d03ca39b1cadba9a5361d596743ce06c19cd1639f3c2ee6284b3cd333aaed620eca56c6be7f37bc8138dd14946fdcbc41e853be85d260f2850d42160d1e1618553435fce5092e21ee003aa9a655715a5ccfda2cb743639e4c2e5a97beccf56a7525be3b50d04f11543d8b9c577a0cd66725aaf90bf5623dc59fb118e8f6b5fcc80175d4bd4300f6f6c5c857608fd57e7e66dfbddba9918ca9ecf0991c4be37d4d122ed333bb00fa8e0dcb0593b656c3951923d8d618cb991286a482ede5dcdf9ef5a50995d74226dd0a846c6f5ff5277dfe816573b5480a37d9bc4b1c7b510f6400eba4c61485f6569264929be7e230a8c8ad38b857ff2b5d5f0e1697352e4fc61b40732b38a6b58ae407529351eb8b3309025bddc6d4630b4c95f95720eb624e525c7b3d5b8917dba357ea0f59e44c1e7b37760a1049d59684feb1f04f9e578a6e3b53324bf76720833938aba16c2bf5698bb19c1dd4405dda91e07ce31b7b83c71f53b18cf9b375e0e388c6888195123e376c02872c7a658f52028aafddcf4bb804e6509467a392735fee12061fbb296064988b184a73005d6dbeac54b529347f1c726fb3eef5a55cabe1254bcada9040e259eef34c5523e1d0a4f223680d2ebb18b2faf1c633c82e99064d0019d4421c578f3821f9127e91e000d8e769807a07aba1ff692a74806164ca5e85a2f07dffd11277e1c2cb2cf6311555226b15e3e9400d59d77ceefe13b97d2731dee86f14dce9069c8ffc8861099d3132965905c4020b88c684e3ae5d74bdb939e6112885fdf5894d7e7071286167c3231de4982aaf120c61481d0729a78be220f676228a52a59158efa06a4347a54bf1cf25e0a879b983cb08da8e0b24125daa9549150761b1561659c3451eae953913f74a51f913c70770bf751f589756c94e0965a799dddb5f6c87a04181ec2d1af25533f60734b20f33c0f2a4c9208c6410b228b843703b9268a1f97a376c0c9aa21c8aaf522811bf84f980748daef07eefda8df9dc8bdf80c4a17c07bc2547f681ce4067a2bb2dc248bc03b67005b774ebdeee81dfa018f7a6aeed535e760458e54c34aba0827d1c36b0095b3917d048bbbcc08c8e9fd5b1347cb85b023e22085462706a36a147fc8dab4282bfba1be0bbcb078f94475b7524395e54c96a305b2f56a403f8932e93c64ee73f1531da63f0cdf4fb40dfafd6a324541241766b6204b9dd1b504d9b2c8f0aaaa9fc68aeaad402e2f2dc5439cc3b6284c18117d1f3a6e71cdb7bca18a2aedd23b7760473013ee78db668d27157ec7ab1a3a5dd701ddf2ac08ff02fc1b65bfb8d0d4d23d0b55d7c6925ed3e064ff9cebc1f2b09944b3d1026918a4c5cc1f096388a85988e32efa320e207062f1c8447854e6531dd2338dc530c0b73db0595875953b3f8c09947a2d8219b92711c03988562bb089c9dace64096b4f761fbf8aaf17d204ba885daa145efcb568232c55f8656f1f051baf25a84cbbd2e6cb9ab393db824dd5df6e19f3238da45eb7a58a7cc292ecc3c12f883d017393dd9da7d91a3dd2c0e8f4c5db8f7567dd98bcf164d4036b75ca0944c3862655d14f12b0dffd1dce7f0a3ad73ec63a7234443fae49e5f94ceb39a42d2dda9c77c02e21f9dd7b1c1634fe41344285a6f77f7974055fe07b41f5bc194456e84d558f9810b611eb459ccf99f731547b6665ce33d3f51864cb2849baef5fa44c56f8b4ee5ba78fcd4730f82ac34c6297841cf6bb5384ee2880be07401e1880f082bf0887f0cd7d60aa9f9b106e211377824f6d50a16a0eaa2d053d331d96eefb9e53a2f74661671ecd3aafc930c973b5d8873482b0fb7839cf4d08319bf7b4c94a43e72dae496c58dfbda608e77ce27bda0728add18067cb904baddfbc252209c15a903d970a23bdf58e6cbcf3ce38d738f64c3915538555cbcd3c8277cf9655ffc339d9392302d0ccc18f9dd18e8658080b88e04003df2184b325b80ff4b09fe897832826c154bf66eb2e5de52ca2465370cfb0b410c2f6312c6032aaf4ed114c72fee70a325c843eaae8687bb433a3f51f54718d4d43451f50e0f8b3954b6cb077425cd4353be9a4ab4b9aa3a1355dfde4fde55c7a5a6b85c7a443ff5eb7f30183afa433fd3f3227843d2d4d54eb38bf7107d3ff2f3f97c3e3fc222afa3a108822c7d8e7e42d8eb401de8d399bc84f76947d7ef6ec412c6e3d3b4ab69d2ab607f8a3d5d753c257cf22694a7b8d329ae9ae2d2dd6f172d4f6178583f844f3b1ed63fc127313cac4fc2275a4cd577fcb098aa997e2a18c489a9fa5567aeeac7e8e26232ddaba3ebf73bc5a5eba7e0ae8987f54dd8c3f2b07e097b88786c62aa7eec6a124bddd5f4c3c0f7c41ca4affa1486efb82af4f54f62f889365723244960641e13f40ee9fb1b46a6ebbd7f823f0fefdf27e11b53f74758e449d48d875406047afa17c483d3cc8ba0fc0f964fe987ca8f44e221acabc9d869e6aa4f57f91ee8297eaf7e1f493f20faf72325056599c4c3fa1f2c91c43cac2f97b86a0f914b6aaefae483787f4cd7fff00e795d6d87f43ecdf6c482dea7d9155e9fc357d4da12e38641ab1f25135d5f2eb9f5348b80a3aace8682db000feb27c0c3fa5378587f3bc1d5d1f54fb3fa9d66baeae8fad246eeb387e8109685fc6441c14e9660085fd8e146c72fece0d2333a7e513b8316e5e8d9d18cdcddddb91cb7a136d486da501b6a436da8cc23f3c83c328fcc23f3c83cd6de6b32fd87a1add5999930fc379960b089da99a8f9d6de6b3271dccb7b792fefe5bd5e333361f81e9d6e77f2894def219ac4e5cc15c8da7b4da6ff3004597bafc9f41f869775631335dfda7b4da6ff30b4f65e93e93f0c2f6da266e866a2e6cfcc84e1bfc974afb5f79a4cff61189a4dd414cdcc84e1bfc974efcbda7b4da6ff139634527b19eefee87c1f97f371391f97f371391f97f3fd9e996f6dac8db5b136d6c6caaccccaaccccaacccd66ccdd66c6d7e07eb766e07eb601dac837530dded743bdd4eb7d3ed743b7abee735331386ff26d3bd2f6dadb5d69eb0a501b540b005b6c016d8025b604bcf3f618e06843341387afe096f3497f5f95cd6e7b23e97f5b9accf657d7ecfe8fa9d70a5b9311028068a8162a01828068ae9f9274c692e6daee6df4bbb97762fed5edabdb47b69fa84274de866da6bfa5014bad1f34fd86942b3b98a2f72cdcc84e1bfc9149acdb4c82572895c2297c82572e949ca5d9c5e67ae38d7b6fb6ed3fe1d8e3e3a7afe2767ae92f8f95e6bae4e3f6b7ebef79a2b257ebe079b2b1e3fdfcb99ab257ebe479bab1e3fff6bcd15133fff83cd55133fffcb992b277efe479bab277e3ed89a2b00fc7c1036573e7e3e98335750fc7c90365751fcfc4f6baea4f8f91fd85c05e0670a0a4988881373a24edc89b42b6d644bbae40d48c6248ecc913a1f4993351b6fb9cb6f1ce631c7f11cd0779ce6b569f34d170d125e2b00784a816714d8a1c0ee033b00b03f81e5cc092c9bc09209f93d7003264afe1298077e256a701278ca264a3e1234fa882274e038511467255f8583908f030321e50d9c53433e0d3c43863806cb8079c9f8310b3e61d75c79ad95bced3599f23695f2fe309c19e53da337e7d2734759687b2d0bd3f9641db7559d9923ab08ae7caf15534d6e4c793aee3d5adfb1673d9cefcd999edf618b639aa563dcf47fd4a794524ae95bbde1155b6badb5d6dac4967f6c79b8fedbb66ddbb66d9cd5155b4df196872b45393abe6421c4901497c2c68b301bd4d2ee713849f4fe328723bb1b6403b27115270369e1aad842e279e11dedef65f0a7d646fb732eedbfcdb46f3a1eda8ea666bbe9703a31194e8ece8c65d372c16030180c06b391c96432994c666363636363a3b303abc96ce4c6b269b95e373b38393ab31d180c0683c16032994c2693c9fcb503abc9bceee0e4e8cc76682dd7eb86d660b51dd8a42dd7eb066675eeccb4f3b4b00683c16030184cc26a1e9d3ab31dda0c4e28fb9809766f6a51569d669bc109651f33c1eecd369b2bbbe9e8e8b422cda63357766f3ab3a3d5b47b58d663633d2deb716d2f9ded15db5eb2ed85b3bd72b697cef69aedf86ba763ed74363b5d6ba773ed74af9d0a933b1566712acce65498d5a9303bab30bb5361d6b65c35fbaad99b9a85d562dafd37ab7367a69da7c964dbcc7f0627947dcc04bb379a7b69a7f65e93e93fdc7466b896dd5e75a7c268cdc590132d9014990e0236e1795e3abe6421874cf7210e9ec718638c5127be94524ae92f777729369ab9137fce69258c524a436b9d3474b35ef7e982cea8b39043dc371b7811666e1bf7554a29a594524a29a59452ca5c65b69c9c755216133ddcfdd124c7719cfd8f56edbd22f702096b561004bfdfd50bdba4637d6733572befffe198ae77c22abf824d2fb14783a2dfe1125bed84ab228c347b4dfafdd14a987a484ac1d651a437e1eb28d2a3e013ec55391a7d69347af9a4d1c8041bc1a5c2c32a1255d28b70d45c08ee95cd15ca7bb435da47f3445f514eb0c7c91a7a3902edcc09e1cd8d6a15712351ada2af57001e7a8e00145084dedb401edf121ed66c8d65edbd3b3b1f6a79813d7d777ca7d3a1d674afa6dadfa459cd1fed8bbbfdfe6854d89aab96087d349aa3fc41225c5f4a91ac22273ccc507c224c7a892b8a0b79a3fe488449efd94f54452392e83d29e58fb200b013117055043cf4d087be8fb5b52ba88734d3fe5da8f5d1a870950c27caa524d264cb61183be26c5adc6d6bb636575f13df1fada6fd37147c346b3f9af637c164163e64444566f022ccf6e1a5ade781767ecc77251787abc4086bcc5c7fc3b540e7efcdbca94b48fdee2996b00ecf98e0722f690cf4962db1980354c26a4f8eb725b63fb0a3e7df8fe0dc7215d4a5bbb0799aedef9dd6da18a594ee2df762823594d25a6bddb66de3388ee3acb5927a4c1c65ff622fc74315da44d957a18140737e1e08c7cfc7934337ea21ef39c6184025404d591e7a324fc9f719a1f58135ee0508d678defb7c9f0f0804026be27bf7de0bd6c84b592187dd313cb473d6e6ac6286449c482492dac352875468a0573f0fa843ea794ff1e7438d70bfa7b80aead2e0b781359e9737f4550f37f49eabbe6efbfa36a61503d376c7e4c4d0645a3230991c195ad80a61614e4843b550b0981b6d63706276646c646e64706476429bf026c409775036a81b542cc615f32ac5c8b4dd313a31b31819968c4be625139391c9e8c8cc644256e80a5f612c94853ae12c44b1502ed44b5ba97398e468bbc2f2d05e9010fcf974c90572f7380f5a927cdafb3e3a86bb41291d6f47de104c462169b6dfe12db11699082ef775cba8857ecba8e170a0141d4d7d4f4567ae9678fb3cb08a4a6cae783c155558e091c02a497ccd2bf12aaeb942e22550813f02abb85ee3385115789a94da5c1df10f9800055e074e21e28b78233e4567ae743c032010815fe114217e88cff129b1b95a7d021ae0800702a7e0f8205ef529aeb902e20da08005fc0d9c32f33efc0f6faacdd58d27c00110f034b0a93651f66b7cea6dbc4967ae687c000a30c5cb6093ce44d90f1ff533de149b2b9907800006f02fd804f3323ee64daeb97a791f5044f12ed8e49a28fbfff8f3976a73e5f2f65770a9a633572b6fbf844b3ab1b92afd13dfe2c49f9a7896ef4de0a77c54704b6c844bb82516a698584e2ddf12fb15971819302f3350a18c8d540d1a3ff830734315040e20720c21c4ca882288d041a3771ca1444d124848c1440f1e4bb4c45a62b545b6b5e0742fc21d4d04a5e8686cee965113cd55f7f6636ce66afb3d65a60f4f7ecf6c217694ed88b363ce8e3a3bce76dcd991b6636d4bd696365bb6a4f82d5d5bbeb6bcd912b6656c4bd996385be66ca9b3e56c674bda96b5edaced36db5bdb5ddb5fdb6fb6c3b6c7b6cbb6e36ccfd9aeb37db67d673b6d7b6d4fd69e367bb6f674edf9daf366c2664cff7893ec071555bc05dec50279cf584b15794f18cbcde947def34505cb4ba002ff924baed9c2f3a9c87bb22480f34fe0e35cbd3c055e8602797b2d6602793b4d068c04f2f6d903643c0320f071ae643e024f230279bbce0c08e4ed39a8f00179bb8c01a819df808f7345e31df0371c90b7c76c34206f87a56e6a30206f7fd5f804a4de000af83857377e010f84bb7e5040dedef2c16d661290b7b30ce0c313e007201e01bf4240deb2a692b420767018206f392340101f80027c9cabd54ff13aa6c85beae42840de3267081c21a42c00433c0072e8f801fc1103c85bc68c90b0226e880840def2058022de8711477c142f4514794b1713b2d5c347ded26687643df1baa6ff89a77922ef3873e291883b487c139f042d896fe26b9ac83bca6afe7b2570c451e2c1e781630e8ffffc129f1eefdd940e13333dc22502cfe19cc434955fef732ab8202743e3d1fd8fad7b159c0fa655d42eef0c80600df861a93d5dd7759f7f1e8c63bdf7fc96278e54e20963d3893351f42df63e9f4c6d898774e6e04c9c14168a12bce52d57014c8cdc673f54d47169842ad55b65d11125efedbfeea5e877e94452dd8f9fa30e524b54813efe4ad461da4274977f6cdf793524e51a3662ca9f664a0598991146405cc5d03f043242fb873ab40a0702e2129a8b08bb97de0774c5517f66e22784fbd805873795293fda832bc12ce4903a3921781e28babbc72825fddce7f458ab7b11a3bbebb75f446e047723c205c9deda516c14f370b68763e3e178e8de8d773357d746efc6bbd1fe548b5bb2992beffd4b2d0f7f8e8a3f47b189f29f9843bdbeae526a39cf5329a5cf614bb9fa288e2bc1f5bcf7bb6413d39e03625df91e4ec9c655b46483a3fdbb5ab2c1d1e370d473dbbedbf2c41ce536cb7172cba596875e7a515cb2f19216493614c4928df6a74e3165d9e985c00379f28b5f6b8d51481a8eeb2ae8712008028542a30f94c25e109482137d402936120894a2a25c500a6a0a6de0fcc2158d3e65f06278a70ef7dad151e7c4399b5888cfbd5e1d37ebdb6dbae2a7ce44dd1975ccdf213dd271c5bd26ca71e528131df7e06feaca59d7b3fb70eec2cbf5abadef796ea5d556d9712fcfdc4b7ba57476eec561e3b68d9bbfd11578685a049e99abc47055f484a1a9674753cbb55e2e994a8e2cd1f43dcc7930e7d2b46edbd6c92eaf44e1debd90f99e65b2003c21fede109a2e6f191a1782ebf164d7c1f5b8b55cad282eb89687a6e3cb1827d840f037707b8fdb118938caed88449c1a38357034eae276b8315c05c61c9b0e3de839315c05f24010e8812e578140740b57810fd223ae0a3d0882c0ab45a2bc271668fce0f3a989425c2d44e307356a43b51061da5a41f7feb47ede7b927aa617b424c3d4649858f0b923af9eb398234e315c058a39363dc3983b1fd00714afab42210bba2f12816aa40e7520306ad0c39706126d69c0f446e307346e68fc80068cc60d8d1fd080ade0d2805d09ee408633061e88cc078140bcaf06b78d4371b18570457141ab4d5cb56d730c57dddfb66debb6f70771f6c1a8ad05c1fbf2dab90abdf72adc0a40bfddbcfd047d781a94fdb93bf3308cb9b3a92084411fc9d4dd4e82a087bad1dbfba3b840bd5cb5bd7cd4161beac655281deda15eae8a3ae645dd6c2ab894fbb8f5c28b30db33b9fc3e9f634ccee6d2cddf0453033e5782c9e568198733691e92e0ee87f9d7d3b4e970452e9733577336dba1697f9f760c5fd149fb4c1c914b3f4e1a7d9374f415a557cb8ffbab947a9d1d6737cf13e5f7999e25a020c2ec97e93927b5b6cb9bebfec3a7d389d6586f932bb777bcd5977f61f8de56ab983255e67778c61ed67799f7ea57b7f07d932103d7cb67938c54ff2af130bc4b4c4b4e7ef4f5ca3c7c93cc5573936219bf60afee31311fc6e41d84cae098f7dfb853cc46bbc58d87f37b793865642acccf08b1046b4252120f49320f27e823e8603c8982817aa15ea26e3cac35a8972d6bc1d0211929a63557347eeaa06e627678ad55e66954af39a45a3f2606f5caa623a6978726978773a226e9d6e06edbbaa47b2f8a0b1417614c685b9bebe06e35e665bccc10999898fc2fbfc9e082c0070278f9190f82fc300f82979f219f1473552d7d242531bf3d2909897e0cfeb6a09f171eceefb512457e989f223f4cfe295e7e46ce321fa5ebe0d6df9fcb90791932bf6386189597fcf77295bfe013cec9472bff82df66a2e6e7234438a04fb112c8becf79704112c9456a29b9320f497f8a8d41e3e68bc9346099452279285fdedfa7182916ba7f8cc760ff2de6abd3b8898989c98fe463f8611ece98bbeefe582625261c57ad0cd1b21dee3258a1cc8732352626067b0eae4b50892dd797f91d339409655c0fafec24738a396da793493651f365f2b63726ef6b92cd27c5549ee5f7b3b08c1e748a99642e2e3fbad76472f9fdbaf42d478c7c2fd027bbf1a67c04412b526ca2a892b98a341f293657decc9bc5c03c9cf7e5ba475c73b8fb14fb5ee0b785110fa717473c34724b9ff211f4ef655bdfcbe59aab8f3551f3ad75b15c2c8f16866d914ca4379d7cca181fd05776bd8f675d13b437b6658dd4f77bc45791c65e99ab9c4442f9131a8421449f621ecedf27d2f657c7c379713c9481359eaf120f5d6f44b89ecfe7f331916226d917f77b4dd4fc93fb5d2fc4e62aa3e4e87dca7ba2af6299f79877bc7dc532ef9d7cd56b8cbf4c15c564130e58e3d9a463926193923dac7c54c93d2971d5c9c398ab62121909acf16c6a42adfd3e1edcae7b6ef5b282f955a630d83a4afe0b8e8e927f3de3eb28f95ec9037d1f8e6edfa7fe3f75c17cbaa38f37297605d52e2d2716bcefe9aee07d054dc1df4bcf47c131d295e9f923936ccf9c9049a6e75f52cc6af014d3f3bfed7b5bb3fddc850e21022fc2ec1006833bab90f28bdbd1cfc19afbde9c73524ae9bd3574527a4d3fe994b28a59a372dbbaa83718dcf95eedc01a20920e136c82d334dbb91ab96b66e6fe2e6910e8de0785db6684f0e5b7859647644ba7b896d8e1934a99af17ea6ad249b29377264c3cacdfd53ce6a2a1a0783032d3ce5cad88be8e70ea4518c753f0378c6cb3c181b7566a63c9d86c4c7823a2c5e7e56f44361bd0078c31b4429f6a95ef72f450973e34fb2be51d892339cd2256c1dbba0bc4fb4f2fbb20b97267a2e34b4879bb927a92b727d1d55b30d90ab1f7a19f8fa692ca2aa5bb0bd67532d31fdd777191f25fe28f600de69112d28939a6ae1f02c35792469d705dae927a85e47ab185ae9e23ba7e79dfae16f218e96a304b36145c181c251ed6879179b8bd80eee1ee1457d5e13c44f2e721d749e9b409959424929b914b7a93129b0b2ea501a3e1058d1b0fe54f530bae37a9d7994c9f82f7109de26ddfc682bb427ff42bbf42f34a142bb9fbd11360e54539f7bec47be6b80e6057772a2615d37778cbcc52b0295359eebe7eeed717e1d1c5944aec91c09a8fbca26ecb34caef908e0d073e79c1251e82391e56dd8464c25dcdc3cfdf37e13d449b3ceeab73b85f4d46d9759e832b53ee7ff0109d727fc7f4ae87b50771628ecfd70797b84ae5ebe8abcc8352883aa407f4d2d14f8939eed78791cdd5c6caa79908e3788983f8144cdf84a506c2871b331fc4ea1fba5a0c238a74039f62084436c5907b1c98c8e300029b7ec058583d934933981453dc07c17d08081f6ee0c040e01b3fdc78f933ef03c6c2ea1befadccdc48b92add7b27604dd78d4438f512dbf8518d0f62f58cf055f01540e41e34ea83584d23a453639c3b5487788211c31a79eac490fb14263267d107ee4790058b2635750d3c7550793289e107bb46e1c924a6b8b7c17dba18fd8cd187a33c75268afb149ed5c0e17ff0a669602cace65470c3978ffa19180babc3f74e600d2ac71ba242ee55426ee6c414f7261c35ccefae769aa5e05318179f76c07095d4c0e5c5bd014dff097788d1bcb93cac7aa83a358e05d443eef39013dd080ad9f7b0e66ac5c6a461f5efed4efe844fb489aa28efc98f058ffe8445bf824f3b273154a4f44e347f1f178d3095a1e91d844a8ae9e7f3f97cbcd09b7e10d75d87515bc81b547eeeb2f5f0e6958d88ab036be86facb9b277c3c8f4d6ba1f1a65bcdf136dc69c669ef7a18032643c3d85419554313cac334a0356c3f0b0d6aab3824b1f6689aebf6d981c4dda5470298c0c464904dd76b6f378df7419c1ef43f3bf0cde530b608eae1f8349785bbd7f3f08ef39937182c1bb7bc1db6302709631d6a1ff0f8683197f0bd60308565ef47425af6418d944d517e5f8b0d3ce3ed1b89993e14ace9b9ecfee4968e661ecba13bc433bfb04a64152773cb852ca2fb897b80a6ee65957c52ab8590d880cbfc349bfad7515c9ce95a4f17cf2080b197d683651b5fb09462169423a22b8f4471f6934ca9f6631c7c957f939c931a63e23ee3bbc39f0d224bc43338d82af909afbd1e73fb90a6e0623db4640ea4eb9ea4cd404514eb389aa1fcabec5690c77f9117f9dc4f09036b9fb343b853e27d1ca8b5e9485887ec543c4554a746de2aacfd7f7b0bccfa74b49a2ebef7095d29f66a14fa894b74925ef3054bfabcdd54a96b0ed79872b7ec45135c789aaa1d4df5220619ed027ef2bfafd305d637375facaf2b5cb2c380486a3eae9ab39a493827b82654c0960f4a22c244ed4a636177fb275559d59b8360f77f4a2df1b6b63c51c9d1d4aa57b394ff4c590e5b890e5e2cd72090d5ce9b765017b58ee4bda7a97578080b4e79855bcfa8573356f266a0b719f11a5f7e74de8c69b37379edffe5ee9d678f3f3ed4d38baf5d09b38d7b7779087ff8fce661acacf51bdd1247aa34af4f6d1da9af7bda6f79c70892a5a487464939712dfd102c624e6a8c51c47224ccc21d316c79852b19de7b8cabef757d014b047296f1fa477f049fea2100a061f5c8273b3ac7d3e0f81ac956413bc89d0feb2266b36de7217ea9bd8f3a5fb5c497b391e6e5fc25e9170ebcf97dbcf1bbb3d0d415cc988b2bf75bf7d4a4a28647f77d6097753d6fbd32dba8a127195d4321aebbefeee3e04f6e87edaeff2ae024673d9765d297f401fdd73198b191f87a78eaef2bcf775e212a616dfefee7bfe7e10a9bb4ca9cff83a4ac4c3ed3f6cc2d451f44b98a54578a337fad2db6f3ffced6fff2be8f61fb0c756d33374546283259a823cee8fdedbf0c99f941e0bea75d6da47f910e8c3f3a5bcfdef5fd047e86dc6c25f84e22b4d905ef441a40e3d29ffb83fca41e416aef2fcf6226cb17cb9cafb2d5be1e1f65b671fc43b084dc48e76d05bf4e4201e6efe56cccdfd6453434e8f54d6adb2441e002e8878e2cf2eb8ebef1e1c6922de9c70bb9758883227e618634a32a881c964a2378a650e964c3c9cbf45e176d91f66ad29018eea66a6f030a76227a24b4a8b2401a97830b14904634ccdbc9fa03f1dc8103de7c7267a1291ac56fd2d59ad269abe94ad6dcb59c426343e9834c62654be2693ad09130725d013c72c684f12c10b7a621dda732334414f3c84f6a6113df10cedd125e88963b4578b1086f6b611e8894bdae366a0ad11eea0277eed45cb75d1139b81278f1065b13be8896313b417a78cf3233b4212f4c42e3a823540b83de881a5e50f71e92be07e03c9af51637e8ca9add6b8c5495d70b787d19c7ffdb4c71a3115ff47fd2052734f6170a96f2f9f4a9bb77c627bae5e5a03fa933e05bf0702aa2f27f8c47cfafe140ba93ddb2a65cc8be1759ae4ee1a9a4af9f3a5fcd006d6d898b2d122d28f5d8a86716d59c28408e142d4c87599e3132e5a66d9ba47ae077ee04b9b1ef267962d1f59681937cc153588d41bde36d007d6337b121ae8e3ecdcc63def9a2b4f963812070747e2c4147dda827bf2d443d2a3fc9638f7b78b76a7a16c4cb8dc4bbd5d463d3c214997778247efc9ef0493249d12d449f9b7ce1cde76d1239167b3b99452b65a5e6528f4dec95028cb9687a0bff497dbcbede57c4a25a8db211937255cfa5be2e0c825bea333d3914ce2c604ba844bdf65aec471bc28a3f48e78483d8fbb6c8eb82a6a9741ccb13d9dd9dfe9e69b7f9f9654d6f74039b9151058e3dbadb36e73d65ae3dbc6fddee6ac753ab55fdfa6803de6d79a658b0381359ef79099a98d8dab96e0e4b0aecb55d2c68ff8cba502f6d89ecb5be6be85a516608dbb8bbe1f71958dd442b64a5beec2f3637e10e9f887fccd823de46ff209f9764a1c68bac596bbf81cf1d5274747b9a4952e1047d3cfc35bb631453f4a39e3939bb346d9cc74beac00159ea870e7878ee3856ecc712b955be4dc2d47fdc84d2f866eadf6bb3467ba8b51abad5703b142d369a9bb4f01e56d1b3ace90aad0c349721577f28f1fc61cdfc64400d7092188983a74d51452efa8b3c3a9e5f53c056b38d0a77f644c7d66b2d0fe31f5c9bbfbef470776ff759dd77599763fb8f72ecf38c7cdb9add0fe539f3c9ca64b8a76231293c41c2ad8b527ef141e4e9c2996c49d99848a2aa64880af220d92a842f9f83216a512620e0f42d471b2115ffa20aa4e3ebeec41d4f131bee422aa481f5fea20ea8089f1e50da2caf4f1e51139e34b235115faf8d215552216441d3568fc962e484154dd13441d33520b1d5f9220aa40af03872ca2e30f1122750891430f3a7e100e4415f8f181441d4484f12d1055dec7df51c70e99094020ea4822263e036202e49cf105304554d98f1f45d4e184bc3165c47f22aa36986722ea8042de982fbfe3173a3e125187009488d2081d9f08a943c63f22aaba4fc11f5f0857e58f2b1f3ffebb9c6c9c96c0481d54c81b531ca086d4218dc81b53a6be068dbca7e3903ae4911c44ec40e108b34c0c134138200079d303194b60f2f697cc440931253f637984488420c450a644810a3b8b2b6029613125a37e2c5f1125df05dfc856444994644594fc151c638a8a4a0662854ef908f6b83a25ef212c5309e584b4848a034cb124ee0cd943167a00411e8434f9001e3c70870ed88103b50dd4010b3a68600e41c6c8801cae880310385841c3c01b2ee0060bb4a10a317eb061afa1026aa06287026998001a24708608840101333ca00c0e2043036646e68f44a10b721dc9c12b894b13e10803a8300697054c410c2d0a90421858128003c609015100c3ca01a0f00515037ce185942994e8980af0842e9408e0042ea00ca0095b3811808c0929004cd0c2488a256441148512b010822249cef591842b800080042b7c9e3842154027624bbe268c40058f89224cc1d3830852e896408263790c210a9c124280c25613842f92884a90884fa0994ed0b1093ba26cfe07fc3c8fb4915ab4a0256d8e38c208238a2882082274e8c891638821841062b552a9820802070e2080f8e1071f7c9899b971c3868d54aa460d1a3466cc40a1c25046262646860c1818ed2ff4457bce3e883930d6fed28b98e3634afefc26e8278ca18110c3f916df704aa4126411f47c0e2041cb21681124d193087aba50c1c5a5650a2d2d2c52606139e19c4e2b5158595181828a4aca17292926252653e909a5128a1350504e9a70724292914823268c46a22588442125844237c9bda02480401f247c3ee01140f08b7d9f6704cff314c1e3e988d0751689b5dc10386e13c2b6d520e84a2910628e393da6a40fe48dab649298c33f596c434cf38618e69cd37ed3d239e93769b694524ae79cdb9c734e8bb797f43f1a5ed0b7f37b3be9a4f6a32fad9dd4e6956fce69adddb639ad9d1f70524a29a51f95bf75787efe62f041f87bbb4d39ed476b9f9b93b379e53f0779ccfff1e52de5ac55212727b939e7739393734aeeede4640989875a535c9bb512ccc33ddc3d6b73ca294191083c2f4617233b9c929b2d9428f1284c8f0a92cc14c038e92ff0e67b53d2d04c61a1ad2a2bf2bd97324da58cc7efc51a77be0c95c752de949760cde967a83c7d1a31a48f7f9bf4e8ead1c7381a3dcb4b1d92266fd0c7df9a3979496bae2a2c3fe92b6caeb8a72f695287cad3cf799b70deb7e53f47544bd8f21b6ef915dcd2f231de6879ae25e5c344157ef9618da85279f9f247d823b1bc0a66f9a8250bcb7fde7685c4428b39a2a62f537059be05c4f22d5fe3b263bebe096fd3cbf754545eb2bc178a898979199498184f8c8c4845e5aae4cdf2f5e55b5a409f96bcd204cbbffc0b8b55e2aafc143f7dbbe4e4b99611d954e213476a16dc82a9e8c3bf3f893fbf7caf8431962309f270edf2e95a1f44fa57e18eb8cae5e9732f57b53c7d6e0b57b17c8cf908f28879895fde7b79575999f5053f8ec9bedafee5e37b2d2deff22fef99c09a971c6fcb4b4b0bcb4b16188c65bc67fc40401ae718531fd0c77c19190ba9613208fa50799cb1903ae72d7fe5774c59c3a25f58f28ffaa0ffb1f241e4cb177d15e5673c319e493ca428bf238e7cac8265130fe9af60677948df053b11ec36d8b5f0300577e55342a2df152675e94131e8fb7be670ad98a2af823916c414fd6a87bb92537e732d5072adb90a278a5ecf6faee53d2703f92ed9729511ce1573c426e64b1316b284a3aefb4fb8d6368dc21c49bbc23528fce46dc1fc654f7676cb2d59d0213e4b5228c5ec0e8f309e8409589d1212c85c083a7ec4a18455a5579f4ec1f0843d18d95e4a29a58c52ce78188588537ab21ab9f3a99e72ca29e7cf4a2b9d31f0e8ebff196594335908d14184b86a484dccef40f0aa0beec7eb6d2a6ebad45b9400903a821cf73b7ca31ff79bd41ce79c7b13ace138b9d55a733572e9d36d6e5273d537247811a6c835e12ee84b8a71384acefccd28b936d06ead8c38464bc570f78c1eb430e31306586ae136ae85abc0055ec4994fb80311398676ed4fb043134db34861698ad2755272282e3e69bff7701e4ffd3eebe13c1e0ff775f909fb1fe879b0eb68f674f73dcfb96487ba715507d6749c0be5d9ea778fdaa2ab24141752c736fa4efe239dd4efcb9bfdefbf0f9f907ecb39f6eb3721bffbdca0b8d89e7b4fd7752f3d5f1fb505ea66a36eb4e7ef7b401e282f7307faf070f5513c9cc783c2bdad794bcee3f17028dc046b406badb5db97515c7058fe8e7982414fc29f1f61ee6fe81d8bdefb7c7407a91e8fe7c7953544d3f4f7e746d3935888d675d9a3fafe0e42bb3c73f4cddd7f2f65d775ffe5ddc9f78451032f8f108b39b8af92b639cbc74dcd793c7fff7e4a8b8cc918f5c291247157a2ede785f83c95cfc5f573b5e37aac77b5fa204d83644c2671cd1d33ef6b6b97eb7bdeac7059f5fd4808f4b91e3da41f8efa447eff81a604413f3dfc8138ea13ecfaab6fd5b7ea5b7d0b7a8e3175dde54796dc988c7d5f75648ec7ac3889287ff28e7754824b27275f32854229efb1a1100ae883fb1453de27dffd09e863f4219bf7c9df525e6922f4288f32fa50fed19d60d0932a16fd084391c40e57ddaf5bf5cfbb8c5cae1feaff39ca338348cde5c9f21f6850e753df89b52b82d86d47cf39bdf7ed33391c777c67da1d7da2b76f20d0e70385eb6bd8913ad8104f74adf55d0e7afb3d91e84a045d6d7dcf3e08fae07e7e8ff99c17fabc389a717e26ddb6a823a9cfcffc4a9be91d0fc5a8c2a53f652ba62bc5dc6fd6721bddece645d9e681ff793c7953f0f33cd0f3f0e7f97c3c4f175db7b3a3ebcbf7262de69870d095eeb8ca4e31ea4f5a7dba6d3bb5563a3f42a069ea329328d5f1f206fd5d75ac1cc8a11ae4f1ba3e077264aed16a5b761dc38d8ba86d7bba51d6f61b0c9534aff5a574bcbd9432524b2f35d14a9363c068fab1465f8e11853bbffe96344a25a571385e84a99885543d27cfaedffd2914f20ce4f4f53dbf637a66fd22331335dfcec8d9ad790bd11b0a5d27142a24527d14cf8f3c396a51cc19e5222a7236572a79aeacbc69a256bee53deeff37b0463e0b06526badd99337d59e48f412f4017aef774cfcdf82572a086feeff3dbca9fe7c4fa7d3cb3de82eefee1dece1f1e42e4aef6017364f53ca59c49c930782ced547b1254fde569456a34ff9968fbe72f927a9fcca475fa1fca9fe89fdbcaf0b4b4b66f91493e8eb8f86c056f2be2a37f48eaa5fc250684f1675e0c74f27cf3b58fa0fb8e2a793fb8ee9c12bb98b523641a9f4255c44b2262afa70bff45bb68a5851fa2b3729dc2d6772265f1335a784a57ce94baf5204e5a5f291a688e951547291d2cf37e118e5ce5c95bc9f28de9b26cafb2f4614298ff010181442acd8a16b063fea0eccf5bb6ad21fabb3747ca1596c971b256146882082d842ee44490ef80e223102119f044f13a30f7b889e5f048af8f43fce157d79f5ccdb0a3dff8514a1b1be9ba04453c4662145ee44f953ce0abde3cf27ae9e7a3ecd5908a15fa40132fb607e9cc56fe6e84e691ebca8e97346a2a66fbf8803116d7fa3d3347305d535e3c0c39d9973ce39c4fca22aaab64ae9e4a80ffaf6377be9a661b4cc3fb6b7db3f05528150dac3e98f2052d31c675b0842305d55a4c95126898aaadd2ef7b15fe7796c7833be0df44f0d50ea8a425674471fd277e2a174251b261a2933546aac6c2767e15cbeff48f0343eb0f19b08dfb17f434fd5406d9210dc4aee4c5465a9667c7ccf06e66880725468c0bc7ca80fbfc67b31604d8d1c2faa068a06467d8d70a652a914e953a9542a25fa54ea899413a92652f6532926523d524ba4eea7523c524aa46a529f4fa592482191a2497d9f4ae9d48ed41129ef5329235245a48848759f4ae948e5480d91b2f1a99410a9554a95a2f1a91410291ca92052333e959a49f990fa2155e353a91ba998144c2a956a497d2aa752a7944aca944a719f4aa55052a9d4cb006b524f38d104133d96e0a1444d1248d0e81d47185104113a720c21c44a15040e207ef061e6460c4cfe96938a094592582c22239108bb26896c7ec93259e85eecdade4f8b4b0b8bf57dd8f5e7e3a9aca8809d6befb3815242e96c673bdbb168b8b6e199211a89ba1aae6758ee03bf8ddbe8ec3cdfb907f3c9db4386a6df0cecda7117a00d2c77ea833490068eb1411a48dba870bd9917860dec5f038350a01c1018f559acf9292c03d64c3dc369fcf6c5edc2f3dd5f416760aae9cb575f6ba2eadb1b6fc1bed691d9c42d91ab459d3f6b53c7570e803d77b4133f994c24bef23d9330d163fe84b98ae42b5f82c7eff952e2f7d4c255a29fef62f86ad6fcf63192f8ed4d3412bf27113dedaf268dfeed3a3bde95f816be9a47fc762f8cf8ed487411bf3d899eef2f67f96a12f1db6db48edfdecaf14d1c0c5fd1217ecb308458fd966378bfa23882f82d7154485c65e3e74b235e5d1ed15b6e01c46fe9859e337ebe15bea2b32959ab9a7f4726dff25b083d435fd5d744d51a3f7f9ff424a17e7f35f5f365c09ae9afb9f22c00f2b6f789bcaf13799bb4276b42c684ac87cfe6ca7b2de1331e3e53c267acb9f2cc6af2b649b09060e9eab13479dbabf3be3bf236d59fb2b9ea3aca9a2b6b8fc8db5e23f2be45649925226f7b75e47d73643b44de5608d6aa3e7dcd957d717436579c2a6f53102f1cf96502226fd3fd21efeb83cccee46def8dbc6f98b7a96eb3d75c6daf2a9bab6a8ac9db7461f2be1bcbf4799b6e4bdef7f4b2a8bcedbdb2aff5b5625458ac8f88ab505f6d28c3142313f33bdc845dabcc66331418193032994ca6ebbf90f24b768df2f25edecb7be9fa59f4f87f877b6673e5791ecfe3793ccff3b06d7169712dc2ae3dafb9f2783c1e8fc7e3f1783c7f4f2cdd6cae3cd6b266330fcbc3f2b03c2c5ddfe5a3b2a2e2fa62d7dd6baebaaeebbaaeebbaae6bf94c29a6dfe17636575d673bdbd9aeeb3a160fa5e461d71f766d5f7365adb5d65a6bad3dd9209d907e8773b3b9b22c1637637133cbe26696655996557f6586683403bbb6815d73afb9e264b2978c7bc9b8974c2693e9fa2a37747f876fb3b9e258ac196b36e3581c8b63712c5d3fc53fa08feb0dbbde5e73b5c964db4bb6bd5e32994ca6eb9b6a7c2bf067d3da7beb8c65413939205a0954426a500a839850e1d2df5feb6b7d4668d3da7b53d8750dec9a9be9fa343c998fbaca71cc31dfdfdd3d4ed2e95cfdccc051a3c2fa32f5635eb217ba3ede425717dca285ae2b5805d74f1943d72fd54709a33e692452122242e3b0dbda2c5370e7fb1574c62741cff1cee82ee6989947d4402a4803e56c188485f93504d3f165884c7591acd6551902d3a18fba7b20de6f213a14faee4357fd788f84c310e9f3dd8704c4fb1d7a5246f91d338482817cef6d53b85b26d15246ca40a446f91d4ec2d1430f2594b1989a0a7089a851728c35762803f17e838fc5d454a07cf7c1dea37cf7218c8277e8c197204afe502d936020a347c1a2d19f885044effd08054534472fc228135482e54f5b8816bd2d7dcbbb7ce9bd16bcab6ec1a2ff0468d1e71dbef22ed8a4577e879770cabb60956f61c97b084c8b8094de3b5561054b1b0ffd555a46b68c12de584c4d85e84f7e8481887e0fd1a2138cf224d28f488ff2de8b44a29c8110ca777fdf432f41d1a3e0d1ef989f3fc1e00803f1c017854239031794b148d1df7f728ce10633902f776102fa45ba1c25ce4451ec1e7dd89208dabf8810611159c48444bb14ae094a344584149962092a76b8e7004d91f9f565ce5c71b9c896a9c7f7222959d421727a463a8fcec9833ac5309ac39e0d536e7a62defef2edc7f8f33becef1f7f3ec18b30bbb2f4064664b285dbcaf43bca3ce12c7952ce492df7ddd6954a6f3bfbd38730aca77e1799f03c177aeb1ecf5392f71bd9fc45574ded9ef85ecbc772d4f6fbd3f16f70bc6ab8605a7adb7e93642077227a7b96bf323e79b79701f690a18378187aa92a3d17f37dae4dd8075ccd66ca991b010d01e8f32fd324fdf462dad28d0f7c9b37fe79ceabd8120c069b4d7c8ee1530cbded19c60c83c471d4f6ee7a4f304226bfc4a424894f24fe9b62b087e7fd657c77ae244ce2d460b7566b1e0e0e0d51992d6123dcf648f4f69e177afb7aa798fea63771d65794d5036d6fa8bdf8e37a03e9dc1c8af36d1fe3a647b0b7c4fdee5ebe3cdcb6ff1b0fb7f070634df03713e945608d7be117e2a83b6a85c4a12a292e9d28d47d44dc92c4c15123afe89e3773366fa20ce644fa282bbc5cceeeeeeeeeeeee47605aba4e6a8ebaee063fe6eeafa0ac0f68643fa0cf5c4d31e9bd29bffd141267ae5272ca6f938a28abe43835072a015b4299e8ed4f360a86de5e44f1f5e07c3896a6739e73da94e5397953d6a644be5e5b0d18120e7de34b4cd4f6273f6fa617aea22c2b96982b4ac451db6fa1bc4db9947128c759d697374d42ca9bcaec4916654fc8f378efbd8b6c297111c65a6badb5d65a6b8fa0803556823e3ed27ffea795ef87289469fef1f160f0391007111c779b78b83de84d7874552c580344eec1721eebd6dd29ebc3dc9b70a4a9d776b3f4254fe9818074e9b91b476df65ed39c14a6379a5a017b747997be7bfb2aa00febc9d3bbff02ac62a8f40b180c8b1c32342302000040019315000038140a8783c2c15096c6a1b4f614800d81b25e744e1987519ea314420818431000000000100000806103a2e0fa8a10524bd26673853bacf04249ab61410a40460811e138b6c23eeba1bb571f8c83d13f0434d930d6c54d940b1fdfdc0335a0ab2c57fc6b4ba5a43947ee0b3eda931c8a8ce7a9f480847916cced9663ef586be8930ca3ed6755fd735526e5796a3e9550e3f2913b3ffc485bf79da1bc1eb08aaa7dcd1e415f07974601cbb8de58a558b0784c14bfee9c993b1209ec168d996f9771685717139a1e176ab6ee75b97a3f24f90b2b5189fa6bf7c1ed02f2ba7bd5be8faa3041140a38550cbd0655c0a6b76489156880fe74e27182577446449073b6b2774c31b99b5a82f28902ec5338771da4cd24cb2be0be51a651b4820b324d1447b53f3074dabf1d6ab7f7b867704f04174fb17a5f1e14482321e1c8b36d26ace898d528576fb06b9c7686e806c421eeb45a5dec7f96e23f5ff71a180aa8fa21714a5b2b29e63b3e9c9af6d960674aac4c949238a34be1828d1bb80b2594e99b90500c09a28b3fbf7492c602f0b3727566fa434e22fa293980e463facc22f4727621549de60981adee6dad03a335bbdbbf097cff3b0769dd4097c6f0688abb32196e74a728d9972c6605d1e4e551b7bb3a89684e65c415df02cdb956815c36f351d6a2fb730ce87611cf10e9bd16c4d51a54def0ee8cbd4824c5d990834b37060091bb85e39a4376fc7519ae483bb3007e6c16864492852ceec0bce3b221221a49854174921e5a539ad9e56e50999091694c37940e2abd712f0918d859f41a89c36a2e83b8f23280df63caedc04e51fff12ba60e45e3b198f5b805c9f33d83991ff91261d4f038ad65b090a5568a523021604ef366817174a8225b1495a7b304b47a386cf6fff510117cceb0f8c307fadbee00ceaf1ef8833d339675e61c94af2f1c11695563cf035d52fe29e2ad831fcc452d840cca647d08e7600f97b4235fe3bb5c813153e67121654e6e82e084074f49c12245f389d334ef9c3c811586dad2c4025613072f289d23d877d46035b1acb83feca4775d6f35d395a39a0506282280fcbf064cc755dd8fa7d70f032b4d63d450f16abd1c297e323f941560eb5f8229f5dcfcab58c5fff21024bfba60e721b2c1ba3265c94398005a397a0803966c422ab7550acd66b6aec387ff23d7a22dc406138493955c08cd96589ce577741a5d3fc7a020c51a55d16d0a943ac6d9d5bb00e8ad4e511eadace2c989f7aeee65ab34888fc26b1756fabaa14e1c20eab30f87c26f96f561fff1dfc1df0139449c74c18a2f9790431e5f195e0f152df3ea2a6823878e6cb51ea7b827761714492d1126e30c56d357053fda60db500371ee8975cc8a89f50af8793be40c9d8ef8a2503ba1138ef2b43eda130951487e5d1293f2a600ee23b7de8788c99d3fad5c00ce2be3a00252a333edcab3d5c9271766435ce4342765277d2d1becd4c2c2387fe1bf087c2fa2abc738530a344244e787f4f2bffa7d65aedad89e72294fb04f59bf1e6aa23e5b7b733eb6e121ce42f42b2ff8153a8a640691b9474bf27eae12c1432849862102c1a06d9ba2a403bc6c6913797c3150647703585e3369bf85326b93382b527cb8ec23dbaa02c1a8fbc2a565f79b621d6c167146c2b68e880e52c6bbd7f5b9742744ae2c1ca7fbda328d94178d53dce82a6c15efbc3fbeffcb566e4ac1ca2749764ad3ba29b25ee2b807b5e4dead6479bf832c6b19c04cbf70fba42ec7e1c4343f8d56281d5566b80112a8891766242e3f034b67213881a6808f8d7309a4b269a347eaa60c078bb99253f8896a1f26690458145e9839bb75a021d24f78e52890abc23c02a7eee1a7f3ae05875f2666c5a0ddb871a9cbe942d6a50856517a1e25bfa08ee1ce2eae34ece4223b08bf10219cc22386a63bb28337bd96834845a206beef4496809898287075e1053f9a5bcd4cdc1b33e2ab638e6e15ee96ac38ad2151ac5da5934fe49fc44936bad2209538a407b65d25421343297ed250567b7db2e93072c8200cfd0f58a3ff5ecd1fad0850a3708c9272ce3fe997afc3e75cdedc2ee2e861533fca216503852056bee39f0859396228a74709e0b6042795f86beaa15ed150058b2fd22c18153cdcae9430de3ffb58e44da787bb4b597c458a5a48efc498580a972b9f2f1ae28beae433cbcd68f5a416682190b91a77c2e5fa0ed221a1952b76970eb93947489c4d72e061262c3bf82221eac1a3e83e3cd247d0965d83a2114f54aa109254ba431687f46065970f51641dba73bc06e72ac8860727d0a8ffcace31971619a46d1e053b318081c7ddb379732fb96094e1deb63b099fb2b8b65cd9268b61fde8bab34cdbcfe41c97d0f685ab62af34c7d98dc84bf6b7959c6fe196c77201d8ee2b825d62dc85db388c1ec17be19f6a1ea175cfd069aa378fb6ffe875e16235bb8176c280fdccdb5cd7ef85048b3d25b8fb69d602bbe2b7a9a22c8abd59208ce6d68561846d7aee2c2d8cf8b2a20dd2f28d9dd9703c8b7e2efd725235f32d28a0e5c77f9c3c606011836a6e46e915210d395d3d0c76797bff570290800d0e56a45b3bca349f35ada1dbdf2d988336f08f66f9d9d8da9c0e3542270a76e7299c833a15cd19cd2cbf5e77d675aaf7307d7d93f63632f812160bb47844e455bdd1bc5e873e537113e40fe149881aa882fd9c6257ea49a448c33d0c900851c808e2f2165270ef41d94028957c11c8fe513854010028f5ea1465082b5a68189ce001d688283423236ccb96cdcd1f67f6dc7cd07dbb251e64b852ec1b79cef4038ae13c20aaf0a833bcc480934fc9c146d6d70f247a7ee7d4f30fa56f9de2bc1cbeafc1f18c2fa5b8d13786c6a1dd463c6e03c4e9f490c2625c803c6084fedba88b242f1b7b8f906b4f99cb46c61a865bb9ea774cbcdea338ba971bdca0c034f9558e5df4261c3a35043f422e40a98ad0189cb9dce076cf0b2e4b1ac216672d5676307f9c18fe7bc39006cab4bf7774ba33382b2e04423488d3172eab62044c38463f25120c0dd0821f243f34ce0e3d44318ecd3ec97ece2b33124b68714371ec10cdeac32ada569d5785d6f3499d57fcc0c0725acf891058c04c48a0c3b365c85e852a09809e2b5edc95749844963800508762bf48413b37c271ec95469bb682480e22b8cfa12093fd7e01c68f32048daba2c40db42a0e20f45fe4187f107bfe7d1137f0ed4d0fbd1a1431bb3637401ebbffaaea7022012bbbefeaea0d3f87d3782f17de0a7d9180d92bb88ea0ecbdc0a405779fb2ea8f20fd2203949fd8cb8a3c7dfd206eb18ad58c97cc36c74b321bb125f98668896c43bc24bf115d9a6f8a97c837474b731bd125f9a678897c33be34bb115b9a6f8c96ce3722978472be41cc47e276e042b3660ad94a2cc59a1f15fb93f67612d20b5b79df752b74e410e7d17ab9347d53d1fb162f688f7bf1a17fdb4145d28a77c47642a491141f019d08c7aa7e520152a5172ea43aec5eb9a99531e4cd1df716f0332427d71a22293dab37a21d65bcb65eab57d1fb3fbe19b65bf11acf6f5350aab1084f39880dd4a8c90aa7b1859d292f50c913e45ab48078251bccb30a760427a3464ad855b2c31ca35147f6327554801c2d5ccc590af184a7574324c429c2d88cd5b14b784a15c0b24aaa464077b47059a75517a862cbb6e2e7467595a0b717f50d9006dda344f453bf92d1737d4b47df7a2f897ed75f327af4dda5a2bb343a9744e792e8d1ef978cfe92d15d3afaa5465fdfb934fa97447fa942377a1bbac0d65fd960977eba6c6daebc93eadcfd496e0e1e29f6acbb11738834fb2ebe92dcf1ddca3332b5b3e3062ef7acbf01738964f32eee6e5e72ebde56c04c8f75b5f6e1a7ea14f6c14f9fb5a17096dd99b96125f7b614c6072f604492742cfac267edcad292fbd6583e3cb2cf129414c1d754e0a4af8bf29eb8c3616f1c2954bfee1e9d097f013ef862ea29323d965e614c7731bbcd4aee5b2b840fbe3876ff988ea51b448c1e96bd4aba1bb35b5a72dfb4c2ffefe1db129bb5dbea840c4d85bc76dd56367d1cf52e331760ddea065206dc3237b69bd3cdbb504c268ec2423383d03b2b02afeaeadae1beab1b9c035463500b250b25d0f8c8985c460e5c7bb3db2a23787a96a6da3ab611fa7567ec539f1408b4d530b06136b605f76e52f8e2f829819c8170d18dd6b3f95b5fe63f2f04ac7c335721d1e3c5c0638d4eb6dccc40f9c68ca38a3d84be5c08b0bbc8de9a5e9c856206561590f60e988e0944274d55b2ba09bc9b5b0c05f884e2957f994e537a47d88bf41b1353652bdf7ec7dea7fd948dd31cd6ef8511552136e17843fece444fe67cb7b43388da004f5fe271aa558f7bb4cf20002fd4707c7d4256bdc6fede674460a783e73cf25c0d6619ece58b00f32a2bb0ff4194b93e11b146d9c065a00564cc7f3bc7f27de04f6058b3be6533352d0a5f20df4f93911f6b1a65bc182296997349ef833ca571752fa04d8533de4e58df9be7deeecf7520202ec0ebc770819f15f93dbe774edc791fa358f825c67f1a4f60a9450cf2a27869f023d664681e673f2227073fcb09262a6c56df86dc96ecf2dc9938dc190560656b6556e2fbba43701417239950bf91e20860609b7d6ebda7ab42ead03b13ca4d1af4a600b00ed0c137829989ac6648ab7b0d44a32815d8af420bfd0d5807d2034d0d2694f978d80d5118e350d29aff712d66f17f2e1a912ef805097579bdddcda039acfba6b668d30a0956391b7efefb86c92d38fa75fd49c0b7e644e056f7cd082107093adab75f2dac3f6ba09aef7742fb0f16c9abeb9732a78683d5b103d8570f5e2c1b93ec56c71d30f04e596a4b94e41797233d683f808f26f01e93f6112574bccab955f7f9fe4a3b1205a6bac4d1ef024c4b6034676dcd9cfa161198efbef7acd3cb62ca056cc98208d6ed9298452fd8d2c3120129292ee2e7a53d1be09892301b673b4af0d0bcec73800f35b8f850d7f7f25957b9a65894483d56df9a5c3b5b19c02a993466d3f6f74d24a01197f6f027946995e8a821eba41226c70d7e28c997a68cbbca0a9cfbb1805eee47a07def05a2b81b084d4e8fd877f90c8645a90103cee421fc63608d1e7aa30c20af963aff6eed7eb364cfd4e84a3263c106243acdb8767119cbfc50332b6696344ec1da2e1e5164cf924db79a31e6959df83ba5a2b13bceba53d2a442dd516357cad48675818cdc9defc010383956bba5cc05dbafa6af9cf92efb02da77dfd568f9933d9d23697876516e0f755540be1a44fc27d10a9fc83f53b15dbb716de9a28802b51b8a4950fbd5f4ca33ef662f607b778077b7a6cd85fbabc6af9ce92dfb029b77df12c5f152afa10a8595a7c6ae90991deb8219b9abc67730e98e9e0032701ef583730a2bff04aed4132b290ea1e308b376f7d69e9f31fb18b539b029a10e544f8c54fbca99e09931d75ebb649c4349d52f7886f9080fea47efa4f8b56ae5ca9ef89fa7d2dcdd39685aa97daa6bf8fc58aa88bf6808ba15641a3ba7fade1ce5fd1e1d2514e1951301914639acde556e14dbedb8f0063a7afd18b383c1dc93d8e99eb4947b59403a6ab0dfc31274335c6828f707c6c7a2a8de9c7674cd75cc25c15049eac0e81d9f189ab5a9eb8ace03e30c1e64b00071d0375edc39d644a24aa806b04c1b5f258362a862f03e95c3ac26d9ba293b19bf3fb86d93e07938a1a99e4a93e5584ddcc66d19be70171257e7027bef492ebd3e2badbd55abdbab36e4470c830f2ec970b2a60042ca576db313ab4dcb5c6dc7a7825438f26289adf1a8892b126f4156199757caeebf182e609333c2c92a7d07be4eafb3e00b4c18534a73a86417bfe9d28a39822a60a72fcfc5d22a61a75482cf167f2232a8c2a4ce32886be643e0767f63aea3131e5badd566a988bb98f760468322c4ac881181970f6cc616fe31375be2e06ac32fac5ffcc07e3ff6957861f06679231c6f08a84c8c7c5f89dfbf4237e75cba1483f5c7a007473e873c269ab1904ab83da223d289e8f9325d0b95a612354cd27b9532e2cdb0558adc4c85fa496d86874ad4ed8ff2a0b056d5e884de05847e5450764e48466e3fe7e42d54e91093b6b1c5423a6fbe0c93a454db794a8ad02571dc35d14b5df9e87b1a99151b4234e91549b5a7141557fb0877ba4664256b213328ff9ec2bb6087b4e5e45486214092522442322b622b591ac95109edcad62ad35640d5b2b24a746b2f5ad696550233d1750e95bf5ab0ab48117f7a5b1155ec58505da9af0973fdf40e5cd830ac55f4ea5b94c54298ef0caeeb17b10690037d5b5088e22424c81436d183600319547a98f3e4ce17d8f7c793bc14521f22512e5f687f0e46e1a532121b6a52db348062f02edaa978fc5589f8be77c53990a473ff6c5fdc656bc9e492da2363c33650c288f123232cb655168310254785f63ea2f191c3c0db5ed4139351e9fbbb114488f7b15d5e48709af9dbf03efe242ca0b439e3eb2446c5624265de7dec6139c80b1cac13b5f14800bbc7a76a2748c744b0530173e721ebaf91723251768fe012c7ef7cb6f8a0ba62703e03c1adc033d1b775827bc51a2fc0f7f05e4fac39cc9fabfba826573cb762d97ae85f7df73eff621f1fd3783e879278a3ed98774197c5383567036533c822d0f9a9308b4ba4d10be634b59da1eb52b833d2403c3094b4cdd6f1aa326122f14afdd57badeeb9fe0975be078db79d819c30c37645558cb76859ef3f3e0882d679a0708ce431506cc58b3316872b6a5800cc9341b2efdbfa8389bdf16c21f2dce32ccf3865cfcd5b33022191205d0bc2e086089df3048041af94485c5c27e3b07137728432db06048394c849770f540f10bda2b5938b98d64a985142765fb1ae13d547346b10772628fdc58885ce6ff2c93010cb89489c5a9c32a992cb9040efb14caf10938a7ace7da9889806f60637ba75c1b7789c3be94de0e52355444c3dc898b9ba3f091445f24bfdeea029d78a16807b19a25af683b0dbc329963d916072918e5789a22601357e06b7e1e18ce771a4ece15399b1c5d93d6d0777e54a8d659f52fdb831d1b5caa619f39c86d80e9a7e15936188c3a1d0ff965a9efb12c8f20210e6fb800f93d96ca34b9a2123754eababd183609b632809c14eef1c90f1a6cd795ccd9308d73ecb451231767b75d1a59358192d2988f7aa53f98837913ef72b74f0dce8fda528698e854081056cc310cccf9065736f3de06f0eb626a5e5b827792f761504a9c848964e58c95cb44034f667414bc9c27c54bacdd8ad306f9e0b8ad857c66500f657df6e57e78e29ba2d91504b256317b197cb8aa1cdaf40a31c58ff79bb96025b72b90b086b0b580f5eb8bca7fb281a6aef70f89a9435fc3af4201032c5ab0c65a29bc05bfa81921b1280117a0f416652da7d0dd6061cb85a8108e77261bc1123c1ad415d2d6df2ea5c8be26699966e0eb4e3032cd16cc75afa29e0e2e8a49c68b0bdf9441aea57a7b7b0ae0c1b5591fadbe1e5fad0ecc71260730cbdef2bd8104fde08802f294f1b545c51cf504eacaab976651d2d15b90f6b3ba53e14a41e50b529d4e9b7daf9b2644506cd00247cd3bc85c37a2385103c48f71dcdbb896d5200acba19db86ef74d8f0f618087129c8c9107b0be505aa76cca8409f3dffe1ab655911da9ad2ad504ec1681856e81af91516955c9ca7e808f5f95c66ea6283953943283241ceab24c20a8c9a4aa4e25ca3c3ec09b6f8b982470c99325cf6ac8d4c72fd95741d0049a00f9844fe4075f4254e4a42743a211b53c9ffee3766b4b76689bd9991c24e51e97856ab5813b7e42e2a92095ed60bba627d21635bca9ee9503f27465f3d500fcc531b34fe32fcee2449f6d112ff52a9ec06068ec1f43c372208c17497d5f13ecf4cca382a90cfdbf76d8576948e8fd54fb85b081b248a4339c03914f899fa0577645242b61255b4165d0816a376b08162d839cd725689c08fd11bb276fd51764d0fcb4b0104505d4073c7974821543531c062966accacec2cbc52df935f879a60c3a986341cc96fbb18b4e48192e757a7b2f32a0701382fc905b57c58649f18eeed82e238b1dc3270270f706058b0f4fdae31e07cc9ebc642ea4dd4438f7449646d8d7c26b429c14e2ca422ef7454a0631f3594ea8c2a43f912a7067972f111d25fe0d0468239fec705c36df30666fa7253b7a73ee5f2d261f95ee4015d1bef544f002b28c30b244923a779f1456dc54218fb2307e1ef54dc01ebfbca14c02971b9ea2d5c69ebca074f0c41a5e3e33f7bc243fa294f6c4770e258d3da23ad021c998021764e697c75945d4202a5a5bb20adff40db76dd7f5866bd333be202a7ff79cf6a1c75448f1a8e6816fcf2c5638eaa818a27f7aca18c7d8276bd50567a181a42056febf1c2dd4c0322b9aef7c30a4fb13ea0253480ee361e1e239c2a14a3ae43373dba8244c1b46bf55767d7708febd5924eb4a249b80a464126075907d39c83093eb51388d7b19f79206d6f4ecd9d3ba0ae2637dd68346bca277c8e1f5f6feec6be7a7dc09876cd2a9d07e0c388ea3597a7a520c333d56b01b2a60636d05e8e70347f5697e20a2dc6a56eef40a1f56d7b1d9622678f7d3b0b0fd046719e00f838a856f7347cb6199ca5e00fc6a0b0c63f358c30a6ef01c65d31944c291f3e04e3d9de58ff25a49249e3571933e2c2de0aed685e4f4f83d5a469d98925b6961ed83867d87ee78c7ef1703e181e83fd0c4c87a6f6e073f72c317b7af7382fa743f7d40425606cc0cdffa98c4f698aa1894c2443a35e4c804a4d28afe6f84280d424a6ee21959d73cacc0c14c766e6e8394562bc485b20279cd20ae41774da5e17c5553d234a98f26df39911e3d4c3f62e313c2d463147fd6962f787ba1751772574f59c085c6d5814e39396ea471679a0bd30e2130360ae83f7cc8366a8937ec7cf2781b4038fbe1ca8ef93200618471f048a505e4b0666ada598027673c074a2a2cd69e1f09b9192a23e570ff74909b53c2c1ed454036150a05703559e1e24255589d6ce3c0e53d1c7f3b867c0706cf58109b0c364e0ca072d3dc1e2ddb152a74ba46d6d411a1ea3719a85352de10434c1e357e0afc11a721d7f09994f8a2beb46fd2139cbe72ca4b5e5b3a407008a4ce0131621bc375aec50300edc9b56972479146cde82c4821d0a249696e82764b651d91b65cf3bfe9d0f75a8b6ac791da42a2f727985758d3c82f23db2978360c7b29bcb30a709a348538552b8c984fed3184a89809158575ee5a8f0a0c52b67c3060dda800694fc0e97acb6dc7b82bc6c5fa93f4703b8b278bd7244031002136c751fb41216a2d90c248338c593fd244f0fef11ba8fbce10e040fb4d81ea2ff450305caa65e30406dab8592045a9b361423d8f1d341df55fbcc4878ba34de0b85772efa6acb02d1466245c93cb7fee771f730ff7f083ca904b01782bcbaccc48d691d3cd99db82e749be1925c69de624c654ec35f36eba8e125477f8a397576e1fee6012a4dde4db06e62fa40f5ca092ce084402c44c39f941bd01f345f84bfdb0699140230d694c4c718a4547802570b83e66f2e45013b31d19ef698d5ffb6294aea6307b1508f59882710c27f509a0f325ffa16c09a0e8e7b9687f8ac1406a96e1e11b2e50fd6d229975a24f879bead214c8271b658e983a76dbd0e845cd7c3b3e98770f2716eeedecac1c83c61dc531065fee538f4b7097de38128300c5a781b5b645981098f56c148aaeb3d0a903898a989e51722177a1ea9d321b9cda0b4c9c801fb639c444f68406afb5318ed3eef3647cd1817421ab56aa97583654e619fdea33207d5e85f26708ae23bd2dd80c526ec401c55be172f125e2ba133883ffb9b75d0941fe3102dc8f2a5b76a364f41772c3c5c0c6d21cb1046def3a44d9850b7a54027e0cf459764a6d34ba5352638d58879d5463b13ff623026cd157f5072b536ad410ecd22a378318c8d128a4b56771f093fd51cce98c38c05bbdd535b984d014edb5d556fd250d7d1c74c84798401a06a98017b63a61a3b9efdbb9f304150ba252bda97a61be1f99c4b02d9df17085adf3dd228d9d592f19d4046d5ea65eb07490d13f165dc2f47a3927e98e1f09714128b1cfc2e4ccef4d9d925be1481315116deb16b453bde261c5cd30f22631a224ab43fbf0817e2c9d90d8e0de1c87ea38228cc0febb3ef64fe5062b1ad0ce9db5d7df42d40493c43554b50011af71452a2de8038aa0ebeb35cbe05afd34377c3d8b53aef04ecf10da2f3125166813db723e2e2f30b11bcc2f51a6c062a0ab3525341738b918fc2ecacd9586b3e72503ec05fd9c2045e6548f34154ca9862222001e55ca8e1d598a5ac429fed3ea40cabdb90f46dbc0d636945895ca433454ce0da08dac544dc52750c99c8bf9237b57b828707d8426e1c9e3d15c9d8adbd742ef66bbd618a0cf9c5a5b7bfca6c9f88092e2b2821f05a144c6701692743e26a540192d5869d011596f50f2c17d53786095aacf2cec953ffed53e08fb9051a4729bd9cc6824bdb8939856f32c547acec0f0685cbffeb2fa9feb32c569e3c6ac938b8fbc8b99856a7e4a075e15ee75ce66584acf9107e88067361663f33a04ad0bf3c6588fc2fbbf6eac83170615a8370059611c14b0d993b9901c946c88e3fc801f6f5b73c440dd572c8488b913b40802110cafe5a7187d12b02051f8b7c452c1c13912d0b14d6ab87b6d8c8e590c74aac62fd970201b4d62ddb883180f42b68425a46aa652d4f548fcad7fb87e2bf9ad43eb2f3ddc0d54f8217fdfd304d0cc0bd441398571de09ca3ef55807166c219064af55579370b3da7d03082a289463519670eb4695f4370ab396d916874d728fb2f83743b2121ba9c98e1f0433e7d3548f89d24268fa2910b5d7d35b81ad7a506cb6d82eb88d0498570def827cb200aed5229246600fc52489e7a3ddc0f27c57e2792daeb10ce9ea30f838e7509b856cac6c747a0e27acecdcc260d89bdcab1983dfa4dc3d931269800b039e61121e5298d7fd7de90c0df3dcf4ccf44e1df130bb3f1221cf7d2d2b47419c5cca58422b4df813a391940272d3f839227a9bc105406ad64fc9c21ec1617e391a52287730a7c9357c8bbd943a76d0bba77db118294173219dd0690408927e0fd8f63d028ae1884f31d7492febea62ed4cace230d4e1e35d63a70e80950b70ff55cf6bc4c67d844c9b11c261b120629541d84922c0d78aec2801906b3faf65da23ba48cba23da886fb53f73538090a5c4231724c6c152654d4b33e4718d9ad1dfe41e74e4d581aac66045b4f1f772a5577212c5a54e649cf55ab193f83c0a742f468a953d2b513d25442b45532afc1adb434beca0390d28213c6a4613b62444cca899e230b8623dfe12ca8a7f201524bb8a0e0f283dd00f903052c9089f4211140d7e5eeb48a426c5292bd460f92a8fff8c5c6bca42c49e3318c87d630a171e7333ea6e411736f4e6532849065e920c883dc871cb05f04eb32be142558fc7e77e5c9d9ab1bbf5e4d2a401a5699c1709776a461eed60804586fef57c88c508b375af5e4a85efe67ecd6749a64684a5c525e77d6ae6335808b8b19c6402e77478d32667f7f1d4cc62d5816326a554017ae1875ffdc02abe03e815bd33249ebb3b3919dfd5884104b6fa11f58dd767e28dd2431f5104b78325f2c3299433a8a23308b203328eab68fc2a8081faf224ac86daf2a8c05320687f15d7542552e3362b44a41a0696ee7af416d05941a12ce6f0d48ce00f23a034da4b56dc40dd6e4da2acefd2f17edb2f01c8b1a174f49163fa306ea94b9014dc9c14d7a0980e1666b060bdcc2c74e873a99f506c221df0cb66fa4e74cd8c2a0796cd39296ce0d195213b9b0cb942630d4173130ed4577e92e89c21b0e2427b3aef32383e78c4093c7640b5e62124556ddef7afccacc28c9c61240aab411a9e7a4d67b98962d5051507483225c10f74f2805c45468875c2cb84240a554fef0db05d9a8929570fb2dc2267d71c8a211f77df6f81b05fa5dd727215c33a066146ee7016a4eddf8567f207d5d802511046b0ad2768d0e11afe936ffbe7e20092f4eae6d0029120ccc8068428b155e7bae8050ae1f7171f45f89c65b314fe51ef879bf20986bedaf055bf44dd0ffc826b69683846962e41e17250ab63066c18b592433216b3967b2b4098a1d74e2b750863dc7d0c3300fceb18fe362d28b95d6b8c530519a854b8a68e0881fc7ecac7b8de6b2c01252e2b6b47823637a646a4f364b6d832e7052a7976c098c388687310479b50974f8d18649744c0712b312befc897f1f307f48110d269b18212964398197de42ae60aa2e17a781de589d81c33c41d71a7216d217f9e7d5c8e99cf0f013cb6978f61e620f7e20c5fad692a3dd4f4e1999c4198991f4c9cf93b9c28bd68a87831575d145543262e5b731f990b49bdc92e0dd1f37422d9a767315176bb102c6cd5643780eeae1aa4dc90afa04dae641d2e71c0074baf74f977d44e5c94739a5f86acdb43884e3acc678d95fd1c636d4e4320950da42e812b55ae07debaf0025d068cc3b81cb302257e2db3bbd0db192037821e077557972b1201477d604dd0e3746615aaed4d5dcdec869ce1de887dad6feb5742a1d03d59fa906f656a0787346d471084675ff9ce83aa35864e448fcdb7ab745f2872d69c0ae55d4680b27e98edd5345e401621e026479dbb5628d58682e752cd52e68107364b95dbdd3f1269518ea5d607dee0e97d9c9774ba39191a5c6481933b3767305b0b41a046993461d431bb718a0aa5ce033db764af465e51b857f17c4574a52b03009a4a92d9ba4adb28e3b705918ba6dbe9ba83b648a02a17de2d92f9c516cb6f101f6b3a6c42e3a01343319a2aa26d7b16516df0570c1e9501e016034f2d51a700e7cba2b430bbfabbc45152c706c7789e2b2168da37212ba3e21a0f74bdc4f5994c45a155a83eee48965955387437aa8237b8ee53c6bfcd736df7bbd3f1b7274325a198db4b21aeb6aa4d8da26302f0e3d792d4a8a15c21e2b21235f2d8651b96b276bf30047bf632b011df9b8f210f52c4b5b312d35200927a10b492a47db0601d7cb51d45a6bb5d6c57524563f4a050afc15c983453a2e40a3d07018a0a21eacc9cb0b819a2f73b63901c211b094c7bd9b231028e14d6a1b47bab1a37f8a1d75e9457404e5864f312f0acb9e87b9ff8985780f836fb9cda2451b752691348c8f698ab2b8031b5da618a04ac7bd0ea05cdf9c12edde1b4a6ec93b88d08aba6a47154fc3b434ab4b788f5926ef1c7efab7d063dd74b33a12ecd65fc9d9ded989bdab7d9783387f8b7c95b20bc4f41ec7a6756b6e9a7af0828901d563aaec39aa57052404c9cc3de6947016a72035dd779c0eb3496513797a6f000c04b0ec3dfb0f4e91a209154b1b6ba1eca798b341413cda6ffecf0e595e2cf80ba5ebdd26e149f640c42f43d28fdc4372f62ca853f733a907428f0b80dd171c7af2b1bd8116326596d7e1aefe82b18c258f5691d5c8a241b32b3d3b25d9f41494cc9a6445554c149a44f64438cb3cb52683022c49a104fb0a3ee309e55cf5167ae78e9c4a89cf60dc3ad014ea178cc63b3b4a8228dda783bcc61dd560a1d31f75959756fa15b90ce5a4b9acdbdfee1eba60f9fdfe0f848220dd8275757e98ba127c7481f6b91eb62deb70d486b02e932d7794c73e29572e84e0bfe7a71ca8af6956bb553d6bc0ab66215915bac6db9f300c982a25ebfd6195ec5bcda472820ce4610262b177824fca5a6a2acc319b01a5fa58c8656c7f6468b72c52ff327bce34eacb1c29dc848b0e679c67db4f33eb77b5e049163fb3171cf5592a3d9d1b0b86ca7b7dbafae0021ff5920af29ad89b527c4eca58e868c11c7ea70a40ecc2cc8fc89a3b0847cd69f66f98b20e3c6ce633387cdaaa44fbf0f652312e1211a5dcea2007d822646b8e33ce131491e2da81f7cd670cfcbd3c1a7dbb995f0bd8b4f439fb7732bc37b2f4e0e9edde45784f6583c197eda9eab1ceebd743ef07c3bb71ab667f169f8d9764e7598fd3bc35746ef8cefa6e161ec05adb1e437322d428fc8556cce8851735cfab67dfe24193080043090041940021850821950861c28813c20430c28410e94400e96410692210bc8210348100325800124908125908332c88072c04112c84019644019e64009e2a014f0a004309004191c429983f94599aaf6425317acf83896e5e122110f6cc1a9457ce757dacedd8607ad9bfe8f65340b108205d509d994ffa201abcd1dd35cd6ac8c7959331966b2cc64cdc8989131236b26db4ca6b9ac395933b2e665cc6599c9349335276b46d65cb6b94c3359e6b26665cccbda6c57007dc11e4f6fff8bba695931eff3d27a880ecb042990ee56981e2a29cf0cdf7f81512dede5b80984976c016dfdc80cc5f877febb41a354bc33041e5151a6c1ceab63f80419c405165187dd68a0435cd24f8448f4b81d72035437cb4897a3c338c8e2169030093ab4a49ad2f2062a3b1112ace02dae91def65dc5f95e657eaf18cf53dce314e6f18af75ccd7d5ee17ea739cf55dce715eefb9af53ccdbd4ee79ea338cf4b02d886e9421afd18cdfc1341145ada9d27cec3003f80680eac6a62746560c88211badeebb42c5230a23349a46fff4d187e684000aaa56818d6a0796f81232e4fcf96457021cdceeccb945719a795f29371d3fd3dd257bd7c2a8ae8ec5486201cd4df73ca44db41fa92efe075ce325830a62071d304687f2a41365d7dc11576951f99bbec9c3607d217a377f6445f4bfcd38255ab4bce6e8393944306ec96a8445fd30d40c3036068e39d42eca14497228901ceffed72677a70400860b802bb177c647bc91c23083111d919e6a8ac166f200cd1d798839715cb138e955cc6e62af495a4c465d72a52f14a0bb98b2992b9dda1bf5d1ed7a1d01754add690290444af0e562bf4e5a5d20b2b494514bf7c82996f3d8850a4e134e5d635f33b0c7391e0251bd63c2edacc1e425f29dece6f69dce90d03fd80a90e0675aa2ff4853d3c859b490f9adec34fecb9abc827188837600708d5da2a5f127db2dc7aa1af7318bc05b5a00d3a85a0a4300f787beb5ec223bd769abdba9ffa8d40dfb37482f1d509340048bd9238d200b0e44e75374d17d90c28c96afd0f3378e8d7709f89fa6160c127d49edfeccfd002548fdf19ad1d4777e69263b88185b501bf9adafa71c883af8fb7617e82e93538795abd400152f58e480fb633f83aeb5c632196ce0c2d095a319633ec7bc3f862a96280bedc6806ef0701deb7abb400002b265ca03871d208b889a37505d0cc6a980bb2d220db26c278e0995f6ea0895f86341ab715c2275c95a60b2c31340aedb8ef06e0a08456a11468459f8aee1c2300739e890cad3c9d852cdd478811b3819c7b72273c91d95e7a675e9af54dac253c217ad5bb3ea725a5623ceebe297759f1923b8eab076738c4646fd60dcbb0d730ec0be85b9f0bdb11cb9b8a41e3dbf9170e64b09da63dc53d9b4de234f0246256ae6379516ac7b72f15133beaa31954e75f1c8f28095c10945a81939a39b783a7b16bd21541ccf795705155baf743bc6aa47931b7479e62e217f8e993a9a2cbfb13356f1b7e845baf8cbaff2e2f24fce9d0508d0cb40c9d7b705e98e3c962870968256d28db7b363fe361a5a559d2aa61cd147f38a70a9a706fd271af81ae1a8aca8b938608207e6ad42fd55bfb196a7ff555ee310470d970e085b9812ea4b7705d0a9ea0df9c2c7b08b03539fc95190387087199415ab3a0d1a79e41a0944c7dadef64f3af3379e12bd46919f24d9384b0fafadc298e20c686f03ab87fcad613915cf68eab67766a89788ba2856102463f880e49d39518aaa090c251180d25634850ac853cd85084f2b1b9e2952eaa818f682f7206961b7f144545a5727ee26981fff51ea735b3def0509cdcf4a228e283b4570dae28cb5ed6a0e82334ef0c8ed5c6a224f88db1c5428761895e2e14ab849417fcf0beaa5fb9e17f914b2fe132d45eaaa9ad3c133892e93afb954ab56db2a137768fc0c38c73fc3cb6d7585a1de9f625ed61e38f942adb55a84eb56b829c695d5a41ad34254f4f947f8560a7974645e497047e8f3fcefc5ad69d6b5ca416953c8f9e3de426cccab6aa380d92fbbb3a1be01669e0cad4c95f8b54f82a74c512bdf8a820a3643ed12c0d5e0ae3a3d8972fae5877ac3a053f021e6e447767e96f2b1a3e4e671f6184a90ee4a5fd061293c65008963beaa35b18b1ea5f24f9ce43c44130eacb77c7a90345e1599b3d14944b6f86eaa1e802c404b888fe96f50dad341c947f6188456eaa1df9833e414e0535fca14709501cd43b34171e711f7854fce19b48038f42f4dad6ec5225dd5de55f92e95888daf532e915b175159487deb5da4b45ae89ed6f83f1e351504263ae1a63d8f0ffbb3ca4f92dfc702aab85858c1ebb2660128aac17111dd5705a6d55d8f4dd42f41c7a9c7a0935ac2df34329b3adbbbba2b7336bf1af15223ae611d3debeab7c645b55c2b148050ee43b654b54c5c7635bf7cf6c32bf8d97e7055310b73ca36a6dddb5ad4bafd3a05327af3c1145321647a93bbb79d4991ce87ac71e14931e65f9176c0f422b719f7f257e17ab74d6608bd863c52a5c1b0bb069e2025c1280936733f8c08d58fd4a23a2a6ca75c20981077c8147b64d957b186fb64006d5226d86836db593b4ffb488859ffc930e9008b9a4e4689d69913f10584102a1deab7210c7f99344c20d1d5945a6d292f306ffa032833208e4c136339d8f082c8c969515c02a7de779e7730f54ed36a0c0932e984e8102180de1a872264c1d883c05a919b75b6a0fcc0bd8dcfb2c28f12b2a918fbe22085cd4816615f58daf65bc54771fab8bb3cd3cd89c6aca851c6c8cc56dfdd0c1ea4eff0e4d75f2ee3c6402560d0a5c1c5242ccb953b87fa87658af80d117fd240c41a260aa25c6f3bcad0f2fb39c769872af46b39cc28ddf88bc2663173b466bfb32a6fb71cc55d5cbf583ea7514b47ab9bebc4a4dba98ac21a2f319204771b6e67aeb38f7936bab105ed08426741bc234563c19efa5f2fd1741bfa690a10f1819bd2d5fabdc8060a048a8195d40ea5e87bd2988c3b108cad51f67632bedfe0f9a51fcba0de42de70633e0b08dbac037727909ba7927667df668e23bab9891aee7eaaa821634b0e1caa06e378bbbb200a12201593b62d0eafe108d98c2be1c4995bd72b4926b2a23c64e433471ebb24f134d9fa08470419d884f8a56d14798c224efe8496ba33b71e4c85fca3b77ec1d3325f5b9efdee32230b1425fc6ab2b84a6b6d12c2d8978834511f5f975600c5df7c47f94c7de19e9be8b5e6fcdc81d548980d0ebbf62b043ec1da98c137b1f1630d9a03b4632a78221b5b820aa9b2a313fe2b99bb8cfc77715d3749e047b3d5d318b72c850bd227d776292e5e82ba5efd11fdde63735d5e10d83aa1da9284e1c8777cebe5308feb61b8e52ac618d2e2ab08608a12d5351cb3e1f0b336be834e8c19b1770162dfcc0480f55a22c2b6f875debe53077b4e5bba2fafc94ee7fdf769cf8cbdbc9e03ac0ec966049ff17263f0db2c1cb89839832fd33168391a960d83efaa4c950fc1845bf9b343bc7ed982eb7ce0c9844bb07d5bb9ccbaae27a499aef66024e364c6d0831547929eeacb123a72de0cf2ec8c560a1c59e22f37892bb5d1e68576a05f913af0790334dfd2efc8c31341baf059844ef293a46999fe6965e721e1059238f15baec24b88886709dcb4e454c65b45d76526489387252b498dda6e0a3cdf86a8cba0c3421fd7df4c954d4acde8b3dab154d0df8a307eb657fb0d4d4d7525d79528eb206d4e7ce6b29d5094417e82db321e8fafc80b0c2a4485f07c22c884b7e9335d5d709fb735b57d40fc820d02de4d6ccd20066db33fbd5c0d6a758a9ffb55068f75a4250c214526821c346885f93819141d3f2de7c6d808b49405980320bbd02d0cdb5fc52adf1b1728024f34938487452ccf5c671a4124b0cd86ded0729fae2080a707cae206c2c75db78969ddb102a73efea7e03d39c5dce4e918a5aeb44fb9d776ea6c2f29f64b517ccc7a72a6f3a28d5252cffd9f5510cf4eb4c42e364fd7f4c54ebf02462d864841f9827e662404af327311aaee4fbe399f887574493d072eb0abb23f7eefeabae8daffca5b83ccf11839fc97fb33997a86935ab57c7dbcd5df7e0db3b9b25753ab541ed54fe380f095147642744258aaa8a55eabd8320fbbd96e472f9f98af6bd09812eec83be165e18fca98ed921d0848a1746e139fbe730c1efbbe296ac5f1a36c7e6875d7befd768fcc29e70b0ed5e5d4b4f31bc963e272fd05bd8bbf150fd324397f82bd82af466af32d332b82ed47bfbdd13e332d4c356ca0523c71242ac25bde6c5335976f24feb95791c6908a42524a807b8a6c042469c0a0ee5947431d5b03708ce32508be8c2d15f65505770a5a9c0bf6213d2dbf75ed56a9a40c59b54807a35f1d109bd53db1b5d4be3c2586120d60db63dc67d8178202f1c3e009b55d96883e859663a8ac307a4273520754fcba2cc04128676a32ea8e06df251ab064d64974cd5a411a3a9c9a38b32c7d1d6c547a6401545cb922974f19f191fa6660e70076bfafd8fe36369b6fb747824bfcdeb41967fafb8244d82afacf48a13432770ef78aa6e047e3f1b6b80dd90ff0640f2b1f8f9886605a2502a01267238ff6777658c0a13e3f95d8acf692f9de7299e5b4ace251a7f5408669e48c1bce2ded4916e44d81d5a93c2a8f681b940c67bda6b16fc4f81cf10d9829ef5fb8e37c7a08bdb63f0ffbcb8e00dede78fb11fa5b2d1c4564adad3f60c635a0b75237e6c17f3a6f959a9e9c8425c0b7704273ac71b19fb7141e04924d4cdbf68dd799eef2fa52253a85bd04c995861650ba810a1a9902207c950b624834d661505e9d84ef6dd422a539c52b8b19a41c43dd1a84c66a46d46a21ecc048736dcc28ee8cf14cdc6410dca959169a611792cb1d6617a06ea226a5335e08f72c1b60df8d2b980665be7e7e8bc7d882b859af2bcd0e25f85218ca4f8f9109f5c0543faafb1667c0d13cab6b6fc95a47100db2700ff25d6e829212e4cf8b08dcdd5f952829213cd67c2938c7bcdd2a18d09b90876c3edf53837399980fe74e183bd0c80a6e7b7a99f9dd7e9197092142a42fa6fb4f60d08091748deaef095c2f970bc98d396c154008e0427e2efa54e9bd549478e1768d5717875274eaa4c6d26a48fb4335308f6bf8df7f846567ec14ed986a57f7b8f61bcd119a2fba8005a557f28b0aa6c4fc964f691612776d2299be99ae1ac9bb3e205e71153e0c13e7300446944241fca999d8ec986e6cbad60ed9598ebe4cdcbd1e5d9e3dffd6b5ee6bad15bd0304f40b7b9149b3553154fe4980db8dc6be9dd6616cfc013aeea27590bef70b030549a6ce5a5a867c43b526b1a9c242e5da42fb54703f9a7cd3d7eb30ad486dc0dd153316a3485b811b5198ab790390f422dc2121e6d0727b144509a977b60cf56cef0c15ee39807d69f15a50da5233032fdd4667dbcdf0b8b7b0390053578591656655c66a3a0393e424c1cd2b4c80a93674893a51852fcbcd201fbdb8e70b77c50383d4c6ff74df8eb09fa8df85c7d8aa384cba610b52f1aeff2131b7c53f8a37894efb7a2406cbf1e9215aeb28eb232d2f0d51dc9c23d1b1a5bbc37c8a5adfefa55705b7537abed5eaab26b51a40015b715b52146983f64e979495888547fa21ae1350d0ba0bf7dd3698407501e019ead4509d2c57f2e8b5ac7e1ee55c91a8ed8e596e508d80a71f6e692974090662ce5234257c6724dee03d95701d17a56b61b7117f7b42b6aefb8fdb51f70714815b2da06c3d9d7a91d4d9add184b2d758bb12b095cf0606b02ffa0e1a8378b2888ec0398d3f42be30b386a542dd35d17d4ad499220799c2395df29522edfb9568a3f81d658a88425031afe9f61940cacf2ca8b5a6609be8f4c536886e705963a9b9274e7bde5137f45335594e7d788ed057657b5c185b271d6868b125854fc96bde572a2a8e706b773bf4dd3f14c022a72f88b51fc3b8e4e73d425aa8fb9fb27bbad7c0ec6f692b6e6f443f72ce0d63ef5cb44fbb2dea29a99cff08cb5ab12a731ffeccd3a9ae4d88de245e91f1ce1c4f7c64df46ac9b609e14f6c81b9533c891796b0185610485b73f14f1f74a508869c9a5430856850245f531aa2973b4ca19306128afdbb912f01db266633dfc45ed31f88900f0def11c512349cf01ee050f286ce3dce778fb9362fa7ae50a0764f6c0db24b40afe895c8c8815d25d7693df1763072f0a249befc07c1971b60035a2e0b0539349df1bc3b010ed1d4073c521a323d3ff6dcd1647a172e708084e1a1ba5a65af88968fe8b2337a8ae82ce5842f48e5015b47189de809419c693cf4e45f5a3ca95eb5d1cd88cb77994e5db220c21c48b974e9067fc2ef16dd32079a4d388c6afc7c459436d517863d400b860c4763b980339f4604fc93583f0b70cdea6f8256865081e5468e4dbd5f16c08211fbbaeb131f1e3ab7c85312fc0bfc01a9b75415158f4b56182fa101d9689a788c628487fcb146b11d26ca33733e36198b09a07b3a1665a392b636351a7901ddb7a6eb29ad0913d544ecec2570b189025f822762929d2266544fb566b6a85291911a8de1dba5b7b12543385e7f4112ca765105dab6cf8e296a3b79b9c1ddaec8fca2ef94513bf3230e72bbd94ecaea80d2cdae08bb58e7f4f0347c67877c83024fc3cbadd7ad7549cd7762eaca309dcd3c208482fc074f842f2d0b9edf66d7bb40682792016fd28b9981601f2b33d4ac6668f23e313d2a2f2a081e6d9d0850f2dbb6970fc876a943d594251feba5c3076192759c9e505382bb98a4f0996cbb510f8882239e031a3d1d677e609eb8165657ec5cb89add72a1f34934d0623a8a166ed55095779be2030bde5ddf92c4d7657585face8c21000b42b396651a45d4650d07a123bf10fa272b0b6d9c6ff61253129cfe3ad20b3e9daff70b8cd2ad9142dc31be50d0af8a1fe29387f9737da3fb7e5783c90ab5e9103e7511e456ade003f7e184320ba425ecff0bd207d5962a737fcde46a1b1be9dbda46c2b19e9b29e502537046403d1d80e8d407253314a4b4e4064f868756c1d8cd97c20503d6034f5eec3ba3cdef01d0ae3a1276ad1d2e37ca2e99c1514f597e6ae05809a0f1b91c0d03fab2322e2a661949dca47684a250ffc1c3ef3e77c28f1c91dbe90d6c42043e45e8e58dafb6ab69546a2732ecca590ef23b5fe131ec0d9cbfb4743eca1b66344432ab63f69d31ef7f23753adfe0e6754162861212031acd63f7ef59e8511cf422a87c8239fa99294a56564f4948bb6973f0a7868661afc6534c0c2d87e1d16e8cc319d0251b4f6142ff85e4af326072ad5b90a9c0f1d52152d3f97d08f316805f709f60f59964bc93056d120db06cfb26a81150ac9b5159cc4bc639e321419ab062ddc2de2d99e51b9b616797028512e8d4b58a703053455c073df5d4e1282c8a8664f80f96fb4340a15c986557dbc21eb3060327eb21b13d21a338cac3802f7d1e93872d771497525531171c86df99babbe81681c10f8845126bbf4d90209081897b8617adf03c998996fc429e3c14e38620ec1986245588f726a4b537a7f8517a14865a1cd76a66c3f877d5266225857676a9c5f2887ef023480f05f5092e109c489f9baf14197e66e2de27171e6f91b9f9aaa653d254f5190801a1be2b5194d3f1c418d166a978028d8dc60a600ee5fd029fb25cfa801c6980e2c60ed76c3d9d92ba23f3c0248ea9aabc56a263e826dca5e60ccae385e8a334a124260cc3f2b3d2a44cdf3979a26f59fda680168fb452e1d82e1e6e4b2628cb8091c32e761de26d8ac1494356a9948507fb0e42a187ca51a038c9d80901b96c78af6e71bd228475ec08cb6607f58195c0cd7ec58b7768bc7c3f64b5216ca1c91aa43a4c78759b531d8bf75f15da09a3a4bc813e94983216bf621f4190b23141ec3e16e168813e50216cd4e76c3323926da3a47752ac8a178bb9116595216f4c40d36b7c43f833f8a4356b2f0cc2bd12795f7c16cc39bf815269a77adc07ef9965310e5ed2f129c37c3e57e750022f2ae74240163a17fbafa45ba83edfdc94a803e85bb69feecf11d488b761f9804aecab327d4083dacc6dc849e34f500674dda21eea49d8b94de86fc453dc56480013f265e6ca05a39a79b6d0758ba5164d537f2656ea8567056ecf3d8652a302ca6f57ce7870459422f7c49f230d4b3aeb848edea4cdd50200db55a87cea3154c4014057aec995acffa6d1df95103f12578f809023a9904c5b2ed2ce539ed1234538c8d7bd50ef93e16daee0998e25c695058314c03952a3e0da215e0f27840d44676c356c2b91884589ea358109d1d1859f4155c520100c0296a282f0c5c02aa84430536ec542ea3517aa2bc115955d4d1f80846972e7038009a9b255781d2d434c1acda021814e403e0273a5c26c0f08e40650cfebd81902c11d1931b044b03c749ce40630e460492957ebc547492a633cd7ad3af328b9829c3f4d3c2c2418d966b422a64e57d5ab791448f0249a4b641ce73fbad45622d14fedb576f424ef885789388175630c80daabc4502d970335d4d8b47bb2ab44a6862fa6c8b291148779f72a99b242996ce8ffeff625967e8de6129375e528d3d414fff2ba40e9bec4b442cf8ae8a7a7b8813cc9f35b7c590da3dbf14f883132e75f09dd9fbf3940106d55ee225ef034ed9e60ee75fc83f08a5c6635c37fae84bb56da3cf78b7dcfd1ca3924303490f6dc2591c23aa303011d083259a39ca9f28566324c2c48b9515ddb7d9718cb711a166b1d79fc431ecafd6b33d3cb09c1d684e409b21e660cf66d5bbdeadb1e964e8bc996ec9b59115451c53e71171b93f65899e6eee185975623488c3d879a6c30740c4d16db22a5be577ede779a1dc1b15e12738621663cf821d5269728b72ec81a63e6297dfe6bf07dfbf81d136b31e8f47e8bcdf238ddd0987e3e71393fe6022b2e9dac374a7461f81eb90f9c16fcf96931d885915ff1289491188629b5c10079170248e16ae494b9b99a0e2f7994176fe639610d622edab8b8a3e98e06ad4b12bb651fad37d27923f545123b03252526d794858443a2ed722f37f463751b911963669ae48baa408651bcf50cd4d48307a80eba7c18f744e51a099bbdbd6c5ba5813b087b57e0ff96e08fa3e353137cb6274c5ace5e9d9a2a7dc1d43aacee41034696e5cd47cc439953f4c675ade411710f3df8e23de1308ae86f3cb2eb2f15eb071de1c66730883dc2e12f710a0c6167f9910cfdc3281adb49710b314c3c9e43a7b24adb7b043a94f91249ba2046138759b0dc36192f9b79fbc41ae4775c5a0e485d6e2439a3df2060e447162b436ee73746c212b21ff196ee548d4232d5a822ceff6a9c17933deddf0cbf6df5a9e510d885f11d2d775fa5abc76bec51096276ca174ec3d75e82feb15c8ba388374348b5dc29ec69cd695a87e0c5178dfcd4fc5c141202eae03dee6fd0f0b6eed8f80cc3f4f876602a0340505fe8586096743126380f31ec468cae9c995d4abd3377429b49f8d842f6a13d46053364f4037dc1cbbd5aee98990576edb052e9d6b274398f0b17193d5b7c5bdc1aefa64441660ffbe4ec2927100526294d6676afb1081fe8d04229b8dc6fce0bef21151f37d244efe934e8e17514db1192240a05019cdb9bbfc088f5d10ee87fcc40f7bbca042a265d3cd100afd9fd2011a8df1a065db61ca9617ce00bfce3d0d4f94280c3678e68e5ee4d6de96514d7b8ebe678e2fdfa0a1bdd2944d49ae63d251a1b145b19344423a232d537a8c3bb345f18cee9a68e7d7e3a3e4cd89410206ed71a3455317edfbc8fcafb70598b99c26916a762bfa00058706fa7cae01b27825407f0998545a145d02f632cd65524d36b6ee866c3bed475352723d2db0fbe5fd6522969c613c4dafe9af4a04a899d78505e1ca3a2f0124837c8dbf64d21e5706cbe6aa0be37257adba6c8a10a1ac948521281005f66dc642213d9b22275c3448938388969268dabcb2a575bc3b40207c18a2cbd2a38d62239adf9d04aee22f49becb96c0170d95a507e440102a8691b8492089e4fb2bf96c298142f32eb8f72a8937bc8ec4c8749b5c9e5dbf287fa92fb3dd5430d767a001cfec452262cd8cb3284c9e915b383262eceabdc0b85dc369b881b195df2f2b748eb67715eae90d415062b3e7ef448e0f5eab186ea2e5f004e3d1fe2fff28837f9e1caf4ade91974c846180f4494750df281084b5f154a34b8f0553ada72a8ba7a14c38ade02d502289d11a2c459f0bc79a5a6b21709dcfa3d16f4f9635567fc13ab9612d78f9ec9cf73829974740523c55f6cf8c32bd657ddb134243de2356dc191dba83b641e0fbe0f5e0b89ed399ab27f01f0a20872489f127e001c8c34921e9c096a551343e818aa9ff3e0408805862d8a94263069a550abfa971015e903b16f8bda12eaa70886b731ff35933df859f5b3872bba133c1d7503c27a774f9bbb090495804acaf4d8875c164cbb012ed6a8aa079d9bf07552030bd18c60740602b95911bb5cc60fc0d1f38e3d39145686812c67d7fc99446cca2c25db358e728e5d80807f6734bd7fb1d0f9aa1d84c662098cd89f65ecbf0c1249216da905c207066942625d5b8ad0f3adcb991aaa3487d3de914fe59bf9a752a1d35c61829900f8b5ebe98bbba216a4278fa380740e771e9fdd0df1bca00ee8b499d04c0cd9daeda061c9b1038ed605ceec8d2d824414fe5d6d258b7111ba06c6290b661d3ce4b92e918bf267b317a2a710467da6fca9d5af2cd30616b80d6609bdffd26bf13e30107d4e9f1001089a72b21ad1550420983ef2a5d8d13959e62a5781a31e8545028bf1094904380761df72c3bfdab4a97c5e7583aed293182bed6d627a2d63a966800cd440e9a0cc306768f75c14c746a6e4f50b8f2e6a614a5ef0db7fc7db4f9c608e1a6721feea117df4a4127fa280731420a3b08bc342ba71a060e9880f2e531832c27d1dfa363a8cdbc1111205457c866a70a3ee79445d3033d99174d9b879914b374861765d7ea64fbcde3b2c3a68a28b1f7342397c190084554cb23c05cae317f14abeefe5898380b400a47172513d5049ae0b28f486c814c79c96bea5961fd185657b09e4d22177d765e1f61a6cb30b03ec8af2c68b52945ba3e631e63dd16ded0f70dec164b865a9663a82581bb726751b8f7677753e0bce86ef27aee433bc42c0043114f0e9862833f07bb3deba2ec4f3c7f760edc43766f9d8f8068ee99be34ca3beba199a9088fc773be2664ada69b0a4b30602dee7ef1d09f653da2a8dbfe853c1d784461f418abc032d9410104e6708131f3217a4a6fa67cb487013c38b7dc135e39bd963832a089d7a16eba0c7945e8ee5da0e1f3c0204f9ade4d59cd0c8363541c2f4c1fbc1f89a1fe9945f2d3195df1a3dcc503ffcc6b3a163330f6146e300ac5c53530ec13dcf6848522c9b65f04cd41295529c3bcbe9aeb6ad753479c19c05ec313b43237c7d860b251f9e26cf6d62cf0a13eec5bfbb78ba7cf0dcb305ed95a97e9c931fe3e3c24ab9121bacedf38a5034e7dca72f430c14b2a379630a64528656520ed37ada8ad44f1f4e70b3f436deb782c9201269a26a39d08c2bc2f466d962eb01dcae625f40f2eb7eaac8b3480330f4066a1cfc8cdb39dbbbe39911939f27b4dd72ea26b5485e0d8d8271236d688427a6644af30f11816450a5e21dc77f87b870a156673d21e8b970219eb4a25ec540fd089fb2f2b245e18396029592daaeb3967dbc831632a6dfab17f72242ad805da39c7e5b6095dadf54c718284a0c6115ba7d54fdb3ac7546465bb5bd38a625b7e7a4fb0fb688d0bb66b87f01070d8c11640cdb15636a209312c8c206ca6a630b98096efc220b0db4415841ae05002abe09f9ab3cf9a0e1b627567dfbfb277d71807eb6c022b1e2f48de8b2611127c198d62db9e672e6475337bc0340264f205e3be8190c5178c2dd9b8b7eda87c0cf29fcea4ece2f0163fb4835bdca41bafa63fd19dd6d55754d78bd8670fb39689e61e7884c3a03b0b4c4cdfff97530d7f591d75228cc0f92abaf100501612a7cae2b7c381df0c36ef572aab70392c5b558f40c5bd82274e2a8a29828b2681672c77dfa0646b803fd0e7b0ada607073c4f01839dffc92fe0c4eff8185fc8cdc52bf2cd21d56a6a45f4480839b73a8caf25780d70824126d896810b8063508a14f38f75352afa9b7fcb734d4a70b231331cec8089f55b295e4f9704a5aeeb1c067bdb606c3e0ce0c767507130b502ccf9ddad0d716a66d7c58c6f76aae6aa23a1a2fc6649013a8bcc911685b8af518729dcdc8a8399e42d7c21a924b42dd81b06271b5ac1c23a5b865f426fd1ee69e44bbdf00dc15ff5866fa1fe5c99be2c958e80e2009e566d14cfb75cf6295801b9e67c450d2dd857dd5104c025aafb6fb76e3f068d53aa0c8da719ea1a4a37c085eda214fec49428a9a36e01596916c73d5737c9c4636f9db6a7772741bbb838ad289477f4638f8231639d80b1e31314310a014d198146b1b5420a877266f0520803c7a33ea701ba8ea22e90444966928097f5ed65b28292081a0ce4a4e8ca3228226c33bf22808d4d3615d524c0fa67fa788081623c9122e7c947005121f994b8c5c031b57aaa096adb431b290d416751cf0fcc068f1bb1d8e5b679010b304d82d8f7a232036d3e1b171c3f7b5b5e6e559ab980352b171ebabcb19907a0d5683511b02181b2994fa097a3b4cb7cdab6fc6940ed92c3771fff0fb7c645011a950f7bc7856c9a7a04191944de9030bf58ece69d2e207175b1b9427f503e2febdd0eda33fdc360bdf8907056556f715960207bf3fa129d69cf9cbf11a6fd903839ccfeee95dfe2bda1f8b4ac09ad36dcd27e276a080377fea3be4e54f415d59dcc10f7a06fa09deea2e0d7a63fe9c15c15b6774e8bc5245453d20f5e5b698a25749b2048faee10010927c8134e222e57adce72e1b55a17749d9f28a2b555eedfc93be09b02d73dcd2b3207711b49343ad4237e4f6903a7856f7f6333f6874f1f70381c0745b38796240367774448ef6879323fa319268ea7a264336feb0d3858752c5db7012cd45de0e7a1f724225138b996befc5242c6d0111f31fe8c065d147afd5211063743ee3ff74b92af749d05c7d7e0a43704d2c9b53cc6423e4d8accad01c0a57581a94401573e4c4ba5ae433e35c155b2502901a23341ca7fb7dad1bd271e7cd66acae0e5a3d79daa61cbc955bed36d010835d24e3685d7c40b0f8e86ed6ff932918018ced436c883545364b8f69cb54f14eda9b648555cfa7f4a7992c54e6e4716ca2f52ceb52373bc981df8a16d99094d914e21939be1a80a0bac08eb1aa54ab0ddf4e987f7cb9785b232263b530f71f21bb3f482de4fdc804e7628adc165c6aeb68304d62badcbb55d2e4316487c6220348c4c0b12d2bf22250a8a9480bc7b487d2437fc96fa2a7397a6e871eff1016650848498f1c02ef035fdb33f4b2ecc8dded42451d13698b422349d04836219917642b5e6f69de9fb65f36830865aa39a710be877e4af6305cf7d3f8e605fabe7fccb0a06b091ed23cfad05499baa0a933005df4a18210a22f3c4c46de39c127790d985501ba641d2479ccfa3c80fd68b5888b72c4a36df0ac24b2c9ef0f25421496b12a94b69199c84bcf2163420894a077279d0a0f272400bfde3c8e7fe197733a857622a94bc8a24dd106df51c409519a888981ed3a9c93984add6b6b44b99c1aee4b100eb1e1dabce8dad6e62fca006f48620410e9f0a43842569244376a425b2c810a2624c11555c4c5b352627d34d84c0fc1b937c31b5141984ae602437359a9715b986a52c2886a720377c6229c3138afeecd0566531932e04f16f18ca8c8cfd6adab1c89e6a54eeb2cbbf3c4df96643cf62d42cd678a36f1958bd5586c0bdebba5fc3d083621acb419d60b025ab363deff6785c57d655b43693fad77dbb73a660c01bdc12d8e6a808d01914bf1099042106bc0b3159a1b04b180133da552482a718273c988037312b54b769dd080824be77a620731c05befa6e16ba76cd534d407f95e825c512f5101f351a40514cf88c7a0cc0a936a348443e996bef0a7b5b1eaf73f1493fec0a2333bbdfbca68794c1c351cb3ef9b3aa435a5915c22a6a6b08c0c27f188c52a916f0aeaae5a5ff32883c26e0e17e7964752ba06e2a3c29c373952863940a944bcdfa450cbc650e8aa90e56cdefe466e5b160bbd39462f5770cae4cb9a7266dd085419c5fa293a5a05f79d56bc8e225d814b295046e158aafa7fcde56f9f2e92c00b75786a65fe5b9e788a7070966c8c21529646f603f27b07ddf6dba57330e26d7d674a62863ac19dd0fe22ef47948dc5406c30555582ad65b191dea7a127475e0832327d951b2699af75499ae11515ba564c72f6c30c789905c71d9ecd48589c5c601bd51f8708f522e8d730aafe4058ff83f8708cf4edb1092391eceb544147d3838fa5c1780521346c74296283f1dc6b28e51f9c037b5ee7e764d038b12318f8468acca0ee1018b1021f22be57ef27d86dba705724eef72903d72840c14956d9f354726d2539274a52858d268b7d6f881690ae097e72e2c60c1c6daf3d3fe7b7b91ae856717dce45a5cc5498ac06d2f3a60822125f113edc83c640342f12cbe82d97bc0d1fc593f5b474943315ec50fbf14ae1e1a9dec17f6ef4d2ed584961e8eb656a1eb453984f071d67e9fa54e1150e3c953329881addd8fdbdf418b4423e21c04cb4186b723d169871c559768a5897aa0d2b03324ea1f51b26679689da8f314828bd792f959c7db04c851b60241a08da24f544bc1584f7053beb2184851c94468109953a3a6b829e13ed49a834cdfc355f3c0e000d971157258ca23ba19c95a95676c2dc61bf78a21d039b840a40aeb51e0175fd4007521885750b73586f9c46fcce819e10131a3d081d6497221fbe15fb01c5ee5eb28cd382d3b150fb2bc82b36c4ed487d9728fca4a324dcca7dee009b597dc73a424066c29cba373e4ca2166837bbc63c30135be9ae1889b1bd45243163506419f046a5e0d2094ba51c34614dfa25ec26e7486168c43ba02073fdaa48cab563513c1bb52ff5481743b07a1e163657ea8d010a45f8db631783f90de439f6819fdf27bd440642ce106ddb01976985925e2ad1de460810206475b2c0a04d9b867aaddf0f000f286acad943c50d9c5d36259c959597f9c163a935127e5e34a7dfdee53cc22de9aa83003d7ab92bf79dd3eb6c6d3846c1015be340ecd339145c37f69b657a2aff39cb8a1048d838af124ba3b07d4ce7e9388250c289f1b8072fae9b17f6bb10dcc0a26ac057e6bf9fd05b3e9f4a44ac4ec64b46346694d0fcb4b29a9b589b4bb2e4f5f2e37209f1fa94ea52101783e6a4f8b8290f7e39072a3d80ec823d5b13ce9abd4b84596fd8fbf8131de0a097634612c911588454452483e2f4e55d18804417811f0d78cbf7e8f1d411541b298233d515888a113190b6777ec0292d664816d928f0657b9d69b3d38fd769da93c6d7909f070d7ad948afdee56712ec064ff651e6581c1e66ed5662ca747e0ba95e86b64acc776fc080c52d34b713492af481040a418fb11a069e93387c7ebe97e7e3fbbc1ebf4f220a9e9a466040083e3e4f0cfe6ba42cdc40ae1a90f5dd51aa480daa4443b64ab660e86aa53bd2ccd529e5851471d9b46becaabe77fb42dea72e97bc98ab51df250abfd5d821643eac66b7a6f4d173f41c7da79f9fc1b7a24ba14ef1c493e30cb8b53c1d8835e9db1fb80f5a2c83cabda83a0677ff79d1921323d0a332df2d412ce3ab109f29537bacd5189b04b7877abf9bfbb578cef59dd2bd3d3e595441519dcef2d2735471ee9bcbd5fa6f8f180c02bf2c0ea048cfdeeb6c4e3845f13e7e56497fec60e97db29cf9ae6de33b5f93890cabef35b99e7db616db255d983a011b894f69509c5cd09bc46f1d6053aa24f5b31645791014d1e9fb39379f0557d91b22809ea32b2b39a1a602d368d2a40b4cd30130ad4812b3ace019c8fda8398e98a2c0da8db9cae2762cd100e50b075e98283d5955ae8de480d45c1a4600449e2c4eaab51d2c96896a8ce4d8ee88b73f0a5ffd7f10bea7cba9efd953e0fa9c0eceb43af463ee1717fbb8f6540635ecd379b30e43a1107183df903a4839e32ba323afe94c72cbbc0f7cc56e08665e7ebdff804bacecd375b20fb8ce37bcf710bb81846f81bd01dc04ccab9668f54855353da4248798e44771bc64ac9dc40afcc0c415f48ce01d15b4f7d2134f91e1e79bfafaf73082e1e701c7db3e9e8d04dfa14d87eaaa78aec6879ba3e45c24d766ed388085df1b0059bdb0ef80838a0a61cb14750258773a58a4e49257670c51881bf1418468cad1b1cf3771f5bd3efb15a97e1205502fd308a74f6965e0a56f2a09f8acbf4aa6edcc82269fa0af6a5cc1430fdc4f96cee5ab57e8bf96ee445b783b06837b9c5974cb804de1820f1ebdffb5a5321574e48d3028bc0c105c090414668ae7d67be8cba0278de848a9de95a7305abda339b114bec18efd9221b6f59e93c8b923cc39d68f0fcbdcc7597ae8ca6fb45a8fb9105272e28e6073a97f7e37c3e3f1511950bcbe4173f47e7c4ea9bb99def4b6c6977e18c1c96dd73671358806e8f3d06479de5fb0631faea002cfb59cf85aa5adb6bc37e4b26e17e5980f2f48cdf1da1229b6d0609eee19d993cbebaa935c0117fe23f5426f88dcc60fa7d4776be8f1dd2e8a361f2e48cdc3b5279272a441d39d37662c672b37c1071744c7760d120311b445446e2c3402e99000e44b28ad4ee2cb080c0fcecfeb04bd8090899e83fad8b8cb10f9befd7aae1cf6c56af5f45833bcb370f611cb7ac2f3a67cb99b0a15292a544e57431f202e05fa514eb9054eb83513f79a9c10e35f2b356350043aebbd8508c7c8699ce114805f10c74477a0a7d90e0aca75e0a8ef40f2ac0164d74016541d7da1cbb1df04bf5ed014551bb821043a6b54382d733dbe0a018340e199aa125e10a1052cd14d8d134796ebb810611f2ff0950cde0da1f2c58cb4f5d41ec545333644756087db4a38014d22554d6bc9d072baab440688828e8e2f0d92ecd34c6bc01e1321f4217dd62ee0d7bc00edd4c0dfa35303051ee14cd40d2f5e1e5b20a24d6fd34bcc3cc62fc5d60e0591133d8ad6e4a2282bf764e494b1fffc08f1238511c5f7f1305844e2042b6783b7528eac3fa8cfbdc45dda3c7e9b193e844f13d1c24e6a77687fbd5bbaee901306b38b8c4082ad3c17c1b21fd331e89f7a735738d4416770053ac66e618121e0b4a19b0218f0400dd18ead63d31a17d785a27daa49aa7473fb895f20af97a5af61dda3527b84cebbce6d5995a1441c8e6e15387e5e553724e488ac7282aa30d3641e583fda526ea29a102f5dbfd62a4e4a8586a4bd84857ce61bfadd1f7711011f0cbad3feb7627136dda5d61a90600542ce0a2502248873f683f1c9e7f5b2228a549f117e6d503fb36da5f6c7e8261fe0a5bb3a27b2e898b845093127d75a345c98deda681ecd82451940ffceb6cc5e823ba565766bbd4d4c5d14bd447cc2dbb8899ae88c59f9693b890729f2732e664c6d2165c53504c3f82ac13d4dad671a5b30cc8380272dd1ba0a247f000fc3ec77fbe1187a0e0c337b5f842a270c139aa5f30f94f31bbeea1d74a8c99a4f841a3d5eb9ead63ce073262941993b90f8401e4e458a8f7c361c8e0181f7802059c0905eba0f280194b306bbc3c061ec307a6868a3cb5829013a0da0a101c4764f8a4c844e463fb007c78b8aef135acdd15fc92cac43bf3168340a8195a5712777dce50e6ff0feb9ff209df0b2f94ee984d0b9b946560c2dd8667733c64175f320d9b8b50f472293419b9ed547946a045a0d02c35dc2b0f18c38062e03d78ccdbb88b5d2d0df109a1b422ed629e2d8180c08055caf4840df5503452e1f48767900ce084347e6329959a66696e869597922b9657254bdea1007de3cd7813e9c7860ff72a2609006713363d582b06ac15895f04ed9d6f2d1763b850f4226d11fd8b9c382b2d7b9e671f452181572bb3cdea4612562282d24188278aad324e0b8e4479938a16139d433288ed90c913f31c395cc74c4866d70cafc98a836a9a115b410acf9dd8879d0ba3da86c6fed9127414d6af4eaba98435dbccc2ae5495d181d176448d07fa44158a860fe94d8c69b5915ce4c3f48664419378344b8c1de168b353399cd2c33b34992c64fd7b53f4b3b18ed421f40766d9ed2dbf9ff8433b97c11e7d3c476e2732aec1d2c58267cb4067e13bf3e150b254217232466174cb18aa430ffbbeaf0b3c3dd9e215cea77c77d3e77b8c87348925ceab78e6b9a252c0938f780b05e771c37ceb9517852921c9ecddb0c20857ed6c3745b9b3309feab66203b5c0730c205c07eb8fab7a159ff4c6899d25430d2159a568e50d2614190d59a8179bf70572d362f60554b9a0b34d512b608ada4cf4c0a57f459cc42533d5c78ba440a4b1f48a71c7b33cedc69538bb6b0d5b066845980aa54d501213cc20125353f35ae1f49e442301e99111cb54f64d226ae4fbf93cc0b9e34cffedbbbdf6a57cb8189973b4e0e5f581c8a2797ea0180ae4c30a4b102ff29fc863fb8aa182a990f69278c148a3668878637f703aec55bab38660859b10e4aed0149fc3d06e8013373e115d28426e08011f73a946c0e0f044ab4747f2eeaa002baccb8e7d5b2565a6980e01259867ad7b286f0304caf9055990fd73ab120c05cb4ece1512fb87e98d047abcd1011fb36c1dcca9eaa41ef5ad58399f4bc546823b84995108390f179c3c748b0876403eec4e8108581471ef346289430c72afbd090e09a2ab361c2e91a3621cd32659651e6921298b7af6107e32c902840b61d6cebbdae7aeaa86725bb3d1036bcff86afcfe27bb0865d7b5926996431991a9e9ec69caf73c9078f42f35a6fd799dee29fcea51a1b4645b9c07bd6352cfcbab01e54cbabcfc03d7d209d350e8b959ee732620ee6d11a7e1519f2f5e54736ecf05e0d1b3f5e85b14c431acf903d0c7ec9db7182ab96332ebd74458061f2a805506f5081f408cdc738d2bd905b489c30123c4455c9dc087de850320348174a11c50a54a3c6aa9048aff5da64fdf200fa149c2ef772847bd826a4993805a6ae6e3ee7e4502c5468aa03773a912251e5d00bf0c4d838807f616d4ca1080728637d87ceb2849baee12e15707c5e31726cda35094edb34644b699ba4e81a8d1a0ee6a0cbc1446b3a98f5f5d11cc36dec3b360f0533b0c533f421addbc26d33032a4f519d7fbe60233370bf192a48aec7ea1f12814681a5023c93b53bde867afb77d5f3ba8cf12eb37f3608de4afc82f3dfde1c2100bccae9eb100f0384519b118e5430dd9fb9a587cf8cc36a8b2f953d4bb7dd6498dc351b9825c8d97d025f323a216526f90558b093c81aa15642775535ce37235fc706d098011fe78441dd7d78e5b4563d735c2c1409aa06d64d33bff9b98ace97f3ba373274346e8aed29053099c03b0a90c2acccb51d7a96ebe68e2a4a51739fbca347147a5fcce497e880ed39bddd1c3458172a2b08381a23a5a5d56322d0902de1768aa37ab9f6afb08ffb5fef19fc52a0305dba0332ae703b4cc941c1716580949e7706a0e2f2221d892152a0f00bf5f6ac9ccb146ec73ace9ae91fabc5f5e6cf7741f6d43d7a741e13cd62b574aedd7f78e860cd9dcf63d1fce3acb619bab40b4791dc28656b9eebecf1dc63bf2d15fa05b4c7c9201c15e3d17334a59f4946e200c43b8dbc209ee733cd4c7b9c63a0e3a03c1abc721c4caaee5b06c14be4d7b01d5abe65c6c26038933e411749944f2030c5f629931ae25addf9f67d039f662fd42e884f00d67bf0eb69de4f1603a4228a0bc8a21508cf90f832541c011c1239a14d591416d2a254836c37abb19fa1644923637b55ced239f6eb1754f89473e2a4a6e3589500af567cd8f1ef915aa3ea10f0c2d6a031b1116900404b3e362a63fc5d655060b0bd95db95dfede9a6fa394d4b05b128a52d131156d32549938651b771bc97e1032a0de738439cb8256255999416f681d1f7174f32000901d5e68abf78b272e541fdcd2795f3a2eca67badadd52f6aba7c5d2f17c01d48062bb1450f739cff2e4a26a81cd38e23cd59e43a5402ea9e0cf8fcb00c71b611b7d95b2b5b0dd7e5ad61687943647400d75aae2e00da7902b25a00a2be7b47f13c06edba30976775089c4aea39e0d70472f993f755142a61d09174ef415fd96292a99ee2d31541b449c03d125586df9d98bffda6a335ea6614d7191f58f77058c432aff4c2c5cdd159c013558503ded8fa67bfaa000e956308f8927494351819af116202e6a59c0464e81ae4ab53ef52ab3dff0bfc3207c882b765635bfd8133750f1b99ecee1e1fc970a56c3097b1709c3052b71e72fc35c929609280a38d57607a41e76c0d751367defe693e500e83df4f392ea414442f2939aae8cfb82de78de47bc6843ba45a0508bc473f35a175f54573f554859a8b014559081ec76bc26e8a06124c6e47d4f4c2049f2380894f21ada77311fe511e260ec4292e3979bc167944169e274bd15e315cff480ec69bbb103b9a8c36efab553ebce82b6d4443a3c1ac9e104ac5804eaa7f24ac13ec9a8d7b2f66c7e09f87700d85dc2d4f295be55ed2bbd25f8db479a49e0943c452c31385edb087c6c1dcbe0a511b64168b0ed5c9a57ad217dd474fb497192c33010884ac01d0ed09b38a3e2a47b5cb7119833d18ccb1819a010ac3feb1c44b02f40fa440e5194cf8e79b877e32f6c24a540857b876194a25689b88d832df9cd4f715ccd0fc63c684269de6301c943b5f2ff0ba73a92447b58065ff1ab9d1d093029e23cd56d2fc262e3c3bca75518e2d436676524ce40bc97ad180d88894dd1ea5af0840254e13efdbdf22bfd5cdf7e6eba27f64ec7fe62f1441bcc72edf4be0b49b7b994742bf451d89a4be3dee280ab27f014e7d5885acd818fe92d14090fc09841eb90398fbbf8129977d640bd48630832966ad9354e1bb0c8a493608449613f35ff03e24e52fb8701150d6445cbecf01d094d0ee45ee1e4fc96fd799d3e5a92e88df9a9feec51b50a7a7c9caf6f26015476eeb021bdc754aa879c280954b5dc66322de5c33ce46584d6da388b118fe4b116e6121aefbadd2038d73b639694b55540f0eece878812036b276173c056cd3a03aab51cd932b781b752026fca696da6b0aff55176e9ce754d04188a48d66a9083f6ceb308653fb283d106e6d6e75bd3ba3a48d636d16fb5e2aca5853972a9863d1cd94a06f43ebe143a7ffbf1234a64a7ab711cf475e54d04797e1379401a2720b8fb903046e583fe41cbde92e44c1d4089a77111d98414f76250260543afddfa82eae0e2ec99222fe77db8ae00071f81e606fcc31de5cef5154b94f424f8e8a2881fc1b0de8847975c9e24cda0abc034447c7aecf13530bd3010f564b8ecce6e7c98109486d05c3545f90fb4f86a9791dd08ca366a1545aa88b9f86de26e1bd55d0f6f2d70936063feebef6500b4d7ec65e03da82882a3ca3267967827b6bfcdc597b9baec107d6753613cdee4061c5d9ca307855dac0acfa0741271b22c6e66d8537a0ede3652acbdacfb26a98a2102c42d4f226ea6b04041e5e570b5b049f04cdde6831bd407ee9008235d7b5f217c93a41b35ddab517d25f2a60b0e6ba5ab3a2b829687650dbf105024c091c614595762d580beb4915347d190b1c4f50f8ad705b77aeb3e759e3f87d4c307b321c59df91e5a6e8b45ccff5daf517d2602a7087755dda392a2d8cc78dc1fe1f5cdf7bc4c0a585346d436f18d1c20b8053e8d62001c7fd66d5fb1d10b72466607fb319d8dbe8fc0f5bdee6886a194e11b2042c2205bcc2021e213f96583e26763cc53fdc1cd18c1be90fe639c6791e6b5e8f3f8f119ef7b8e665c4f333e2fc8f359fc79e9ff1cf7f64f330f6f919719e4731ffa3cfcfa8e73d6ef318fbbc8c3fcf2398f771e765c4f33ba2f98d7d3e8d2afe4c122e5642824b523029842f8db8921640dae24a246289852491c892132bdd422458ac74442e7f6c731edbdd04e92cd838a379a46f31dc1baf5fd18cc5285b717b058f4b74244b58145a109a77aa84dfb64e24640ecbd84011b73859e0aeef2ced28faea43386136c7df019ccac8f20b6139a30d35bfb5accfa0f2fa14011ba84ec973acec726b99d69033aed65cd755745ce7d11ace65ab271f33a5799883e85f4fc2db87de669e4417eb0c1a320e48b9bf40408cedc6feee1368448fd09dcae1823477dfa7ce8e1e6fb539c19c5c2ef1b139938b8ea81f7e6e6251714c063181de73ae744ee958be33e779ce9ef59b7abe6bd60733859cc512732443dc49ef700ec56d6191d7cad5711df317f4fef1d760a9b11b0c1cd981c3a91b560e9bbc672779e29c238e6c08cc67da1e9c1a83bf9d133fa9924e3ec47b933609c98b8d77e324008b32bb9b6630709c1d83981c27985a1771a367990018884e3978660143f0721384ab6bee4d8ccb364db801fd7290dc0e84a5ca268aafceb9d1b34c001844bf4493893b04b1b97353a949f42828811aeef5157d3ac8a4e018cf44684cf3113629206a659e07a098146983532a440e8b4126123dae9f4c385a6919ee17da38c5fde6938cc1871113d1d49e99cda477b4daa9a83d11d34e6bf1d422388396389ed36d4f4cc68b7a192b9227a6072322521e9ee88e4497f470bb2976bb932aaf2d6189da496cb913afe02d7f634b3dfdde2e154aa7fac5bd89ffe45f28d05fc960b3e94acc57d324d462627962071e859c7e062cc6059e81c5dd12591040e88c73a41a414a4afd0ce17afe30a572e2a86ffe501ce67708db314f6bfc5e0b65475b25135066b2d5d892284cb63be5750b9b49d1ae5d071d724cd84620ddba1d1919b17a214935fb5a37030d4859a3fddff693953b05db12c5123e122c168bd582f1ad56abb52a637c5996a44bc6bb5ca52b56beec5f34b7fc2761865459d19e5666b9b5f14baa5b1ba78c3f34daafa4d5a0fd4c1068646c8a57fd1845328bf9244e895e7e57ea77b7b8f895543faab1ea679ef7499c928af22ce7110ecef85396666cea1c3f36159b8add1ad1b442e3082b2d2aad215a419c24193bc97fc19e145fb4df0845ac6ad452de72acaaba0d305d3f5b7d398b728a552d2b10389d7cb15eb49a20326e1b7f4bcbcaf823f3e3ebc71f981b5f4e98eb6560b4df0b467bc51e367b7d0cf6abd5eb057bcd60302c2daa961598a92d322d265e3f7e4bcbf8adaaebe3350f106f5e2fd86b8cc568b70166ec6f6cf67bfdaa7cd82ccab99a912495d76549e0e9bc6395dbae57416989da42e5bc325e4c28d85942bd99c31dbf88f3def1be0f50648bc692e34c8689f3ca6839af4c95db6eece9fa8c7f497284093200b7dd9f61c9f3177bca22f6d41acbb2a4fdd4f1cbcf842acb2c9e4e992fb7167b2a070075defb260de694eb438334a1c66f9503709cb7bc6c61de5f89a5962d5dc64bbb334faf11c0dcc6bd3e1b575f8e4adc9f712ab65a7d4dcd95fb332a716b56ffb1d9f8e3d438e559c61fb21c7f62ffa26124e6639f24e663b187427e0ced93c41e860665fc18cdc71a16ec35fbc166f745f15d25ebd5b1ea2c69350f68b5a85a977c02e6367e2d2fa7f8a3797d9643ead6eed97ac1b4e20b6c95c3cacf67f7c7d938ae445a0ea95bbbe33b8c510e09b056344bc05cbcdbf8c9bc94314872a4fdc85226f6ab7fc9ac5c323fbec69156cab4e36b1cc7970c4923723d4c0c563e4c369ae32ae67295ab560d1572b51a7fb52a49daf8fa71357bfdc77e35ab71ad8c666a1e706556a58c0c2d16a38c7d8ce6fa55b97ad2f5fa110673da8ffc55f93541883b565fd648ad56ab5f0d6be58a315bfd2bc6f87a7d59aec818297fad3e06ec6ba8d43c60355b9dae95cbe5fa988ceb3523637e6606f32f66b13b335f9c91bfb2a4c568a58b45b67eada8b345be8b2fc79ffb2e68323f8e3419da52f9ae1f9f7c105a379863d5d9227291248dc6eb571ffbbdb69cad919489d15a3698b097c5de8c8d2f43fe926bfc18e982718de4f831180c061bc773ac126188c677bdceb1cab5c8bcc08c2f6a9071f938a5eabc2da82c2d281694f9f7612d2d5dbc7c79829a22252525252525f534353535353535f5f4f4f4f4f4a465ea49649153e45455d416292f5377d5e54b54545454545414e9454a4a4a4a4a4a8af4d2256a8b9497918c8a8a8a8a8a8a929292929292928ada22359650e6149aa8a752935a6d89aa8ada7283585151515151515151ad29e30fabaa55d5826a418d3f65d0ad1a6baa5e54aa5e52552f2b555355545559a25a505dbc7c798a7a4dd972a96c7159d932b5856a4b962d555ba4c69afb6b4195e517f38906eaa7d4a2ce9594cbcb58f36b4195545ebc78f1e265ea4b0935353535d59a32fe8c599ebe3c7979eaf2b4e549cb53d5530b2a4b0b2a4b0b2a4b0b2a4b0b2a4b0b2a0b15ab2a6a8b9497a9a72c553708b8a228de12c672cd68d03012f3309f147b01c4d060c617408cf530da18e5bc304344f17563ad1fe2fad647395d2314ac67fdc8c4ad0d615df2499821ab7165ae60869024ab64c10c194fd7c35631570b26888bd6c2c124cfdf7882168c1573cd680cb5def5e219e584b1627e435aac77d1c62ab78def1a4b5aeb04e7f82e90515a97d4020b32efe946f88087537c8781890f93a1519eadd361dcdd9d46eb649d22ccea1445511459e7eabc30e7bdf78e30e3398e23798e2709734f921ccf7bae60ce150d77db3dc59305231304568aa30fd30309ffa67ddb66bfc6c9e7ec04ff579e3befe38ffe5f79e2d6ff9927ae07cd860935150522d7c8d223cd5e1c21041a7fc5134810105ea4893133e4c55f7916bd17a5ff33cf5f79227947f23efea0efe34fb9c203407cf1e2fbcbc0bce84bbec933791f7f72cf027e5d699a3434ffb51f8e8fd3adf904c06bf7f37bc944fb95a690f633695ada8fe637edf735d609ed87235605692395abef7abf04d27ea57aef9425daaf3ca9fc68d74a7a7db45f7995684fbdebe35e1f78f05aed46097f69563fc620bcf683d7a6d4a07e6aacb9a3153228cfaa0c8d556312a312b3bfe58b70246908087f4d19230e462bbc9667555678df78df74f1a40f240f5e7bf131ab991894675596bc8e08e935afd568c69a6b8e35795665f744440278edbe4883d7eec7feba607956e5e7898c3f3a5ee7ef1f8d3f387f6dfe5ae1b58b03afddbfe39865acb97fbb544d31a1b6547df14265fc19b758197fc8a79b85ca14d3ca9432aa2cf3ec75de2de30fcfdf9ebf3f7fff7e197f74fcddf1f747a8f187c7df1fa78c3f27fcfd316afcf1f1f7c7df1fa5c69fa0bf3f5a197f84fefe3835fe08f93be4ef8f59c69fa1bf3f568d3f29fcfd51cbf843f4d7e8ef8f5dc69fa3bf3f7a197f8efcfdf1cbf893f437c9df27a1c61f15fe3e3965fc51f2f7c9a8f16785bf4bbec9e7fe3ecdf883ffbef834fe907f777f797f51daf366bb5939d6b816af62b26405252a2441227e12927824255211bfa040fb895e4e91086d88b8c58a948f998f353d68bfaba56a070e88f61ba37c683de3d348355219a5462be3d4dd6202ed77bbf858638346a3cd6617ea4eb951336864c4803113b5b89899e21492ca0b17c63bde6b840625f5e24f398ceb745a10bf3591a6254bd5e954a7ebadb072bafe17e514a5cef1c98f3ac717a1c41de0984ef15f3041fc61a2e863cb53104fb1857d94f299c86fb5dc054324be5eae2f67ab986ba884d35d4e5a67799db4ced8ad5d1ffd84cd6c9c23eb5b2d962b461a892fce7e2411398ae4b358a25fa61a674b73fec47f7d4b9eeee3f82f9648248e5f96ad554c1489c41f9ff47f69c088181401c332a2055930a18327198ec3296d50ba88c1d5021890241713e6cb275b2e5a94d60b6616c4f52d185a6c26fa20e68085e4e1b9b5fbb75516716b2349c40792148d1019dfdd69708e4be3bb46722432d68c25ad9c2aaddc9a15f14ac90298dbf8bdac786cc5729cf8fee51defbde338d248711633676ead74226e71746b4957ee54391ecd86b8b552a4dda9bf43a2e388b8adfcf2f554b7fc3bbb52e3ec5a31a5ce32c8ada2dd2cb716635d610eb9adfcfbab277f85156d851f6b2eed064103fab2fcd6c9da805975b5380ee6cbbf4efc7d42f4b952b7567eb91ae22cbf7595705bd0ea96c06de58bb36b02b795ef9add25dc563e133709b7b98d07e6cc8fff7ad8c7ccae136e2b7f35a3717f75935e24ed0911979604fb15ed498df6e44593ba3e2ed67ef789b3fcf2bae02cff7787a8c1d0ae964b756be5dfa971eaa4712f8d8691d5ea612b1ad058533e14d89334bf349ab1a67cd8ac7c3df9495e4fd2a0100165f52f9a8f359796848c3d49f3a0999820e33dc73b8b9d9ec539f3594a73a4fdc41bc4f599a1d198f1b3749d0e1364c607b795e7cd52fe5115ab85c286dce73ae1441ce72a6766804a71879f3fcf72962e9a4fc702f3be581b7f64be7c9cf1c7fcf2e7f557895b2b3fca39031b63ad198b9c8d0e6805618ee6cb3e89ccbbf8d68c94e1bcff42868c17331a301e8616b7955fbe07b134106384c2acd13042fe8b4f22ff05ed091130fe89f9e4c3a025bdf82732ffe25bb318194e5729c30913cd5699c58c9432bb59c69af25dcc6e97b1a67c72269b7939cb6761c0c4a1d56ead7c5386462386e6443c99ccb345038646c308ec579f04f62b1a1422a0ac623428e497e5ff001a7fc82f5fe7fba7197f5e5f3e6c56ba682c2b4c3fb3dc16981707fee37e4fe025493312e085b3ecc15996578ab3bc3438cb3287a8b31ca99ce5af9e9cb93ea3f8b2723a09ab28d78531ca65c5a801363e8efffdeb341c27b9984ee3b3d2a4197deaf5696f6d7c928bc97a31e84a6161093adddaf87787295fa2ae933f91ea4a1983b09c2e4e8d35e3ffb897e6440bde1acb592c12872d5d58a45f104cf9e8230ccc5732f3d668b85a4fc3e52ac771bc61d4c196731cc7711cc77795332103f0321332002b6e6d25fa8d219f9ca9b7e6abff71ef8c66a471000d8d14ee934fd278441795970d30d84709fa95a72791afd8c3684f5c1ffb27af273f8aeb5bacb3f5abd3c51daf17ced7cc834a170d23e6bf3e49e65d0f1bc51de238c21e0af9238d465012d8bb6834449a907b8a0f1363602f318625ee88bd70b660fffa24b07fd1a0100185a4d188f9d7930ffb24ae8712f349c68f7decc77791a78b3bca17ce12a664b96460260c4c84b938d7299e31b3f12c596739732c2e30c029ce62582ec0c079fe622729ee701103eb47181a313423e4bf7e05f25fb4d7af307e8c4623864663f5324f23e661ef414962ef7af369c4d06818919181bdf9505c2f43a311037b9346238626c4833c28a6c519f32e133333ddd67a96064628ccfb3042ccb2255e715beb61666207dcd6fad80c36fb170b03a69845a45ac5608aff731b2dda925875c992042f30afd4e9ff02f317e51c6de0002c5aa44c19c5a72729220dd727ca496392e6398e55e61f8d5564d5ad1aa360ab2fe60f07c7245ba64973772ad10998af562dd66ab380b8a40e236b014ef3bb8369b256640eee37ce9fd3d45b53838e6371ce2aac8f0293f4e4972cda8a2645065bd0eaa15e0491af5e9f99f3be7aaab7761fe7fccd9c4752564ccc27aca7196ba204f9153e64800119b0b2e5e92988468a0c37a8f5503da07a043d212289fc274ac6274424b57e457b428456a365712dbe83012451c5064f44400a14d4a22040890e2c600120d052011d047910eb8914c28606c000440782a4c8600b221fea4510eb1d26c9085b6c11445ef5fadc38efb348292b9a14197804910f4506ad563ff772aebcdcdb4a8007dcfdc91f1823f185d31f46d2a0c820721cc72ae4ffa2cc7c7c3a9f9a2881ca04b23ca580a5092ad31ce2424f8965099203582e1015450d653933536444923764cc25ab1dccfcb8484606fc00c0f567e1fe25c148034201f67e39fe789007a85c2979c0832fa79f7e8a23cbdd66e364cd5ce26c558a4fde1ae93297dc6deeb615d1ea5da78fabd9caf4939cfdfc258e5530b7f15b7919c3995a3d6c04722a2a066471de9c8e85015057cc7bbe5e5f96402eb324df356385c0c48215cf1f0983c149fe388e502210228e58a8a87e1cc7a7514a124a5061a122499224c9a7a7a7a7a7a7a7272954b1178c2a76a5dc1a395ab1428e56ce1c6868b82b293f328bd865e24201f379bd66bf9100ac51caf8445596a679af1c61925bc69f918aa41a4d2f2749f5652457e5ff56349c231516c7f948fe96f169fcb934dc1af273287d3083a019e224ff1671a39c77cb48a38d345bb4dc194ef245282821dce572fd0bf62cd8b3a80c71c29eb5723d8c0a0d6ec4742c0ca08201594e580c33766be416254c5cafd8cbb572d19ccab59271b95c31d72b2626f6125d23d548356219b338aefc3189937c32042412fe0334d688c07d5ee28ea4aa28c8254ef269c0cad91669c09e05732d30dfe25c6030264d9478167e85dbe09e303030188c8b9887c5c05c3299ec6131313059cc058c11ec590f8319623d0cf6ac17618c580ffbed28ae2f3f0663fd6b3583b9ca5b735b6cf6e32162cd5c34ac99cb458b018d3f49344058cefb73deff791327f925c9aa9d2b5fad605cc0048179986962e171029db1b22ccbd817981525f9321a6ecdf503f2d24da77918eb7faef377a1eea5c135632d61feee96cbe5fafc9c8924c7b1b65c1ff1b4316d2871217b32568103ec18adb81c67fe851a7f462cb7867c2aa89973a482b241c587eb2e9231bf28e748756ba408864a386530d1841a9f6e8d94e236120603d611a6484592359ce49351e6cf8706c7f949e535e49725950883ad623044ab723596230c86c5f9c311cb1f7df5e2456c2cabb41e3663896074c1701ccc93ff137138c91f43e0b811091f45e054e20e20f186fc5fc1b8c449bed388fdf8b18799c198d188c16233764542d1e08a49719c00fce9fab8c628c6207c54808f0838c9314b0d27f9b0584b9e2c2a2c6e234923bc86e412450bb4a8802c41ec63ef2478bef89feb613c0c36663949aa99998dd3359bf9d8ec4752b1ab9354e224a9c828d3f5e393585efc6046ae877d0b6608f62e172cf6bf2517df8ee4adc964311f231f8874d17ee8e982d17e4d4e1790eb491821b02f693f26a78b360303f330588c98c3082967fe637c3d6cb6c462b15cb318ed67e3e7fad7b348aad3f5ae999f2e64e50ba6b59a2919472be20e18bfb94fca9cf761c46e0d4952d570be46f32669b6fec7c34f12cb497e8c18319609cc2b482cf767a4ba2799c38c1a7e2b019ca4165da8a0e2a2058a1f2a254e92b4e2249f64b18c304572a4729cebc9a7812961301b4baea731649eae374f98bb8d45fbd93859ef7a114688cce9fad68fc9b91a5d3857e328a40098db289958ad56305f03862933038331136594240c1855600f13639081bdb368684a183327e2b9a39cadd79bb7f5335ebccc9491b97011433461620ec305132f6c464c3613cb130642ecc5d38c331f03c6f863940113e4050dcc9017301a1104329e6626669121236e11b54c8d4f62943815833d3d3d455d2f412f5e8060ffe3310383060386d788c96622ccc39891e70b578dd84f4545459140e6103445bc2b84988c349211e367665e84193203068cd7cb60bc139913060dc6bff81918a3d60cda0b18239a8721a3fdee0c8d460a315ec6cba0f91857e65fd090e50833a405e30a29db4221818bbbe3505c0ea70a712f0b6525ccea7663515a5336b76b4642bdc0948b10e8f5b4e80093054feebe14cced5ee26935ff9a59544d7dbc4757fc419db40e0d519c59f51495dcdabc338b877909cd4375d5bc55d8dba92fe96f68feddae9af7bb4ddf06cd4c1ae872b95caf157f66752f07fd302ffdb06553f4b3af4559cdcbeceff4b350c549d03cc42a9b998c7ec5afdbcf6dca36fd998346ba480628bab8fb6fcdc120cee1dc726e3a365e4635cf9655ccdbb6619bb23878b3a303c4cb3a76a80e1d3a3e3c5eceb10135efb613fada5469c8b63b55ca6c007a70f82af7179e4870f7271e8011ac70dcee35f5f130d0965bdc6e1f9bbdf9782ccefb2667b6ddddecacaa9ad76e21bb4bd55daade0857259b93704d559b8dc727e703e4641baaad4f295d6fb6aa757b1314b65bc8cadc5d688ea00b62a29cd9a4a035ed65d4a6aa286b9457a50cd44848dabcf709042804a66b4ad4a4d51ca48b8e74d191d4dd7d4446280e2ad2ea755562b3af3572f7de9a9774129035554a59fd280e525ad335c5c0cc3e9b81c2bd6a209bd5455915a21af8eb99d51d5653cc8457e16716e714dd4260deb5e88ae6166796f779770a7fa73b0b9dfc9a7e9bf7c69f7d496b6e41b3bdcf2c6e77ea9485b0421e4fa3a78a854eb26f6322a8bbf376ee8ed726bd2ead48b26e1fcd6c2a74b2a61f142e69ad665fcbea16a379554af72a5c810075bb85354d5acdbc15ab78f7ed2ad43c1efe9bd22dd77ee7dcfb0cd4fb8738f8bafd619baae90eaf439915b6c2dee7ddab6ada84e616a39915b678554af7a378f7be964d77dfae39e5adf857fc1bfb7e89a7d55dd3ed57fc6bfa68b6c17987d5dfb8e95515f3febced9c99b06f8881bf770c59dd6274c5c0dfe9666f98cd37bc94cd6b56b271f726eebee426083594d6b465f5eefc1b9adb2dc43ea7fc43560333f0c8666fc35d6e6f1ce4e11e9bdb35b5b9e89a91e4ee2f862a9ab350c54c0fdcb8696b229bbdb5e90e482727b7d91c54b36f4d55e176e1eec44d1a04b83b9112cd4e7e07ef57ec6b7fefacfe1ee22615ff70f74c6c46d7149859560aeebebab9c404ae59d1898f54f4892df47014349b5bf8e1ee339a32a5e8ebf6db2030b72dd6418a3b100ea493237cddaee9b3790714ae8fbf4d7bdfea75c5bccddeda35152aa5bbb4cd405f9bb2f86667a6b44d81291b74b9fb76f79f9b31a83469b5c76626a3619bf270100371f7212acb06e1695575f71f3f460c279ccdded220ce01376e5a53ece36116076f30d00ece0e8f8e1ba0ac83334fee417f747a403b383cb656a37849d5c110dc9d0537614cb9fb0b61704d7919d5409a30b159c2e46f1bbfaae6a6dff86dd6cc942abdd29ab69b4d7bdfd3ff3734456f7a1daaaab0f7bcdf19fd9efe3767b2b8a3b9cd6a10a881d870138611774fe2e60c163ee71419cd6d50c8b2b95d877cbc1607cd50cd58a13233f3e437a53545356fcded0dcd68caa4d9206e31faed9ad9ec5bd30f0271bb33304dc209e27603d35688bb077177a12db6d8620b77773102eeae73d3c59596975956f3328b7fb73ea534377d06a6ed2a64bf973e9a5b5e0e3ae5dfe97ff625fd0e5d8ed539ddfbdab4e9d1ecdbe99af63e68b3b7dda6c05405e6760fdd1d88bb8b382dab7dfbb56e7d1bfb1e97379b9932fb68aa62a67568b337dfc6be9b1b9d1d5e8f07e47393a383717e76783ce8ce0e0f104efeb1e516b3edde09f7cd6e857a89977dbc9b3655bad14a2ce6dd6e34ca625ecade64a0f6ddf836f6e1702dab8341e1ce6520667b2e64b8a22ecaa8e665a19ed6ec51bbe6bd3b8304812c11a78cae437b6756691d0a025922b98514c9c76b7170a74243ace62328ce44784e889c008594d2deaa81ec94a8d5fa88bb9f3fd4bcaed807240864890800065325c808a0080fb329303a0850401145d87240a3038d09540001211750905480135cc072771f3d78e07e4373dba640a0e6e5608987778f6655d5ece7ddaf98f72df6b53cbc57ccb6bfe6a07e5de4ee36f717dc24417b6bf34edb54c52b9b5ba7fceaaad994690de2ee27e456a554c5b9dc42ba5ba11ee222eece634ddb9dd1f7f15a0ccc1afd9a5ace3c56a8770e37cd1926e922b897b1f2854c95bb2f1165a023e77b3ccb0a79389abc6a6c5eb51a9487e2ee3bdc75bc6cdc1dc8dd7f48779c5700fe6d3e00bfd91bebe30133f0c65790a1d9ec6db3195553e1eea605f6dc7766eeae13d3c5ddffffdfe6c60ddc151911170fc474c0bfc58fe6255ebae2602b246235cb0669d22cab831ea7d33dee65a3d33daeed65f5ffa5ab697d4a29fbdff6b25ad33d0ecd6a8a7b1bbbfbe866cc52cccd985c0c91bbcf703386c7fd841376faba575ad335fb9abee64fe0f1b51378fc9a2ae5dd666fb8c568ce5d05f714dcddbd3ce9bc056c39e92d5fc9c496cb88ab18628c58ea903f3ee6408ad0ba65b9224751f4eba211d287e8ad1d2bbf2e8ae2788988624bbca238b25ab8e2155b37c6115164892dbf22cc6dbc2c56edf522792f39452445f1bec42baee8f29548de318be2ef8ae22d915c1a57bc2cf28a35b8a2c8baa2115186288eb714c16a6cc58831441146398a5444d615c53be6c44bbe5c3c3726f628c5958d31c8bd64ce0824e3235a81f1709df4eb00911c6be4ea8aa3af1020be40f4eba669bae822295eb10ab1bc3844f1aeee1d457147bc114b3176efbd2c20e28d7bc92be28c37d88cd20411c60508770771756788a4388a7e8feebf44d26fcaf2d789358c3e1381e82b1177c41d459648b64418718cbab7c48d22d028de4bfe8db96ae24a145b38a40f198e785facf28aa228b6441127decb829125ba2e393289b4db34da4417ec8a654bbc3fae0837843184d147176544d6bd220c698ee49d71ef155922d9135d3644d8ea8a2b31e647144551a4715160c15c57dc95b1d6158d88a5288e57244522620857c7ad7161b77557e2285ef1c26e8b14c7d5a8431cc59ae81263a228ee1045b8afb12596a4784511278aac18774624afb822451d17268e5704711cef252f29eab85704e1be449758925714459c18c27db546912c4951147f5e94691a73acc4517489248de872e1604b68882092408af7b26e2b8b260c1c181151bce21545d1e62d0fbabbf770f723ee5e7313660a920f885e90dcfc93a4e85295f4c30ba840c252e01891628b1fcd9e7023294e908d66571450f483362ac23f2f28fc20820e84e01a383a6634374052c408f183616cf8fcf0127db0a845cf962d16d043e5076edb828508365ba4ae8dee013a07151c1c39dee606226cf998085464b8702a2f9ab86e85833f1983fbe88eaeb9c5bfcd17ed15f3cddeb2bac3ed9ab2c19b8c6a5eba0a59525e2590e0a9a60533ba5aad19aed66a1c61c4925e28a29535d6ab04226333b1160062ed0833c2945a62e8e18915735b2ed206260420093cbd92c450d226e685cb4363858414593c42f074421121590c977c91456a56f0e4021057b8e00b970461b4a9e029c7910060c80409601cf2c2009e66b85488cdf4f02444c65aeed70e9e7407305bae1166b544128086174a5236e68cf0020f8070e168424af96587980b5bfd90b5749029e425566078b1aabd84bc4cd05d12474b070c1af861080c27b8e146ca9502607982097b098801464746ccc0d30c9f175e2d1dac571933fe0c0d1943780969bda02304a492088d20425e2e2231249407d59349daf8bc5a3a5ec0b05eb02034161ef0f42a8988b09be169359a2b916584f55aed60e1387dc084ae1b2511d6ab352306888c0864914bc64c8d2438ca5ad111135e7895b7d60ecccecfd0512b46b64058e1461f578cbcf13f5aaed68bbc59a54002fd105734c6d92a068eabe48d3aa29eca570cd7cf0b539e44184f59236d9036581178c211430aad72ac4470d9206bc8e48c21c0f074bb11c7de6823c75500682c1c40af4a0c2720812a2a2b13884010058802c5692ff5324fc702931594244182745404052238a09d9a092590f0e41146f8e851020d84192d2a2550a2ca038c04f1810b01460cc6c272650344485509a2013f50510092da8d04f4b05be10655e4b4016e487b3d76bc5a52384cf97139a1050252381d3e326660afb25583460630c024a34645280c0909b2001b083000175b7a3a30010944208a0a497e7c6866c81354e920498f137c5c2d160316b0801b8c8a7aecb81113b1b83eb83db85f482f5fc5ed72a5586d119fb82bb84db8541063e29ee05eb94be34fb45186b0aa0133e3cab830c419d98b958b2b134d32e6c256afeb2acb4b8aa328b2dc1d04189991c6e88127b28627b2080b47cdc904be2073c0d36a156b99f0c40be40f39a48c581042b00af0441671c578d5a089e1c905007285510458cb8a95424a20d66b04c24182a772ea6986c90bae9fb10629234c15b1289e565b3cad622034f1146b6d167872d1c4dcd68ed5cd2a072818b0193bc040d2f02433337fb4c96e4a1ad91630ac7294402d1ea3ccc8a36c471b59c4c78cf5620df134c258209036b09c512463a4cd4bc82a470b002c10582fd62f36139b71c980c1680160d402061608a3151856599e4af891c0cf951002898bc9b064a438da4620e4110c8cd66da9d03257ac966cc4ad60c4882cd8b82263e338deb13596a3eb55831c5b485a2e648e5eb216ab258e2d9287bc21c572c6b8e50956eb11e229668817642c924629040319050cb4dcfb163f9881135a4e50954416a112d2163fc0614a90201f27fce8f50655dcdc3065cad692158c8ab6300108a846b801276a871f3d44b1822590f840062650e5e66642ee4607617bc366afc081172854c084111788e2020b4c565062543444c80822c888e1832b1c9880045c80920ba1865e47908989c2054e80304f5bfc80073b60b244460cd90a903802041fc800062870830d04c8b10000158c8a869630c11125e8401411163cb184099030e2031e784010330820061c7859810a3ee0812b1590f294d1a12032182f31e012451246706003454000871a32aac250901a19cc122648420109c0414a465940614848901db81818d263c06509138ce0080e6ca0080a40c00036486982c2d0093b703f3c39352e64a46f11032e2e1841124718c1810d50000206c0c1861aa4bce002b9264c7cdcdcb2c0a2480a32312d08a1c6141a6650a2020e1035cc307422c25fee5e829bae26dcb5c5f803528b1516d707a51064042e046e1551e7e68c38e20d66bb36638ef1638c2086706bb44018675c9a950c3186eb850b17a349cac0c4983033b119b01a2f99ab2c59ad91c55aad46d1377b030a5716b79bfce19edd9d869be411f7dbcdddaf9b640d9dee7bfa6b7ee776b8abfd6734dd6bfa3bfd36fd1d4316b3d8c77bfcad5e7fa7df0e772c374918772fdd2457ee6e829b6314302330618e70f7183761a6c817304fb83bcccd91096f72bbdd96bcaf555ab3fa3dfd9997aafb59dd43d7fc5969c5ac7b11771eee3a7400e9f8d1e1a3a347078f8e1d1d3a3a7274e0e8d0010404f403e403d403c403b403a40394038403a4e307e8e7e7c7e7a7e787e767e747e727e707e747870f90cf8f8f8f4f8f0f8fcf8e8f8e4f8e0f8e8f8e1ea09e9f1e9f9e9e1e9e9e9d1e9d9e9c1e9c1e1d3c403c3f3c3e3c3d3c3c3c3b3c3a3c393c383c3a7680767e767c767a767876767674767276707674e800e9fce8f8e8f4e8f0e8ece8e8e8e4e8e0e8e8c801caf9c9f1c9e9c9e1c9d9c9d1c9c9c9c1c9d1810384f383e383d383c383b383a38393838383f33b6d85bbff9d665ffbb88dae42bdfb9efe56a8df29a33df7c8dddfcd8be36daa06f7eb5aac6bd560b8297e71573193066616480c37c51beeeec24df1ca094e195d5336ef35757718f7d50b1166ca04c0dd65b8293e71f71937459fbbff4e6bbf66f5797cde3daa0ab56f7f0d2f336df6866ae04d0bec6556f36e7e74f4f470509d1c9f1e9e9c9e0e9ede0f0fe7e41f1c9f8cc393c303f2d1e1659d8c937f706e78ed16b2379bbdb5c09edf2077a771d3a5dc9dc7dd59cdb2f957fc685e59619bd95f75dae276cdc0ac0681e9b72966db575ad3b6c54056f71ebbfb8ebbebb87b0ee9ee38eefec25d5cc1dd5370d3a9367be365a65c13666f78ecbee16955c5374316b3bb5475f795fba571f71a6ebac91a4015cca99e9e4e1f5904f80293817cf1ef4c0a940ca20ce2d2eac9bba2390d26489451440167e34be2fbffb81ae60f8be2032bc79fd73f9102f5412bd6affec91317ee8fef82f8e4bbe0faf2fd890c1fb4a23d71c14583fa209a0bac1fbf457381455bd162f0778125aea53b8dd82a8049da58f12861b1d91583eeb3684ff745322605f62f0fba17067b722685fc0b0bbab32833197c048dff9a49811283c697c187189b79503993523eebf5a28bf6344a89018a0be3bf684fa314a80f125f860f8afdf83f6eaca43d8d7ffffe086364fc3b8bc5def57a12c68807950f9b893328ae174b1a1422925c2f3e94d75fd8cc835c337fd168bd8f7369fc2ac3fbbec208c585f159b4a7f1c51f37e69a418941ae2f67506250f9af9914197c04b91e4a0c7a3decce622fce6818213ff62b8c0f7bd64c4af9ac7718240f8a890fc5f517caebc50f5abd6b56ce5a2f06b50c603af12dce166da9caf07e95e1c31cdd5f25917f5947e4af5c5891ac08c0a0482950248d08273e6420c2898ff34211e1c4c739fe75aa735462e51c714ed828420d1ad24baa98d39c1e9b72bd8b1745517c124becd694b8b59124c9f1f52f7eb55aad562b12f633cf620554ac70775fb58d6e1fcd2c4637f6ed9a615eaa2d608bbbc7c000260c80b93b0c352f9b1e3c56ddcb423c7839496d015ab22cc04903492cc0e7be00252e23e2b20052037bd5ea0eefbc94aa3a36e755a3df4b9fcd4cb949fbde66b8fb5503f78ae495d694e871464246497febada9cd4e757987ea94cdc1cf5b18d465f686500f6f353a3568f367ea94d59e6e75bacf4cc15dbb3550c54c7ae8a4753a9dafddb52b66b150c9b733db7bfc6b130e227d0f9d1d610f20b79aa3dafbb4af89cd2990cd47ba48a7a658c8e75aa7bcb14ff7361d8e6ea7d9a3bfe99665739b8198c5419dee75ba237fcbea2ec56b9aaad9375ccfc781439f38703c6e48d150d1915385bfad4d38b87b3a8794cb39b8a6ba76cdc076d52dd6e5a3156be0eba2bf6936b7b0d30fa6bead66f6539ede1bff10ab79a73bc93674daa9ba131e0d73bb66203a546b74bada6f365d35b006ad7d9b9558dc3efee12eb75829ab3dfd3d70381567f6b6b1efd9bc85476ffbdbf9b6c7f5f4df767988f4381d8fd5bd9efe9e8a7d79f7ab5655156756b76bab0eeee18a8ffc4da76b2165b5af15e2dfe9d740644a9029ad1b3a70037ac3cf942da6484d99c10619d8f0011b1e8043ec002b0378c0000130800f0e54e090030e47a6b8a0830f2a10c003028610501691832e879e03b8e0005507807200a31d481db0d0818b0e2ed0e14a0f467a9071c34d1ebcf090001e70a2b444c5108546993b70600706ec90dbc14c40ac070cf40095002d09b021013c1e10c0c3e903950f01f0a1a607a10e25d04104b22330eeee3a3cb1c1890d343530b1faa8010235f8a000bf81841b5edc204303150dba28336c99c14a0f33e04421c2ddbd0050055012858a005304f891050a0aea4713eeee03f012258a014445b181bbfb007064e812a507eeee320465a83ddd264c9630393f0787494d98e46c7270d8e6b4afe96d82c3165d31162aa53b20de29fa4d79fdb75171669730f91bba66e0afe7c7f0e334635822861ca4d49ca6141d778f0128868f61260612062e3030018312eeee571401c315f79e9a917411ba0ab59056170d9d347bd4eaa2acee302f55834221744592cbe5729bbda53b371d9d1b8e6d8702a92c1c3139d9014c7fe3a6b497a21ac8dba1e294d5edb7a95346b5afcd40212f40b9efcfea2edd5b07b3afdd40167f66d23b36b74319d545414239659358de9ae2703ba0900582a278983a6936b8851a385cf58adb35035b5efe6516cdbc55a8d715e76eacd2b3fa75fe36dc3599d5c0da0f57acaa184853ee015feb76987dedefc8bb6f6fac7f6bd35777f8779a57235dd4f66e43dcc46654afdfe6e1c64de7dfcc27529e10f1e4050f458552840b0e64baf0c4052a17a88822238a8f284b4f7455da1c0dd4dc175407d3cd48d2d92802038d27423a1b1e3a1f3cba249b9e0d5d530d1dd49319dd0eeeeeab5029af3a03f556550ca4c712267fb3b159c2e4fc218d3a0cee80a80519432ec3235a083284c29b72d1d074cac20a2725ae380de14483d3132727264e476c6eb1faaceebd6edb74153e9b838fe6218f2907777f818909777f6a1280d954e3ee516878e232222e4c2a139ac424c4c484440e4c269abde6a0cebba62624e2ee417428e86d84402e23e2223459624e58bab75f5c46c4a5c5725737c702cfab2eba017974c52bd48cfe8683299b55a535dd8f8536fc299a81c0a1173ac141a32d548fde5693cbac6eb7ee7b696deb5415f3b26a736a5758415793e357f81c1f44b70a75eff3ce0637a56fc3ea74dbe49d36fd4d97a3fba1daf2b0534e1fcd59c54ca9d0c991bfe1df6dfa99b7a6fb6d56243e25a15e339b7b3c8eff1cff3d9d7ba9fabb4dd7bc84db7f9c5b48f7dbe436a7064949ab3f64f19aeab4500f55bc66a0466ad3a1bfe9f2aa8b749f77ba5cde0d3190b73eab7feba1bfe958ddf2b010dd16aac1b7d9a92e6f1c24a47b5cbb66e0101ffd4da7cb79dbf7344e7166f3916fa2b3f33b80844b7af0e881be0dba0a7bf9c8db3461b3aa62204bdee67128ce47de1624f4b6b7fd0d98db8d434271663fe7714637436fcbab514f9bf02ad6411b9d1326d205839877fbd721e97caddebd8dcd6af4b6bfb1fa6d79d548def6b79dafa6f6edb00d02b35eb3f6357d4ded770edde176d5ab70a7be76a832b17967f687ebf93725dbaadf46694d6d990d3e7e20ffdb62fe7af811fd72f838e0e3994a2bcdd292236ae6ad98a76d562d7ebf3406a800df134bed14612e9becce146bd53ac4aa73220111d6590dd22a9ce4d487b4484ae3e4c8094d3004c1a5a00d5343015402ba5039e01ba2b403252a2a116a1355666a1a9650b0f4048b044ca1a007768a5ed24c966eb8bbb3505a773282ad017317406b600fb13d6083389770dcdd7b4472d6824ea13f509c1dd50e6757c352d809a3eeee68129ad18ce65cb455cca4d960f0d4454d5988d649c31513699dc4669435ea19b542a39d535623ad43486c5e9b8c5a5da4b46a56850c4c9356244dba88d6494e9868ab2a06b2f14eb8874115d540a574ef70d1e6c65dcc21c6dcb1c8e572a5cddd05e0260b58741ec707312f87aafa4f38e16b6a41ccbbf5d4bc7d726e38b6566bd69653b63541047700b8c9028ebbeb7839896ed5e5007d09b9259e56d9dceb09778fb2f8770a7c34e7fdbff1ef969703b45336237d132a7268c2c3dd9978f0729226369accb88c884b132539b80be8d091bb8b26132a2e23e2f2811bb8bb33c9c1dd5d077368764a7b28cebea3f6c6bab346b16e370efe0996a84a2cc94124c112512cb980bbd7b8fb0d0518e6a59c8a795ae79673cbb1a99800b3219b773adc6221346d77bad97ca47377181397c140b9d766b83b093e7c66ae80e6dd0fd51d6e85401c8a83367bbbc9e1707bd5e95e73eb9401b084671f9022c154edd932936defbcdea83865738b898e20510284bbebde9adaf6cdb6699ee669f64667c747079a7d6e727c72702fe7876787a7a7a3d3a3a3c7b685aa1028e401733bd45b3ffb92da8c366955cdbe249dee753a15f3d2207ffbdbc63e34e5a5422556987d6c30f3d6cce65e665fb3b905dbaad7c79f0427890b66121f24f1800a27a860830a0da83991e4779e92943b07f8620549979d11b8bbab41609afbb9e1d8789969885916df3093beb83b14f186ae8fdb26fc0d03dbcdae4236f8edcea8aa6b1fcc7909f840213075c2447fcb4b9a8997833bdc6274df18b2b6e9f7745ec2c0d7edb31965f5afe9eb1dfe26bd2e6d9c8ffc8d9783fbd161cbe6a066834f1302d4b3378d87d560667b8090901ecd19450ac2dd8bb889a4c4dd8bdc447a1dd9e2eec123a01e2424242a777f822485bb076027944482bbb7e0db98489293bb0f8b2401e1ee4e7b1f999272191117d98fec880f3948711911977d4445935c46c4e588d0111e3ce6111b2e23e27264e6482c0b97117131320323501861c23482c565445c8c58311284d0108b55212fc5cfea9eaa0a7b366cf6b55949b7df0a83bf5515d7fc9ad654dcfa36f60531d1df6a708b51ddfebe11c4c0dafe9b4ef7c3ddb77b679e6683afb4a67917c4d9f72c0ebede2a7e9b1b2be469f5f3eedf97959452b64d7be9fa4e796d57cd4b75ba2dfce974ef6bdb9dd9dcb63bf5f1dadce3fd9a0277ba621f2f0331db2a613633a52acfd6fa9452f577935655ccd32a2f6d77ba7969f0fc5bbb53f5753d7a24f1d8ba9697991ed70c778fe676cd3bb3c1ccd69e970675fbf8d79c9bdabc7ba5350d063151bb714fbf2e03f1cacbc1adcbac6e91747684badfe97f0e0e5b5dabd7efa55f53fbbc552ce46f3a5d0e0edbcf99f5b5bff57e54989bbe977e16b2497fcb1bfb82bfea14052b7963df510a35260a28486187ce0e129d84a66083bb0787328a59a520928d8b98442a80c1dd91dc24ba29b2037737e2661107143152c4260518b87b53cddb2cf1b41a84c325d578f072922218ee4540dc9da9876f6322385c128f23ed9a9982f0e0e524454bee2eec91c4a3675454a54804eede1aaddc7d1b25b93b6bd482d108dcdd096a4485bb07716e1e81e0ee1ab75808874b7a1b1c2e8987eead43eeee52512e23e282c2942daea0f0247396e8e473191117d9cf0b148edcdd512062a20064a2f05b70a91aa232877cd040067218827ae229680e15f921c4e332222e4335998b30f45b64314433546eb10371c8bd5c7975d112c5097a6841d44013555b8c40cc32e532222e44a4646e83ca1497117191f90d112827e2e432222e448e824888412a554d776c3ecadd74fb4161effcdc8dc747881464c879943b3a8310c9795b0f0ecf2de716c4d9f7fb46fea1ba03e6bdcf5d562133fd6ed9bc66a5cc94ee5597c3e1783b05e2703acd05b7ee6bafab41aa19e91e975b314fd7a64e3a24dda32b46fa1c7fc3bf718b33db6615fed6ae195d7312102040744a6baa512039659378ac3a6d8346edce4aa9d023bd4d4ed92420ff0f94a373fba9c9a919bdde6f337474be0ed5fdce1bc9e3744a5acde95eb79ff3b5cfac7e5d4d4e4ed9f69bb24f4f4d4ecd4857fb3dd4d36d46fa1ec39cc2302fa58fe3817e766eb6bcea1474ba3dcc4bbaef69dd902e85a15ccee7287adcce6dcaaaf0b6df1708c11f3d8ee7d901bae13c4e85cf1b07bded6f7bd5699bd58cda5ea7fb9e06e2d71de98e54212fb79815f278f8756efaec6b853be1167edb6a7de4f30fd5cc7e56e171e0c081e36fbff106e63655d534859cb7fd6da7abd9d58cda14981f5d715ec244bfa3871dc1136c9cd0e25185c92303260f2577377293078db9230527a020f3134e103a21cb09133821689e70a4c73de1072770317ba43d50e851428f578f197ac8e0ee8ec34d1f42bf1a7ce4307b5c61f648a247948f177caceeee3f6e3eba983e7e3827e0ee3937cfa31d597ee4e047ec87037ecc10d423a8842017e69982a0254149dcdd7b5005b120fb79b9bb0fdd83dc0c7a0aca1214821d3f76d492c055e1a83ca1c311c98901aef49283031d547440e564a18388ce0ba02f510ca18303688a8a8e0e9013904ee70710d00f1d21eeee4d98e8de5045756f1d6235cb0669c2c486d52c9b9730f9f5fc9b509751cdc3e9fed694d70fe2cc3661b284c9afe73761e2dbd897b359c2e46f68f6bd6dd5bf1abdd913958352d613049a8ff494c0dd55354da1a78b7b532ef2697910494635109f1a37377d56f029429af2d4e314ecd129b9a2aaa788500f104ecff798658ff37871776f57a106d2cb47349b5758755106e2225e0e22e58d33cb5b8774d246732ee2e52052929687d9d629884e1202d440565db4525ae5cc0dc0dcfd856f639f10d5458faba9b54176443077c81c0e17c4d9877bdd7ede6f5383a3f529a5401cb5dfac520a7c15af99c52a2fa3ff374cdd804a0f2fd009804eabaa692f2be1602e88b32fd7e6bd73ad506754f3723965db5caecdbbcddb29ed65369853d57429e76bd3a6dc128b81993573a6dccc09c23d87869ca07bce91b37989d54db91ca05c6e714e8d9cd277ce8b6f138709f735ede15c717719377182c02d46719b813839a46dbaa6384fdc3d8783bae3a00668318303e4ee2d377190dc671b3f9bd35edaae194d8766288b7dbfe26773dbc38fe63698793cbcd9ec6bf5af2a6e71eff3aa779ad4ae29303365f42a993742eebed9dbce29ad297b93854e329ae365a6d516eedebaa903f71adcbc05e1eec01eaa8a81e0703d7ee34fe2c1839793dc54618fcd4dbda18c62e06f55d8b3d1e93efbda147f6f28dd3a98d13533d9ec9d793ce19a02d9dc66f475d2df76e6adb8dd40218f4d79afaa78c948f7ba9d70e7d09cdb58b771938d4e0e8e5f75bad9ccf4ba3d42716ef79afe2ba53b6d5521912e2787aadab733eb6b7369ab0a81b98d759fb7d0a666db76c2fdc315abc1e04ed97667f6db153769f4857ad86e56a76cf0d1bc85bfe6bcd3edeb864e9a0dea3e6f21e6e5dddff22dad3d9a59bd6a9fd29aa279e39d6db8e2cc0af79af3fa423dfcded0e382241915fd6da75bf83e5eea6b5af14d69d52a7e34ef8d837f6333bae60d1cae1a15e61d7c34aff87d4a42cdfada1b9a7b3a7d209fd9ec6bfa1a2035a3c70ddbd4e96d7fabd10951550c246f1c84c3e170b9bd7170b8fb9d51a1caf325d5fec6e6564d7b4a6bfaad50afd9d77eab756f2803f1feec6bf3ee75fb389dee6d7f036a768889fed6d33f5cf1f7d25753dc53b5afe90614f2b253fea1aa625e0ad42ddebbc78fae19e987dcacf9419a3d009a3636acee8ec44d9b19ee0e0037735099395633470f1c5d4c1c567c60babbfb20e6ee4e55840e4eb8bb9b371dee9ee4a62d06b61bdc9dc84d5b900d15b2ef61e2d03211aee0e0e1ee4adcace162d648993504b051c2dd69dcbc1db911f960963053e3a991258470a37577bfc1c42c01470162505a53146715c5597dddfe6ed35e4fb81fcd6d2ff5edcdde5a1e0e0259304d4845154c1348c7d9614167b8e2df19c8e22dd42953668f70b856986bb3aae260664a5bcc94b219cd6dacaa38e7e3b578e7f708d38614f79d5f57a4fbcf2a6cf67699b83b0c2e8352840f33073c8edc7d04771f62ea2088cdde76a91ab2265a34b1010b4ab010c502540e07132b58c0c958c0c10e00bb8b5de83ca0a4337353e444206bf243ee48b6c30155002a04f700ff8089a031781ee0659eb9eb9273e14807642809b2cb947a7a3290f570e809e985905b901f20cb4a6499e54bc2b7ca7c3894a690292540a6e474e4948ef08be1a7f4f3f9d1c87c54646907d220d2a214c72f889f0264c0199507ea0f2a0e3255678905b2a521d9d208b21f0e64bf0a2891e228c8d14cb68e4096244a921c2b106b0a4b59969cc8561923800100fe50d28492111ce91ce114b1a2480e365d8ad8a4c0c5a607293c49a1882d06852150406d21c8868a2062858d880f361f446c86148134844916028590275b488d2057a2045183f0b00dc00a1b0feeee424308e5d00021a10900b10208160b00b109522288c739c489fea0e247102ff821e4230b9b0c7cd0e083896d8a1e45f448b29d70e584d6a685bb3bab87aa4d0b39a74014bf0d9b857ba7409cdb57c26bf625695fd3db685f538ba639dd0d456d7b6395f7aad63b20610f20210f5e4ed284492fb7d3b7d92a06a6bc8cbe8daa77c0e17e1b9b6fca45df8409fe264c6cd014f76aceda376132dcbd1e1a6ac2c4e66d509d6ed866366dd7fcbb4d591d9a2e61a2dbb915ee5216fb60321e25bcc7a927d7e302cd6c0f0e7a8af049e2e36273cf078aa399c55905e253813623c97e64fc1809017f7c2001f625fd64016493012101714e9201e5e01ee4ee27b80ca8042f1fd21144018ee62b3c523c53787c3c4942321e1c9ee73179ca9d2f5e76b25c29428aca4e0e343c39057750263b49456e5cecf0ecd4767ec7ada0820b143a5774ac484dd181d279d2f1e9e8522154156a159a7491dc826685e48d641d42719066f30a6b4a4484e2a01589007c78419bf7b6dd2870f3c1879a6d7746db3505aeac70d7847d6d6e2167b6d7847d6d5e9b740e88739b6bf36ef3ceb138abbc5ccee5dc74dc706c6b936677be8d7d6e6443c3df5470d9d0c9dd7f2fdc4517eea2cc5d34dd45197731c65d841163658e29ee38b21cb21cbb4d5761d2c6ea6a836624a0de4bac6e6af3fa4d79c5b9e1dc74985ee39091d57871175f1b6735e3c8387edc9d6989a78b2cf174111c49c87048c05d74f5c831c35d2cb564a9a1324556e3a446ad4912aab1a991d5ac387077af21813948e8f56af4b61a9bdaeb94c56be6ed76b3bae96d7c6e3b3fff8f9bb62e33a52ace05735ecae9d055a8e2760b858eac1a875b8d70b8245d7b1baabadc8a79391deec8df9cd64787def63734b719e96ffbd91cd4362ae6a56dcaf2bed5eb5e85b44e67734397b31076cd409d6bca6bce6c2fd794579df635e96c72726e3d3b8f4b53f0e9b9fde83c4e694d379a319021ad59ddef5457fb9db2fa9bf25aa31bd2d5847ba7371d2b44879f84bfa1ff3bb5fdad0d669e537e9bdf38c80d0f12be26ada990c373cbe949978238fb80bced7bf07812fe46820a6c7db7a35bcb13b2ed7e5cbbe21274e868f58a9be8d8dcd32dc9408cf43ad908334610454042841964223011a148085f640fc2082318e103232ced0620a3ad403b69376834b42b9b9d6046819914d94ce87ff057be95bd110d8af67483851b374c68c2dd692e33a10899094c32136cc84a504256c20eee9e82cb4a2862e38b8d18d898c18612998d988c842348e0414642120931196d04b41c8e5c903d0a2150b121114230849a4d0335a26a1cbd48808c86130d22b627dc7339b3bddbde5afd56a8bf49ab79f7ad70d774e66fc204b5c999ed0d77df9edf84c9ceb9879bd05e13264b98fcad2667b6f7baad3561626303d46c4fa8c40af91bba6a5edebf71938c8627a3b171f72497c9d04253438b83f9888ce600ee28129a16c866943003d86624d90c2a3210686433b2b45b1769b750480642911e22d0dca4d13508950c2a326890e21494e193a193a1e40848868d0c1b326232482b625011834b0c266228b151a63409245aad417043811a800154c466a6476ad2239bd1e27ef36dbcf7abb809b3a8daea219f856bce42345dba61738fe9cf6771ca4b7b79cd412f83026721996c0b575a53173aee9e9952f50ce69c82cc4512f776a74e41642e701892b99880cc8512ee7e64d8a6682a74921671f71b2e73f10377a5244cc8b250c96452546439c868903905653226b2a49b0d8ac8643c321b590d5fd5ac6044c1020ba441218fa7bf87e62d24a2e9f74eb87dbc15b341e3534d2db7d399a8d4ba7b13973d299df80c1db249dfe2d7401e77c4e8c89120b2182cb85caec86808e9489024b9a420458a9c47b91cae8618b40dc873baab1c6c114d208bb1e1e483bd01376ec2ad2e8b41b16a27c4d67e741dd206338f877bb7756bdda6e9cb60a80c6600198c02b013c06620837d89cd60c2924a92b1888a60211690076bc82363c900b391b17470f7d10969842c22894821d2870441e6e2e22e922b521c63fccda7c2cb4a26dc3de81add451c570d77f1f6e801ccedd0906dd7203c783949a94479a5b4e2525148e51459f9e432222eb252e80731780f36a338e79af27a7b779fe1b256d9cad19ab9ace5ac2e321614eeeeaa519bf7109f524a44eb24d4dd45d15d2cb770f71fb8bb16bb5585b8a7ee841ab5c1acf07c560bc929ab9b9ab670af796f0d80bfed2d6c318b83418c03c74e71530efadb06ca582bd96a88d51119f9c5ddb320b564711911171939c50a81bc8f362b7d2af432d2464602c0ddb1b02123677ee000777719291b65a3972d8ebc47bb66a026c2e1929af47a23fa9baecd3be7fbbc845b1c4ef73d5d1302d115e79daecd48ab91aea64b8738dbe840766790dd1eb794893c90890f9089419908824c2465a3cd58e3ee2e731adcdd65defe80c9873985ac065336c9b73191a376cd4c41d65c64abeae90377ef81bb7fd981bb5fe1ee565469d24558768f231ec35d08b408c21d4d859c92866daae296d5443babbc15c9d9e69dfab616aa16e81520b8bbc740f602cac36911438b1c5caaa081fb120fefb030b34842f32d8b1977d78198450c8b2cfcb65121d2122ffb5aad8f34e5f5d694d71a5d535e75b577d2413838383638399fe3752ad48284368a335b24a7e66bd38cae58a3ed9a7dadf0fc1e30e94129cb116d9cd3a8d00702f0414d7684820f74c858e8b0d8f1c10cb040f32aecc1133d08410f20d0831f7cc0c3fe62e5cb93d3179c2f345f4c2a1e4ce181130f7860f220766449eb56a33774a7a8aa876ddab49b3061b346857b0993bc6aa12ba6408739851de04053548874a5882d5768b902cb1557ae18c2352a4442352adcb9b1c42d4675bbfed6f467672727ddc3ed041316d8402ea37a4da73881751159b79d6256c887cdde8038b3ed26fad103cdc160cab61b07dcb889876f6322670e7060031c30810325705084675515e226ba34b8f16f1567f6cfbf35d1edfcba6d6aca6b139d6e898fbcb30a7f537313fe8d3550ef74e7352be19daab8dd6f63c3a63ddceef46fdc94b22ce6fd33e1fd28d62a93d29afa78383f9b8328ce3e5d6ed5ba2dccad5ab7d35af79ad029a0a801aec12ba329cb6626a32090a7e4480dbad4e006776f757684b9c5688aae18089b99a8b0e1ee39e0b1519c89b41b17a162092a98a89881bbe320b71b17b1810d770fa259094dd9dd59450d1b246183b50a2a550c69b56f07f18a64565101776fdb8d8b54a1454635903623a1a9d00d7adc3d885b2c74031edc80881ba4ee8e4588171978a1e2c5c98b8fbb0771a698e209219fa288298298026a8a29a61012a7e071191197296653c4a8a001143498a281944803281a38d1a047032534a8d180c665445cba68d1858a2e4504e132222e3674710aeaba0ce9c243ecd2c5ec328319b86006553398c10c6898813a03262e23e232831fb99bd2aad9a667857af84bbc94dd6d9ce46f5bd53cdd6a3688ae78a77bcdfb77da42ba6ad6c75b87487f5b539fe67d8b75d1df74cb63b590c72d16c22d466fb9c5291b6c79b9d7cb9fd17dbe4ed7ea35c5436c0ea2efdbd8a7795160c91245145bb6d882812d2f6c61610b4c1454485182143377f7170891c206a614069002f7820abce08721b45811450eb1274e84e0ee1e054f14359ce87181152e80c20922453338e51fdc7770bd56adf729032fba0da26f0e9d0efdbc534af7e33ec5ed5cee0924eece015c2e1704b23e9cbba7e02efa68f3c62d46dbbc733974cd3ba751e1cee55a1e5eb36de623b7b845525ad376c54c59cd475eaf3ba7e65549274e40cbd195cf6aea6b3a77bb8342f69558acfe2e085c85ac5029edb55bfb84fb7dbcb4a7351b7ce0ef74cd4227793ffad886b23618675e66b18a95b2aaa68f66fd362ade38abd8f79bd58f33f05bec4bb2f184281023444c29cbe26f6fac1b5d5555f376c2ade2e0f9b79d9a2920b222498193bb9f4a6bea6b75510a1480665588661f0fa9d5454c1cc184ca444d0a986089a8a0870929dc9de784481705812c9126949a30559002153c71e739210a02859a7092d5253613ad29f60169a287265690630534ac208a1f3c3629a049819902120a142881822b28b082022814380551905464891984967082021e523c4b900005364bb0e09ee3390d83d0dca6bbd4a7d9235c46352fc7946bca2b4e290dd23aa9dd9ac8d9eaa27d43d7bc97b0e1be840e90a704c5414b04a16b46aab1c4cc12b125dc045f4c40851177f70b707142645521cab8893bc423125c045c201470ab2cddf2d62aef9dda2c54fa55f33ea8b5ba5570bd6eecb75888eb859b580cf4f1d6bc7b56f77aaf62ecee6a6ed23bb32adc09b87bea660b5277f7e2ee22ce8dcd25b0c462209b5bdc54e587b549a37f1435e365a6df3770f72adcdd06ee4e85bbd7c0dda770771ab87b17779f81bbcbc0dd63e0ee5cdc1d06eefe027797c2ddb7b87b14eeee02776f81bb43e1ee2c70f727dcdd0977d7e2ee2b70f726dc5d05eece84bba7c0dd51e0ee2770f72a775fc2dd4de0ee25707725dc9d04a623f15bab35bbf3daa62a10f936161204626373f03106a638e84b4ad56050c52950af43550751771f418f1e3cb206c2839793e42c244b15774f226721b91d0631299285842c34eeee59cc2c8ec4962c48b0395583390b699d721112351e90d55841e2c865445c9008e2ee8ec4927e56b36c10204f0950233d0e1a62350b83bb743fde4788fc7abe698494114eb87bbb662494c54d41244794ee8ee2a023424882e2a023768e3852532ce408254708391523a64019d1aa46e894185144c8081e23708c782368d29b677330ef56ccdbac92127edc665f9bda7c4aa96fefc8abfe160359bd3eab7b7fdb3d3b3d3d3e7afd26cd2afdce40e1de58a7cb6c9b62a113dd84aea9d29a02352fefbea737ef8f88802859d39de2a6dfea6b5e0ac4eb105535dbae9a07021b773f4298854640e0c4ddb1a820e0c12747b845c013c10849846087600410647177236a7c72846fa36abd6b8546227080bb6341874450037717418f1aa22090a7e46d6a3c7839c9dbbc0d3a84597c5413b6b8450a02794ad62110d800c10c0846aa2f5eb6b88c880b555596292a2a54419dcb88b838958ebb3bd553d150951fb8e2de0f40f1810f7c60e8eefe019fabe88a8900794ab250d5c3bc84cb2d5683187813c4401c8ed52d0e77e5071d20c19d77e51db758a8c5c3bc946bb16e6b6c8679a9c6012abf384c0eacc00129dc37c0c5dd772a44338be28ce252255d0487db80cfdd75b8b9012abe372f0deaa4cdae9a975b75dab2d906e439dd00794e0b303540c4730be9def14a2cf601e95153e301e42929d223890790a78487930ebae1c840bd71ec58758aa3d52b0e61efd4e9ca6bd32d74c2409cb62c66f50f559dd206eaded7f44a2bbaa67fdabc8d4a0444c9aff87faa86a99c291a19c092015f069a64c0850126a6403045032d5350ec6a58f3c6c093221810c2c00c064ca0e6b542231c0e87098703f29c2e20e5eee705a85c200775877d3c9cd9154966856a8a85e0888028b11d110151f24a6b7a245eb9008f0b88ef2f76d66c6e21f83bf58b73d32cfa6abaff96855909ef9d819f5bd02f2d4ee0f1680a2c8289db6e82b95c10c873cae56ee86e05ea76c5bea35c4e98854e6c4120cfc97ba8001516207277191dae1030c4840004544234c17c40070fe8d081d5dd637ec539b0010d4c0991c274c880bb3b065c88ddeb024558a0021458c1656502122022a91c428808b83b048438d24107bf7ea58400a243157fc011ac035c070fa201403cd1f3833b1577062cc01520c40e1f744880f7f083a1fb751d9c07bf1eb583103a3af8d50101a61020e4700003e030458819bfa1061bdcbd061a667077b200409e1220409e92a32090a704c9d6a81049f7d61d4c5521408eb8bb280504048e5e7020cb8fbb8b3e0cb0c4680a011470c5ddc5196a30420dbbe22184bbdf22417cc460861b33f0c0dd2f8c1baaaad821ea0a0adc9dec01015f4426703ff8e1ee22972b707892c50e30f871f73101ba160f3e12fca27077771723504404d8dca6bee29910a082858409011eee8ee61f3aa14e7adfc8ea2e6d7110a8796b7adb5929ab2953ca067fb729e6eddca643b55d332fb3af756ba3aaf85114ff57c9a18a04aac040aa2688940d522190da42030c38a4bc60c5939b11da17b6a8a2c250564161785185499524184870776742b39367db1dfa774021cbfb2d0c7e46f59ad3ed9ae6d035f376466f5be35a4fe716d2adfb9d6214c5bff6b4aea6b666f55653bbe5789d1dddebd6acb383a238b3b60c4c5b9f1cddabdaf7c0dca618c827386c6baff36d4c44f7363adda34044010401804872770234a0a801d7dda11a20e5ee0368400fdc5d8623274ce480184178200834881e7717800346e08002384088bb4b018207081b40943f78d9f243162a2b41fce0030d2e23e2f2c3d30f4a88fcc0f3c3cc0f64ac12a854cecdc8819cc6985246066000000000f31240304024180d870332b15815a5d41a1400086eb4548048268aa3440e22649421060180010000100000600000b3a3053dee72fd3fdd8f9f1efa4dfb7f7daea6d4d9c09a71b5d4b26c40dea111b8db111eedc60b8984ff3cd28edc56f7f27549d045d71fa06c0fc7bd03b512f5064cdec8cd20147f0a79f41a536d081ae9b70879d620f63e19174e74facc657fa7f21450f8a4fba00c455ae0d67f33fdf360231ee7d17c2c3613f947731978d7b9c6ce4ec12532a770e5e1ac9ebf3cbd690edc2fe5f1913abbdf0d9fd7e4ccfd6e798ddf9c6967f507692b57960f182f69a3dd9fd1708b0db0420c7f3a5e7fafc7647bf3f29f84f0abfec63947ff57471779171ff60eca26bff9a1b0c1d41098f590c5e2d0723daca683be05ef7fe8f4643f3e6318d96677424b0b1e36e2dea0a7f1c9eebf0ba2f369ce0d392ad8255f0ef0966b5b47e3bf00e34394642ffacb61be6ab64f0c13fa1cd3726beffba9c1358e06961f02ec3714f1586267c46d605fcc5030a3151235f9584ba6ea0220fa19f54cd47717f619a0d69036ce8aef1e54cd4f8e1f9bfa6d61e1c583cdefabe0b5569e3676c953fec3776fea0fc20f2dc609a6cbb54be857029336f3f7622139ad5ee68e2a6a80b238e33d73ea24043dde95c6ffa3c14c8deed2c4f14bc149e891851c3ab4d16bc8bd4eb78aff4a097a901d3e3aa2dacf3d288dcf1e5a1634642c34b0177ff0fc32397e4299e4b9fcf66a0a3f8269de083bfe93892fe3b9f67e011071efdd012e9f495c8a336fe08849452c7c2e55c3ff0e2c46bf1fffbf5cdcd7560d336908cc3d8ebe03f06b20143154008dc0e46497c324b25e38cabd00af90aa113d873db1dfbe16d79ad02b3b9d702360e0b7aa12224fc1f96aead1a8f15c3acac2120e167c00321bee54aedbc20d15588929a11dc1d8f1d88a25b03dc6c18474590e855d0897df0da97d35aff479665dfa3bce2b20e598a358a6e0f90980a8f404ec043dfefb677e42425ffb8071ec0e1cf862f796a1a5744843e0a01c2e8999a09781440c61e8a2c984d75ec362ebbd5c992a0a732b096c13ed0cbcb1d920056231515b7e8358047c55a174a2f2e0ed5bce9892c134da168eae994154cbf650086f8d46ff6264f9e71ee3f7ab68565abd54ce2c00d06629909fc6fd75b475590244c8b48ee8b3d817f7272bab131d0ecb2d0aa2735ef2e0d4df5f02030d5e30839ae08f96a793df173ac22857c20ba8c9e2719d81dc26e206b015fda8f912ce7fd99b715f5bc6cd0ee875b7f92f90f767921f8821f7b81b918318fd998fdfd7faea39130b6de09fd0396d0f90b3cae0c20ba82c9c546846d4d764cb5bd3849b4be97ecd70fd76b36b119840acd2cc76969d7558a14604c837021c20986af86b816f345fdbdc9ba617ec210f2edf64185cd2e9822ed6a05f115bcb992d826107ba07101aecb272a7c785d680506e2e9c31fbde0bfd23c3ecc46565f117fc4bc23630f9fb67244f00efe5087626334662902de21dd8ff1f1c2db35ca0375ef2778050b6cccfed9be2de2b99e19bc6d477fe601f3efc3a5f7a579bcf6b618626e1e4aea474d2bfc595e54d1aac11f84ee96dfd24478d6cc3991dbc24d3b489223484d85853323a1c30092a3ab5245ac3b6d0305e1201118e05e2287e4d12f0871549c1e06f2c8d559660c53aab0462b0f229b02c40399f4bda2774f15da6d76a3b2650764b7eed0b5a39d04534e83b5eea65c3d97318752d7df8667365357b8683cad5b49b515dfefc22df920cae53babb01986a8984ab9066ab7284827b60256d8d2865f22e2b3dfa65893e3a5801bddb2bf13045cf5ab416700a597aa8eb448a6d690e8dd5b35736ba60ea02d25ada630e5a66b7ac8f1b26357a5a1af538ac9e93d5758a90845f27f19ba6a0bfe2e09f5e54b2fcb7557c857e79b31c2f75f879cd4a382473c052292941797b2feb91985fcae79fa873d9b2f59555b30a4d18f350ce57591d40e0d1b556109958bc19fc37c5992303687842e371d77c97893aaa19d16b698c3ae480dc04882e634e09b150a8dd9426190db171b006f47890e9a9b6782f921c3af73dd1afe1b10c19bd1210145f47219daebc4715f45848f9c87d9efebac118e6f695924486df831c7fc36399a93f02d99364b831b8f50f04fa13a96b06b875deec4e753a64b03ad7b6856cb921847cd23db1b81db5b6b665c9bc3981f2a55c2e81ada0c9ba57827a492e8ee3f2839e89474c7b85ab06a9b0505b80ad0d64ad372b5d24d8c181e4c2518b00f85466d1630a16c21252cb848674ef83870021fb130ca6784cfdd682991d5b581834606e8db3285c2c16ec25824a80a5b0781b68fdcca560e66f542e22b0b4563c871885ac8bc190ad9d56dadee0fc866f36cf0344451affaa26d482c70155cb50d99bbff72a1800ad4e0b98e836fa819c500a1f60b20194ebb11b1974d606d9a477194a85522ca35aaca79aa18531245e5f3ed85836b0da28d288cec546de2196ba4901d823077e0223133c36d362373132f538ba861ae84bda9c26da416423153051a11360d0285c3434fb28e372691193b93a6441045fb89a4b0d87b783202fc61948a0692679b731a825c317cb904d90f604a073ac65e99b1a750389d4d84ad1d3c271bf8934487a1d0b0194137f98b2c7085fd05f75388e23eb874eccdcfbc1a1453fb47bccc0e783ac829e8221dac87e82680318afa83e4d2d33abc08b23ad1dd8f8403516090ea230df66de89e6d4b5b52381e82e33279661f2ff12ed1e5e1474c0ce0a43190ec0d70504bb76b29ddf58a93a61aafbb3d632014c5d16f1257ca9f20ad7e5f5b7c6181acdb197a2408f203a8fdac8effb95f87e3c0dd7c99e5b491e443e35592d5394b164db4c4c97a9a56c62d135f5e6c5b9d52a9c5a87c8c634e99d5e83d182516cf481523595e6785d44c1fb50b47f5f1aa4ec6252b33a8a23fd457911b0e2af2db1fbd41ab733afa73ebc8376f6eb9a261160a944ae37d059e95fd96902a9e9610d394e4e538e709a8236e8b9e151726791c6de23cdf27b7363da048f992423f417e0eda38d07ebcd446768c769ed06fca947181efb5d970787b40620ff2a68632bcc8cd51dfc47a4c8139ebd5cad8380ee9f870919730ab3b1d9c9d0433a1258957b95ec098c32400e35edec8c92097eaca52f9ab0c9db96d39bde0d0e773e32254f627c8b3cf0a5f92315375fef7995ed7716f30f2f6dc3780d5859237b4fa6b9c96a6f83d4d4b5f667cc1db04dce14693314a10bbdad0cb811fa86a54e6c91fe30f60b9a9d4e92d363e969595da9988329f95be64784a2fcce699cfb0abf3d336c3b90eded38f7c1fbc67f420b3ffb8ce87721855d3ff1775a5c062b1be193790d5daf6aad693c37139ff79901e2a6247ca31b5b0f267b54dffeaa4ef29dfc56c8d03644c60f14cd71583d788c098181f0fd35a65c8a1186d90f1ce6555b46c1f691df3dfea0026bcc6022bb277c21e0f1075699ce4d29ae6521013477181f69804c36360743c8bd804fa61a7071ab231576aa2e1f317f1754bf268900f4a04c34fbe354dbd96cd736fcb112d7cd7c72727f2fc00bb5af757c1b98bc88f80d29e96fee61496c91f211d02fca68d214dec36a29695df6dad9372529756404482f49fd5e021fd790a3d8d9eb368250ed5b1c7b5796bb53f2a2835a8939ff96b739fe24af57ca38c3ea4d4cd0afabdfef97062362e6bba0e83217e413e90866ecd3a1391c6dac533f6f331b432ef0c6789cf5be4093871d9ec9ac7bd12b27c87175adf3900e1e3ee09fe04c4da07303419c33eadd7bfbfa3b8ff73cd736fcd2ac6b7fdf4c1513ebd036deb3accf7bef6cbe84e755bcf0fadb1ea7f755227b51e48fbc17fc930a36d418790d1099fc489e8014c6b346471866c04a9a7b28b535e721d3823eb77e877e952ef29309a481f5fdbaacebe45c69859376f58b814927e8c2579c7d8f639b17a55cd3222983d277e45bf0362de7a8cdef65b26016b1b63c9a3a7c598eb272c92b23fc1c54e173324e7af00e2ab8f4b7b4f62f344be0e77cc766c92bbac725a912e7c9a7662e4fbd1d52012e80ae262ff35ff34ed2628abad005166d2fae2ca6030ff10ce82a9e50364cab762b4df453bcac26a136136d1ceecb7d57c30a826b7e74118279b401b48ca725b8ac4afab77e77fad7450b0d05438fa5759578d180e44d5bae8b5eb50bd3b88fb8b46e663d942ebc4d8dc265a57fd8b129fb12d09388f2a5294237898e7b72b5c2bf2af4751de519d111997a00bff03d0d362fe42d6d30fb09ff513f844152478abf9fda994c31871f677589efc650e5cecfeaf9587261cb9ef8b1a9630e20cd0f89f3db925def1170327bd35b8794eb45affd7dfd0f74464b3cc6b07ae4157149d090b16e955c23cffbd1572a460a79a3f1555dee3fd90eef9ee88e39543fb27377f006565cd2bd753f9c05446b5fb6156fef92b0d8c562390ae1233d98f971c68c00b98b5ad61710139f0e4e094bcce2476a56b35f5fa125285e54ed143d8484b92fa7a553aeebb2fc8f49dcca4f1ffbc296facc8c17cdcdcac3b154aebc2236b1589cfb876354f7a59150abc1b46da0c9c0b3cc0044b3a0f3c7814a5fa558176aad0a72df9f8bd3d15656b44e1938d2d3cdfcd93b13aeb60bbc520c689d64c0e104f99fd7c278a133b32c0825403926ec9b9233411a36465b28c18d76e791cc5f2e226a8c60258ff545e7388b74268fd6024af966ee395263cfd323252d82a55d48d77ed976da15c1a00eb8d54c1d8c5b3c85274453ed1bfe17df1a01967d4aa611bf2fe58802fa93f02819d24fa0fbdd785967066a0e9c317fa06cd9ee5b05fd85520cde10ab259faf61dfdf2b88f37475beb98a138fbd0dd5337c300e1f84787e9fe6c3c96dad6d07d5a09953c3a49a278acace63d366c051a70ccfb50773ef2943777d86bf737f3a98751b1d5f6c8d826a5b5556ef5fa3ff5799d3377ab39afc20f8e997b9c539772d4779fcf415a86ed1079ca4b61726b59eb6ffad506b83c66d9684d3fab7c378d947673f01c381262a73d5ad774f318a96b43d35e88f1bc0dddf4b2ddc595eb6868a3cb29307f0009d8e49aa9160e5139817bd64b77c892cc2841f3e0639b38f41e18e02c82563f343c47f5b98ecdcde6f6c07276d9af8ce4cadb264885568bd64912ff6e7c683f49e3d3f469e85f0ac5cd98adcb51948da0e7663de1f49b76076fc021b9aa9daf212897b1b168378a67585a5a522e5b5488340844daead6c66f9417d4f3aa5baba3a285f1b3233d74d713f18e53cfa78534a697c3990f99e64fa59be9b2ee40460d859bdd1ac5668b23807947972eca9a3739b552ed7d6c08a7d0a59642a49ee6ebc2603e0fa23a84d22b8f2f2bf1ecbbc474eb4cfb9df76ea89df51d55ef829c7d9fdafb01231b10951afd82b868474c0167d94045f5d953681f7667fcc0b768cb5db8e1e6e21b64bb4b5cd3017e70386d71c0eb29f514238084de4cef947725662b9c0efc0a14631e0f0f3049c99d3389bf8b43a397736dbc5a47ccc067dbc38806fe144a8dd46d804483e063f9b5778ad85c5a03065ed0df9bc1f5e11a0e5e72cea6ec4462078c434d6228b5cee67ed312e6b8d3cc02e7341e9ea3887cc542e808e663b39e3b4021cd3e4759baa31fc468266d0a3bcf86912575709f39b0b9b834a795bda3ce5d6ba53c520942d0b8f6b8ba5b8d561e3c113a7a61814b12eafca56eba4db802d6f2cc863790a7e6521a23c6c60d3d7fd61dfd1c47e655a22e8ad0784cbc0053d9de429cae07e880a64f3a4bbcfd6c2b03b3bde89aebfc9d4df92f949653849108b0926cab8de573ac9d68c543180a228b8e93cd522f73d5dc50c74fc4ba6c1e91378232078d2fea4e208a7b253819ebb749b7b52bee370b935b8c7ad5957f32253730fdd45e7e9e0f8887f73debcd6bc97e63214660efe30717bb1d7a00257b7e53dd80f356041c2e1351f2caac1a1ef3276aa729b2e4c3fa0eb6de97bb7a4aec90399fbc09e4edd65044690807f5bea0b81123761ee3b233bfaa536611b8e0657b40a7f9371688de01fe4e3473d9dd989c7f841494df1a7343b31c659a253c05762c39b03bb29819d549068784daf67ccb2fcd00c79be8551974d6f2bf6b573ad00d88e838e9c12052f179466ca7a4b3036f2c254a632352419e841b27073c65bce802156c78c4d78262eec356cfba0af996cdb775c72d4495befde9205736165a61a0d56a8ba67887937212bee3a8210f79e9984955b4c6d327d5fc6f00f9a15a7fad1fafcb7bb0b77d90879dd09bb3ed3ff3bd19d8ef2392786ffdda861a03656cf9f5fdbdfaecc6dbe1791f7fb3b24d0f0bb67fc0b038e07400ee329e2e5224b6c888d08552fa6ed17db85044cacdc38b31a7b3d929b76e1acee35bd96afd936e669ea22d6ce96c3ef55d4d394ca06647e1550cf3f813ec9cd3ebf5e87cc4dfca6fc945190c73fccb290ea32e1b60bfbeedfeeaf40d1fb0135ff31d19cad652d1bcd3505d7ba49c5e02d15c4aaac9b90ade408c8d696f9a4d5bff2515527bf407087dda47e322fc7f470968d73d8be6e999c1cd34d712c1a8fe97412d8b2d7f1bbd137b41ba8becf66bb0258c2da5ea08144eebfb48b4f0ef87ea892ac6e2e6e6c2eacde5311769ff077f204b33608ddc7ee4d917e77e90db1093472e419b9bd4f5d245304e28702fe4504f7291de79350443c7b5998e2b24d2a889ca6c448a08e2de7026b4aa7a8e82dfe2924793323ae6b7cb7c96cdae5327b7b6033c755d03f3ccdfb6f2302fe0183d8ef3c47855f7a91bb631aa7f988b3964f737aec9313699a7f3ba440466951854bddf2088b2f15ccb951b60eeb2dfa8aea55008c9c97533109dd288e103987e200286ce35685e320ce8c8de73fee2dd859b9a77b8ad958fd761e1946bf013169eb1a7b7ecee78289db64482de0f78bad8e28e1563658d822d55419fcdceee1f97f754a07899f197c249bd6c1212f7eff0f032f8195d407130809a6b079c50d216a8db21a48218d1d315e16d8315731e85232eba52ab6968c3e665b6ab2f222c53933fb27af618257cdeeb4239104626062876512b2c490f0cd8f8480b7031f18ecd998b7a2ed4014153dc4e543fa2973cb5df1b36912ee642198907bf49d904246d5711470312d8386ce4976c833ee1d35fd6a8b80a75834102a0f187754a48913b5f3d5cd2ad87fe147ac800257c8e194759d29eed9d8ef3302d29adedf51ee503f8eaf8f408ef18a9793123d640eb414865b14d898df9de6b1c695e5f9f76dee2b35b191e869912054982a37ece7703f30b135f98129981c15d385ed9447798bbc02bdac40411060bb436c2325523ea9250aafb3bb18652b4f84205edeea8b517a96999f367f0a2bfbb503b50964129ce97c7c547f4b9ad4d6ca3c5278ed8416e5644525c716b490add0affbf176e59a3dcc00f1d881861c6fc9a63b96191d7d7f6c7d4b78341f84ad5ce09a93c7058213d7ee8e7ce74847fc5ecabcf56d6a02e9db99b3291b1b94ecaa8ae2465e0f0aed99fdfc8ac8fe4bc06cca34529e94a75cc2710b7f5657cfae75df3ef34650713a94c66fab6ebd5738d9eb4ccf74e46d2e35feb2d493e5c747b6a15fefe26ea83f5db8acdd6a74240e32a50086db00fee9e107bf32f5a148915a7ea86ffd93db83be3c63c9b2ffc4b3a6d458880d2802f6fb839b77452e560ebc25c034fd3065b7a9676303724d95dba159b1d7c6ec8f4a7f183141be4f29ff5cf09f4c10e3e50a9fd85a45575d4542e83fcfef83160e8d9553f034d5e49ef764a38364315f10daf879606b19dfbb9d50c44622ed06fd6ecf21d96cf3e6b63efac94ef0efa9679035002d91ebab04ecc647923dd9bd3b2b8cb72dc388635bcb90b29390a4b36cfc4a7d63cc6db0f30a39c1698417b3e8c57279b9b15961feb9416ca6ee5180fcf8dbd2670786b397167a673d3818b6997b1f7287626e9d288b9e8eccd2f85e4aa09d09fa9f52c6568823e6c9d8b56fcf173116da4f65800c725a60ce15bc28f1005e1ebe660b5225d96417b1416cc4fb286ac13f2970aede1a704a7900a0a096a5dd597c87d6bab1b08dd7a2445e4bfcfb42cc2d415a310451b3c89334ad4e39866295cf0a2ad41f910a309c1fe913378a98598d6f14d3f72aa7b58c70b52aacbcb2819833c511e174cc2bef1c529f90d2bae18b271b76bbc96d2c6a5fbd040f693208a1c1165fdb3fc396587f0d1bfeb851164967472bc31bd9325f36eacc6f80a6ae0f8467da8fedc99ef8de23048c7c4cef16eb1e20c6b1514e18ebc93efd72d3612d4d6364c15259aea67340dcc919fb98cb3fc1b496d635935c7d2bec0646c13862ec03fe80bf2bfb36409019b2c1b8f6346b3f26edbf9e76b6d6c31efa600a6d0c5eb79d03483f1d064e8f9b99376417322dabc4efe653ad9847a269d503eb17a5f25d8cdf539347751a26446a7a30f20f9a194087d9357fcb14b5aee32cc935bc76e78f6f66ccdf6ed2ab95b36edce1af9afef954ef00624214d0d60ae5607ab741a950658300426f4cdd8398bc5ab7fd5ad7f5bed0ea6aaf2e38e3a01fdb07efbae0dfcd8bb754ec0300f0a91ad674b0feb883a0f607f0034b0578c3ed4edc1b6c1ee31373987a81265b2766f153b66fa255d5385871452640eefcb06be2ef5a1297f40616fdb5e7cdfbeaf5cc8bd0750ee5b92d8f44bd23f698f1337316ebdc9cafccd8faa38d33b90e971e84871cc4a76a8d23cc7578c479e9e6f4a4a93a93f4815fef6dd7119e2a02c40527f643e13aeaf394235460f23675d388a37f95553b122c6402cf55401ab48bb88a23fdda7781c12e3518182e446bf9883f60a6a9d41c9fb9d69bd96af79694f5332f14e0ad7197a80e1ff3de811ce40c02b9cdd229cb8efe609562608bea65ca94817db1d9c385cf9c70e75135e039ce232af46941974ae05e0242f10094369746d7a92b08e214f6d5ce7df608d11847e1e40b0e6a86fd862666bb088d8d69878f9237522c8c23785a87e89cf2eb4fde03f8241d5703a63835b5d7d522b1bb2360728a17df7c04ca9048b3a6bf24df36333683099ae81ea29fb9228b4301f4a8705ff77a705f99e9215f47c18143a1fd93c89be4452204f3ac698c2fba2d178eab6b40923db33aeee0a51c20f32ae32f88f8ea30c4dca753e5ee9d6904f2a4257ee81324b35877a3677961c9ddecb69c59297d6ec1150580da8238f0f4f129c1d8f5a45f2150af903b0eadd13c3d22d43cba0b8b0d1f648bbad90b24de8c7552be59c199fc84c2f44702692ba62b0a00ab67d29c9601308987e87808d8154448e5c171349a2d3cb135ec2567b11d98c0d83ecc7d5c7fd4371635ed3c49792cd9838be948649f2088fbb263c8bb6dc80db403ddee2aa092074c118bcf468e5e1946fe8eb8ded7fb809cbf104b35b5f5f67338370325f564c86d224fb3c9ebabec43132ff807bc31c9e83a3ae19d577dc9efeeeafd0becee3aa4d7eb91b0fb9bbf2a3a7804a43c2cbb2840e30c7116376ba43d429a04d68bcc6535a3f0e29ddc8db8276304d673d5ac4288d70f5072ff1f63c619235aa2e6c351406cabd9d316475b87131ce239d78b7bb4efa9884286e418381fa79f10861e2ca81d9e1bd786a7bf9405480f0e3d1797aef5c4c79c0af9d57b5ac65dd527a7292bb7aab1146b3c951147cde5f7b8dcde45ade8d5eab27ab433e9e98bce3b6e1a7be4227ba73491267bcce6cb81ab324f8c45da7e40aa65d2534cec2a963dea64e5a00202cca0631439215d58735c156b1f02c82560aff96ccadfd1884cc57101d8ec62fe3da998aaae7965d75627c0f8e98eb42bcec124811ad83751177837d3e7816e403d91292713e9dc8ae1c7537818623406ac176a5915d4823a3880026b5c079b377419424c2226e812e51f035e8d0876617534806811813ee9febbbce2b1b7fb8363db3c76dd64bc7bd91ce008ee82f348eda670e1126c72735a70d200c2a95698500415f63d97efc0e131771aa19c62e5796260521c7ed588911c99e6c149d5ee0a039b683d885b740fccccaf8f590ac9c6efa8a58b5ad2f5b1e61a97737f9c006eed31fc3138d470d873dd723325d1de9924349e8611f0c599a1487f519802ef4c83efa9d7adbd92671febaa145136c8c3ace1dca803a0f6b07be03d4a98006717985e523d8340eb8e6699bea03a9fea9419d9e14459421ab2dae52577ec7bb0ff64176ee23c2685edecadc1ce5a987ebed83a2f3f46af165e8a39bd3641d0357664de03002b92dfef3101a9e1048179d24d2fea3e8eac1a9aff3a2bc2562bc4965d0ed5e57c3f926ba1f02694d0d558fed96e15d10e69a4be454d0ed86149c676ca896509e5f9c8fa801fa77cd29722bb4a44152d843ee27b6c6e424eba42ebc89b6154ed29a17c03df7f4de2a9c9f54f71e0c0707adfc4ebfbec245e11df2290931600e339615d8c706ddf5ae405ece579d6ef36f68137f9a3ac88432bf1241e7d902f83f0e3ae6f44c02ef02a893c0b25f0a17b6c30b431a2be1d8034fb48ba303bd29207f28a526fbea11f84864ea3ff641114e7054e56386ee9cdb7ac1b14d654adba2830c4ec672ffd3aa4d829738b3e637a0e2baf97a74573eff4477ddcf04b7bf58e50e8b2022c3f0093cb0efbc1cb8ab78a3546c4107e49a131b864065a584e21a2bd120f05f426357acab67c6a4253f57eb95920904caa10a8484267816f705f67906c98ab1bbe516f93ebc8ceb6600b47228f881f521c6d497a587f1996448e764e05620851134d4cbdbe2f0a645828ae4f226c970724090a4afa2c687716815f823fdcc9bdd716808f6702f19372424e90b8e4e73e49a799d57fb564d921c4dcbf8ff9b5ffe312de3389c721cebc3da68076bda66255f3c219619a4fbcd63134798e57caa3e377bbc25dc8e3819d62b244db33de23e72e48207774094128dc1daa23620cd9cf86f03f291f214cee89982416f2e28ccc99121fac2c0447f0cadf6936edd441e02f6f0e33b50b3c3dc8c7dbb049a006c47f64dccb7bdf9a3188674510b8c9a158718bee4257a54c61fce666e0498879a47deb9938fdfb350fbca1dc3dbef041884e14ce424f5a8ac870148d1018bea78a2d36a29bbef959afeb664f70b68e211e6c818d9db49aca0f450fdaa323b33d9cbc0d00c8e37d6164b824c25b000a23000b83557adc18714e9b945c50a9d6acd56826c5f96361c231f6eda020f798d3c9ff8f64ef467ec8f45f8b90029bcfbb3c3bf4703566d9a77b9c7f0ab3143ab70ce27d1b2761147bd2acf8c61016b4da65e9e867fcadfb302105b666130f619f1dbff8e49c0e593621bcb35beba6ebf27f574fcbca4c2ddce4c8ee67597ff794afecc227662dee92574070b49cad16b4742766961959953c431d3bbb0e30652cbeb0e47a9531d514220e98b0a23c0e38f2c8058b8088c528561927dba1ec53be218867ff56cd04bb7689cfa21673a5106f5888e9f780d48045f267cb2f0857d061c0201fcecb7fbea7f6291d6413dd20dba571b2f862d0471258503216022466f15fc05dd5b5eca989e77a4df1143b60f9d52dd33891aa404eb062d91d1c3ccde6fd8599e6043b9446adb01aa83b159731818179e0b8a0a8d7ee691ceb8df8606fcbc721f83fd29c2478c9fa7d893ef03b556f08d678ac572c61a6f9cbe1f198b03f376a6fba7cac0aeab987daa371ee85aa3109c3e005df7ea68483cafbfbd5443b641f27c7449e331ef12d58835841ad37aa0880fdde1bda305370c5a9956fedad778d7afc99496783ea6b7052ad486ca8f8c929e8af11b678d72a79178ca9e8204de5c73772019ed161a0a65beedd028d71df484a1411ad8edb82525767152db1b25263ed1fa67ee90d736ce6e4f079480414f49d8683d31dca61c5e0b26bd2dcfaa3ca8614c0cc1f6bdb282ec303625a436dcab5e02117fdfd7e754076df71eb225c981696be3090cc7325437548b233d49f7c9cf2b7ad87ea5e4c77d097c716803a4cf37706c658c4fbfac72a04e8fb1d06903451e244c83b810b637867920a7d5a9a843c239626207cdd681d40b447f9a4cb927e178ffad0ccf74f2b2dce134637d19c1962c0db9c55ae71dbd706a9c48ca61d689b6100274374fea2661d549d3c2686fe18cb1a4a1809773ee066d3fa673e5bdd09b9e0d32645fe65060092224a5f406317c55e65f6e961390dbedd9198ae0b240ed47ef36870c410c3602ec10124d671807b266aecd04edf0977a1a2ef2010e284867e008d60340e75604616db8ae74a921d37704aeabc5cc8f4eb764e0fa6f5ef54c128c827e15d9bf9ebf5a0b5fb84e66130af8856e47b11bab1266e3f2b68e2cde452f1f962801f261f218ac1a3ace3b9565909bbe0c4bc04e545922446db95a3a6da4d3bc0dd023cafd559e7deab874fdba69c59a8c874d980df78f6df05ca8051b0579d7e68512aff555f442914b7a7e47d7b167d2250fd0d183413f64a590929bf90512cb34fe7f04654e7dea78c62c574a62e6e56c2f220759e253303ccdc70e6b7e74f8ce27d28a909da7ed1e60919920ac2e260a23887e11ae088d3b4e6cabc6d75de175c6f9d4544bcc869806ce9aa69f8db3b45964808f9f8e92afdaef58e7a31a5214311929a52448cff2cc4a9903de0836bd7eb7ef2b5a4ffd91c5634b337db9fb11d310f6ff8a360d3ffeb63295ddc1bae4a4276685de8831279d390c796aefd28f6c22269fbb442e7af79c2326265f7e0428c03e20059cfe55eeb8dc170d78908dd643e64a26e4daf5c16bab9728737e8f431929bf594b06640237744d02eda2beceee8ce2a3d23e0cb73454f50a4499af245f189da1fa1ba221593b31ad8a99cc9bc092f28b6aa4239785feaa01c0c5e593569ef0332cc7e5a62b9ca17644dee03bea0e2b7740e0e577aa0721744057664f0d27ce10c8558353138b7548e16322bfd0d51d39730af009fc70aaf1cf0d26597b4c0ab368f2f032209902a076ddc6b61c7b90d680545de5b84c252a829c698e6422492fb9a949b875dba5c3fdf5e500161fa89700824a872446170e97d6d9b6ed460bf5b659fcbb2dc01f7dee9be62ff59ec79315bbcbf3805f9568639f8c5ae3e978b2247b640c3eba902b96db27eb90198fbca7e5686650a8541e05db7718910e725dad332fbc739e42a983bd06f5022abbbeea61eb1914b754aaf683c6f83ab477ae3f096201ba9d89f6880795d72a5f37691d8b7b9b40e8f66237f9c0cdfe16a8a6ef23fddfd2c01c9aa3d7b27ba907d9a359cd44f7dd9c1f858511d3a8104f220602779075fb0cc2ed8d6cf827f00b9bf234814b3061e101cd7a0f82599fd7d82394f6f3fa1e617b5af0e9b32cd1cf026777a17e2fb77657e80eed42d897b8d383652e05d278f7f24a44f16e19b77873ed78a53af8f2a6f6ce69d64dd9e760bd7ef234da7890b69e2fcb572dba0bd674cf982d217a54f9226766f7aad43d94f6b31cd8175668a97083c0893519aab11d17e6a3b9546826f9e54a509e263192c4c6658a01aa4e86d485badd78176660589521f7e5a8bdea6dd184c2e993514608e757d7ae478f0b7984379b65e99b78773e9e44d0e9c9dcebff50ee92fbce22c4abbe120f427d1e3e4fe1702439ff8a9544f9ef96bcc6aaa0cf89d6f800539297183f19e33f6ff03e344c15c58672a06e9f4e7b60da89d2f3068aebff33621bdf0efa9dbad7cc7b5a80e9882a00a9c2525129d09468c7d31c185a421747eab7ccd9bf5002b1bfb68c7db97404b300d065fce394f346f0fa52ee270a9a6df3cec5ae510bb985fc1f9b53e0c4c3c64a23d923c8957b1ef4c621f4e867ec7ede90e598ec0a78b542adf8a0986393222da516bdf02c922a4037c97df5e3ff88d1f6243a5e5674d48c2a4927793d08fe9b9ffdb5edaf23a995137f14caf02647698172e36834b3f102b4948a4223ab2051f12675f9745b986870e0eff0c338778d4bccf4d74b2ec062c399a6ddd914301afdbd339d2fca47636598db061911711d48870cc611709924c9f57176c6e3919d6cd9ebe96cf7e967e00f64040732fe0a6f3d0a91c531510b0c4cc89381598414d24878334b6a29202429f31bcc5e3396063932baabe1bcdbeb7d808b12b8e2c370841df98341df7cd2882425f8cf28db93855fbb0e4f7db44ecc068b79bcf748822633bb04b3e4f0fbb33be7b90bcaa2c118dd5789f309520eb1efbbac2dc1a7396342440940c33c7290d008455cdd7cd1ae5d2e5640c59e6a54d2cb6a4a8026428e9e319e87d0693a3aa02337068538a808060d8cccfc2d0c54a78b1e243e7d15e41621b9ede0adb17fc1ea6f551283511685132e45039f7e7f621fc02b9b57e5a89a51a40118a7098c2799be2e58c6b7c1ad45983ce1521d07a9d0c190f45fc30d6806674540459c9525e4b59f9cb14ba9814d264ad734548ed919d22daa8a9836d509201a9087690a72809b58dada13c7e0b404b9fb3e1d97d60aae70265a36df194bc4254e8845454390af455a324a1877df385cacc71b21a2a09a710822330601d5e49f429bb7a2aadfd1c62ab3a12438eac4d0cf29732411e60a743fb472b9fbfe994780550ba3aa5c6f4ce4ec9f7c0edc48d47e09478eebfbd09d1f1efe0944fd51b5b8e821f1360b44c60e477fc037dc2c4091b068721ce453ad14437457398f3de11eacc7d8e25c8a6dea57cae639973e6f06d460ef860f1bb6f6c987ec2797371938aea3810de524227a86e09830c990892d4c53608df6403184ef179ad6063bbebfb6da06ecfb266fd1bc8afa17040101c516f095eb2eda1272168dd1eaa9a18df214576d5a8c6deb45c1cbdb5377cea12ccf6e51cd4bc452d9471f1b754a365d44e8388d4ddcf7713fa488716fd9c27e71133e7da8c2a55fdadbf7c43f37ba8bb9832f5cc546c6750f53d96797bf03b3bc49133778aff85041b5bde7819a4b7838c87a1051bece23492c60ad85a4be4da121a9cba7bc3c9759271d97e43dd1fad3d8405d8715a3bfe56a9588e3f7df6b3714a2f1f6fb04fb0e10bfc33440ee20c1a7bc4f84d3c2281682417169a2aac3c8a3b88005a3b370039e5d2f2d66d9b87bb5fbc2f431e7585830cb045859fc832be85b9d22df73fe0b01e102fb93f9f972f0220d34ec7a60aee8ded57fce1b365597ec296a7029f44efbc364ceaf7a766202e7e357f036d650d69792b6b8b749584f0f1df6bfb793d729b64bbe75a1d6ca013d19e59ee789794b217bf30391783ffaaf78c7170f4bfb2510cbb74a46af3f118b6ebfe369e7e4c9f606f05c4dee54f2aeee710bfd3ccf37f7680e349f125c13fba7fa3df89f9f1f6303ec8f07cfab58cab01f0e3a9933b03ebcd3b30d7ad9c0489bbf7ab4abe327b9e82fe09a43e0b6d45b325bb25d9d9baeec30dba9d0e1c33acc6016c7380dc536082a9f016e72bf2f376cac5073ee82855e7016e67d15ee397bdb1dfc00f06ce8e66474e1cac92b58799e1ff1c24b86888a761d411c42458b1efe95a2d0d9cc044db85636f01a8b2b70f06133e25f569b112b9be1071b34720bae785062bdaf35b1a418372b0d428c053796bb5b9d241e6c6302cea00edfb8e7868c246db88ac9f35c6e7634885551f9bef0144e7b1c1a979d96f8c37dcf44d7d7a7bfee84d4e326d48a4c82d5b3f50221d2a885d671865410e1038f97308d7a25673d6488fde1a3cbfb738790f4a1c4da7c773497876b5828abdcf21861afc46441245225db7a312550f5cc94b48ea876f49729da44bd8a0aa95ae88453d9d43e6f432a6928a2abf01235c2911f880725620c5a5eefc53d36a3533feb33b3ccb19fa18adc4412730a7da5cef904e409d76d9d2e809b6a1b0a234c0a679d34fc60afbfd55d065324273271d348294462289a2dd3617849a6817aa32501371150a582cb34e7eff6bf86ee3a8f768ac30bed3e5b465d7a5444c7338652e3ce5483f24d9587cd0f8d3c84481d0ad65b10e247afe7ea777b66119babf5c901c4780855718ca8ea97c197dc6db90bf8d4dfb4cc70e95a4a32785d7ac456981dcd8d8a87f6efb8c0471d865c0e8b2cd8fc3124ecccb010837120175589006803cfcf8bf1a3b1a6a8ec31424cb9fb871de46755afb31358f1c03d7739638ff641d443a8fd38d4e0c267320c60e1c24a25aa20cc5adfbbdc8685a3a96a2e9f3891f0b12ce8dced7a76b479a833cfe35059e91670dae41f4fa957c8755bcb9862f61c7058efde5d0290319d50df0483cb2c757ec388f46593f90286e7afb5ccbd2440f4b7effa6a66779ec083f504f47c9e067e4286878f92ee1452db69043c302f85186d30c2a1308dd0f460046048290cf384cf1fcd8ce2af90522b912f7245bb3128f0691e6e6d40359ef67d3e1d5f50a432547f623a23bf0402241a39a445260561c89081c2c4a0317e2dd63d5e0ecafb22ed4c2990e473578df5eb2efe3bdbdda084cc6e857d501a532d4dfa2ff7b7f0ff2b77029c92c7e18ceb3ef32d0963aefd6538f24a698886dac321d36e6bedb5b86b40f176546b360431d8a42db8f958e5ab9322ea4863829e01f6fd1d9ca8969acf24cafc003a76b7a08f27b6067bc03e1e69634f2c17e3bd80b8fba0509fa9c59c7d62bf7d054d939d20fc12e6fc0dd19c310cb5f7a9946a68728643d7ac377c3fbb27a9800387a25766f324b7776c8ce2498d8e3d9403ba413c1bdb64959e9953cf68b08633e1a58239b012fc98823051b9ccda76fb03eda8caa841069ce2c33727ed611d93e77b9fdee7aace5e4b3b4e5cba3e4f6feeedfea4e12f31c865ecdddf1aa3e5d6e048d8947ab9deaf33cf2a3a8d9f306b979a761172a8a687ad2d2b454aef8b006f5629fa12484650a58448a284aa88773cbc5cef9d656461daa238f3a2e24e2394ba2414887e5064b70e3dfff476cd7412791ccb1ea962e6d0dc7c9e232466c36f6206e1075faab170b5665c3700aeb0aac9be87cbe0d870d8f5fbab1197f484bd27de6329cf5db528701567fcfeb70bbde13cfd059118e2706c34d8fba49f9e5424c686f216556d0259987ff639d76fe06eccdf1a85765a492d47b48e82725625212a8a40ac8ddda16e22f2b6fe4c7dda1219b45463486ab0ae4dfeeb63b1d29d4023d967bf3b702144f84ee3e1bb942c63e451454212ca3652f03a513868fb825ff0b431538ac7a448ecc7df6089e06fbed6f7150f2773db1f26d86cc13d039863ae5e03733e385fa29a8c5ac94afcb8eda0cc529e8a737b15365c169411cf9ba390dbb48ef7179a1fc0e01d71edaa7e09319bda63c71ea614ddfc082fb0f0621ba815ca1daf7daac1f89a0f33136d3d39f8bbb5bc2ef38fcd6e230db7b2eed969d1197ba689e5b327ffdf5af69fc0a04253b27ec7aa2a30b2d051166b0bd2a0698428e29d883ebf3e162f269d83171bff4675cb99c38bd022aea5195501d33cff72844270c784ab480817609bc12c4d094278952293da54b2f392649c61dea75e98e455a8b10d6e2d5a632cde3e06768bb73e775054ef0989572fe66b8b60ac5b0cf35535f40007a72a19f687cba9e755a750fdbac231845fae0b43a7727ae20db7313d836bb34d36db94c12209f9394446c9e3034233a97c6c76e4703d6fd074a4198f4606505da06e2387f518019c1d710f856fe86800494710c5b30edf4796be5c9376b40b1a949fff269142867c81720ac8d3a537e30408b4e524e3accc734adf9d0185cb946975d95fbff268dbf02084b7a54948160b8940479ea8de4a2613b303028dd5ff611b4f4e9b9beaa2254140047b0b7aa9f8bcb227ae7158efcbcad12f69b01e9e3b2fc28bd31685777a745f39cd61e4d44e55bf3df338b36d3df184a89a24afd3e5322ea8db3cee11107c6346f037b2153d964cce6ed80cd9d6f6d251b10010e95b6badb170a8286884c05d70e833210696dcbe4d656afb1f7cfd22fdcfa75a29bc30bf8cc2abd1a6892838ded2421dcedb2531d7f76a4299dedd2c06b9aff595c79f7fcc5df5e873d9754b2f1bc58d1c8ec757caffd9bdf76fe16722e31214ef7212de87b9341767b30a37cf7d71c41e9d8df40873bf00e28fa053d5bd8deedd0eb29712b22bb9b78f375b3e637e3f9b43718bd19a4664319b857f66b0eeb5e526032cb2caa9902e62b6db8ad746ae471f748da56206e00fab9af3792462614697f1ae572f11ecd8fb6943de81bc19bb5ce76b7d51563344dd78bee04033bf2c8bd6b2e9f91eae2299d37c67791fcc07133f95f61c5fcde7f0fbacd7d7c36e4933cb7bc7b8dbecb84c95bc8597255879ac132a07f5373df1b25783e410c1dfe0d3e4acadbc97b94aece8f6bfbcc875bebfdaf402552dc09a21f1a1bd7a03bbfa7def8aa3a89daf5f3b81bcc5ee26a3a55089861f8f8e7ea32767d281ac6b638da6c278874aa3679b31d4c20adf83f55385e7c6dec6a479a577bf934b07ec665a6b21b0a7ba27e1b81ebde6ef7dd327178e287b7bda727a1679397be0be2bf8233347beb67f8965791596bad578859d5feb61beefaed07416a888aa580442f206293b462888237bee3fb8f3033ed860875cee893381586750434c2cfe1525aebddc1aacc0ea9234892578b813bf5f936edbc1132b26f8f4f51a3c93e24082ffce3488d4458e2f67602d7ece6ac9a22614c4153fbf51dbc6cd7716d117379e7d10d6092ab10b16d8562eeea988c92f0f5a717d50e27da9fc3d71101e3725e45f1d9c1856d6b471f40dca97cd850f97d12d6520d7683e2f866594de81555722228ff4bc8de6f3cd47655622fb37054f49201c2b12e9e5e767f8a736a0664fa887050fd8d74c19bd0e853d7cec1c57cf1846e24fe82c41c64444a8db340feae4a11d8202692b68d11d3b9f2364773c691c9d56485b0677282f4c35e349e1404b06f586cfa8f27c79b4c88a10f0687cb55dd04b3f5052706b86ca7d0df54d1f165de0484a957ae1dc35ed83b50f205c2f408578cace9d63a564a15d5a3b777b3f3561cc6d5e1018d23b93775b35ddb5257fc311f8250b2653e30940121d5a23b83f8df397017d371de6520329aa3900a0364809881212d6e53838398e32c3ddc85f46f61a7da70f5846a01877c8625e5da5d1e66483f78a882271a1bc40941a5236fcdcbb1ce17288ab32162776ed1e9b6403ba70ebfb1c6f9639c016d8c29dfe83c6c0b715c67514be1ef105a147bb73eac5e7b85d1578c4f1b700ca1912cf7cef9a086be2d1caf19c73fc072cf66944c335b68b7288d2dc5c1c044968a6f20be92686b6f95ba95e0d2faca349ad248789e9d7038989b4974b3b2cb4a7395d488d918a48f2874b1e092117b28e559aaf06c8b0d798033d472e241ca4ab703519509739281b21ff36955a21a22e9bbc1dc66a74cbeaf6e013284070f5d40fc67296c188e709b26b426641994c76892e12e46c62b8add4cf67b079243d3377645be07defb2d523be75dbfca532ef4fb8cd25cea59116efdfba25884d3e3bffb649e8dc597dbd8b7692463144eab0ca561beeee0557a43353d51f2233080713d8698bc29baca0f7f0cc39843bbb75f7c8fcabe22dd9eb967811e99916f4854f7f834f88c110c811bb7896bcabbfa35842ba012630dbdbb89b065b88b8ed46b76cea4d3822609c89b840b156463ae71b3242e09d474030583d829b6eefdb21ba044c4052188a77e99504acd9e51bca46ba18d4ba49185d7d6f0311623f17d3ecdca7eec4a87969d99fc8c31563ae11d88e0fae91b1153faa5289257bd7dc6d00a0f67accb3e3409a88a4debc18330e7037561fd082f1096a6e2fa5bf656dc6fb802ff2ead95b60d6a6369e337c7aa4e5a383fccfa72c8685763498340868f727fb959239aa02bbd24e1eed7686f025bf8db96b063f0ced41e6a781cae76c606793e1a48287ec5e79b2041bd6925b54aa3b83df47b989a6611d960b7a518f15e80bd31420e87b6dbbf794adc77a2d287642f97e0a7f80eea1713173551a1ec5af7f3de3969f052848d3427b5548cf3bce0009f2a821843516e2e180afd4b9ae17cf7b5796f35074ec7bfe901516b792b8dd4dc617d28dd99c5ef29215a399544eea9fd3303f6dd874ee093c69413a15747a5aa854a32be38e002552e9ffae739cf236baa1180560a22ff3b84ec652f17f1a4853694518ceae9608ca0339d54ef83dca6ffafcb792fa1fd961683218c7dd4d07b664c0a2bacf157c0bee30058ca342e9f383a1b5cc17e7f38366d3a2086c1bc13463c3d2b4fdf369aa3e97a2b7759f8f20a49babcf394e3a5babb7ed35ef2d18d62302b74e618d42e4cb3ce990d3708011b36cf0b939ecdff3c22583ba0412302b141cbfb7edebe93fc823ca576c76dc15af8c404189c93fbfff0a43ca4b637e3fa9dc431a4e54ff67110146312568b1b105ae87aa949b503564949b62f8b1766c14ee9d4674ff6ccb7af4f062c24f8bafde9ff85dd36c4b91dfeb1d97802bbf14896a82da2cd45f6311a9bcda37a6eeaa6fcec7d0ccf2844d2d67fcaac3a903388983f9e3578834d27e09ee5990136a7ee8817ddb0e577eded1d8074ed5071e072afec15f21d7f0f2da601ac534c462e2a9fabc30e349e200614f3169218a8aae30aee1cbb38b89b58a6399e1d1079dd4214afd835a7a06bf0ce7eaefe9bec3909128d8a511db07617df014bb0cc1215a3119acf2cb623261a3a9266f3fa97447cdf083130c77140adcd62fccdf25d782100dfe9081676986f6769c689896f226d602edaa6d8de0ed74d882d593b8f2cf38d056d4cc350a26056cf976b55e0710946fd48dcc18d8f5f31dccefe74bff128b3967ec8510f5bb46605a1626e302cc6c83f10b81bd7b29a99046a2e56444c143f11a8b162059e68f8b7454b75e3631f74f9f17941f3591e0be8bcd11f4172a6d2159e23c645bfbd662a7722f988e664e42d985c0a685960f78f663b13ce7e619d15b84134716d9cbab0671ff239bbcc21fd4fcc9fdeb737ad323f7100ceec0a0c6d9f7901d8fce55cef6113839a600a8b3d508af8596d5049f46f4dfe36ccdaf4d4a0a2a75ba2b97a7dd86b8103c4e0aa379062de932090ff0c1b50774a78c0a861e4127878c63664e620a5e982c386c4351521e8b4b825aec7ffd448b3b14942b28f5e72aaf322a5ea90808926d95a741b36ef7c987ad1c54bd714c84842561f541f7dc92d9e764f1fc0327d7e694a3a5a38d6b88ce63b96e73fd87e0c89459bdb956d0ee61d2693f671a663e524ed187a3e5cd74fe1d29886bed5cee4c0cc9a0cf77408c0ed9cb26afd2fc2df306343310fc99e694a9f675ac224d845a44cd9671ff2671759e7f30d2af7af0fda0aacb69446d8fd44503cb15ba081d78208170fa04b8cec062ae3645d26c9bc2310f6c68a716afa12a075183cd0eecdc72f883dabdae6fe3583a1a728e16d45d6741eeb57dc9e416f86221786741e62dd27062c06e4d06985f0dfaaff8eb1b8a65365ddf2755d0eb731fa34dff666139b6ff5d4a37aaadf6d1a628d859b059fdee59af735c6b34689c2dde165932ac43b5ed3dbf72852f6c5b339593d762f0b26ebefe203b347f8b53014a7c26626f0d2c06592ccf5d924be4a22e2f37c9ba3b3b784c8ba50d09e011756031b9d1242f0c10d53a91fa97d17d56d19f03619b956ba9e7c6267986c2543e4071bd77d2ecb6be5bf2bb266fb1c54769d5e04adc4059681ebdf7c4037d03b815438a354e7874982e36973af22db5eea6f007bad7336ace349c97934903f729c68758175447f8ab64b7b580dff5afed97bc83764eaf71c2932226e1252e2cf4f7aff5ae79d1720e85369f405d4fcae09d9df804b63fb30299ff1c27bea612b5645dc75313fb55a8bcdb10f7fddc27e9a3639354e6fe29225045ec64bf6ef2f13078d1c52952f840d10fc1f36439e40bc974c375dd9f2c6d107abb6031d28df8e9f849189db31030ac36e3ccb8f74bee1f795b72599add2373ced1710b2ac6ff8f0527b2b771a4812d9b70f997dda373c68dbb0fb0a4877e6e54249bbb71e28361b6958417ec3db5c35424abcdbd2fab0b11bf97c6093376202f75f2c4bbe7ec37f071d5bd36c33b1b46f78fc4b3cd553b6346beb4e9ab88fb3735645462cab7e5cde8f1e6283b2058cedc4d1e1dab355a687d96fc0fa209470c714d173b808acf6e81e8aeac9fae8ee47b03b44f5a81cfb5ba50f9cf1504edab8253ffdf743bdab39c7d1d35d37a2c58d023b2fdcec8576dbff318704823179320dc0be1c7bc2b9726d8208eb9c3475088af9a2633e03870988a472be993001a4ce0a63c63c0a4576ed58898f2f49e2b4de8033f152468684748399d74289190a4d2cb6a874d1fcca2fea84ece36d6baf7db1dcabf681ae8ab15e938d109550ab28d4c80a1d9a2bb33e476f294f6540c23880f6d55b31919a2fd592812b42aa56c32aa7e03f1263df8f06a79e7cf84467664bed4b8d7221d6e4069576f27e8342fdd766ca52392c6afa4816b1c91ed22b79f88aa2cbeacf709520b93c0cca8dd0502c17aca875125e573e11ff99c86f5e7f6e4ae5818b611d80eec595a47b05467cc7317e9363ec5dcf9c7dd77784b62952c27fd7e1a0c1c8768bea77afdd6fbe5ffe66f6503ab51593e15b0538c2587077b460e138497ceb098f02eb86176d613f9e840260d66792e4fa55d4b070c50481b4d10cef68b0a0d3b9609c320f42770e28fdda4c373b2f5db289793c478b1a8ee923b17b38206ad5d4185d5dcd573f43712cf68807fdd8bc4b04f50eaa7739d8b074364ee93bef1b7319bee1b80e67fb35cf2686ea47fddafe7f9cfc0fb952cfc9b7a7c17f3cf64e061261e0412f037596bc3eb7af5307a7c9d91f445208020c36d95ba406b1971056952df857691f2dec6d043eed4dbfda1bad5839859b178b5b4c2bed8d43e6851ab2abcc18b04bd38a24fb780ce702c0d3ecfa23698bf196869fe318606ebb5ee979a5b142001d2edb0d108199ba719280d51f9cdfb517385afe45cf76a8a15b8088b450e7d9661a855e27c5f906cdc52076486c02967c9c71a15d4e2792866aba4e1666089d7b594b1b2d0da83adb82eb296ceb555caf6523aff486dd2dde60c54bafe1d5a30494ff427c2f32f5041c9a93ea8748e09415619cb5f21d306e1c507413c74af549447ff72f587f8948e9598b94f051767da963168e18c791a6621902bb9ac429fb905df9dbb2a394b00ad3682d66ce33e78789464a2535bc4741822b7b6a54045f7855137be4247461fc97f7ad1782fde2acaf8e2f957d373c993bd09dfbbf0b4f8f2fa25c477dfe05245a7f7d4a1d64c359c43fc7ffab983ff134e5affdce5263aa20e0868e4a2797c78a021e45894ad3bf36074e9baca3c0ef0086fee749616ef3e4e554c13e0b03231ee9fc30caacda64eaf268b4ab292d8dbeeac2b4267210ab90c4d59475b8c7f43e00f4b8363db21bcba2954fb8d3d08db8e5e93214309629cd34463518c671f92e1fe0a1dc35d14c3092da21f0360cb4842161a64b87bf139b7c270db9b80ff24da64830ef9ff74b8e06f17a052a504c4b8811ed82562ea5a3d10235a99864986d1563aca8e0b6db3b11f4eb44d301529e466814b4ae93e6542a3fff0e216722b318126cc5e14fb9133a543fef5c2317516d433d3ff7af9a3f783e90e17b1c9b4b0797f427b52a1eef7124a70875b09f5efcb3249de8c22e87c69bdb0cae65e192419ba5a0fa1eb6f907a6000ffcf24f9c760370f2c7c1f25511bcf5c9693eeefb471df5c979b74728d29ea1ef32ef18859cbdfd217ed2e9067822037e9346e8473b4e387bb03a878ef3494dd7d2503a0c6066d5e7ab59f3691343a4818d745fb82d01ffd8f9d65cccc82fa45a06c187b40f5b14d2d45789d22d9865c657feb74f57eddf6f3352b77b0ec0aff58c9b80b97750d6308db5ea378dbb4218638733537e39be1ad8494d60689a18b025ec48c60da3f6d53148c265e9ef79b6ff33c64b25b79c69194dc359b5737b06d433bce7706ca213b862d93593a02b529c2366579ae74dfc01eed1d6911bf4ceda53629d5ae47f13bd060e27fef0c6a50e91c3ac5e8445bc50aea3986ce588b0c4e2a829307aa79532aeaab7dcadb04352fa998b1e35a0ff4280e19f6f07f08dd2507f61c58f210f0e82f94167c93e6890cd7fed17758c2f549fa1df0fbd050877f305ec623d2717f8197e3606e29656f6408fb3f1e7c3a0e39ee3b116762a9df1e3c9cd7499e8fe2d25a59a16a3a32092462e810d904afed480642d5959bdf055d2015c6e657eeac1ac295aecd2a8d7dead8548c3cc9cc6f31afa9835d570bd887ffc338197110b0e299bf59cd5e0695677f6291542db69ba4250a41ad8de22222850be0fe07cf599baf6b14f6f54e0d52f34c90f58fa5f40de0f8b4ad06728c8e89d56bd20d77e4236abbf57579cdc6cacd3bcc045e0a0b365bf88c3b6e4d3931e45c3ded799c09ab37c27a8f5c7154eaaac3ca518ccc4e383016f884de1ba837dda953f886ccad5cdee301a9ea5a4abb2531c1cef63333586f7e076efdc6ccde604f5f7a16eda230c2c98dbd2944d8be62127b780f79db693effb4a2fe9655efb67d6c2365eb0c3fd496ead6ff1f8fb3e473fcfc5b322869766cb08dde4d81cd9dabd910af31f03b50fad2bc8b0367049b1990ea9dc4cd8fe90895fb8578820dbe9a12a2d68f3cccf7892dc87e0594436fce86818f7f5fdd5ab94245c4067a8588b559ed24373959b47368324ba5704151e7cc1437555db5f0a281f8e6bad9a2c393ee59f3b5ae64582602af0a07b4633fb78294496dd430c7a5891fba11939a9c5035b08cf94aa126fc5fe9d3d97f804a897f48f6ee7c797b4edf4d5d00e6d2d78d5b206418ca5f906c3d90aca13c797ed3f6fcc25a3a0ec2a1849c18d1ad86a91814a1f869e33763f659a28246ae4c50014807dd228ded2a833ea40d7f32fae05a34aaea1804f45f827cae6d2745a253916d21fb8b6a44d27028a6cfee38d758a4312f2e8a8bb69754ad101b570625c1c5c6875b8267fc7b744ba25f8bebc2ab30ba72fd329a5ee2647f626bc3832a5bc06a1d9e984a68dad720c4e7179e46ca52ffb86368f7578d1a8c4afbc8fdac2564d9106783fd34e2cd24c448c5eebdb4895984ea335639043e4ce3d5d1a054d8be0f4f76a642a1bd8182d254d6f7205f83fb70b2baa16f9b533d5755364235c039a87c1f88b848867de6860d589fa0a4123f3e6987f58c9b3e7e11bceb17eaad4a6611783e6381c37b3dd63fe7ad981b8f1e762481951a61a22fc239f3d4b133af04ea186fef31640092b824a4dd6e03b3116a0005893b55975c991e7c31073246b428dcb424dc9ace562830575282559676b2243b84db88992b0c09d988bffa87f3fbda521cbfe184ef0c9e9891c0b47df2875c2ef1b42884ca55d4a820500eaebfc8cf8781370c7f43114220b632a000adc57001984e2db05a04ab6b7203b3d62582364642d7ca15e091988ca3b646227fd0e7fad03ba7a6b63ecba17dc62e3592ee947c96878a196db70ab23315432ec1c6ef8a56076bca2b6b52555f724c2d54b0e5326ab4455aa3e5964b7381a887f9ed7e70170949f72d5ee661cf316463c2f2f46c25d3fe0fe76fd492acb864b9a9f863afff3b676c326ea36d5db4b5deb26cb6998df50f5c3c97117e29007a7a3919fdc849095b7c87bf2cf01cce967ee46e61d5ae39a5ca9cad6f1d1d5bf60cc77f3356d7558218b38ef774162e6b2358ba316e77f0bda2274805e7599175413672456c30e2e3022a66eebec5b7958604b9b18121d05ca786c21d163b15d3e6ae5545e828689305409ff2a722312b993c1e16ea0b0f26612a89632fd12ab551bd0955b1ff1436477d060a2ad7122e4d674cffec1f6c80c69dc97f99cd555d1b1f418d8993064b1156d49f1bbaa4dee7f4f01578061d823a7794d2df7c2cf1393d8c0e340f8a2bf8903586255efc866f566c2d2f21a2f3672b921091826606d6de3ec884cd5c9b6817da400f18691f1706690dff812267ddcf682343bd6b1853a163f7271f9568793eeae31b88ea021ac1ec8cf7000cf556b12e04f0be2830901330b98b85719c783ab836889b74ce38b935cfc5143dd4cb6d9f017ec30b8aea183351a3017c3bd86d3073206b868f9152c1af78761d5d5b353edcd1bae72e3655daabd1170241d7e76084eae25e8013dd155692adfc5be0d8a0d14ddc789daf3e016efe049245032749f58463e7611d5f5cc4a6268888323183068f92f55d0dea3e5851f7b1f4cc857313e9731426b56ef80a3e521568c35b712fe1c7765473853399832b8115ef741fdd8ec814e8b10dcf2e5b0eb15baed01c23e327712470df78b0573ebe41296f2cf1e4fb615217f7390d20cc92ac975f43bf1ed553e045cce8727972b34c7012fc843fc0bb1e003eb8278205245c434116d5b344f6813363438c2f245bd3b0f46bf48170e4164fc35e90a0022a34359d6b3666b6df747a14e4198262874a20122c401d6760dd369d117c821353964cf72e39e85fe3d765d44f1f34858c3b1411f7f4afd5641f717475553b1b24eb90d7d6fb2f3d4b3b682205aed4901e3a8c3ac605638afe4fca2ce6b915f1f67cfb64afc6cd33768a7e56a32125d1ac33ec9ae419ddab8987dbf9ddd48fee3c04a7b318bedf96ceca2f105f7a3ca34cac9125fc0a63434f007b10b10a998ea87380d8bd9f094948f5359766bb2b9a2838784a3a77c3cf82e88ff5d97f521e67956262e0264cbc7d998f06ce14590af289c4d7b8cf0d0192f7d5ceee89e251492f39ead8abdc3c7573d9aacfa9678251b82fbb9b86a40dee30ede6470f039a02600c31e42e422ce8ed682471da2a05525fc10791904609afd971a4507c44ccfa31a2f8cac3daa35e14bed293851f91e6ad90a8a5a1c51bd4b38838622aa8ae135fc8d471cdccb461fee54c43dfa4cc7f8eab9766c29ba9ed7010dd33e71c1919ac29663ff8532eea875e21ad0ec94c060276f599e3188ac18021567c6dc9d784f686c7f0af10c0fb64f465bd806a4c5d9f2f8b635544724a6066f0ca950d7179a54a543f986ef6d4a44b02df980d1979ee9734b505146eb2bcb307fea691596b039447a58b466996e8f0cf661f7be072f032c2be7d9ae7b99a2e68f18d941e1093a0f9823961962b84670b690fe970e1c2df1a0db57dcc987c22456caa703eb5fbb2a623a3b63a844516c4332c026989c1b593bb24e775dd372cc685fac257db8276876ac529a93433dc09c1d7b96f07a656fde676e51b233311e6bf5c0140ed8c10212081683e7136bfadd51f65a74aff86672f1b6f17fe1cde7650b3e0bf705aa9aba39cd9fa995938a7c029fb0a735557c09d874192bf2f3e4f09c051e349a21f76223a301a15ed88861168ddf2f3c64c7c42bbd931ee54495732921e4eccbe47387267f0b282a8353ea1f13e11f98d90583fb0386253b919b75134c22280755ce47d2b8a4d242ba1dd8929a8f0c134bfb3c0524a8fbc39c0d3a4ee4fcec1acdc55e4b44b28f7af7db073bda433c041860817b7480a655608a6c091b91a950b6febe72d90e522cc2981f4aefaccc5db6b1f615af92e08f983463dad3241730c4e3dfa6ff801d5889576d72d2e56d7c0728f6766c00bc7c586ea082920b612928719005dd94a09bb45f2513a8915a854a72229d126ee401d98db93c562b5f74b80fc6791e7a35068498df640a0ae2e41180a40ac9d5b660f88a99e09895114ce00254aee8b2472a2c31bf593de5333bab3765b1c7ead2bb9906d13c0985048ab13f4de0a458875d23551870159d5e15969522ec398944835db01052619953b41569481d75e9fa8ff38ca9830d7313d45cc4a958cc50fe3d4875ac684dd2b930671070b5e674b57a9bc4c0aab07ca6de2f90c5d7e0a9ba0c7649b7af09404f4e928fe9cc5227055166d317af140302d3562f741f0f4c0d923e592475223d72519f72595b291c3091b32fd9af8ab5904fb4c118fda313848fe9331bd4cf45148ec1d6bbb6159689c653caaab0dc78cb719c8073eb598cc4593f8ba705c6cf79db80ecd1c7b499b6f47f03d39a5abb684dd067cab4b4dcf70814cbf4ed978de307ff75a70724598b5cb43767e5a5587c951ec5f221086450825826dd8c6c59ac943768b9c515e787b002a87bb6d2a3452423085ab70da140be3432b08b7b6699aa3792529705b93f411385979296e0b516fd41d833cb04270fcb22a7dc54da84b4c1362801b3b5d5109d59867a0ef9153dfaa92c1abc3fb3dc94f36520c6be4ce5e55e2ead6315ba84035ae8a2a5e71557e28a21adb9bd5bc983a9c29001b30927e24fbfe9bb62bbb36abef10700fd6fb12097c8c930c6e20b75448782f1456b46ed917ce99a1d63942f5733684df3456a7e86f3a51963552a5da10fdbd297f6c7cd05baf1cd5fb362e51f45f6caa2519f6a7e0227ff32bb5338b87e068cbe500993135d4a11c7e41f8dea32a558deb99f4b21205dbcf524ae34e0f9cefe2ec58094f27b1dbfee2eff51284223b4a00205fde32efdc6782f11709096841b64bcc060d902186d10380a65680735a880e8eeffb7622b36c548cc1084df42955542a33ff294140ec876aff77d2e1fd1f75628992ed8fa49971af83c44dfb3a260aa62cbe1b5894d8d0d7ef1bfa3489442635bfd77fea2bbf811f3cd2881f12c0b3388f1d830f2b21dec8a66131f4540b0bd9dbf37de7883a2ccaf17b01511101db5b6b03c5b96ef6617edc3ec5988ca0261926cfdf2965b7f09b68e39cc21e2271f7a493d3db54303296e370ff912e39a649d69d12dd1ff2f14a1134ad002827fbf8bbf31b78f101cca6530469adf116456ace15dfbfe1bb5011bb3510d58a3fd1d73889d4bce5826e3e0603f9c9a9401e74293d4cae289f1b0789f88fae3777de7e915f89a8b852936b74a7068036014fc6728855a2884161cc600343cde06270632aba279434c3eb2c456b0586d184467f61f6255ecc53e3153dc0194d008d445c9b44f60627dfaef760713105fb6ef177e569b655d873cfc0f286a9f7693caf8d36a60b49f442b0d89151e5586c61be2a1d80bf02c0401ea420a98c42580371dffaf7dc95f83ec7e859bc8bacc599f907d60b7040efb89371b6f8182819e9b6a6ee4fd23038a9a1d4b9bb77895aceb14fb624eecc44621c25ecb49fef09d6b9cb15225b8cb409a5859c70060893aba13a485dc4755c82eea2fdcef5bb240de89f6ed8bf309192feb3055d5c28ef1fa5d760f24ca849d69ad578a5c7330f8ed7f1f37ae1eeced6fdddb0dac7ca23ade09ef1eac9ccbc1af76e8c55718af766fdd6b725a28dc3af220f772376c3c4929788932d7418ff6608040475e6024c98383a24cbcabc50e7d59e6a689b4193725f077ca6404ca086e94cc461e22c7571e0487490476e7b24c8c0b6b5c261ad9052e18c911d88de009a7c30c4827f6b103a6be1b11f390815fbf68d613e7f830f65ad3a10c8dfd806d7dffca27e96dd71083061e7448ae39e513533df25d7b124d35484c2f8d6242228bd9314fe70ce2792d353604d037391a1a57c3590dfb3e05427fe4a58bafe540557b5205a013453a8005b87e2207fa2fd73a1dd1ddf720022504aa35a3dac157c3b68e461b3b2dbfc9daefdad4ec43e28effaa984c899bac2700770b58073db6d0b2e16a05483959741efcadb6ab9a556d49c26708ddd518c9f7d3c8771e64a6ca8752e4316d6953dd05717fea63f1db51980f1eba1be6d6f5d75cf2627984bc79e77876a78e763834c9ee9633d9ffe45ae73823c2e709933e9e505f383b8506033460ac4d3a57dca849bf39573aa48a02a8bc99a9e28b1963f5c98fdd8b650ee3edeaeae4237e4b97328d43a2288216f35d8235122095b630a76a06c930f4396be2e4a2cb593e4b8a665c54392bef67e9b1c75c58d4f2811a6eb76e8f45a6e29463e10a5677451c82dd975ed997a35d0ed769dacce94487fe64cd2d67a3c494d6b2a66733cd5ff03fd314ccce8e13ae3634576d292bddf4b940beb3312a143b57c3b3c24ce5c6e0fe1868bbaf7bf04c7f1b4120a6e8223ad482b2655d9c9a2359fcf26fab815456a3ece38c4c564f04d774982b7ac4d103a3720a11ea3f448d9460ef73a9c828e2218ec3f65e532d276eac2b205e1961cf97531d96a1c9060b249ce5dc8b1063a27b490ddf260a8cc98f6cd4e18fedd45d472794ad0fe605c10b9fe4dbd0aa88e503edee1193b59cae2a08c559b7906af34fc6632125ccaf07c0ee10a0668a2033e3300c914fa3bf2d68d24e7390696302fc97a3b4e96dbb320290a997c1425af22393f75f8e681b321f82255ba057de161c001409e66b07f1bae4ce19c57340c7851c7fdc83afef5b3d61cd408e643e8f8d098f59d1ea0c38bd1f12655deceb78a9dbea000d7d517ac327b8015bae5767712ba9e838cc6a0cfe7481fa787cd2939cdca3f20bce5dabe055663c3cba5fb7fca9dcb079c8c633ab6f8c4f479a5c85907861f7a9677ac41e4ea68d570b753e3a98217b35b1fa2c7c8188a44eb8748a27a5ec8520729f2ef87cbadd932e7338930b4a2ef49160ed9d2aa95345db2eb15e2857df668cab07445143e1561ee646bdf645f1207def89105fe7a62479f5ba73903fa0542a53cd4af016c3cbcd6e68d6e9e35ef6d9c80202b53be1cbd87ceef0e9996b556f1bd81dbabc2c9a5153f786afee9a5d63ebdec4410a60c80e03d4551378a1fbe408ecfe8869daed0095d5ccb29c4b47eba1e5b18ce97e533932fea6855c3661bd1a278c1a51029c8f1c97d3659df8f6924c998e76f14440d960b6713ac4c3164b33caf506caf030bf1099abfc148fb67f2f8376693748cfe6f15d5edff570bc67ff28f1e6c24b19d5a5df49d506c8d5a502fe00339df61eb313ccd6cd4437bdfefd6e5bff9416a57f37a9d33fe44d209a88af75557acbd2fa91f69c42f6ed3444b3b9138270a2a20bb555bbd0c56fb8898ce47771b95163a19ccf9d4f593e341f61b235d3c153aa81ef5c8db2373e89042b58a4cd1d747187b21aa3557b7e558b10fa77d0654d5a07bed3608f69bc5b879918e802c109960b2a9ced9223be0e53ba3f90b2d1a1c42d7347728bdfc19fcbe0b138db01ba3421e4da81d7a6d4b25c530ec98be29e5ce0d2733e17084845fe8c11532ec80079c8ea4c772e46c2a4e3a719145201b80bd4665a1e103945c056b780f661c735b09ba9e752c2dea6cd27f749af2fbef90e2979e09f4b6156d36955a959cd2c2474b8c0b391fff4e18137878724e8593305faa9d94327c4628fbd3350f570fc87ae98a7088c6e6f2f0153ea488849e9f44c05de9e0d3246fe13abcb45d67dbadf006dd7c581a154500a6e6276c1eec3a2d02efad3bb0d6b203d8142f85371d82be01cf4fc0c30b1271243814bbd5566f2cb93e4a2569658488b833ce87d8aa588c74c93018f4e78900eb8d8c3ec2270c8cc764ea6af33f512b534c880300f07a3c5dda916ac12595b1d9fd5498041c620d6e9cc795e0e78656c62099f6c683736d137893aee9a0317ec41608f2ac47780fd68af6a8325f4274e26bb6e8fafb9ee570644636d5feeb0fcadfb1fdc69acced3bccc5149fa87c112ec23ee520558519aed7b5e63602102dff4c4c844dff7896a3c9c64ebd53ab4502317444f67a683b99fce3b4cb9285999d7d045349ba5fffab4de17417fa32ee7f01274c5955e5cb591f9963d1c58b4c755ead4b29edaa3a0c24e57f1504dd609abf2c5fad688389ed3492f72e54f92d165209102389606d97e17e7fd8440e283d3d9cc9b9c488b2ca1c4996dcabfc53576fc8c7a2e114f70099c3c0c943f3f39deb022980b119b53b88d13126f84646fbfe4fbfcbc0c22a396ec3472ff10a9aa06c5f3756a81ff7b1e57e292995915ceefc4be06f3926375fe81d9f92c975ab36854a9ee7cf5bd26531ab6bf3dce4c11ffff82289013bb31b3acedfc85086cfa6774b9d91d56f38342029e03c4080f2d33cea09fe4f03d549d88dbdd2cf65b312cc4efb759d6cee41fb8aae6307e043b1efaa3c346f2f8a22cd76956db66aa2fdbf62c0357edbb775d4751d66cbac6c1557b3e34fa6b6cbb3909cac8c558c24856b80a2fed0555f05492543162c048d1acc24cb2cb929b95d032a670e71d26dc0d887fd74dce963cc028771d06f56a28447417e55fca4d7779e078b3593a128a60e8bcbdf43e3f09ffff350682c8cf0289412093dbd91a3589b481dcbc9db242e9ca47d586ba6a1ce4145135ad46f841ada13db02b149e13b00f49f63547e7e3b50e8a1e4ff50e7c1b80a6a6d04f99f48c40ad382cd2d5df49657bf8ab7703245b4a3799c2aa9723003992aa7fe109ca5e4605af8dd80a256a7063c23b14ee1374692ae12908ca07cd9b1facad6439097214bf2f5113ddd9394bd97b3a86d1bf205a8fa1be82065269bc4b0cf51f681e0c7774404c3500077550a16f6644cdfd987a0970b9a3b61b161dd3dd1871f98e88fa03a9941349bad92dfb07ceff436811b37309ecb37f90aa084fd16c4b2c0e45cb0d2ea90c37078c41f29b5564b8f390a60369d241176c0435e9f8543eb2739a51d4a28319c3ae74d5096f5810dabe9e469873c52cb2d1eac351791704b289221bc704dd038fa910825c3504742fa3ad8b7f8bd1f3d561a13346f6becc5816dae46da8bae9c11d9620985fe3be4a2a8b2275cfad6b833105906ac328f099837f18c94ca0ad7b8934e972da6915962565496c7d7030a77524901500d493231cc10236462f010323d784694d38a497b651c1744210d7e7ac4f410a911f54f40c68acfe02ae4c8174ff6d83bc1fba1ce9a8c03052a3a83162f81272523cfe19865fccf927aa47f7389df328b11632ea6227f916d269291b529a40bca3e5eb93be09af3ddeaee9f7dbefa6810d289d008f0d10c07b04219bac1d8e5c8a87b6202eb8ae97851187b33ec2259e080d5b3a9aa158f448e260c26a47e2a08aae554e4e278f317f13649c99439e77789a74281259d7a251bd4e82bf51ceb47b1809e346c601b280aa3b668f57d7284aa4a2f6d22901fef8cb29a5da7e4000271ca392dcd205d9d8b2f3e5e7e462cb009e1b1997db32f04de05a413fdd2326d25cb0a295561b2f767cdbc52c9c5b91a5d63ce1581d31e6a54e06fe2edce15ba7687c3bb9418c7af8ff168e8e4328cc4f2b0dede2d96c69a3fa5bbed708dc14944fa325a3bf03311a21669826febb004e80df7da70be0647018cf14cded5e894df9669da55bc109e7c9231db55bb19e0ee33ff26b9be3a9a601fec61c055863ba5d346519cbec14a30b0bd7d6d11ae7af889a2cbb2d7317538d997625c686077c6f3af1c3c4b6f7b3b62e80eb7cf95fe7da7ca8e9dbdbea66ae1b92e6199564a3116919a566192fdb19e34c887c63e3e85d8cb8cbcc8f0cc30609560973ba4a4b7820f3304849fdd0084871e4459c3018681cce605288a10cf8434422d39d7c8b88b3d0f08a13c052e58ff0675caf9e71df6dd5c088cf3b8d9bf38789e2a2a2a2392cca8197c526dbe62c4db56e121ea9d38a2f16e5088350e4b1e649152989b1d8bf780b76f6a06af41784cd8f0efa40e51b68d80e197bdcd312556254bd0ffdaa712cca817e79b4c6c5ebd6e1242eac53db4861ada32390c6c326e4463ac612f59e8a7ded678a08fb0e76b70d125796e12a4d8085074d23ebffe492e024549be6eeac42caa4954aec14b840f044b7a9b95236e1ae094b6b4db8b0da4626223adaf9dd91e2072f82fa50dcb41e9ba77acd835fa2e004e1c27bcac1a9eee302e1bae32ff5b810a7e5c14fcbcf0f3d51b451028bb53b37940d46d096a0b53d6ea8b5518414c4312ec2c54fffd7f53cb37942c74f8783201c66f268f020c285bac20e7677a3d24aa1ab3aaf93ad4426f773e617d2ee442bcc23091cff696ee2cbbab92d90e3e59a91c530ac170a7a857b07d8b50dd02f0df0713dc5bfe557b3e366e961154ec24120a6ace6653f14046a6a4a4741520d92fa1910969ee8a9b47156e5ded355db0fbd40b32a88b55c7a36c46511270517cba78228b0a237359af9fe5bcf04108525701052342e7479fcb17ad2f335812a81928ddba128d155509f47a94952c83811437408d000b791431fa329dd3cc34340a00b83c6e453eb459c858375b55e347a4a2841620d3c879e4a4482000426f2e94072c85ef15ca0b4029174081030ecea707298fc5a3ec01a71984201fd63a050d7449ccb4c060a7d242c19869a81c25d31c5768ef88576a002299574d2c15da4b4153deda31234c24d2d44749fe0cf3c9abdf1a06e64d8e16102ff86e7dfa66069115ee5b7c4b3b831fde2a8e2d0be189ffd0c15c12c9bc4cb010b1d72d41ae74c7f4c8f006407a6175e02b21e66cc1e8e7194f0d3403b8dc9ac44e4bf9fdd2f7ec396737ba5bc706e53af87c687867544ec735481317860aac80919894ceeb9d72cd0cc1d72be3df15a341a745ac14528c991d3b2911625d37fadfb378d0c38518f4ad8a7565e8296d1341ad2715db8465ec018dcdae73887e8cb92dee1c39e48e5ceb1db30d543ee229ad0f236db97501ee620c15d18b43450bceaaf22f933d099b3921e2a29dc134e32d895c884653dfc65090c3e094e087f1c48b9d6dcae8bb502332e97cd889f550aa0d634ef4090f61400ee78b19aa7fda9716fac8917688811ff0484022664164ec9d03e09f8340e3db22d59bba6628713f892160f73079665f718dee0b976c4e05a03f3118a738df4eb077cac7de58d7a072f18c686377d880ed2afca8433e9e7c0b88f547d2d978b6b7c6583431c6fe323922255283258f190ea3d1c846b5fbabb9ff754ed6215707a91d3d68dbdae7b86041a98693db02ad39f53601d081302994755999818f21f297cc954699208feae66ba62f32df72db68831902b9531089378af48a743bf092ee0d495910ac01de0d3a9c6ace2f738cb5a46c36280c7aa07945a27d7242591669c9e066f1f097cf25536c0ff8fd900dfebe06d3b223c214e96e1608c52b3013eecfdc1a1d7049d22df787e8f83fa8a0df027ebe05a3f4e41978d604b3a55a7b5416ae2ff20374b830c7749e7f25cbb48b78eb28ac49da2a237112bc61cb16955ffd7ba4891169f63b76c9d53393b34160bd93f6a169aa77eae52aea59cd5ae9d03163825f4a5e7abaa06d2c78cf215c65791cd58340527b042b18eafd99b1715734bb7e15c2334e1f7dd5a02db7afa00a00154a81230e2fc0546fd5fbad36c403c68f09dc97c3a1b1bfc3f9a29a2bae307e9a3990bec2704bb281a5cd7d0c8d1fe41b4c39d9d9147cf4c9dd0fd1aebb9854aa5ea713b7ce9d42c9673834a642deb1e61260645f3b09e2ca8049ba842e980ab791492229b7400e2c6a5085fbe7b44a3a27f10cd714f1341c9298fd09c62f740e38b1681c3a3c0bc43c8f072a6d04b71bd6b503936bb3d3838bfa01dc80483faf6b5c8458200957ee6953b82bbbea728efb278819d4fef746ec36270a8c45571222fc555b639b32a0aab8336da67754402e7b31efb00d7cd396410f25429cb1ea7dc89321c5c22fe5a2474edee85ade761675f4810c1a6705a44f8d322587ae08a281871db1ddacdc70df4941a5d3d2f9ec57a59ee556f2da104ed70292929fd72b5e841ffc3dc49ccaab2074e4e386594a9d4d0e652085b67ea071c68a21dac9b9c2be6f4261c670faacc8be2bf0d9988bf044d27f33cb30b66678965e680603a812a51462f9bbc17c1ed3367b63cb0e8f1cc0c012a24f0ff0370e7abc39bed796a98ef399901bce2833dd57dd56a9b1941dfa27c129b20539c3fea8da92aa26c427126ddefbe44115927a3f37b8984c291562bef962588e95edb16e32b2d0823d4421387ca972f662748f5f8b5f128d93e2f169b2f401c207023a45c8418c3b152da0b7b246ac62144edf1f9841b32ce82f5bccccfe345cfd38c1f990b6824e2f01e0eeec9d86d11e9c7b6614277d8bddd075e12fb9e9e1efd603fc00ff561f0bf3a2ed5463664a3d22c701f2def5e8cd96fb2ba6a1e48ef875699e0fd691931860d03736d68b1411e78c4c9ba4233a8eba04b8d02866b42757da4b8d0fd1164be525df7256e47a679baecd1315404b7113d1dd0baaf2363f57a9e3b716a863b8b6abdaf5299a1e4787377624b61a0e4034147e069a60ff4edddaca55015601d6a6482d050c250c9975ac31b6dae4b445e7c2f6c40615fbf02b1a1065e9818bc8ad1ffd6096bf4e8ccb1b18dfc71a310a76c62693f9e874efeb1289df5f6b64935a2c9fb566214a0e3e243d07e07153857b58ca209f25b71adda08ff706c15bd8f31f9fc5b3014da7e134bd2616ead55bdb843e278b09825c699309eabf0de8c6e80692c2ec724f2e017eaea28856f42ecd535f65e4b189b34e8bf6b65af8863f21556d0d417f7f2f42c97e18a7856bb512c053a34cb398e4462eaf6cb7fa3db7fcb3f1312c9f0de48c4069b35189b3dea42813224c0e805956e025f1acd896fc5fbdb56338a88456d55f6e1c1e10c20a8d668c8a4769213b1f713e6fd786696e33759ea1ee22044a4a2886c06e23e3adc36786edd32aa871f2a2ec218c01c45cf5f0f1f76c4bc2ed3a4ee020dfb8c1a4801e9f399d6fcec06d725ba5554d28c4ac41e865c1ace9bd464f0aaddf27399ac23f8bbd58619b3edc454aa6019be7746cc0545b316093500215f8631b415620f4726008babf0ffa1d1dcec9380209c83739b05170bcac50693e75b2028065aaf7590926e2fe15bd1a124e73e49767105263c709762e58a4bfe6acf9877efa98e83c637174f63bdcb122dca52c33d0c6fc12f2aac059a54c55f4dc84a1a93eb2248c1105c1906d9127ebd56a361098e1b98ade6d2b9a9bd661ea5acb6ca9e34415796bd842b5fc3715dc5692bbd5c60748f76ab6bb230e8f8e483a5601fadaced4491dc4791fbdbd97fc9020d6bd12367300084beb981f90f2daa7680e0d5d94ffa53bd478538e0a3adaace6d0c098e4d1b8b343a2c1d4c73e9433a0afa57a49577f11158be00cbba61c14dec7d4c3c8a2c69155979f6263e00ab740201240d02cadf33758bd4f6d9355db74f6125488730f3433d897074781056d576ebe2b4a6523be23c5dcf118d1de1e683eab35cfa1a1185548c22ed7f1637f4e7e63baa43c47cd42c3e62aaba7b80fba5836fe971d7fdd9a0a117d85d4c955e84e275cbafe14e2555494dea9e207f71f129a8227c4d247266aeed105f1081606e0a2b3c0440f52c96a1f4ba8f3cdf609bc9815e5a72dbc5a8ef34f7f26130bc06f44decda0b42c3c27ffc6003ca74b079236456b9974c81609f64ae28bf548583ea41b52382c80b0ff2a8143497117133451c4e9e352e812c16f0e5934f0d7cc0ef1cf1a21a81fbd1c6a3d4e8b495faa43ddaec8daea72d8fe770d6e30f5227950181754fafc479a2308c0f57c71139deedf37361a1cd9317d360ebfa056f21e2a72f69fabebdbc71e1d01202815d4ea91c549d954b2342859785050d25a8e4f9b121acbed4a987305bae674cdd544a25459126b6f8a205c396df4ccfdc3e497405a4325728ce5ae11d75b337afa772afbc2a52b6e3fe8dc19f71237683a2d326a0e486948a2a9edd7b9cf77e8551a5fe8fb97b4059006e5c83e40bbb67eb209c9a592a2e6ba446b282ba3974875b979a86cba33d1eb7d2613ee8802d3b733e789204c10558f348e6a4518ca95f7666d365647fe658c014c40124a46b9445ac9165a42d9de6c2bb71b382d5443fceaed64a88fd00894a63be1a76005fd80bd8cf243c31a74dccba6cd83649688e675e938821f0b50c0bc1ad891d28258ca8b7b8fc201d9a070ef1cc292a422a6fd9d86bbb44a9c96b005be91c31c810ffec847d2e8af7790d9eb9433ca2836ac749bec9914ec2de1e3995298d9d5f8af53dee120ec89d6cc3a679f813bafc1d5358bc6242626e261007b6d571b3ce2bd962a2f68af8fd847ec893ec4771fd2f6e144d8552582cadb60dbb5b1c0c47290e6d55678c6c468868d62991a2b75436c7f52466dac8be3c7a532e7edae3144953a6851c45a0da3e3d3d0036ea875cb589916d4f6440e10e62b20e7f0a87cf39d647c3c64f0ebafdd1f4e0b78de92f01f75fb07c856d76fca86f4d75c29fce46a09ec6ab868f34b102db67515c1ceee4f9f65bc5af87c14bf9f0f72a987c50dce8fe28ff27055226c6331e63274dcc3f4de7700b16e2b3e5b50c1a9b966a298569210770161b5c934769ca80267f60ef9ec5765ac0a56254875c820d4c2a4d44e14a93d29b7c2071d65723bf7a6772f0eb7d220ad53c71c8d1bf4e3ee1ab6c54e884ef3a0b801908531caa78263c0644c75c83c4ba7522358b1c7754abef25c0e83501cd29dbd7c5b056b36d6a6f7def8d6d615ff247edf0ac3558e5449215fdc4ade484c9e88c197f33c09b1c0afc6bb8df6a4e779e220bd84340142878ce0e4c2c3426254de86713e33964885ed8e3a9c6d4e437edc8770980b53d1c9ce54b52e8969772480af35368b09a9a8d279f548e011285997fa54bad95b242a808ad46ef2367507934292ec6598892f5422d59d1c1ab29bd0e2faa0e76fc6eeaae1705f61d5cd6cf336e8e57fe6cd64495bc382beeace77509b6a4f59cb6f8e49df57c3dbdff07c57ee9473f0ab73c6b0b488467d16882aabedc1430c3ea571da5f97d00288013aeb88ea6651617cae6239a6a4df271a997661bc062eb69015c2ac80874ce8f135b88a9873da202b10b9b5c10b7646687a83645f2ebd4fe1d8c1ac7e727625caee27a507f645358169c196cc615c357bae7ef0ffa0f4d413531973bd65fb720bb98ef2f179068c000219639bb19257084e158f2843bdfc5663bc7f72003df9e95e2ca434a132d434688aa94d44b22995c07ffc3d7d7a20968f4798326a2070c806b6d022e313a98605440f7a1f03fd3f8c7004f51ff781c8a2fc308888200826c23d38397cdd865951b36087ad29f992d60a5be3bbfcfb5fd45c690c8fedaa38f0fb2b720570f5172dcc031f360874c1eeece1edc185c62d06bb5a8bae1f7415078c850ef06481777e6e6627fe60157170d2cad88b8748a82759bb6f36d75557cf5269087b4bb3115e553c91ad9e6e99f24463114f59501494e532d81b89c88a10694bc5fb258eee7859c860247300bc0526a43cd15da31523464ee2593e1fe53cd9457f388eb349d7b8c392b8dbd95c47b79aaad639175b0acb5a5cc952eedd86b006bc51e7e77d77cdee5247b5c5e4b9584c2785c5bc271c31187bf6deef61130cd6cd2ea3529541769075586bcc3d4073af0fd0b74a44bb9282b1bad7e889acd4185287b2f17d6d79022444b458903119a114c37f4f5f0d7cb6aa32fbe9f6e5dfd88629a4586a57cc8cc9335cb45d64e01a40164c9db2efe384ece098bc08d360f7a202e27cd07344734c7d26f04e8c096dc3f81ba39e17e4027d77e9db147b9c95490e5543a724285519c16f0098baea949a98a49626d9d3f6f1295fe910c252503eea044260d3b10b0b5190e300cc3300cc3300cc3500b8bff6d6f752f152f6d2b534a923e5155f5ff4259f01004dd6fd2a59452ca94a4f865c6aa840dd344448404980e990cb10ccb1b53046a8abcc8bc0786a5acb0ff5339d75faa65880b18efbde791e1b4946af8cbe122c67b2c4ff2058e1f7f458619d521e4cd7b2e70c177663c9c9766010bde1be2e26090780141d5ebcb29a1af776cf3decb0c4c173abd6a51c5059972426746c205e49c63999d92eb6ce89bf7645c3a1fcfcb7b9f18173584b878f1de7b1a19cf23d94273aca5fb06775952ba3eefb5b4a8c1c2f9c4f028d201f2dea70b122da8949b527a26d4daafcc42532e39cdb8942733635888ca2d957eb9757fdc18ce7b2c2420b942464f30615ba7ab289d1538b9a7ba6d9729ff951c4f46e78970cc50922a34c7cd165c0b46c8d0463148a8c08956fa62b0155291f1e6bdf73c451e0e8de6e5e589bc9743def36848403285b4bc294d97165ce8114901baf428ffe12ea7de45217b555aef5aedaa085911a8d9786664de1301091472b58bfb28b1fd4c50cf2079c262ff66d7ef8e314e9606891350c3a8dc27e7504a10a2cd3f9226406d9a28256217634a3af31217091378132dec8748f1424c374bb28406153ac7e7fea6ed5f200be198f19e108e19329c33de13c2796169244a68fff5ebb2b5a81c422d8c35de03429284c69497c1a42063aee56ede6b69e1b10284a5d311a35fe6874b932021354b28a2c8fa0e25c8de637983e4088c29fc8d683f77774523206feb7ed1bb7594ac08cb597496be7c31b7fb44408dbdd7b1e60eb6371f4247e61af9a31655536c21a4e627faa808aea50d06c1591d4499bd9f9663e7371e2643f31e0b4880801826951a834b2d16618b0903c80bc90f926310654cdfe56c6c37efc5fc8b8613a389f91d243e402eba5a8e52820a66d4cd7b31fc924692f440ad66bdd2e9e204d9423cf044cd7bb96fade1239474e63d16384876a09c47ce18995ae9fd59072d9ba157bc5a4bc9976fde7bcfa389e9f020c941a6a6ce36ae155d53296ddefbccc87c66d06001428203085f417dc51a5b9c906dde8b1ccdc6c3642cc90d9632726a51ea479a9a36ef6d3cbcf98ee6bd16202cff02190811f6f11e11eeb490d800458fec1521d5b6cb4a52038debdb618b0e2aa6c95854404203f5ce314428c594a2b7dcb414f932361e266365a9c42102e4e1608d8c87c50b307ab068625c34329c8ebfd7f9c890648164066a5d6bcdd482bce2d2d5b2542243a3e9e7992191c162d67415c54dce2c2dc91cad3d734941959c8b9f8924068b9222c86bbf4575706dde7baf08bf7c07080c76d9520cea72982c2af663658d95325864b8870cc3bcb75ec0d2912653cb6152ecbd7ee77cf1ce39e3bdf7a03b172c5fbb96c2f6b6df2dd9a005cba9bd797f626a3373f39ea7a5a5cdac90c112df87176040d76c3cbc09e33d9ed790ec80050a2ee6a452234dca8e36efb5b49041c6ca0f162fdea503e4bdf7341a190f0b9115f07ad86a713bb5096d2af22b31a498db558a9d7cf31e1c72782f7f2e059db9c8781121e2524bb5d6214cebd2b167c8ab98a22377b98c562916cc387cc8992eb5cb953a673e8a1335b654d542f77137efbdbcb8c0c1020f2bb80935e6e863f6ab4f07b2c8eb7555f2e552b14e1ceb5735728b296e14596596d72bf82a656e365f9bf7383169ec579e10f385b06ddef3c440b8cec921f62c7e6cba796f0646a9969e176ad39414749bf73a2fab1731c8ba3e25661a37efb9c09150a104b7c5e51c6c0c37efa9a06537c35dad14355d6cf39e0babe685beda4147a92d980ddb8e4b5be1f6b2441c8e101413631bbd5736da8436efc5b8fb707f39d4de54626ef39e907fd67475ae5562b5de0971d5d23eeb42982aa95b9bf73eeff1660a7d5de9e2c5145a69f39ef3773c9ccd7bef3de44d94ae73515a0eb2e6562b7513c7b68e6da796202df2abecc69443f153d4a4fcc69eed2763f6aa309a987f790f86d3899a22329c7eaf050540dc382305efef993025d54d2ef2c7c392288830b15bd0a574ac55639bf7389f1817cdae19cd7b3a2c936fb0b68c5062e95b274aec5f646680383758830c55952d88dca27682cc644ab164e658d3bd8de818a2ff6ddf85d0f2868dc4b12de451692a77e78d0e13b463ec9652b9503555bcc66a9e892d7529ed22ffcd7beffd786a70cc5f4dbf70d597cab0ef704ee33dcf0f204a79ef6a71c154a845fdb1ba39c42a65fb52d5ca87bbb25c2bd9737147d55182d6fdaa9acbe8ed1d3f196938a40af9b662ab39b4f0bd9797ef30d048cbec0e6d3a9568e5dac102c6190d3a8732594bced82bd4431364947e215b9531e6e63d0d33a3b14fba5a4aa92507dfbb28a31dfab80da1bf426e790709104a1d49a1b5cfee6b333af25f818b6746c80cfc1e3c9473e4bc9c5bbcbde0da683c2eef3932367236971c8251333adbbcf79e6b1ee63732dc11f2de1863b4e6ac29774b9fc18d1dde344b12e315a3a490217bc60b5bc80cfc16399c07cb0b89611fefbd9018eeb090200c768a9353868aa556ca019604466f7365ed961ebeaad5f1455b5dc9db9f1282aa7af3de8a170e35ede4bcdf3d730437efc5fc8b468e77cd7b22d89198ea47caaa3e7a6cb779ef8b11c46408b9b6d7774865dbbcf7c21d21cf32ef75fea344a098ab16516b4a1415b9685ea6c8e7bd9622313bde2b12c3d9e2312e446266345974c198bbc6dee5829b76cd683e3011042c0d213f6f4b971adb621bce7bdf3168c488f1de7b1e178296bef982cade1043172347b3e331c590a7f48d25d8abdb31a55ec54f6c5554c9918bb65a7bb45cd2e4a6b6d1a625e90cbfc8785cc07891817161794f06c6e53d98999833d8bac411a186ed1fe1a3f7de6bd9b1f25eff9096b5ed0e6e6cb12dff66be512cae5ac4d0aba458736edeebf0a643b06c39b55c2f77fbec54dbbcd7f978342d26503181ca670686032c4f33152955d551177c969bf7341fc389d1bcc7d1e46dd9c594542723e6be79cfa359a9cc3585a0b3e214d1eae6bdffb874886400b9ccfd54bb112694d637efbdf781891b00c15ac42ba2d8e91874fd9bf788703a4274e858ec617283aa988bbb7af39e90181738defb0ea7b7e022b14d97da5aad2e35c49bf734efbdb72b301c0e003e00c3e1688474341a0078a0a3f978663a1a4d04b6506e93b3b1d8ed97916e9ee63dd502021dc0c0063aa0010864200218f0c00522a052010b40a00213a0801613c080042410010c4060020fc08003e267a601136080bf66a9e48105eca2800212a092454ba9490f07bf408d9018978d87372a085074004f070cf0e1700ae0fc1d2d08b03280cf0be980003c10000400cd1658742025753c28ec44a38549118d4ba5927f064a52330112cd478eafc008164338718521481e86634e4e5cf1889191018cd8210784d8311244930214bc31323232d2c6c8c8c8c8c80f1f698c8c8c8c8c8c8cf050001346b2e84189530899038d121a0c60c40e3700c48e91119255743e310f0219862109238b19b4cd47e65de5793a2e4338e68d2c648064600619402248a71346109518de420b19ee108999796f04651023ef9c18151408b820e68d95952e5aba50d9420e77d1e213df8ce7a383c627be192a2a2a2a316fb040450e77d1bc107f0d1ccd1d1422648c817206ff1b74d18262830ff80be76410ffa2f9c47fd110f9989327cc31823621c248ca15b6d0c2e32a5d74a1d29d130e8c106204a9b4b8a00d203cbed891c68e2f545854e47097222a5c74a1a2e385f87fb185169e8e0e0d1a0282ee784ac4c8a2056818192169c0c2e1f14052f1ccc4b8c07ce0330303fd5d3a9f94e245017c50801b70c0065a908212e0f07474bc7348303252c60a6230323292251819e981c624b510f998a523b9e81ff2f2c2309e558c8c8c74f18846a8313282c6087a64c1820718010959c8d182919191338830842c464682d002c7c8884b0146828c90f12f10bac4749105110d8c8cf8c7a112028e7151094152d9804accbf20952e2ed0e1e898018307911d5cc497f770ce28c21f8f4b1ce232a433e32192c507071f43cc00604665a6c8cc1366e630f38819570c99c090100c193244083100c108e4f0838c0e446c744ce213840d1da548c3840c101460040d040f405a80e0031f1510ac9191919122b0c3f97822277a3a2e62a8e8f0c4018791111206b07456e230444b912fc3d3892323240be83c616464444665c5f3e2c29f0783248e38e2a0411c2d88e3258b38dec8228e140704e24000491c0040c548163d289185cc204a4a4a64d03032228385912c7a5042060e1996790386ffe3e9c0c37cc79df9e92802ff5d3c1f97767981333fa4481186f168e46098220cd37999198f87371e174f91174e8cca4a900f12a3868a0ece0648100f77a1e209e251e14207112d54ba5079acf2011519950fa8749108394138fd2fd04548cc0caba8e8809f181718209f18971e2a3a827036444ef09c0d11e85ef4d8f40c0c7c1f2a3a74ac787484c0c3c5bb4018ce0a543e1e8e8c0a074210e4e3e1a4a112824f43e579de393d3e2e2a0f077be0e0cf47a5c88b87673ecd2a1efe78de8b40ff4ebfab3c84f9219c1e2a9c0d9198192e3a3351c5e302868a8e20425825664685082748108fe1151d1f95205bc4fc8b8e0fa8c4fc8b8e87e1182d543ca0f29f225e743e8d0fa83c7e9981e970a277c4f84efccde76138a65fc6f31d8f89f971c619413effe3e3123333a322c70b8971e97c7e04512902635c741479f19877e944188ee17c54fe13ff85f35151d111c4d30181bfcb169b0f114e47c87b5efec31b222a1d0e1861a8c4b0164182a8b0cf743e4154389fc8e3e3f261ce0b547941341e97202a5cbc47c6e3e2e900918f897181114385c8c7a810f998204176a81479f9219e4f27725488701e46662688c7c391e9ccc80871f10429d2413e61a8e870151d311c8f8a8e20ee1204c6777438ef2a2d3fde6b69970f7f7ea87858e53d202c2deea22388e7e30213868a8ec745e4706038ecc29dcec718212e9f0ecb70e11d184e9117345281c61ed0e8a0e1c5199938c3086788e00cd683123d10d1830669c0948051a20497c8a2045528810f1fef830159a411043524004412407e00a48c2c80b81f97f811882c7ebce087163e08e1230e367290051b2c60e30318f08309e4308106d6f8831a42d418c1bad18036e6d0c603da20021b9e181919196983056df470230f59b0710a37484e50063e4101da70c41b4e7883c71b097063146eccb8c171038e2c50c001355e710835baf0861cd8f8031b741819191941411b6ad4e00c3ab8e1822c501002147046024fe0861ead5fcc7d8c1620434c9cd00426e4a605536e37850e75eb1fd262b204d8ef10549f1e2aec75245e305182ef5a507b316e859235099bcb5c8abecbad3d19c704091e159323a0a832aa5a16596db63342549d58a653cd337af7e6bd129814211544aa89bec18d6971381b8dc7b0e65fdc45072644482bd7e942ae5d4b918f0c4c183168ac788c4b19453a3f5382959534587e4605264370d035caa8782da7351182044c82a01c254fe863544829731e1320ac16db8a1f53292fd68a440b263f806c73416d8b557906263e482a31931eacf6b9b6ad54b7ab6a65e5e585bf58d9c1a2c67b244c30e1c10e3435c6eefc8a7861f606088bc7fc478e30fa657e90ccc044075998e4402984689bbb724e03131cdc80a5ee059542f8bd94a7cd7befb5a0f1c58ae7e565c7ca1a6aacacacb084f1de1c263668d193e3f6ef6c5283664c7153d6545ba55c4d68a07ac156aab66123f66de50c16fecd7bedd23199810cd65b6c297e5ba8b9d2dfbc1786c91c043089018bf11bccb52b9732ea5728e396712965b7b075734577ae4a8c54532ae9c2cf8c8c670425ade896f89d529fd0a2c5202b3e976533b670d3c7446d94ac22b3397508c257317a4baa604b7335c8dd74c54c2815c9b938a1e6b877bd7d4606152d36c848b95adb9023778a7d863e7e420857bd3953b8efe662ea57ce7564bf792fc6256a3432dc030ccd7b3225a5e8c531ade652575b693d29baf5a66a897b69ab823133ad6414ad6554ce5d5db5be639bf77c9488c22da89c59e137a356eb52128ad8204b46bfaeb95173a3f198f7bcd702d36c78ccffc8151486162c6c9480a2b58d0ac6a428264ec436efb5a0c00d14947c62575cf9f9d129e8f41b1b2c2428f184a2d6cc379d50cde6a0f66205b59396706273916ffab6b54aade682924d20d6840bea33b85c5251138b19eab8dfe99950978ded4aa7d2b9172bc1446c2cb28dee1bf26ee63128b9845328b986e96bbdb9e4964847db291b8cb1195a8c4406259548eb982154de4e3196bb79cf034609259ae67289b9c16eac9cf378f8e58bcea7e121c941c9249c72c59c4375b89bdc6ede6b21a344123e4a22d1450924a06a9bda20abe8a243a9e411acad9491a508f71372a9478923506beb527ae76fb57081b0a4a0a411301d4c8974a18ca914c1a084112a99d972db1ea9b28458d828598422964a4895b98cbfa92ddbbcf79ee7e372829244b44cf7e47e5b4a8cd76eded370620c8fcf8ff19e47052588c856fcc96242e6c91adc945172084ed63cc5f4dfcdbd79f39e46f302d93f468df758486e50628896a28b4a595a4f77c6856094d0b5e8bbd03faaef9410a25dd2559c4a39c7258380b133e62294d452ef9c201ae2e4f85173cbc63cc6f711474920d032f37ef6cbad3802e257eb9850ee6a9b606329674afee04a77155b04a14a96da0f9998639dd4b2e63436f7a17f35f40ea9b8dcd2b4ce5009011fb4136b18f555334a552800e2060b19257b708addb9d1c68c0d45a807869c0939e7f256e5fea2240f8e5173adb83547cc8ae1817f6dfb737368a97775076d1e7f654706ed90d6ae0e88ba9bda5eaf9a83cd6d58609a0d1394d421ad7a6cbbe066eaf7a503428c9173cb13625eebe7a0ced91b724d5361d296c3b333d7fc967031d871f08edee03b279796ba85836a693173aa29b4bd52bd21db575baec41c5abdd00d8d5852dfd84b2545f1dba0d86bf4151562cd29756c78c4e92064d025a6df6d0dda71c16795b6634baa6a589c9c8a6c5f7547b5521a345f53af8bcb657468c8053d2986dca7fe76db79314aceb0baabc3a5ff2206536e7ab6b46ca185172566c8e53417e737cda61c6281693662491962b7d69b3c5fbd5a5d32a8b5ab43298b2be3d24c169d6a1b1e2563600c466f8d2172e971d3cb0b7f315322065dc63e133b6c1906c83aaad2d4fee993fa152064948021e532d518c674ec68fd0b2e2d74a8e25a9718639da3c40beefa0b31987a256baabbba80147276f8aab7297ab4f951c205a8e91af92e98cd94ee163caac518c1a4db4897976881d14ac496613b47f5b679afa5474916166bce8bd85d6299de243a28c1824bcecaad629ddce5da922b28d412c78ead7b298850ff104d89151e39af85de13b383db1bcdcbcb4c8481e1f188922ab0b57ca5bb14d94a9418095430460915a263b551156e831ef33d1f0d4ccbc1c2a3640a2cd9da662955ca95ba362d5b78b1b2438b0e1aefc9c0f4078c1229b8b558f3335e083ab5380a0dd94a9fef1284add041a1915288d4725e254f78e41825b80e2a4fbf4a9cd0fe116408ad846c29b54a9ab0bc74c5a592eb87eeb28409afeccb6ae5a7c57c61c91258328cba92f2460a91962801395ac7d6820fd3629d2549f8a4daa2d4995adba85a8204ffb4fc35c245ef2993a659c653e4e1784fc6b3254748a47eadd6748b5237dcbc57e4e1d0fc7b9c18c3c35f5c365fb4941861216bca0d22c5094195254578940ca68c2a1354cedc9410c1795c0d41d48eb573becc281942276f651697fbcd7beeac291142829aad9deb5245e4a32408ce694577dc6b3d65846f940021aec8d0f2fd5fc450ba1494fce0bf79a38deadc144affc470f31a3e4a7ce0146b570d97321811639bf73c6e94f460db79667b94542d466af39ee60b1ea866cacc8d13aa62ea59624a76a062624d5de77219b9c5cd7b2b2d6d866409253a80093dfb08132e845a510e92b1e398b14167d65ae294e000c5efe5c698466f55bb79cfc37969212537484ef91b9dea4a8f505062036d19dfd95aa772e56f0de07b4b4e61b38a2eb945847db0121ac0450bb6d41557ad4e88650668b5afa89b2272ca1c796480dc47959b7e379dc36ea3648efc576999b9a80badf75adefb3c97c440337b63f48d5191bc22adb854ba7354c7c965485c915cfeabd8a2738b0955ccbf683efd05492b9619e6c26ccebd2d7e5630d8c9bca5d589d5b6b5f9fc0f314856a1349327546961aba8a22a9a7ff2f5ce525b6ecbf131efc990a4c2a97ee52841a5a0b3575440474b177372c922d4dcc1d2bfc6cb0bc3fce041728a87ad5c62c88b36329c0e18efc9703ace24a64009d1aea4bacb6c796d663c9a6ef918cecb17ef7d0ce7a563484aa13caa56de104330268ea4606955c3885ca55daa6660349dffb890806414cc363da723e61867ef1824a268c4d69b9f396bcc410f83241428add49c3282cbeedc6d381fce2786c77b2b20018552aae9bbfcc59a9dc68de685633a68bc4c1120246a20f9047b872a5f154ad584cb138b5b66326ad560d3849dd8959cef6adbe6b9cc38b17e5be25db097b5f56d13ccadd8ee9477c25f8d34819047085daeb59ecda9cd7b4148328154af4a4a3127b771dbe63d374830d13821b3fb724de52e6fde7be1ff783470bcccc013905ca219736faffcece237b779ef85f80be93ccc7b2d6bac94c1f291e33f319c2f84c4b83889257e615351b195987236040e4de47fd1b4b4ac5146e437638d9532563e333ddeeb3c1c1d8689efe39d73c67bef9c98ffce07be57a205924aa88f09696cd11daf5291120df5536e8291177ab793f0b8d93cfe4795b1f1da904802c586163fe26db8182bff78482291fbce2d55fa8d53724402090575c56f8d5de3a8080d9247645a0ac28cda6ee942f7f283c411fdcb2e59555a283907dff39880a411191d45e5ebb99d11314638a77e17634c29e8aee0e63d44b288a410528f0d3f41853e6dde8b7181309c7eafc8c745a308e758ba5296c91ba65e8950d57e3d43ae1435b50d11bb98e3a650796bda181f42b1767a7b8bccee52790cc172a3530addf359e35488c59852e9507d5c66ca08815e9762ede61674ed5f900c02c66c6710726a96c99320b6bdf666624dd9b1eb40b4850ff5e3420dc55f0f88d66fc4fefadeba59fa83b38c6ef5bf6a5baed30f8b792a75bf9a31a8bd7d88bcb8d1f27a469522dcbcc7078dad5b4c1e531d52467b806efdbfc6b8983d7fdcbc2784f3f21ec7450fd954821c23831e59a3ddbc5706491ed8322b74aaf1114a297e66f0b092358ae95aa7bb4fb4794f8edf68c220b943eae2857895dbd67ed3e63d97cec70e10c6b890e246cc16331e83a40eaaaa22c3a498a1e4ca36efb5947440ca359688ffdfdfdbe700972da6b09f17b3b5ea9143848c21e6099f2d74a6e2a09072d44c5966a7c7878373c8ed6bfe2f5b4d5783e40daaa376b355bbbac5e886c86e7729774529b6d51f246dc84fb13d69531edde3b641c206b69c9dd295c25f302a1f246b50ff2c7f155cf58c6092a841192e779f1a72b17d1a246970ce74cd182ad7d22fdbbc8786562a2d23f69eead4c3cd7b246760c9a995a5c5d22d5abc79af0424666005b3154aba3c35b6bd798ff39129d2693348ca00ffa16bcec599696d934115820915734787b2b5cd7b1a971881a8743891871862c0703a62bcf7344448c610ddba88a0be3bd89cbb47c6c3b283440c3129b650ad53ac1b5bb5794ff39e193bbc40c38c31de7b194e7bde93f178411206047b39468d8d140b2865ca772b2d2d5aacb4b49956a018c129446cb5e45f8a558245f8d496a9dfb5180a11a083fecd3f99253b752b64b0f8401982778b09635ab0d14a106ddeebb10264458c3256c8500345084a95b142cb69ed8abe1b881204f40bdb528d356bdfa55a4001c24ad6dc99b366a89da729a0fcc019530473255e555d6983e28398bcb959a6fa39507af0102e0777bbf705283c70bb083a8d9dddd22a095076a0c950a987ca937b651603141df46a083e52afd2eba736074a0e9e356ac61af347d53c5d808283c8146b5409c6b402941bf4e28f0fd92d839d98f340b101532e55ad3242a8bda10f4a0d5ead6d1aa3338edf9cd1a035e75846c4bbb85315ca0c542f4be7ee4dfd16e3e63dcdc3c19f305064001354a916e47ce416f27b5da0cc919dacbe6b597a2b6b9418247b041dbb8b6ef35e91cec7f31db383a5f33ccc30c2c92bbc79366ed01de4660f33e381331feecc7cd8f39ee78b1357a446d1dd2e6cdf2aef70d28ab55aa374c9db2674d74e580195af8f08fdae57aa1b0c4e56a1543bc8dc507643eb77d3d2e2058b189ecf773a86f38587c77b1acf07e144151c7d9b3a55283f9ddff4877bacb068d270920ad4ae30c6a8da9b72fda6c391f997ffbcb7c6092a14db88d23bdbc858330d314e4ee17115739bcb1aa54f38821353a8d5948c39175b8b97dbbcf7e231609c94429593ae962aadeeb6162916713bd7d67c9333e49351c455c69c177d77549b27a2485da935c34c6e318432142db525e6f51bd72a67a058cd8c6d6b4db40aaef689941fdd4a145dbf21549bf7be5d8674ca38f1048c5045850d756bb6543b811264de28a2a50efd429cd0c614277762f1a34b3ed984b6b5225bd69d36ef9171a20945ab1071d4575338c9843f520a13dc45fa2203e362c60926927ab7b5b2ad954c39767209678ec1e8bb4a2516633cb10444087e82116dda65eaf95fbef87866c050e3a4124c5925e4a23abf43f12991d85ad76c8c5d6ccb944653a4f381c1c9247c23cbc5df9cb65fcd8b7c192b9f1349a0e59ea97e33cf08616ede3b89c4bbf7ed182384a8b5a6244038814453a71ea19c4256e8daa28db09d23d65ac74ac118e1368dce06278d48a43ce95a9b3ac2857cc302d36c3c4b8703d36c9008e184114ad92216b914b939d7c6bfcf664e14911c9baae565cf96b2723a62143949443aa55e317fb829424588c87cb698c6662ef6f2cf4c0f767288a8e2a28814c1850919c665e3d13184052c20e3c410ce5163bdae28f1726b9bf7889c1462576eeca660ba77cbd5a6a5e5e3c21d20a73821047ff762285d830a35971b1e278368c662a765afd9dbd83811446a29adf49f4cc554d99b40a833171566ba2b4a0e6e7a9c00221953999ab28e117df3e60f9c8e1e7d3bbb8d19277e48d1d746c6ee543ff3dc90e0a40f4e7fa34abeb92d2d97362938e10377e345f03df99383bc39e3640f9e605ca46b574c06196d341e8d8f324ef4c0deb325a57139f12634739207c5cd972187925db64c2778502c19cae4507bf4a56e433283933ba0055b3be69c8d96eab6433a750f997b442775587787bcc546ea1482bdb2c5f78af3d082a5f332329c0e18244c38a143c2e58916646e13c6d8bc58d9c1f2de1c144cface5d549ad141762287e5aa35d68c6c6164aed4f8f08b18efc5fce7c32fb1731287d4acb753d4c80eb1b64ee0f08c5e399620fc377833d75c6c9f0d7efc7683278d4cd75abfb43f571bb22d18176d3aa4925b58de3861036209a2754855adcbb806f571a28694bb3a50709286d49e7143915f25d4abd1e03e2905a3a2c57cd99517276750977e69430c25f7ada98d26072766680b791d72dcfa33919f94a1dd822b5969fa043dba1cef312c5638218343ff9d1c6ae9974246276360c98d367952e48e21fd1331a04dcf1db3edea8f9c34efb5fc3883052761706ed752869c73a8aa0e8e7f0f19276060de2c536c2c7a32221ff3de17366e64968d585555b91720dba8aba9a53cdd6a7bc149179a956ac9caa5157fad93c209175e2d4b953c792554575438d9c277f7bb764db5bad2a585744b5b35a65444cad94c38c90274ad992c9123f8ac6d164eb0d08b795adf366d53aca12d9c5c813f75648dcf62fae869d3e3c40a4ef1a7c50f7b29776c9d5481fd664cc835a69869322f4ea8c0d4c9149c43143fb945a64b5b9342d4e4903698fc39b75914527f739343bf90a18b50486f4ed0695caefd82ec09ff2926fb540a4f9c801caee8283ae7440add4913547bc5aeab993b0615e2f8091356e59e2c61ad5f4bdbf9a6e85cd28dc7b8c4f75a7e9c2861b9d6edafca414f0b650d4e92f0caeb2177a7f5a8ec36efc1b414e14e67c70e1622274858da512d67e62b26d8e9e408edd73d738a7fd3724e13e4c408bace11afed4f551a95a6c3d110e18ec60c96119c14c1dd596d44aca0c314e3c6091162c7450cfe376ee51c3c19c27ea6a5d2c28c0fb73f1e7ed1f4af71c61b2742c8e86c115be590192c2c3027418069235ade7c6e6b1d0b720204c796dfc544ee1c2d953f482b3ae8205265bb729b18273e5808d7b56a2ac5224cbf6101e3a407f19d52a8dadf31a689f1a097f2d8ac30dbc90ee0be53aca9e60ba2b6600f4e74003bee2317557a42f73cc941e66a8b755754ca39743438c1816b576c397fd7d51ae3444d91ce478c151e2c32dcc3c32c2f2737686aa91655b5a5cc9bd8e6bd0f9cd86021d6fc5d4b55d3d36bf0ce3db276a4c8b1574e035dcf943282682d621c4f66d0cee04a68dda9a629a5cf890c3c7ba5c3a414f2dec43cec05124ee6804ed1ba6728b173c757c2490c3659d2555f515d9db22598bc42793a5abeb6b32d04794386892b76a37aa3cefc65be4e0426ad50b0e9f2ab95d0abd4dd85092b584aea9995736e315ebb8a66d7bab99ab19429b1304c54b1a043aa716bbea96026214c52a1524330f3bb15c2ce888ad5c4eabfee604bcaf4144c9d229694352d273f084c4cb1324d4ab10f33152dfede8d0b37ef391352e4b262ca98b1d48c65dcbce7e3bd7f814c62089351b86f68ff13c2f6d1ad12056cec60b6e67c57f1da5040f7b6228c90a5ee47cb0414ae7a176b95d0aba56293c3e413ad2247460db194debff97f3a1ccf18269ed0cc4e74af84bfd2eea38cda3130e184bbab16615cc6941d0f68b289e764df452a99db4e6ba3858926be5b8caa1c329e89e3c1f8c22413ee6154dd986accd32e6a1163078be74506c64505269870c5d43395aca9416eec1299e98d55430dd182fe2e9d4fccbff7f1b898616209a5fbea52ddedaf6eb0042695486c9fdfa956d6f061dabc77068be73decf2b223291d4c28d1a9ed63aa5e2e9773df616197353c3fde230184c92460368428716f3bf3ea070d964fe787f46a22918289249cdb77295db9bb5aacfe6368342c1c93486843d5582556759aeb39b1c50412cad993d73177103ed3969595c782c923b8b98450db14bdc5f669e28815dd753b53c654dd7d239082aaddab5bbe88a9c5886fcad5465dbc32f3dd6411ed50636aec29a518e3f8f75ae208238df76460cc305104abdbf4a4ad59c17c0f0d9344a833f3759b1abb77e3598109225aa675af962fbb96d4dabc27f35f7cb10284c5e331331c2f88981ca239e41b397db5c498c7cd7bdf9139818921a05a8cb1d8cdf75593bac0a410dd5c52071da6c58bdf754c08013fc5e5524a2cb5738a07c15647a652ca86e0a6461e9c34605c84980882d965dccfa68adcc7b4697993407c63ac658ce9efbc41d4021340b05ccc9333fbcae4b4fe00995aae61644c59a7de22267e48e6b5eb12a66baba2c709267d48d5d88aacbbb145b179134cf8e0d2b2a5eb525b0c1536144cf6f0ee8f1c8c495ba6d45609267a409bdd507b6f0eba4adff2f931fe53c40b922498e48193375ccfed5582eaf9705ad3c3040f89fb95dbd4ea376098dc01364c91b16691b1b65abd30b1034b30aeff959cef94ad3a306589e0b726c6d293d12146a8bd54428bd95fe11c165bcd29d488615bce9b1cd8f7d9ae5a70f3174c267180913fed62a9d4336b78630207974e752cb60ca1047b9fff519a61f2064e4ebcae1a9dd79372c34aa7266d50e954476c57998ca54c86997af35e0b1b266c808d9adaa4984b6931f76298ac61c5b4ec182e3765cc5cc4440d6813720b9152ec18fb304cd2c0ce5e57f3ffd4b6794dd0801c8a8aa16bd9aa19f6e6bd20989c41d5f1e6af6cceb173caf21ec7c40c1d3029c352b66488fb8a7944c87579f1dabcbcb0a64dc6a07191d991868a8918c26001133024c48aed6feaf35acdbe30f982c653e4cbf87101132fc0d4b1c1a4e9d235d7ed8243eb5654f55e9bf7d4840be861ab5bc831955c5d37efb5fc30d9828bcc8ecec3d1e198008d0b98680129a730be2ba5fd5099e5f3630831c98243d4585bb510fec6479bf7604cb01013d286dcd4a26ffa70703e6f30b94226a8c928a562502311ee3c0f132b30e852d93bcafef5d52655c854adf52aa850ef7ac3840a28b996dcaf9ee36b984c41a1f2cd0819a96729f6e6bd16967f81fc041329e4a228404135a8acf13bf8aea56a5b6ce2421117995052d142850ba443958edc000a4911c80501463e9e191f27242f846784c4f00b004a3c9d00a831a22e9f978d87359a00602104199886275804e1f31e20fc100e0cccc36081c50f8ac834ccc3a460e103d500008b1ea8cb67888bf3405d3ece8199d1680280c50e98755c0eb22bdab49433efc17c4733c4c535fe9e27c6e5d331030b1da8cba7b3f1bc683401c02207d9bfca96aa67dfd1190e3c3572f94b99b1b5f4b1b8c16ae732aaecd8d42a429a33b0b001e496a85373dd6bd7c77062c4c0a2064c1daab60d9d43d6a0d320aec65a35ee0637a1d4b0988182eaa3fa3387946b332c64a060426df91bfebb37dabc47022ce6c80855f374ab9ca5e5ca797881450cd6aaa556b37bb432234b79854bd974ac94ad60ae3265c9986ea1058b4a71c5a206f7f375a5081b84ad486fd82c6547556c250fbfb0023167470493c5d6ad3fd165e3d1a4ac62c1c8de6242ab258d0f638a2a941f3194d233ff5fedc3484945d21873a372c55247e4a850fedfa889dc32f2534075d9322652cfc4aa351c4e31454a2aa5fefba72a77dbbce7fc0e534ae192673273ee9673d7c8b4b4044921852ae79e41e7ce7bd1c6952db460f9bccc68524611dbea5db1c1d59155424044a1ee5b52155b6bb1fdfd8d94502c832c46a56dd746a5161b29a0888efa9783ea799bd9fa446cb70aa372cd35bea7cf8f144ff4b2169d358552dd4aca474a2738bab24c04530a277e75418e4aed82deef9f991e68a46c42ed623a7490a289b89ab11133d7543bb74ce86f37722dba3a529a30b12e157a6ed450ca253475ff764cddd043772996500ba6b85af77727546ee323a5124b91afd3cf96507cb69450af4851ec05e3ba4b6b12b1532b76ad1972ebe69248aa39310415e3f5f68d474a24542ad7226b07f561fc4e81c4aaf408c5ee29aa98de119c9821768d70b1edd58d5029db41d69a41b7d13123b26d4bf8bc891c73c98be814d12f4231a5e41a3a45a4a275ac31f45141e85c229043485bafe43657a7868845a9526311393bc42b2bb6dc2f5d4d9896215ab24fa9a17c6eb46221dc722cb26f0bb14ece2d211a22d4f4d5da6d2cf92056c3f51b95ba5cb44b10ba5c42b69eb3717b855c9012880857f9db99f927b592c78a0a5200d150c5cc55acb9a1ab4d297f409a8d31a492e20853f5e63d395c624bf1c3b274ce4104572782ed7d880d39ad5ec5b439c1e5c3a7db74d452c5982eb20e47f3312e2f68a4eca17573d34dcc3b450f2ac1e5526c4a73979d6dc048c9435b7eb6af5697f236f7e77c3e050fac454648ed76745511a2c1728718d1a785347a8bb1b96f3c4c064bb1835aa9e32b8b30d736a47560eda90bbd7fe962d7625c3461a4d02132d7a8d47a6c2dd3ffe6bddf34bf9439b05e863025e366450f5bc8604991832e622971d086306acab589d74a814362ec4a9d5b4df12205371a8fe1178ee9a4bcc117b398aab1e6cd1ca11437c04f7011ead44ce16aba23a50dcd6183ee5761aed4ead8f01eb7a1ae95284157ba069758f25a0c66f32297d4c0fe57152e973af5da4e83d3b5584aaf5036b7e9d010fbdfdb3dea192262debfd23b8fe992a5988123ea8cc83535b5104265d087bfd4a7655111ec3552c8e0606a0b7e2f865c3b37983286e82cb2d8da5ae926b552c4b031ba6b9ada29e594394c4a183ea9db6c4db6afb1a327050cbfafd8b5d5edbb936322295f58b45aa3c89ce0374be985472b97a3b2c41025e452bac096e3d5d123520ec1969bf7564a6a90c205f7bbaa216ecb9923729bf7e0f83652b6009721e56a71674caa4e08900da46821ddf9b7fda69b4931979205f4515bb9d4d43aafb3142ca494cced483d35b1f4295770b5dfd02797ec0cb11423c50aac1a749e096384dcca2955700ca9f4a8ee50ea759442858c6da34655cac567486d341ef6ec9841ca141435cc54f5ab398da9619022856cb9cda945f1b5f1622f48890284c95d83aaae8829a71b28a0872cee5aaeae29d4a20b529e90e2c6c5de138a2eb6fa0b77c2487102eb4ad7e8db31c8cc529ae0acedb74b0be1a67fa630c175626ab513721a95214f5982eb4c85bf9a0ab96f7acfc392468a1298524fcaaa982eb4b952928020640e61724e6bc5b648604dc8ca90fb7528b59cb142060b4912528ed052e455141f3efac570e3468a1196278c2cd32bd5df22db915204085353876aedaa3e83264821427e6b5be794666268336508d15dadf6bfcfc9c17e305284e0a925b66df9a7d88adcc68c9420acaa149b42eef46821a700e19342bd51e972a6efff834548b5a492821d93e2038838424dc94d3f5574453a1f97d283d45fc918747594ac620a0fd66a8cbb61ae54a4964ad9817f5af58ed4c3c19f11a4e8e05d39f789354789d50a2325072daa4a28618ccdbe146f887c4706070cc2852c3b614be40a6dde731723e506c819b7635e4a394e1dcea663526ca0d2c3d4ccd9254c8ae0e68cf79e905283940c3146b1d75d5bbf9b395268b01043a8256ffdccfb4d3346ca0c166bc81642562a353bc14891818afccc69b653ab6df98b9439f297995aeb9b976bf71d293148d89ae24ce9df1b3f427985ae5328ae30004a2b7625d3d5d954fd5b6fa3b022215f057f5953db31b155246c9654fc778892d539311aa80ae8de283e7bd57c11bfc8685852b11e953a961c23cbd474f31eccff4041457262b7501162e4e290f75a8a4497ceafa106ca291643c8cd6162ebfb51514ce1c9b9e63a324a6fab1d4a29ba9bc2a5f16163db5849e1d8c7b4563b95d23fb951a0940e55af8dec39694211457b5398cd8fd4734178039450ac6c8f4d39f8aa90630d8a981672f7d03987f209c51c5cee6352b63ee1ce00c5139fb928ba8fcab4f9d600a513ced4aad36ccfee108b1b345038e18dd3da854ed1526b630f944d40c5d0aeeb051964c410451391316bcdbf281774106682553ba76233859673ad51308110cb549934398cdef8121f59fd2fecd8104abb96f04ebc5a82ce0aa1d2afc4420badd454be77e63b1f2894d08596adc492c38f9d18ca241e3aa62929852274a52a09e8182f3be418ad55e422b15063d6206baa15390889b698bd46e6aba106597a442f8460e4e51bdb52ed1de132218caa17afb4ac501ad19e796c9994dbb94cd4050a23b65764d750b57331c26e288b6045bfeabb174a564a37ef713c319c2f8aa02862a1f2d5e9944bacb586e44049842e748b1b6ade3eefb5bc27e359030511e958958beed55b694a5b201f2ba8042b288d1584c60a3a6305f558416668a121f101ca2116b16ac7ddeddede4a06c5108cf1eaa72aa4d92c532156eae8ab92397a4611a210421fc5049936a71c43948d3288f6885ab55f04194766ef9c3304d1ab57e57f4a992a29f71e88e5bc3055520bb64f4d6f800288b46919adc6b4bf5431a889e1b878c26801ca1f62b35bc448f5b67e6c3fb46acd5a54a6cf76d30a5c3c9ac8e174641ea50ff96ba9d3a699ad19ab870f304685716d5accd52f9797ffb86c88683e2f640fedcea96b4bbfa1c6743d50f4f0ab58a38bcc7f6136d6e4212ee6ca9c5bcdb14b0ce2c13dcc44bde995f573cc0ce70e2df137a4ffac21b650ec02c50e9dd272eb62c65c6dc5b5798f51ea809652d62b174bd54e6af35ec751e8b03e315af811a2852fe342448332878cfa4d37298462272b918ff915a0c8216e47fdeed5e8ac74e31019315fb59252e5a86a06050ebfaab5b313cab4df9408ca1b98d3b69c36742cba04f383e2066ea751f52e6447dfae0d29b6065fb54218555564c33a662d95416d303d570b50d6a094ca476eed4a4d0b8a1adc3a8bed96d395ab865580a0a4c125d6a570fd33a5ced506050dbdc9dd27c4da45750e6d3e333dbc4039c3a74ebb895a8b6650cbad6568d73be4ab2319286570b5bade7d2bfac88891a1c1d872a598582a97ed312863706cf9c7a6da6ace2e3a14316c665bdabab5a98bc961707e98e932c2e4185d6fded37c810206f5c656f4dee671d9fd0b2b2666d752b7e818b17f018a171ca7bb63d72037621785a074a197e34a0a4598ec186340bc0083c50b30fc9b657e14f9325880a070c12d65d60db14fe859a94da26c419b475f4c57632da61612c59414442b2de4a0b73850b290feaa55642dc2779c6da38941c1c2420f5b459616dc0559c2817205ed566b578a1f9b13be155c6a6c4188d0b25d2e3217942a7473ae913d7a66bdc8c740a142fb74c70f1d5b6b6dfc1d285388a9bfa577ce204caaa93050a4c0deac5272ccab5d2effe6179928bc47771a135b4ed4296d44800285fca86eb9af53ae7383f204c4e02a7e8f9e9e52ebcd7b284e68ec8c5a37b81bd577844169c2ab8ccb9a2eb47891101426349814fadf86a9357fb5790f65091021b4347262143b4287284a58dfcd5e703175e973c60a192c1f39c24049426742961a3abba61843410223f74bb57ac81e26539bf734329e952db4d004ca11d643d5badc05916da824124514611c100641100320000397b62b000311002020202611486422b96c34b55b00140003546c44724e302e0f47839130201208c3208a82280862188682408a514c61e59901cec3ba185828d585c877581b094bbd694dcc1d5d6fa0404cdcb0f19b94e7505c774cdbc4a476036997724a40024335249e8c5df964c0982d1993fd918d0fdef37b804e7c67822e6562c48b4314e8ab026b6c77d7299bf1b6c6df052ded6612673809bf113216094576a1e62917da0e662a0a8fff5cc9d15039298d813e3bcb3ea375e52cd988b06bbfcc162aa136e2582677267199e30bfafadd80ac6e73ba98d8360ea9b12c29a1f56a9fa5a473b83593e1bdcbd690982686a99f2c277eafd491a0404db4e6e5e83193a6c694f01c88d60a67a5d94ae351cee0c7cd3c1b7261353f75132261af384ed19268dd063257f9fd8ca9cebe31e4f4c87ec266eb32b0674c8ebc1971a12c3bbd9097d9eccd6cea4ba07c3370262154cbdf49fa704935693e27a0388fcc1c1344b7ba6b66ad7a4cb0682cab0f0409227bc2e41a4bf52149faf8c947a851e507266dfcf7a3415848b342b381a7f5d5de84dbf8db9e1e380c299a73ae5da7036a13dcc4d922f5ce835835bfc3c3bf426669b3ef5df677cbe6887e1e51b581e725fc8e56497e7b9f1f07f2466d7752c01731cff8a66cf4926d0f33b96ba6f494414fc4067e4ac41a5b65de5bcc6fd95c8f98f7aae6376d83d573989c1ce639c3ff948a8e602e3cc5ebc8f4031f45d600e43ccac3fbdf2b4ee2e6e38cc2c248d67e96fbbedf683bc231af705f5c8b265e2dbf6123230bb2e8ea9f069809fc88f7bfb8f6af40cf4ff0a5e3d423e23d07056ec1e36d49aa7cc6755bec4aa935ffc555e8472e7bd71883d90bc16f6eb2aa28ad621dbd53e5c4a05dff42aa9b552e9e5dcb1e67f0d6ea54482086b6027317dfa2953c7ad823b25591f95a5600526f07d868453a70090100fc67c900fea6499003fe1727e32077cf0dca8f060502172887bef5e3b8caee50c95a55241a2fd19bab62592cc295dc5458db4ea6270ed7276bd3ba5b0fc13ec6f23e4dfb3dba371be7c58b8fd41aee8f8760265f72fadff1ba0fe6533e58da26303fd8f815e04200f510a57e7ad56af9e988e7dd4c4c5dbe1c1161c702d0635c2e048d307249a7d0f081e244e5b221b40a3129de2a6caab999438053d5916d8e88aa05852c905963f455ddf94fd2cb130fff96ffcd6b0fb4c60b071c3dbf0d98ef27fb3fa401280595b7b72f8d840877503ceadf4af2efc010aa0bdaadd69d47736903f1355336e5578feff059add906b5aba5ecda761f7164a736f544ac43c204e36ffa62aceee1a291416999cbb82f37d9d241cd8da86f7c503848e6aa68b73f798e9445560c5142bec7740d137aca4d72ed8f73c2e3ece404eba3c4817a84c182511b5a380652ba73d401a6f0675ef5e433dfe49d8741a5c126483d2f6572857f3f2e2ea926ac74ea4357302cde5a456797e7947eaca728000171691a95ac224c95182a672ec368289d97d7a8cebe73368b3521457acf6e8352b1bab4f6a21bf8dd33d362a19297aa3b2d337d3c6c010889a7879a3e83344b4d72c89082c5933d5f0c63eb324e916aa9606959bac7a22f9a7720883c157608e3bd2243c35a5924179f17c5aea4c5334a7193545b7a3887060428ec0ad3c76ffaaad93e3d5e6e930b4291ac9815f69b578e3ece22f31770ef2804cb26eec783c2689184259b082f6609f4c3e8dcd9ab8c30f7e8f88cbfc77d785c710b70a48cda6e7f0e55d7b627942ce9efe308cc190abdd8929a79c51200e849790fdfaeb5c9fe5dee091e42d111b4c743563ae367220fa1890490f5f8d8ed36ede7158d65cb780c183b38d01acf70db6f961c47deb2c3ca5486afe585f98983b1037f28d50c503899aea20e1fb0f0107c2c0af0dc67b2c67a64fc87ca77dab2b53248869107d2ef09d40b621c4b04a9db2933fcd3617715f4dae89484cff30a258426dea6f5faafaf8eadf3459213769c70dafa12f26d47ccde265ad7e89dae82b534024d55c31b2448a750f7407bfeef538e5db676c40019634ba8866f46039b7b1679d95b74fac80b0490ce11de8a6b4fa35919cb1d27cc713d445f8978bfd305d4caed4212e7531a826748cc53074bc0b79347b136157a511ba386ee4a6bf540dde817c29f0670291d451f3c8af8b2b049395f2706d31afe7b2308685fb2c8ef30ec8811c74739c0a927db83f95b6c0c6b60e96e06347262b5aff7578a165853a889cd88549e99c51250f1ddc29ef283b2e39d01f240e3be3fb22d63c72ea5857f1f8af9803d136cf7af4af833c2c90b4f4c7965bfc4ed22ea8a943b75e55addd507343b47b6b34bfe07b3da4eaf50abdc90adc8c35b2ef8c329719e2cedfed7e6017509d1c0fb907703285f9b8d0321722e68304ab3c4de4d40df16bcb64aa6340879d33916de40e1f52e48abc163b1caa217681df5e3f64afa6ac1677bdceaf2b9bff82d4a280c6414e5bbd366f7bcd9afdf169028c3d284a77bfd06f16677cfd5755f22b3642459907bda5ae740802947754a855c631a6c93a205a30ddd2d6c78d7c98fc34a29617e23faf98d8ecc44ab46d1c1d5c0f1f8d027ec500dd5f5e1b7a116d80f51e73a5acef8ba794a70d6c99d7110a4b9e34fb83cf543e4ac0d25f5a6c8b519fb43409fa5d883febd123d083dab10339d12acb050aae3424e58d2d080d5ae5126b72420a2bcee24b7a7edaf17e5ae7694a044fa7c3603a04a65b97b67ba2961ccad83aba2c3e65d07dace537f57f5a9633199e78026483c753444d3f8629601f8d53c17d1648cdc6dcbd7f5ceefb5e6b3aeb10df6266ec6f2f03d8861a60c8ebec1a3aca7a004f8f2bd885e7cf3af02b487604ba5b51f0f6ddc6ccd76168fd88cbc71268c4e227287822d295d31a270aeb3acbf7cce9bb2d2bb1ece19bbaa6ebc1143c83ca67087849bebba49d2cb51855b1adf4e9414976927a08e6022cda3ac5ebc9a7e8acfe8fe6f9c9135813dcf203512c86e623af35715b45b5eb8b843a2a7029a78f3d714261cd93d45f6fcae8f79229b72e8d9d38fe50a3896eb4d051f910e1bbe59396f9274da5e3e7ba8a3c3974adaef0945b5526706742362564528a1abe8b09ebe36fc2128b593b5cba7e16def483d6864006bda56085a441288c43ca2646b3d02ddc63430beadc70cca453921ddc1a80e22e83bc759efdabb7789936bba6cf2b34301c63ce1f3c8e0981d5b6de9ae9b4bc874466cec5c5e9908c9478249c7b080b9820274b51cc15791fa1bde08a3ffe36384c6f08c1db1b5bf198583c862e7190af932ef59786657769afa6de156948751e3b53c852c7f253b76862ca40c39be54e751bc619fe0ba28d89a9b25dec6d8906b95f7133555c2b134d032e026ab6c0a466180aff92a1136add4e0b6043ebf2ae74383c8a1cccc47dd3ea2270a2eb44d351eeee362707048bf624c5c47c54187379ce4f5a4327bc8d8082023b1c9cd3c6deea55e1068660ce28caa9f0a506f8115786791b1c48324b20c9a6add29984fcb67414497d7c9620b2388db3835ea9a7ba233c66d189e6be32b8365b00c0c80505147ee4b6d98bacf2094431dd72587df28bd32ce0701d66d94b3fdb2f903885f433034834f118612081040c0a3d840838b1a34372241d29bc8e0882768bae55b4f610445de08de1afbed80af1885d68d2438eae5ebdb1d96fa1f9d9a4023248951327719818bebb0b9301d5e6ffb3a71272440761164dd75892b8f3cfdfc8b3886bc28d541911fe5c7eb4f693ef145fba8cb5e13dd0b5ef6a1dce11caf973d53da4edc4b66474fdc63e873568cfea613cd81650bf9d51c7305e27999bf42b766075c3e79c6977c001ec14d1bf3e8e876e008548a6edd40487211bcfe751a61f75bcdf5e95569ebaa9d1ba4bfa3ac5754b86f06b28a2e694cf4f08660c9d0d6798c174647a56ca63e3582abda805d6813f5d629a9422d494f62875da4f08a4116567026869eee75398a507e29fc7109397ce28f6492a1921579e826a4cc55bf49c4fed5bec19d3e94d2c3e5c2e10caaf90be477e1001f9813b5fe8301beccfc57867cea55e9a241636cb0b007d150715f561797e7b9414d05a85767e931046dd623ba7b5528302fcd4fb1f7912807620a4ef7ecc28a90a0f7c0f1f1d508193ebad696b4c10b68f34f92a8a7ea2233dc3920f73fc58b80d0c3529aba149f13e1b64b6e2518a359e4ffd7a3c674ec61b90b771f3a9bd4964ceb8dca20797db7b3fa6190b1687d75cd7d5e874ba476df0bf951d617d6d919af1f59db90479abab8a27d1e61b7eb62b0d6798467f541b7efcfdad1ed0d7825f20d83a8c940c378720a2c4f30b6119430f97c1a25581eb7c9f39461d100376db68e88b113166b13e0cf512a52cee44b4400162de363546b715f420322cfebc32df446bd6bd6f491bfe5ab113563eada248cbdfcbfc772d27007663dcb15ce4e77c36b84c28f1dfbf9f111b0ce5b384afd80cc3ebdd39b14a90db9ea7003394b97cdc981c22875bed82aea4bdd450b0e85064001d6b1f2df8a1cba5b56ba043d52dd42238013a28ad7144c8c142d177557126cf7b0f89b8a9e8f3f0c59ecaa018fa13e4998106788c270586f9aa73164a2d405103856700629a97e13a92b3a893e1b3d6a638796a0dd53b6cc4d913f04dcab888e8e9e3f09ca7aa70c3a1a05e24ec48ea0662e7543151c99f6b26440132fe9380d7dd9aea0fa0e8d97775b88105417f1b4b31b4ffa5d3cf608cb593c57a6567ffb292f66140c1aa896d2ce1bb650d6601b26cfb58f68c0133429a6d9c21d7c7734f734236a53b2c308edc1537cc4f74a59206d98d58e4d0962b5de5dc7384035699c89f48075fcac4f81cba93f0a112139974610c58dc4a8410c396b07df85bd4922c50032314f2fc7bc826425a9f9a7b8b224016024074043aa9b78a7c3379159302349621fc7e129ad41f8cafdb1832f7f04903641ca991284a31f3efc7a605a14d22c0b8cfce238ef6951e122f1a6ac2dadf0dbba5e713450038351bbed148432d6d746eb670117b2f11bd8da28bbf6367479d90845a31c9e60bfad80cf385427371b413768b272e0a8ed83f4d7168cf8699045a2792589ba7acbd27ece2f09b01b891986a26337c9cfc7681b217df2f44c6befbefc6d68d68f8c2411f45cd47f651168802a5d21ce499727c66b613a77147d8a23700b003657939b67adf05cb200e3952ebf6efa61966aff1c64d872ec3ee03b5db7a367591912109554be99d288932d55b074564c0aa5b355f1709f039cc3293e5b97a1cf2a369eb570a9b7ab1c1dd158a4171db2f1586b2f9d47f456ed29b373b24a7118c30d636540aa7f32f6154e4a8ed93f9548eed30d1741de40cd218f9cd0b8ed8cdb90cb4c8df4492346658af8db520db31e92ca6457b86b204baae317c7aea5501e22e0e144543a4c2e59ac944b9efe5766bf850191e31f89e6379c6a7d18c21e585682b55906660a8ea4977af52da2df6bddcc9a5355473c4c6c3e275007b67994a7a56483f8fc99e7609b03c1501846a6337bcc27363a9fcb3d28c52f0f1b7ee72f6e084f7ad872daeb1b140c183d08ac58273468a0e55c952248d67c70d1648c05a5929a7ffab9221c5050695b49ca57e0ecf16f8ee87410b5276814e3f0d065596d23e890c83bfc8cfd8c99e711745fd71909ed469479615a54fab206e0e890f3a6f531685885ea1ae3b28497e96e0b554e4d983cd091c91a1702fb505e2a60af7ccb1d985f866e4f98f1e881541217fffcc74f73530a7744e51a774e6cabf2eba7f86a2b3ab44f7ac4a1576cba075e1ee9e7156b4c87a6ac9d8798e8134ed7b09fe2394a6b9bf2d4e13711176ba5ddcb891ff94aad36806dbc0560122c04995267431114bd034e4f0488cca7605468ae6673e28da689ffd31eec17695c3792e631b1a688d8a327e68f3531eb0c32cdc90910ae92a257d945531216a85fb2b90e8f92456a458f741e69ae2897c2e2601cbb62a94a71c022580d390ecd1545a4b8dcec0dab89805affdcbc0947ed5cb8d940ebfee0671e9af80fbcc6aedd67d26a8b57e6cd74cbb44b7ad4f913f81c0a4ec76e582bf7de8babe186d8dd6d62f075ad48f9cdd670803a8a1712ca3ecb19c1a6f7b4ffbc6180bdb71aa31ef270d3038eac0f051db50e4cdd23f811eb8189baea1ad1df069747a9ec2c2cb6fc2da668c57365c3863202fad932b7723171729fe55abe49488a948d573d971f246f291c9984d7a830f2ed3c850861162464edf9e34ef96765befdd2f292918a1031882057864455b57a7a44d0b2580509ef4f33adf03349afb428cbedd443bd8c497b6f3ab326dd833fc728d81ff6d1040c57f94c1655c114d84de913a69e59c006f67d68995b677a2301e77f0621624971f8fa0b9c0815b0c3eb7da903bc2e61dd50469dd1ffd8e467ce0c387a0ab62fe8c6fb74b318edcdbc8e0cbc0ab7d96d717e093dd916ad4ba529316fa9a36e00110ad6a9b6278a402688a2dfe84e3835f6a9450fabb1fba603a422cb822cd29dd27c7ab10fc60b4927497c66053ce554b956a43de022348e9987e0ca63e885bd9203518c9a5639d1316c493cb6ba6dc50875a60311810579551b08f70116d4e9cba8f78f36e4f5cd43620fe34bcaef9eb84d52fdf14eda2d4271e5cf13eb876e6e2dbad502fabefec947f0fbb4339ed07d825af93100a40391c7d891a0c551414b0c690a1c9982be1804ec600016eb47d9eedad7f0c81f5835e39a645c004efc29bd42887b0c53c51067b1754374380a19a39ab5083988f509fff876f8a01dddaccccc8b1442a547af02411a3190f9750b17aec9e8fcdb2eedb7de951bc2f0a56db526cf318ede894a6e0d62b0480a49e83d57fd317bf0fa08328bd13c47ad3da88a847ff8845ace96a3deae86dfac2b3b3085ac70ec8a7f79b7a5eef6d0eccfd72b1515d5b686ad2f8680fd6cd316d76609e808ae1afabb954669c299484a63dcd50051bef41b34b0a993ae10a89db9c8047c149080eb1fdc40f78d7d43ef924af20cb9b73a6816003c622b989ef6259c733429fb596b13d1ba4e8f760e951e504c43c7d8fd3c272baab18682bb788dd0923c008218968089fc5f94d43b6c2f287dfdb305be529fa940da8fffbc60eb18caafd50263e59d711b257990a32b44c8a0fb8d749b9cfec06462944768227ba5a0cd2f40d3f7c7295d4dd493af01aed0e0b0d7ebe28e8453582390058a860da434ecb454c4f66552496cc573dcb860853a1040c7b1ebbe1364d8c825a5375c92da2bf592d54f6ac1be967aa16db5e27276b5ec7f4c3fc07f065ca2ab9f8ce083668a87ae379459a4c4f3ca1682063433e52607f1b993d8dd0322639a381c665adad1e270fbcb24c5608737f61ad655f7a9997105e0ab7f2fe9a980a01c9515c6148cb52e4f87f50066473a8e620fa8da33060728f59361bf60733a5c14ad762895ab7806002c16be2bb848a9736d3b3f174b0f42c3b77e6e1aee48a880b7d978a9301614ea02970b59c2d6432c31d611ce53216342fc7c8c297f049df6267999f86324b6d9fc9d481e0702e8a74a42095ba350915005a1afffc5cf17611c5ec5aba1c3f71efd501f257726c044bc73f97957a70554f3048504e0469b59402a8ea37a6835f91cea714fd0683e28cf1d91b98a3b1c0156c7dd8f1790dc85215b990f1437f79938ece7b5859b7e66f44810af9836fb4b7b3258390b48dcece75fce51c2fdac9c71fd24ead9ec6697b8281c6757f09c9dae7625835c50fd9259c5d71b84e718527fa1988bc20bd3333934d2354c48d27ccfc567aa748a850d42675f2a9f245a3c7e3eb13ad2117094165b35fe2ce183350f69d0827db68e41bc739f274b2e378c5122cc670420c9da15c4815e940abad6c54cbd3f87c8cf43923ce0d89f4555f86d4718594662d46f3a1501b2a5626993da7a479149513f00ca95f25d55ec037f70f1c0919f5adcdaddbdffe90f1c088346c73531656eaee0fcab40a9de1586fb184841d2418b9060946d91ed0eb85b9f9209cb005084b8062254ab42f93a251581e231c812815f8f01aa24ce92b994152a7ee9eebbcd05d17bd3f27a28712aeef2d87aade7cdb6a41624e0e3f0da32f1f197d86707f8cabae202e22c00032cb9566619658962ced1ae9480d7180a4235c171ee28044249f14c207239d82628c711d9eb4bcce8c3b162f1e35f23fa905bbdd301e7d86a8012cbe3897eedf4be282f9a94411d84b51eb614bfdffe5d2d00ca2663b48141a16e250e718cbcea0214a8f9a18605f941f5db3cff1b173c301e44c4769c4f5c5b49ee399ac5f27468a8da29962075fd0ebe0e83e9a22f57a3c62740739186ce6ccf5ea67fb44784a1a284db4467b4d0d28f5cb61a8c854a4a66865c160c891b0eb8e2e1f87498e8d524e5ada1c226acf9351790fb2587d06d020b610028505c9d1e0301486efd3991e5595f38f230a6e79ebb69d686e430e8950024f5593e1761b738524cbc90317ca86fc6bdb35a3f454722aae8dc5f0a345c5ad13fb714bca2b1318776b0d6c0e330c747107f6ace85192f6f9fcb28261dfef37e61204c70f74567d938d89580e2e53742d42d09451c4f44531ab1a01b859eafd8b1c56f63d753f38aa7d454d35d9b24dd4af96c22ca5d3ef51d7db0579d44e33a7613f66c035f9b7bc5f75b1330f821408089853295f4d5d1f8ccb81734ecd53f6277f1f86e4ee302a6858426c233a8b2d171d58014d1e0bfb2fff051c91afb2d5e4928ac8ac282b5c68a22a35fef020d51a8cfe424e07d1126def3fa62328c6f3b67a5c21635ff12812f677d734e25a9ddf4c21f6059e1e1f73d82301494dc51990a097ddc43376ecc6e95a3f9d4f009a8e444b8b4408a2a0856e328fd6daec86fd7345b961a3544b33da0a1aec33e9ce400134e1026c11f970c4b725fbd60c75f1c2b1c7e931f37c2b97aeae15549692603a621d0a3bf12a5b672076a6d80c627cebc9b97f1bef0ff95ef01bea5e4e829a387c0af7a510a359496dca2ce96a3d5c9003a340dd21cf6a2c8fff1753c2ff767da04472b8230f0010a8b93950267fb58a3d9fa101d153fd4e04ee616ca3f3100633cb7945d702b6279ff4aa6249136027f54da0c42ccf0007a4016d089342788d8ab5d09af6be0d8ecebd1f855a1cab027f0a4740e00c05431bc7d389af3e7e34ea8311553cd51fad8a068469ff74bc130617bf48c7903fb5f7de421dc4af65a01b52f96ad41b1217459fe7a25b9a505c8756668e5cffb127e6dcb4f7e416a045ad6056eace77196ff90aa104bc85bf50701e8a82288af9ec9f2ed2b5366e17c5ef759498df7f746a5561daf2babda5e19f4997ce85b6af15d15c038c31d25ad6e9cc9176f3b39643d7e65167a3dc9ba133d51b7653f56f899f442acad75cc2a94141957be7795b9a0fed80a32e74f34ff7017f0d7dbe4b69e45b0d4e9284de565e1e6932a76f4403e37dec64f5148988ddba3b18ad5552381ad40b7cb3358e88cd9c5e910a5672d02f33d602c8825bcaceb5081920b529cb962aa2d397a2dafdc9559485de8a4fff40a15772268d7e26d70ba48d7169bd96a4d36979d024b3c3ce245a650889968ed38f7c108ac3632d5789f6d18f8a3344f750d0a1c5c24a8082003df3f20acf1fd0c9f4e885d346ced4adf852b312169e8951ca40e0158bbd78724c1569da1eedd219e6d620b9e5e1209b60cae43a459f1692471ebb33da062d2b938e07a1b5f0c9df5542ac920b3f5ae40c51823d0efc0a0f4161a0178496a91da3eade18fe0698348b3afdc9a43756bb077194a625892dd04dbb462abd5594c74c8595b2b9439de29df7f92a30c2c31d98c294d290b530d342ad857e5942a3c942cab2e4b3a50057476e7364a72ace2c9da34f041f62dd30a1a05cce83bb81d147de6180dca1115b5db2ad5fe6e4fe83646a9f8c21fd313363b5d593fd1673e2e601c4e68b2820cd4cac602cd55e7039cc94364fb745be740d387573fc070b725bae0e7bd3f4962047110805ac468201878a475ea281f10280eb21c290b48f74ac801614050f9b1597ad29e3bb58a045bb41828bfc84dcf080193d130db655c9317c4605dfe73e47dce9f88daf1d28a8de7bf240a5e64268c57bd110d488ca87a36bb98032eff39be9f2dcfc7c88e954bd633fd75051f53eee02288438f191b54750bf471780985f62f6937bc3ce2bfb09acc0827466aa411f53e964fc57617548bff500bee332f7e85869266db7cede84c285fdc135d1380f49de3fce805030309b98ef70865393d331aa7da4c9fdb79361c06cec1d88494b9a0e6400ff30153d0ccce473331b0e9ca99527991aff647b03dbd28c748aac2f02047140665834b6c63d16cbf593077edd39809d4d8672eccdcb07e678bccedaf54ed5573047c217dfcb1f8e87c8913cf393a40c1229a3ba3eea9aab587f5e9ef5a734781eee1c5bd36692305aabbfb03d599c93b28a0606b36817059fd9a71302cdc6e3890323df714c2009958eb0e75ab1532d547da27d1a187a4b48894db129d8ed9d5c7b3ec3ceb253616464dfcef10f84cad5a8e04d731d93ba956787b308239c60fc4f8e65c9bc7bacbbe3890672a5be9d8c60247af0c65060ce931a0bc39dd4fc39c02158d94ef593a5ea7c8b474af05028784d710047517ffd036d382f5bd0436093cbfd21a83daa4442d7da207e2c76764fc6cb2851d0088b71802be6e6669b16e434689e31d028d8cb540d8ef0faa50a6f819397462a8c04f92687f6ae636ef62b3531a506e520ec44f3286f9f0748282ebe696c5d041c567434de6f67b43acab92b8d65c82bc6b0d7721b2eaf78566b758543d2045aa3c203ba07d7f10a7f174df64e09869d0aeba093afce681c58282c2a4630d3a1b836e58b474fcf665a2b9d6664e1a4804703543b8f36845f9df2cf15470a274155dddfa31b7d2656edd03f0280b93a565ee4de4ef1c06b8d11530699b248546a8f4600cdfec96b4325747a84820191f210b0692b4984303385ea938712d73ae1f5b491c97652ba91726146efb788ed632b9ccb27bafd703c4accbf73a1779526511758a38d3411259a685cb196ef2c128ec7afd58b5476f3a75736cae48aeae2b518d01300060824a229613343f03598aa922c4674af8d9828ab6cc61e31813539966e32fca4c77d67d40166df850cfea75593366ab06318091b0c1a42d7c790b33d2a7d8fbbe55861d425bc165cd9813306cf77c8fd854ca33301e8d09d4da50f4ae3eab4ae004f70665bfe00fd725968da1f666707e112f18ce20261a92eb96036f4a56ca8a2fdaa16e437d00000401e3c51161fbd7b3fc8f49e5f47077abe6f5614dede3d22421790c5d1ab16944ae87e3d7fd3a6251a2be68bc19dcc5fb9587db3af09908222bc47506300f77718a7bba8b5a687e2d483ecd65898ae92a2607ade5e4ec204e649a047f3382b58c8da7820af6393f31a96e38e328c1f01c27960a9c967fce252fa648387ce46a724917f8416af9597286f66e029b5f74a1d77a345f326a7a73b04c48fc51b60a0aa6fe48a829224824ef81d8d77411151039f7d57d8bf867564b19a8d65ba491411d3db14030d9988ddd5674571ebe7f295e5c035f017dd60a682af0783399a389d95387ab74064898e56cebad1b74efad59d9743458a00a5415fd7ed24f28d24d41bd51011cb6aefb3ac0732d92aa850c3c4ddcdebcbcc75814327167eca8af994e9400104ef0b0fdafc80d2d9f8edb666afd6f8df4e270928beb1397d51d41914b82c564476f0add133936351c08b875c78ef007e070a2f32f7cb98dcd0f63984de02d80dda60548e14af912b576827d686913130af3089c5e5b095e5f4a9c04a33ddc8360e89371962c35938167b75bbf40a368e7b020105ad8aaa84f85df9a70d81066425bbac5ff67a562dc9461aaaa5cca4b0bdd81f396c1a3b9d2e2ec6ad2b19bcbe13f56a133803c66dbb0786ecc04614e5eeed9a7a8b2ef97c4bab9e9c3ada7fa0ece8ca7b8473c6c00646f3bcbed9aa8dac174810097acdefa89589a92691f8581299433a6ac73bc77858b9f34498521d8f56f556346178751d16c32b25538dc61496bed654f8b4072982b9a8409b55adec10b7cd6cdc180ec1c20c7818635344f860981a90d979439ac81036bdbcc9b862f3e1e6420eddc8e728b8538a4db242be464d9ef3e7cc4831f4035b48df63768d02a2b85c06045faaec7fa8a8b8ff85964aa3b60ccf888ef1721569851d1dfc49e1ff3012186a5f7f347ae05ae937f673904b5d79eafe2076039f63935b01f85b1980d3da4aaf09451056a3c3be24f764250cc97591d33de75629d722f4885605090f89312767149795eb43fa3f3110f11b02d7031b0d025b9bd3fcad0a2c615ff78eced11ff00e0445513f881a489e823ee99519960b50dda68dc2bb8daa3a2b52c662986f9175fa473878f28a4c006da9e26f2a5028186cea5155dae1389e86612c82ba0991aa4e1c7d2b09fbac486e290552c9246d892ca759e475dbae8f63948b82466fb6bc4a6b801a3e4282d9ccec7376bff4d837687c51c08c4bcd0666357730101279358c9acf70df7e0a9f9a8d3b3b17dd8c09f4a811b5ce1bbf080a2103ed2cc8a9b0b224d15a63ad12a69f6c64fdae3aa9cc41f048c2227a68efb507ff9e522d2c648fcebff2ff7cd004e7a894ab1074ece968d2db9cd6daebdf244c266fce6937ceb7658087761be656feedbe54116dea532e51796bb58466d57ccb8d5c43ee717fd9f34c911d4de4bab08c0a3b9f6c8b49a1600fe2fe4ed01feaa542090304efb33683e6bb95c7f9f7d424e7e36a4e7d29db02a3eb96cadc0547eae1df2c6eb0696f55861e351ad47034123bea99956694d55d806575e979312e0bce9394bf5119ac9c28861775b77208bd6321d92a477f599dd17bf25f65ba4541c7ecc821684bd73d6dc9704e2e4cb1edaf2a5dbfa397945183e69967f47167e766f25e4124d4446d5148fe5a5f0e0817382c556fd3d56f3cb9b07078123a7c97fd72c11301992528555d6815930ec470ceac480c9ce0a610122147e47bf51f2f1d52f746e71cde88cecdbc646bf42e800856d414bc76f44cf7c8d7b59738799752d9b597f46ad3dc9e67189ca74a33b892744c0e533b7aaf4a28f6478a1ded998caa40df63177a615f78fbf1535a21b8dee263b83e87cbefd1295ddaef18ed1bf4ebb316332fe5c74c1095d4cfd8c2d43ba02e996cb36bfd86baba3c563b1571ebcdfe9b177ec114305846efc42b15238a12288613efeee8860e118f735a5b39a7f6318d28dc2a34490da4cffebee023d95f8590fdc63d0a11c723caf175a701452236228229bba4e25b6e7a5ebc65bba8019f0383957ef7ece9e2078d5d7504ffbddb356950621fa082ac3734879c87fa03b23044c8b16258609dfaf791c198cd61bde723b14086e455e9178a005a5a7ce2710bbc4522d44e71b4b065f369d9fe689b22d53d84ec59892843bb648f49d6ad737f5cc897504195fc4e89930fd72e33717fc3aaaae63856eb71a7a308a82910a353d52a0d5bda5caf9770a5a770bfcdebff4e343193cf9d5055e7389a1d802ac5abb735a9602ed9785d8f270d9e1e3fc04a0d9c539f825b2ffa98dfde20d06883fa5c25703c64513f95b055dbbdeb7e4cc59fc54ef77ef6c9c93b3fa2ffff791b14bb2f9f7e33e58f15c11f8bd5f8f4e12a4c7732d18183d02a798409347f8be54fbbcb73f989c181c0b3e2a68f8e98c65b948a9d30b6dffbc837300d5c186b6a1f97521be50a0528e8547cf480f73df7762d01454635a354664d2078371053838067a002a00986d8fbd7e26183591141cab6af4dad03f43d8be134e98d26c686a1a9f13f5a6ce2b37b2c631f77c7446d73da52a073b617c079c97256b07f3558f5ee6a2ccbc86c6105b1e2fdda5c99982a217aa088468e405ca1dad6f4048651510a8dffc741ff6bb4023edbf4eaecd5a678fefdc8b41f6eff78f3f18ad1114879e3e83f8a3c25b916aa90a1fdcccfe01f2ecf3897e2b024db68ed7b02cb7be3d82e7350e769a38f9ea74f955835d2328780b88a4e545d9ba3c3745896b94c489917acf19229047c6f26454914097987fce71b76ee573e8fe1d0e4d8deed99d32159bd302fc68eda200e4d804c113374094af7e8b6d99aaa29c09799564ca5491a11ad992918c4f0f8c7779eb0eaca7176ec7d3ce9460f0f00da7b6546822da35a1605040c621822b0593de90846c7c38769078fadee4ca7852f3b2815062e5a8f32607007f2edaa76eb5f41d1a0348902e17ea5d603aa0043923fc1b4a3018ced7433f864292dbf50c7563795612dd95a98bde1751220c92aba23a45b86f4920ba2c2af56ce5d1e091cf45a6269dd42b832c94597fc764461cd176e1f587d22cbdaeab3542a72b58a377eb5883dec62904970f3a1c6f7d1c2fbe998785f01d3c2d74a5fe70602606c15ea9c68b832ac8dbfa3b13ffaa82b7ceabff0878cf53945464856157bd28f24cd6e5ddfb4ae79aae7a8a24f76b7d4a3e463069219228db846deda231094195c4a3e732580f01ce0ba54811c48ff1c9d40607ec86841bafa3801591f8744a2f2a5d094c798a97b309457ed499ad8860bf03486a7fb694c22895c558695f086a2be943726b83bde1b66a03447f5520d0c892eae9c29111943c1c3a192f62644c8db0d611d0b529ca08989d9886a12c545529588e2ae3ce2fa6980e462f1356aa5406f9374968bd49926ea0c20c192db360ef5e35d32a153398548ef2f0b0d31aa94bd52c5a36f43e33000f2079444d378d3fe88e9c405779025d9685caca14dcb1db4cf55ddada5cfbeea3b6f65adb5c1e2b00a15f7a98998a5704f11ddda73776c475a1e0244df81a79a45909d8c7d01e540f0403fbf90b16103e3e02eecf0618e8bf9bea02beadbc56f5a4ebcbdbf654e3c2599aa64223427d2221ca1123d205a5c60745567f2a5e41ecd53c46d25a13d074aa5103dbd60f768589eb7a88c56697750df8dbd0968923dc537a8dcc9a2d94bd121c363514071649184a003b1576e00d6d6abb38bf93f44acca7d07a1fd98527536b7463b162e68b03afa694f8d585a97e49efccc9fa99fcff1652118318dd15cf608322f59d30042878484ee6c9ec6a40cdef7200e6565ff80aa3f5d4dfef1b5a64a159611fad3196e36b13f88d04413df152b4760f82f702929d7c68660ffee7fb5fb8f1db7400eb634c7fa4d1e92f6f34514272e41c5ed4e6dac3773bc29ccea5702fd9b96c92ab4e7e98aff8629724a4b1e3b2745456897b968ee45d3fc521381cd80f71c093fbc00aced029c191d8be139ca8e5715160e422e409aea2cebeda47cc4bebaa59131211398f72da464599621f62bc5d8f0a84692987529d19fdc58c331d66bf72b66fdd7df870048438731dcaa1b0f3c39d553f35624e98bce1275cb88d65522d516e5e440575a010cbdaf9b601403184880359198c13fdf62b7a6dc375752b2c4baf7f034900434f24a00de9c767d053ccc4d9100d03f0b7461ad8812923ef4b8a70b71e771612ade5ca3486564f43a7c1d7c1e9c42c912c4aef00bc131857c7137c3c992cb29113391e7ee7d2c8e771ed3816396842ff886e5cf786c537f94e2c78986585122ac142f2e2ef42019eb927b00265557194d7b882d7e998b2242cca9320fece7d7ed70b12c1eab9296681228cc3ba93a28b9bc4a84549491fe9711c662f4b5bd74e189a86c3494ceb267e9f3ce4837122bc5785f9d9f572c1e2867a3ba58aa301f9e4b38fc2c63d84c7e4f267f4f714417f9cd2a2bc31858c00c2f8a02a4f7aab130224d42f51e2c8d42ba421b9626ca122031a019824c5c0b350ab59c529bb47ff15d4790127996d7ac6fd420e9379ac79cbe07814ecd962054e4c19a7b52c8c9c2af6716a5869a9ce71041e4df95ba4facc6c9ca223761b98252dc044231c856681f3e72416b35b9276405e19f61a56a929816be61103c8e95a7ddc14385b029c242bdc5681a89c99057199abf6aa16757255dd62b900d2d8cc16a52964bc0b91971032a4d51ebb6943cfe8471683c90fc7fae1c7e01f3a41127c6ac280e0d47088c11ff069391b581b98bd98de6b13088bc0c5de74294cd58e0b01fedc73e176dbb2a5e65aa2a95c299a15b27eb56700e7733c1ad0b28f41ce2a47449ca22569759c672ad2343623bf45d7856e2f6071ca7929c167e290f0874c13ee4b6a6b4392a539bdb279d486133a757ed0a31a1da89bfd1b34129ab90ab8546edbdbdb6b9c3b60cf69e7cc8dc5b5fc846caf889df43769f915cb529716e6ccb3a0903fb9edeae1fa8f31a78e1a5c7c14b82cd65af0779fb535c9a63aa9d7952ef74df00a4bda1f8c130c25d7566c370ec23334aa0abb26a34c288d9900020d5140e342be7abfb370cf8e9f00b19c6ebd5dcc4d5bb0f9d0e0f063c04c784f0c67b87b67452937b59d8273c90c6cbeceee90b6b84130a3196f793c043050fc7980819dc32432836b292f5b90ca4029594e0ae17049f4daf289ea6289b080cbe36501d1c7fd03259d1c7b703986d216fda8fab08426bdd074d020626df5c51c7657f65e3680726814b94b080c5b25d5300e518a50a36616fb99c9091b6016959e5ddddba5985a835fb6266cb9c55cf9947c8de82f0914323b1ab02d066ae68f564067c47d89c605f49c5a9b658f22c87994c8b45e58ac696241310cbc334c0716840d573fcdd9fad259ae9634288bc1ce30428322a7a96a67360b207f9ea3e30b98d4c62f0e2c2602fbf94eb8f073a5702dc7796810164634617e537c3e7861750167dd381824b797fbdeb30a64e830a4e3bcc28c22f8ed1915730d19a06e4db2bb59b058e163487b380c4bbff36fdeae25d655022bc21367d9ad383bbdf62bf0f0deb3cb6c42785e686e3e27efe61cdcda4d507c954dacd27079640e5b53e82cb86ad7db6dd9a074e66007e2acca7307183424e27d419b35d4aeade2e9ffd88eef73d02986fe1a5ccf15f618783904fa590ae0240dd0d1599a0bbcc805526366341897db427dafd6d392c3e8839710ab5b90367bebcb229c0dac8fa76537a64ec0a8be1b437b7864eb735ae79ee45087d861df9d560ae3149ada9d724d86f87049ee949dd761ff013f467558c56b834c77059d7fc6fd77318d5907cf66f6e954fae02bbf12fbe7736698470eba7b2f916b44a8b2a3716b3c9d67c9390788f170c05a4be6ccc4d4bb0bcedc1d9c9d81422bc973fd269df63174670b7f7b5869af28ecada08d62c0cd3ac508a2b0f2203e2c446b5dc3b03f83adba167b5cc04128c22e529d01", + "0x45323df7cc47150b3930e2666b0aa313878d434d6125b40443fe11fd292d13a4": "0x00000100", + "0xbd2a529379475088d3e29a918cd47872878d434d6125b40443fe11fd292d13a4": "0x03000000", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545" + }, + "childrenDefault": {} + } + } +} diff --git a/polkadot-parachains/src/chain_spec.rs b/polkadot-parachains/src/chain_spec.rs index aba304a207a..ada1569d9d6 100644 --- a/polkadot-parachains/src/chain_spec.rs +++ b/polkadot-parachains/src/chain_spec.rs @@ -56,8 +56,7 @@ impl Extensions { type AccountPublic = ::Signer; /// Helper function to generate an account ID from seed -pub fn get_account_id_from_seed(seed: &str) -> AccountId -where +pub fn get_account_id_from_seed(seed: &str) -> AccountId where AccountPublic: From<::Public>, { AccountPublic::from(get_from_seed::(seed)).into_account() @@ -193,3 +192,487 @@ fn shell_testnet_genesis(parachain_id: ParaId) -> shell_runtime::GenesisConfig { parachain_info: shell_runtime::ParachainInfoConfig { parachain_id }, } } + + + +/// Specialized `ChainSpec` for the normal parachain runtime. +pub type StatemintChainSpec = sc_service::GenericChainSpec; +pub type StatemineChainSpec = sc_service::GenericChainSpec; +pub type WestmintChainSpec = sc_service::GenericChainSpec; + +const STATEMINT_ED: Balance = statemint_runtime::constants::currency::EXISTENTIAL_DEPOSIT; +const STATEMINE_ED: Balance = statemine_runtime::constants::currency::EXISTENTIAL_DEPOSIT; +const WESTMINT_ED: Balance = westmint_runtime::constants::currency::EXISTENTIAL_DEPOSIT; + +/// Helper function to generate a crypto pair from seed +pub fn get_pair_from_seed(seed: &str) -> ::Public { + TPublic::Pair::from_string(&format!("//{}", seed), None) + .expect("static values are valid; qed") + .public() +} + +/// Generate collator keys from seed. +/// +/// This function's return type must always match the session keys of the chain in tuple format. +pub fn get_collator_keys_from_seed(seed: &str) -> AuraId { + get_pair_from_seed::(seed) +} + +/// Generate the session keys from individual elements. +/// +/// The input must be a tuple of individual keys (a single arg for now since we have just one key). +pub fn statemint_session_keys(keys: AuraId) -> statemint_runtime::opaque::SessionKeys { + statemint_runtime::opaque::SessionKeys { aura: keys } +} + +/// Generate the session keys from individual elements. +/// +/// The input must be a tuple of individual keys (a single arg for now since we have just one key). +pub fn statemine_session_keys(keys: AuraId) -> statemine_runtime::opaque::SessionKeys { + statemine_runtime::opaque::SessionKeys { aura: keys } +} + +/// Generate the session keys from individual elements. +/// +/// The input must be a tuple of individual keys (a single arg for now since we have just one key). +pub fn westmint_session_keys(keys: AuraId) -> westmint_runtime::opaque::SessionKeys { + westmint_runtime::opaque::SessionKeys { aura: keys } +} + +pub fn statemint_development_config(id: ParaId) -> ChainSpec { + let mut properties = Properties::new(); + properties.insert("tokenSymbol".into(), "DOT".into()); + properties.insert("tokenDecimals".into(), 10.into()); + + ChainSpec::from_genesis( + // Name + "Statemint Development", + // ID + "statemint_dev", + ChainType::Local, + move || { + statemint_genesis( + // initial collators. + vec![ + ( + get_account_id_from_seed::("Alice"), + get_collator_keys_from_seed("Alice"), + ) + ], + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + ], + id, + ) + }, + vec![], + None, + None, + Some(properties), + Extensions { + relay_chain: "polkadot-dev".into(), + para_id: id.into(), + }, + ) +} + +pub fn statemint_local_config(id: ParaId) -> ChainSpec { + let mut properties = Properties::new(); + properties.insert("tokenSymbol".into(), "DOT".into()); + properties.insert("tokenDecimals".into(), 10.into()); + + ChainSpec::from_genesis( + // Name + "Statemint Local", + // ID + "statemint_local", + ChainType::Local, + move || { + statemint_genesis( + // initial collators. + vec![( + get_account_id_from_seed::("Alice"), + get_collator_keys_from_seed("Alice") + ), + ( + get_account_id_from_seed::("Bob"), + get_collator_keys_from_seed("Bob") + ), + ], + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Charlie"), + get_account_id_from_seed::("Dave"), + get_account_id_from_seed::("Eve"), + get_account_id_from_seed::("Ferdie"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + get_account_id_from_seed::("Charlie//stash"), + get_account_id_from_seed::("Dave//stash"), + get_account_id_from_seed::("Eve//stash"), + get_account_id_from_seed::("Ferdie//stash"), + ], + id, + ) + }, + vec![], + None, + None, + Some(properties), + Extensions { + relay_chain: "polkadot-local".into(), + para_id: id.into(), + }, + ) +} + +fn statemint_genesis( + invulnerables: Vec<(AccountId, AuraId)>, + endowed_accounts: Vec, + id: ParaId, +) -> statemint_runtime::GenesisConfig { + statemint_runtime::GenesisConfig { + frame_system: statemint_runtime::SystemConfig { + code: statemint_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + changes_trie_config: Default::default(), + }, + pallet_balances: statemint_runtime::BalancesConfig { + balances: endowed_accounts + .iter() + .cloned() + .map(|k| (k, STATEMINT_ED * 4096)) + .collect(), + }, + parachain_info: statemint_runtime::ParachainInfoConfig { parachain_id: id }, + pallet_collator_selection: statemint_runtime::CollatorSelectionConfig { + invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), + candidacy_bond: STATEMINT_ED * 16, + ..Default::default() + }, + pallet_session: statemint_runtime::SessionConfig { + keys: invulnerables.iter().cloned().map(|(acc, aura)| ( + acc.clone(), // account id + acc.clone(), // validator id + statemint_session_keys(aura), // session keys + )).collect() + }, + // no need to pass anything to aura, in fact it will panic if we do. Session will take care + // of this. + pallet_aura: Default::default(), + cumulus_pallet_aura_ext: Default::default(), + } +} + +pub fn statemine_development_config(id: ParaId) -> StatemineChainSpec { + let mut properties = Properties::new(); + properties.insert("tokenSymbol".into(), "KSM".into()); + properties.insert("tokenDecimals".into(), 12.into()); + + StatemineChainSpec::from_genesis( + // Name + "Statemine Development", + // ID + "statemine_dev", + ChainType::Local, + move || { + statemine_genesis( + // initial collators. + vec![ + ( + get_account_id_from_seed::("Alice"), + get_collator_keys_from_seed("Alice"), + ) + ], + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + ], + id, + ) + }, + vec![], + None, + None, + Some(properties), + Extensions { + relay_chain: "kusama-dev".into(), + para_id: id.into(), + }, + ) +} + +pub fn statemine_local_config(id: ParaId) -> StatemineChainSpec { + let mut properties = Properties::new(); + properties.insert("tokenSymbol".into(), "KSM".into()); + properties.insert("tokenDecimals".into(), 12.into()); + + StatemineChainSpec::from_genesis( + // Name + "Statemine Local", + // ID + "statemine_local", + ChainType::Local, + move || { + statemine_genesis( + // initial collators. + vec![( + get_account_id_from_seed::("Alice"), + get_collator_keys_from_seed("Alice") + ), + ( + get_account_id_from_seed::("Bob"), + get_collator_keys_from_seed("Bob") + ), + ], + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Charlie"), + get_account_id_from_seed::("Dave"), + get_account_id_from_seed::("Eve"), + get_account_id_from_seed::("Ferdie"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + get_account_id_from_seed::("Charlie//stash"), + get_account_id_from_seed::("Dave//stash"), + get_account_id_from_seed::("Eve//stash"), + get_account_id_from_seed::("Ferdie//stash"), + ], + id, + ) + }, + vec![], + None, + None, + Some(properties), + Extensions { + relay_chain: "kusama-local".into(), + para_id: id.into(), + }, + ) +} + +pub fn statemine_config(id: ParaId) -> StatemineChainSpec { + let mut properties = Properties::new(); + properties.insert("tokenSymbol".into(), "KSM".into()); + properties.insert("tokenDecimals".into(), 12.into()); + + StatemineChainSpec::from_genesis( + // Name + "Statemine", + // ID + "statemine", + ChainType::Live, + move || { + statemine_genesis( + // initial collators. + vec![( + hex!("50673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730").into(), + hex!("50673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730").unchecked_into() + ), + ( + hex!("fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a").into(), + hex!("fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a").unchecked_into() + ), + ( + hex!("38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a").into(), + hex!("38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a").unchecked_into() + ), + ( + hex!("3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415").into(), + hex!("3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415").unchecked_into() + ), + ], + vec![], + id, + ) + }, + vec![], + None, + None, + Some(properties), + Extensions { + relay_chain: "kusama".into(), + para_id: id.into(), + }, + ) +} + +fn statemine_genesis( + invulnerables: Vec<(AccountId, AuraId)>, + endowed_accounts: Vec, + id: ParaId, +) -> statemine_runtime::GenesisConfig { + statemine_runtime::GenesisConfig { + frame_system: statemine_runtime::SystemConfig { + code: statemine_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + changes_trie_config: Default::default(), + }, + pallet_balances: statemine_runtime::BalancesConfig { + balances: endowed_accounts + .iter() + .cloned() + .map(|k| (k, STATEMINE_ED * 4096)) + .collect(), + }, + parachain_info: statemine_runtime::ParachainInfoConfig { parachain_id: id }, + pallet_collator_selection: statemine_runtime::CollatorSelectionConfig { + invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), + candidacy_bond: STATEMINE_ED * 16, + ..Default::default() + }, + pallet_session: statemine_runtime::SessionConfig { + keys: invulnerables.iter().cloned().map(|(acc, aura)| ( + acc.clone(), // account id + acc.clone(), // validator id + statemine_session_keys(aura), // session keys + )).collect() + }, + pallet_aura: Default::default(), + cumulus_pallet_aura_ext: Default::default(), + } +} + +pub fn westmint_development_config(id: ParaId) -> WestmintChainSpec { + let mut properties = Properties::new(); + properties.insert("tokenSymbol".into(), "WND".into()); + properties.insert("tokenDecimals".into(), 12.into()); + + WestmintChainSpec::from_genesis( + // Name + "Westmint Development", + // ID + "westmint_dev", + ChainType::Local, + move || { + westmint_genesis( + // initial collators. + vec![ + ( + get_account_id_from_seed::("Alice"), + get_collator_keys_from_seed("Alice"), + ) + ], + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + ], + get_account_id_from_seed::("Alice"), + id, + ) + }, + vec![], + None, + None, + Some(properties), + Extensions { + relay_chain: "westend-dev".into(), + para_id: id.into(), + }, + ) +} + +pub fn westmint_local_config(id: ParaId) -> WestmintChainSpec { + let mut properties = Properties::new(); + properties.insert("tokenSymbol".into(), "WND".into()); + properties.insert("tokenDecimals".into(), 12.into()); + + WestmintChainSpec::from_genesis( + // Name + "Westmint Local", + // ID + "westmint_local", + ChainType::Local, + move || { + westmint_genesis( + // initial collators. + vec![( + get_account_id_from_seed::("Alice"), + get_collator_keys_from_seed("Alice") + ), + ( + get_account_id_from_seed::("Bob"), + get_collator_keys_from_seed("Bob") + ), + ], + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Charlie"), + get_account_id_from_seed::("Dave"), + get_account_id_from_seed::("Eve"), + get_account_id_from_seed::("Ferdie"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + get_account_id_from_seed::("Charlie//stash"), + get_account_id_from_seed::("Dave//stash"), + get_account_id_from_seed::("Eve//stash"), + get_account_id_from_seed::("Ferdie//stash"), + ], + get_account_id_from_seed::("Alice"), + id, + ) + }, + vec![], + None, + None, + Some(properties), + Extensions { + relay_chain: "westend-local".into(), + para_id: id.into(), + }, + ) +} + +fn westmint_genesis( + invulnerables: Vec<(AccountId, AuraId)>, + endowed_accounts: Vec, + root_key: AccountId, + id: ParaId, +) -> westmint_runtime::GenesisConfig { + westmint_runtime::GenesisConfig { + frame_system: westmint_runtime::SystemConfig { + code: westmint_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + changes_trie_config: Default::default(), + }, + pallet_balances: westmint_runtime::BalancesConfig { + balances: endowed_accounts + .iter() + .cloned() + .map(|k| (k, WESTMINT_ED * 4096)) + .collect(), + }, + pallet_sudo: westmint_runtime::SudoConfig { key: root_key }, + parachain_info: westmint_runtime::ParachainInfoConfig { parachain_id: id }, + pallet_collator_selection: westmint_runtime::CollatorSelectionConfig { + invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), + candidacy_bond: WESTMINT_ED * 16, + ..Default::default() + }, + pallet_session: westmint_runtime::SessionConfig { + keys: invulnerables.iter().cloned().map(|(acc, aura)| ( + acc.clone(), // account id + acc.clone(), // validator id + westmint_session_keys(aura), // session keys + )).collect() + }, + // no need to pass anything to aura, in fact it will panic if we do. Session will take care + // of this. + pallet_aura: Default::default(), + cumulus_pallet_aura_ext: Default::default(), + } +} diff --git a/polkadot-parachains/src/command.rs b/polkadot-parachains/src/command.rs index 67ec05935b6..60dee182179 100644 --- a/polkadot-parachains/src/command.rs +++ b/polkadot-parachains/src/command.rs @@ -48,13 +48,21 @@ fn load_spec( &include_bytes!("../res/track.json")[..], )?)), "shell" => Ok(Box::new(chain_spec::get_shell_chain_spec(para_id))), + "statemint-dev" => Box::new(chain_spec::statemint_development_config(para_id)), + "statemint-local" => Box::new(chain_spec::statemint_local_config(para_id)), + "statemine-dev" => Box::new(chain_spec::statemine_development_config(para_id)), + "statemine-local" => Box::new(chain_spec::statemine_local_config(para_id)), + "statemine" => Box::new(chain_spec::statemine_config(para_id)), + "westmint-dev" => Box::new(chain_spec::westmint_development_config(para_id)), + "westmint-local" => Box::new(chain_spec::westmint_local_config(para_id)), "" => Ok(Box::new(chain_spec::get_chain_spec(para_id))), path => Ok({ - let chain_spec = chain_spec::ChainSpec::from_json_file( - path.into(), - )?; - - if use_shell_runtime(&chain_spec) { + let chain_spec = chain_spec::ChainSpec::from_json_file(path.into())?; + if use_statemine_runtime(&chain_spec) { + Box::new(chain_spec::StatemineChainSpec::from_json_file(path.into())?) + } else if use_westmint_runtime(&chain_spec) { + Box::new(chain_spec::WestmintChainSpec::from_json_file(path.into())?) + } else if use_shell_runtime(&chain_spec) { Box::new(chain_spec::ShellChainSpec::from_json_file(path.into())?) } else { Box::new(chain_spec) @@ -161,6 +169,14 @@ fn use_shell_runtime(chain_spec: &dyn ChainSpec) -> bool { chain_spec.id().starts_with("shell") } +fn use_statemine_runtime(chain_spec: &dyn ChainSpec) -> bool { + chain_spec.id().starts_with("statemine") +} + +fn use_westmint_runtime(chain_spec: &dyn ChainSpec) -> bool { + chain_spec.id().starts_with("westmint") +} + use crate::service::{new_partial, RococoParachainRuntimeExecutor, ShellRuntimeExecutor}; macro_rules! construct_async_run { diff --git a/polkadot-parachains/statemine/Cargo.toml b/polkadot-parachains/statemine/Cargo.toml new file mode 100644 index 00000000000..bef112a4a51 --- /dev/null +++ b/polkadot-parachains/statemine/Cargo.toml @@ -0,0 +1,368 @@ +[build-dependencies.substrate-wasm-builder] +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '4.0.0' + +[package] +authors = ['Anonymous'] +edition = '2018' +homepage = 'https://substrate.dev' +license = 'Apache-2.0' +name = 'statemine-runtime' +repository = 'https://github.com/paritytech/substrate/' +version = '2.0.0' + +[dependencies] +smallvec = "1.6.1" + +[package.metadata.docs.rs] +targets = ['x86_64-unknown-linux-gnu'] + +[dependencies.codec] +default-features = false +features = ['derive'] +package = 'parity-scale-codec' +version = '2.0.0' + +[dependencies.frame-benchmarking] +default-features = false +git = 'https://github.com/paritytech/substrate' +optional = true +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-executive] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-support] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-system] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-system-benchmarking] +default-features = false +git = 'https://github.com/paritytech/substrate' +optional = true +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-system-rpc-runtime-api] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.hex-literal] +optional = true +version = '0.3.1' + +[dependencies.pallet-assets] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" + +[dependencies.pallet-authorship] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" + +[dependencies.pallet-balances] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-multisig] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-proxy] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-randomness-collective-flip] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-timestamp] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-transaction-payment] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-transaction-payment-rpc-runtime-api] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-utility] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-aura] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.serde] +features = ['derive'] +optional = true +version = '1.0.119' + +[dependencies.node-primitives] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" + +[dependencies.sp-api] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-block-builder] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-core] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-inherents] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-io] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-offchain] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-runtime] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-session] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-std] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-transaction-pool] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-version] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-consensus-aura] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '0.9.0' + +# Cumulus dependencies +[dependencies.cumulus-pallet-aura-ext] +default-features = false +path = "../../pallets/aura-ext" + +[dependencies.parachain-info] +default-features = false +path = "../pallets/parachain-info" +version = '0.1.0' + +[dependencies.cumulus-pallet-parachain-system] +path = "../../pallets/parachain-system" +default-features = false + +[dependencies.cumulus-primitives-core] +path = "../../primitives/core" +default-features = false + +[dependencies.cumulus-primitives-utility] +path = "../../primitives/utility" +default-features = false + +[dependencies.cumulus-pallet-dmp-queue] +path = "../../pallets/dmp-queue" +default-features = false + +[dependencies.cumulus-pallet-xcmp-queue] +path = "../../pallets/xcmp-queue" +default-features = false + +[dependencies.cumulus-pallet-xcm] +path = "../../pallets/xcm" +default-features = false + +# Polkadot dependencies +[dependencies.polkadot-primitives] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.polkadot-runtime-common] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.polkadot-parachain] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.xcm] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.xcm-builder] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.xcm-executor] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.pallet-xcm] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.pallet-collator-selection] +default-features = false +path = '../../pallets/collator-selection' + +[dependencies.runtime-common] +default-features = false +version = "0.8.30" +path = '../statemint-common' + +[dependencies.pallet-session] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + + +[features] +default = ['std'] +runtime-benchmarks = [ + 'hex-literal', + 'xcm-builder/runtime-benchmarks', + 'sp-runtime/runtime-benchmarks', + 'frame-benchmarking', + 'frame-support/runtime-benchmarks', + 'frame-system-benchmarking', + 'frame-system/runtime-benchmarks', + 'pallet-assets/runtime-benchmarks', + 'pallet-balances/runtime-benchmarks', + 'pallet-multisig/runtime-benchmarks', + 'pallet-proxy/runtime-benchmarks', + 'pallet-utility/runtime-benchmarks', + 'pallet-timestamp/runtime-benchmarks', + 'pallet-collator-selection/runtime-benchmarks', + 'pallet-xcm/runtime-benchmarks', +] +std = [ + 'codec/std', + 'serde', + 'sp-api/std', + 'sp-std/std', + 'sp-io/std', + 'sp-core/std', + 'sp-runtime/std', + 'sp-version/std', + 'sp-offchain/std', + 'sp-session/std', + 'sp-block-builder/std', + 'sp-transaction-pool/std', + 'sp-inherents/std', + 'sp-consensus-aura/std', + 'frame-support/std', + 'frame-executive/std', + 'frame-system/std', + 'frame-system-rpc-runtime-api/std', + 'pallet-assets/std', + 'pallet-aura/std', + 'pallet-authorship/std', + 'pallet-balances/std', + 'pallet-multisig/std', + 'pallet-proxy/std', + 'pallet-session/std', + 'pallet-utility/std', + 'pallet-randomness-collective-flip/std', + 'pallet-transaction-payment-rpc-runtime-api/std', + 'pallet-timestamp/std', + 'pallet-xcm/std', + 'pallet-transaction-payment/std', + 'pallet-collator-selection/std', + 'node-primitives/std', + 'parachain-info/std', + "cumulus-pallet-aura-ext/std", + 'cumulus-pallet-parachain-system/std', + 'cumulus-pallet-dmp-queue/std', + "cumulus-pallet-xcmp-queue/std", + "cumulus-pallet-xcm/std", + "cumulus-primitives-core/std", + "cumulus-primitives-utility/std", + 'xcm/std', + 'xcm-builder/std', + 'xcm-executor/std', + 'polkadot-runtime-common/std', + 'runtime-common/std', + 'polkadot-primitives/std', +] diff --git a/polkadot-parachains/statemine/build.rs b/polkadot-parachains/statemine/build.rs new file mode 100644 index 00000000000..9b53d2457df --- /dev/null +++ b/polkadot-parachains/statemine/build.rs @@ -0,0 +1,9 @@ +use substrate_wasm_builder::WasmBuilder; + +fn main() { + WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} diff --git a/polkadot-parachains/statemine/src/constants.rs b/polkadot-parachains/statemine/src/constants.rs new file mode 100644 index 00000000000..ea98447bfb8 --- /dev/null +++ b/polkadot-parachains/statemine/src/constants.rs @@ -0,0 +1,72 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod currency { + use node_primitives::Balance; + + /// The existential deposit. Set to 1/10 of its parent Relay Chain (v9020). + pub const EXISTENTIAL_DEPOSIT: Balance = CENTS / 10; + + pub const UNITS: Balance = 1_000_000_000_000; + pub const CENTS: Balance = UNITS / 30_000; + pub const GRAND: Balance = CENTS * 100_000; + pub const MILLICENTS: Balance = CENTS / 1_000; + + pub const fn deposit(items: u32, bytes: u32) -> Balance { + // map to 1/10 of what the kusama relay chain charges (v9020) + (items as Balance * 2_000 * CENTS + (bytes as Balance) * 100 * MILLICENTS) / 10 + } +} + +/// Fee-related. +pub mod fee { + use node_primitives::Balance; + pub use sp_runtime::Perbill; + use frame_support::weights::{ + constants::ExtrinsicBaseWeight, WeightToFeeCoefficient, WeightToFeeCoefficients, + WeightToFeePolynomial, + }; + use smallvec::smallvec; + + /// The block saturation level. Fees will be updates based on this value. + pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); + + /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the + /// node's balance type. + /// + /// This should typically create a mapping between the following ranges: + /// - [0, MAXIMUM_BLOCK_WEIGHT] + /// - [Balance::min, Balance::max] + /// + /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: + /// - Setting it to `0` will essentially disable the weight fee. + /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. + pub struct WeightToFee; + impl WeightToFeePolynomial for WeightToFee { + type Balance = Balance; + fn polynomial() -> WeightToFeeCoefficients { + // in Kusama, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: + // in Statemine, we map to 1/10 of that, or 1/100 CENT + let p = super::currency::CENTS; + let q = 100 * Balance::from(ExtrinsicBaseWeight::get()); + smallvec![WeightToFeeCoefficient { + degree: 1, + negative: false, + coeff_frac: Perbill::from_rational(p % q, q), + coeff_integer: p / q, + }] + } + } +} diff --git a/polkadot-parachains/statemine/src/lib.rs b/polkadot-parachains/statemine/src/lib.rs new file mode 100644 index 00000000000..abf35ab357d --- /dev/null +++ b/polkadot-parachains/statemine/src/lib.rs @@ -0,0 +1,837 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Statemine runtime. + +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +pub mod constants; +mod weights; + +use sp_api::impl_runtime_apis; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +use sp_runtime::traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, +}; + +use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; + +use frame_system::{ + EnsureOneOf, EnsureRoot, limits::{BlockLength, BlockWeights}, +}; +use runtime_common::{ + BlockNumber, Signature, AccountId, Balance, Index, Hash, AuraId, Header, + NORMAL_DISPATCH_RATIO, AVERAGE_ON_INITIALIZE_RATIO, MAXIMUM_BLOCK_WEIGHT, SLOT_DURATION, HOURS, +}; +pub use runtime_common as common; +use runtime_common::impls::DealWithFees; +use codec::{Decode, Encode}; +use constants::{currency::*, fee::WeightToFee}; +use frame_support::{ + construct_runtime, parameter_types, match_type, + traits::{InstanceFilter, All, Filter, MaxEncodedLen}, + weights::{ + constants::{BlockExecutionWeight, ExtrinsicBaseWeight}, + DispatchClass, IdentityFee, Weight, + }, + RuntimeDebug, PalletId, +}; +use sp_runtime::Perbill; + +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; + +// Polkadot imports +use polkadot_parachain::primitives::Sibling; +use polkadot_runtime_common::{ + BlockHashCount, RocksDbWeight, SlowAdjustingFeeUpdate, +}; +use xcm::v0::{MultiAsset, Junction, MultiLocation, NetworkId, Xcm, BodyId}; +use xcm_builder::{ + AccountId32Aliases, CurrencyAdapter, LocationInverter, ParentIsDefault, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SovereignSignedViaLocation, EnsureXcmOrigin, + AllowTopLevelPaidExecutionFrom, TakeWeightCredit, FixedWeightBounds, IsConcrete, NativeAsset, + AllowUnpaidExecutionFrom, ParentAsSuperuser, SignedToAccountId32, UsingComponents, +}; +use xcm_executor::{Config, XcmExecutor}; +use pallet_xcm::{XcmPassthrough, EnsureXcm, IsMajorityOfBody}; + +/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know +/// the specifics of the runtime. They can then be made to be agnostic over specific formats +/// of data like extrinsics, allowing for them to continue syncing the network through upgrades +/// to even the core data structures. +pub mod opaque { + use super::*; + pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; + /// Opaque block header type. + pub type Header = generic::Header; + /// Opaque block type. + pub type Block = generic::Block; + /// Opaque block identifier type. + pub type BlockId = generic::BlockId; + impl_opaque_keys! { + pub struct SessionKeys { + pub aura: Aura, + } + } +} + +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("statemine"), + impl_name: create_runtime_str!("statemine"), + authoring_version: 1, + spec_version: 1, + impl_version: 1, + apis: RUNTIME_API_VERSIONS, + transaction_version: 1, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { + runtime_version: VERSION, + can_author_with: Default::default(), + } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + pub RuntimeBlockLength: BlockLength = + BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have some extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); + pub const SS58Prefix: u8 = 2; +} + +// Don't allow permission-less asset creation. +pub struct BaseFilter; +impl Filter for BaseFilter { + fn filter(c: &Call) -> bool { + !matches!(c, + Call::Assets(pallet_assets::Call::create(..)) + ) + } +} + +// Configure FRAME pallets to include in runtime. +impl frame_system::Config for Runtime { + type BaseCallFilter = BaseFilter; + type BlockWeights = RuntimeBlockWeights; + type BlockLength = RuntimeBlockLength; + type AccountId = AccountId; + type Call = Call; + type Lookup = AccountIdLookup; + type Index = Index; + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hashing = BlakeTwo256; + type Header = Header; + type Event = Event; + type Origin = Origin; + type BlockHashCount = BlockHashCount; + type DbWeight = RocksDbWeight; + type Version = Version; + type PalletInfo = PalletInfo; + type OnNewAccount = (); + type OnKilledAccount = (); + type AccountData = pallet_balances::AccountData; + type SystemWeightInfo = (); + type SS58Prefix = SS58Prefix; + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; +} + +parameter_types! { + pub const MinimumPeriod: u64 = SLOT_DURATION / 2; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = weights::pallet_timestamp::WeightInfo; +} + +parameter_types! { + pub const UncleGenerations: u32 = 0; +} + +impl pallet_authorship::Config for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type UncleGenerations = UncleGenerations; + type FilterUncle = (); + type EventHandler = (CollatorSelection,); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; + pub const MaxLocks: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + /// The type for recording an account's balance. + type Balance = Balance; + /// The ubiquitous event type. + type Event = Event; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = weights::pallet_balances::WeightInfo; +} + +parameter_types! { + /// Relay Chain `TransactionByteFee` / 10 + pub const TransactionByteFee: Balance = 1 * MILLICENTS; +} + +impl pallet_transaction_payment::Config for Runtime { + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; + type TransactionByteFee = TransactionByteFee; + type WeightToFee = WeightToFee; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +parameter_types! { + pub const AssetDeposit: Balance = UNITS; // 1 UNIT deposit to create asset + pub const ApprovalDeposit: Balance = EXISTENTIAL_DEPOSIT; + pub const StringLimit: u32 = 50; + /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) + // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 + pub const MetadataDepositBase: Balance = deposit(1, 68); + pub const MetadataDepositPerByte: Balance = deposit(0, 1); + pub const ExecutiveBody: BodyId = BodyId::Executive; +} + +/// We allow root and the Relay Chain council to execute privileged asset operations. +pub type AssetsForceOrigin = EnsureOneOf< + AccountId, + EnsureRoot, + EnsureXcm>, +>; + +impl pallet_assets::Config for Runtime { + type Event = Event; + type Balance = Balance; + type AssetId = u32; + type Currency = Balances; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = StringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = weights::pallet_assets::WeightInfo; +} + +parameter_types! { + // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. + pub const DepositBase: Balance = deposit(1, 88); + // Additional storage item size of 32 bytes. + pub const DepositFactor: Balance = deposit(0, 32); + pub const MaxSignatories: u16 = 100; +} + +impl pallet_multisig::Config for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = MaxSignatories; + type WeightInfo = weights::pallet_multisig::WeightInfo; +} + +impl pallet_utility::Config for Runtime { + type Event = Event; + type Call = Call; + type WeightInfo = weights::pallet_utility::WeightInfo; +} + +parameter_types! { + // One storage item; key size 32, value size 8; . + pub const ProxyDepositBase: Balance = deposit(1, 40); + // Additional storage item size of 33 bytes. + pub const ProxyDepositFactor: Balance = deposit(0, 33); + pub const MaxProxies: u16 = 32; + // One storage item; key size 32, value size 16 + pub const AnnouncementDepositBase: Balance = deposit(1, 48); + pub const AnnouncementDepositFactor: Balance = deposit(0, 66); + pub const MaxPending: u16 = 32; +} + +/// The type used to represent the kinds of proxying allowed. +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug, MaxEncodedLen)] +pub enum ProxyType { + /// Fully permissioned proxy. Can execute any call on behalf of _proxied_. + Any, + /// Can execute any call that does not transfer funds or assets. + NonTransfer, + /// Proxy with the ability to reject time-delay proxy announcements. + CancelProxy, + /// Assets proxy. Can execute any call from `assets`, **including asset transfers**. + Assets, + /// Owner proxy. Can execute calls related to asset ownership. + AssetOwner, + /// Asset manager. Can execute calls related to asset management. + AssetManager, + // Collator selection proxy. Can execute calls related to collator selection mechanism. + Collator, +} +impl Default for ProxyType { + fn default() -> Self { + Self::Any + } +} +impl InstanceFilter for ProxyType { + fn filter(&self, c: &Call) -> bool { + match self { + ProxyType::Any => true, + ProxyType::NonTransfer => !matches!(c, + Call::Balances(..) | + Call::Assets(pallet_assets::Call::transfer(..)) | + Call::Assets(pallet_assets::Call::transfer_keep_alive(..)) | + Call::Assets(pallet_assets::Call::force_transfer(..)) | + Call::Assets(pallet_assets::Call::approve_transfer(..)) | + Call::Assets(pallet_assets::Call::transfer_approved(..)) + ), + ProxyType::CancelProxy => matches!(c, + Call::Proxy(pallet_proxy::Call::reject_announcement(..)) | + Call::Utility(..) | + Call::Multisig(..) + ), + ProxyType::Assets => { + matches!(c, Call::Assets(..) | Call::Utility(..) | Call::Multisig(..)) + } + ProxyType::AssetOwner => matches!(c, + Call::Assets(pallet_assets::Call::create(..)) | + Call::Assets(pallet_assets::Call::destroy(..)) | + Call::Assets(pallet_assets::Call::transfer_ownership(..)) | + Call::Assets(pallet_assets::Call::set_team(..)) | + Call::Assets(pallet_assets::Call::set_metadata(..)) | + Call::Assets(pallet_assets::Call::clear_metadata(..)) | + Call::Utility(..) | + Call::Multisig(..) + ), + ProxyType::AssetManager => matches!(c, + Call::Assets(pallet_assets::Call::mint(..)) | + Call::Assets(pallet_assets::Call::burn(..)) | + Call::Assets(pallet_assets::Call::freeze(..)) | + Call::Assets(pallet_assets::Call::thaw(..)) | + Call::Assets(pallet_assets::Call::freeze_asset(..)) | + Call::Assets(pallet_assets::Call::thaw_asset(..)) | + Call::Utility(..) | + Call::Multisig(..) + ), + ProxyType::Collator => matches!(c, + Call::CollatorSelection(..) | + Call::Utility(..) | + Call::Multisig(..) + ) + } + } + fn is_superset(&self, o: &Self) -> bool { + match (self, o) { + (x, y) if x == y => true, + (ProxyType::Any, _) => true, + (_, ProxyType::Any) => false, + (ProxyType::Assets, ProxyType::AssetOwner) => true, + (ProxyType::Assets, ProxyType::AssetManager) => true, + _ => false, + } + } +} + +impl pallet_proxy::Config for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type ProxyType = ProxyType; + type ProxyDepositBase = ProxyDepositBase; + type ProxyDepositFactor = ProxyDepositFactor; + type MaxProxies = MaxProxies; + type WeightInfo = weights::pallet_proxy::WeightInfo; + type MaxPending = MaxPending; + type CallHasher = BlakeTwo256; + type AnnouncementDepositBase = AnnouncementDepositBase; + type AnnouncementDepositFactor = AnnouncementDepositFactor; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4; + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4; +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type Event = Event; + type OnValidationData = (); + type SelfParaId = parachain_info::Pallet; + type DmpMessageHandler = DmpQueue; + type ReservedDmpWeight = ReservedDmpWeight; + type OutboundXcmpMessageSource = XcmpQueue; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; +} + +impl parachain_info::Config for Runtime {} + +impl cumulus_pallet_aura_ext::Config for Runtime {} + +parameter_types! { + pub const KsmLocation: MultiLocation = MultiLocation::X1(Junction::Parent); + pub const RelayNetwork: NetworkId = NetworkId::Kusama; + pub RelayChainOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into(); + pub Ancestry: MultiLocation = Junction::Parachain(ParachainInfo::parachain_id().into()).into(); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsDefault, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, +); + +/// Means for transacting assets on this chain. +pub type LocalAssetTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports. + (), +>; + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `Origin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + XcmPassthrough, +); + +parameter_types! { + // One XCM operation is 1_000_000 weight - almost certainly a conservative estimate. + pub UnitWeightCost: Weight = 1_000_000; +} + +match_type! { + pub type ParentOrParentsExecutivePlurality: impl Contains = { + MultiLocation::X1(Junction::Parent) | + MultiLocation::X2(Junction::Parent, Junction::Plurality { id: BodyId::Executive, .. }) + }; +} + +pub type Barrier = ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom>, + AllowUnpaidExecutionFrom, + // ^^^ Parent and its exec plurality get free execution +); + +pub struct XcmConfig; +impl Config for XcmConfig { + type Call = Call; + type XcmSender = XcmRouter; + // How to withdraw and deposit an asset. + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = NativeAsset; + type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of KSM + type LocationInverter = LocationInverter; + type Barrier = Barrier; + type Weigher = FixedWeightBounds; + type Trader = UsingComponents, KsmLocation, AccountId, Balances, ()>; + type ResponseHandler = (); // Don't handle responses for now. +} + +parameter_types! { + pub const MaxDownwardMessageWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 10; +} + +/// No local origins on this chain are allowed to dispatch XCM sends/executions. +pub type LocalOriginToLocation = ( + SignedToAccountId32, +); + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = ( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +); + +impl pallet_xcm::Config for Runtime { + type Event = Event; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = All<(MultiLocation, Xcm)>; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = All<(MultiLocation, Vec)>; + type XcmReserveTransferFilter = All<(MultiLocation, Vec)>; + type Weigher = FixedWeightBounds; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; +} + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; + type ChannelInfo = ParachainSystem; +} + +impl cumulus_pallet_dmp_queue::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; + type ExecuteOverweightOrigin = EnsureRoot; +} + +parameter_types! { + pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(33); + pub const Period: u32 = 6 * HOURS; + pub const Offset: u32 = 0; +} + +impl pallet_session::Config for Runtime { + type Event = Event; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions; + type NextSessionRotation = pallet_session::PeriodicSessions; + type SessionManager = CollatorSelection; + // Essentially just Aura, but lets be pedantic. + type SessionHandler = ::KeyTypeIdProviders; + type Keys = opaque::SessionKeys; + type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const MaxCandidates: u32 = 1000; + pub const SessionLength: BlockNumber = 6 * HOURS; + pub const MaxInvulnerables: u32 = 100; +} + +/// We allow root and the Relay Chain council to execute privileged collator selection operations. +pub type CollatorSelectionUpdateOrigin = EnsureOneOf< + AccountId, + EnsureRoot, + EnsureXcm>, +>; + +impl pallet_collator_selection::Config for Runtime { + type Event = Event; + type Currency = Balances; + type UpdateOrigin = CollatorSelectionUpdateOrigin; + type PotId = PotId; + type MaxCandidates = MaxCandidates; + type MaxInvulnerables = MaxInvulnerables; + // should be a multiple of session or things will get inconsistent + type KickThreshold = Period; + type WeightInfo = weights::pallet_collator_selection::WeightInfo; +} + +// Create the runtime by composing the FRAME pallets that were previously configured. +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = opaque::Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + // System support stuff. + System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, + ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Storage, Inherent, Event} = 1, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Call, Storage} = 2, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 3, + ParachainInfo: parachain_info::{Pallet, Storage, Config} = 4, + + // Monetary stuff. + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage} = 11, + + // Collator support. the order of these 4 are important and shall not change. + Authorship: pallet_authorship::{Pallet, Call, Storage} = 20, + CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, + Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, + Aura: pallet_aura::{Pallet, Storage, Config} = 23, + AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, + + // XCM helpers. + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, + PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin} = 31, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, + DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, + + // Handy utilities. + Utility: pallet_utility::{Pallet, Call, Event} = 40, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, + Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, + + // The main stage. To include pallet-assets-freezer and pallet-uniques. + Assets: pallet_assets::{Pallet, Call, Storage, Event} = 50, + } +); + +/// The address format for describing accounts. +pub type Address = sp_runtime::MultiAddress; +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Extrinsic type that has already been checked. +pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPallets, +>; + +impl_runtime_apis! { + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) + } + + fn authorities() -> Vec { + Aura::authorities() + } + } + + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + Runtime::metadata().into() + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: sp_inherents::InherentData, + ) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + opaque::SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, KeyTypeId)>> { + opaque::SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Index { + System::account_nonce(account) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { + fn query_info( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + fn query_fee_details( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_fee_details(uxt, len) + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info() -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info() + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey}; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime {} + + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), + ]; + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + + add_benchmark!(params, batches, frame_system, SystemBench::); + add_benchmark!(params, batches, pallet_assets, Assets); + add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_multisig, Multisig); + add_benchmark!(params, batches, pallet_proxy, Proxy); + add_benchmark!(params, batches, pallet_utility, Utility); + add_benchmark!(params, batches, pallet_timestamp, Timestamp); + add_benchmark!(params, batches, pallet_collator_selection, CollatorSelection); + + if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } + Ok(batches) + } + } +} + +cumulus_pallet_parachain_system::register_validate_block!( +Runtime, +cumulus_pallet_aura_ext::BlockExecutor::, +); diff --git a/polkadot-parachains/statemine/src/weights/mod.rs b/polkadot-parachains/statemine/src/weights/mod.rs new file mode 100644 index 00000000000..619f9a943a6 --- /dev/null +++ b/polkadot-parachains/statemine/src/weights/mod.rs @@ -0,0 +1,7 @@ +pub mod pallet_assets; +pub mod pallet_balances; +pub mod pallet_multisig; +pub mod pallet_collator_selection; +pub mod pallet_proxy; +pub mod pallet_timestamp; +pub mod pallet_utility; diff --git a/polkadot-parachains/statemine/src/weights/pallet_assets.rs b/polkadot-parachains/statemine/src/weights/pallet_assets.rs new file mode 100644 index 00000000000..9a1b41900ed --- /dev/null +++ b/polkadot-parachains/statemine/src/weights/pallet_assets.rs @@ -0,0 +1,169 @@ + +//! Autogenerated weights for pallet_assets +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_assets +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_assets. +pub struct WeightInfo(PhantomData); +impl pallet_assets::WeightInfo for WeightInfo { + fn create() -> Weight { + (68_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_create() -> Weight { + (34_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn destroy(c: u32, s: u32, a: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 440_000 + .saturating_add((33_246_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 440_000 + .saturating_add((47_556_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(a as Weight))) + } + fn mint() -> Weight { + (103_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn burn() -> Weight { + (115_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn transfer() -> Weight { + (153_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn transfer_keep_alive() -> Weight { + (124_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn force_transfer() -> Weight { + (145_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn freeze() -> Weight { + (49_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn thaw() -> Weight { + (47_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn freeze_asset() -> Weight { + (34_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn thaw_asset() -> Weight { + (34_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer_ownership() -> Weight { + (39_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_team() -> Weight { + (35_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_metadata(_n: u32, s: u32, ) -> Weight { + (75_032_000 as Weight) + // Standard Error: 20_000 + .saturating_add((18_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn clear_metadata() -> Weight { + (70_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_set_metadata(n: u32, s: u32, ) -> Weight { + (34_085_000 as Weight) + // Standard Error: 21_000 + .saturating_add((48_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 21_000 + .saturating_add((53_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_clear_metadata() -> Weight { + (73_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_asset_status() -> Weight { + (33_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_transfer() -> Weight { + (67_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer_approved() -> Weight { + (149_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + fn cancel_approval() -> Weight { + (62_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_cancel_approval() -> Weight { + (71_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/polkadot-parachains/statemine/src/weights/pallet_balances.rs b/polkadot-parachains/statemine/src/weights/pallet_balances.rs new file mode 100644 index 00000000000..c3060cb9c0e --- /dev/null +++ b/polkadot-parachains/statemine/src/weights/pallet_balances.rs @@ -0,0 +1,64 @@ + +//! Autogenerated weights for pallet_balances +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemine-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_balances +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemine/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_balances. +pub struct WeightInfo(PhantomData); +impl pallet_balances::WeightInfo for WeightInfo { + fn transfer() -> Weight { + (121_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer_keep_alive() -> Weight { + (89_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_balance_creating() -> Weight { + (45_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_balance_killing() -> Weight { + (55_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_transfer() -> Weight { + (118_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/polkadot-parachains/statemine/src/weights/pallet_collator_selection.rs b/polkadot-parachains/statemine/src/weights/pallet_collator_selection.rs new file mode 100644 index 00000000000..dfca2ab7d63 --- /dev/null +++ b/polkadot-parachains/statemine/src/weights/pallet_collator_selection.rs @@ -0,0 +1,83 @@ + +//! Autogenerated weights for pallet_collator_selection +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-05-04, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemine-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_collator_selection +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemine/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_collator_selection. +pub struct WeightInfo(PhantomData); +impl pallet_collator_selection::WeightInfo for WeightInfo { + fn set_invulnerables(b: u32, ) -> Weight { + (34_775_000 as Weight) + // Standard Error: 2_000 + .saturating_add((159_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_desired_candidates() -> Weight { + (29_000_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_candidacy_bond() -> Weight { + (30_000_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn register_as_candidate(c: u32, ) -> Weight { + (116_537_000 as Weight) + // Standard Error: 4_000 + .saturating_add((330_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn leave_intent(c: u32, ) -> Weight { + (66_542_000 as Weight) + // Standard Error: 0 + .saturating_add((335_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn note_author(c: u32, ) -> Weight { + (118_918_000 as Weight) + // Standard Error: 1_000 + .saturating_add((334_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn new_session(r: u32, c: u32, ) -> Weight { + (45_567_000 as Weight) + // Standard Error: 3_000 + .saturating_add((16_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 3_000 + .saturating_add((359_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/polkadot-parachains/statemine/src/weights/pallet_multisig.rs b/polkadot-parachains/statemine/src/weights/pallet_multisig.rs new file mode 100644 index 00000000000..cb16c5c93b1 --- /dev/null +++ b/polkadot-parachains/statemine/src/weights/pallet_multisig.rs @@ -0,0 +1,115 @@ + +//! Autogenerated weights for pallet_multisig +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemine-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_multisig +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemine/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_multisig. +pub struct WeightInfo(PhantomData); +impl pallet_multisig::WeightInfo for WeightInfo { + fn as_multi_threshold_1(z: u32, ) -> Weight { + (15_968_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + } + fn as_multi_create(s: u32, _z: u32, ) -> Weight { + (87_843_000 as Weight) + // Standard Error: 19_000 + .saturating_add((193_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_create_store(s: u32, z: u32, ) -> Weight { + (89_845_000 as Weight) + // Standard Error: 8_000 + .saturating_add((131_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_approve(s: u32, z: u32, ) -> Weight { + (42_425_000 as Weight) + // Standard Error: 6_000 + .saturating_add((152_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_approve_store(s: u32, z: u32, ) -> Weight { + (90_210_000 as Weight) + // Standard Error: 8_000 + .saturating_add((129_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_complete(s: u32, z: u32, ) -> Weight { + (119_722_000 as Weight) + // Standard Error: 7_000 + .saturating_add((227_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((5_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn approve_as_multi_create(s: u32, ) -> Weight { + (80_661_000 as Weight) + // Standard Error: 6_000 + .saturating_add((160_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_approve(s: u32, ) -> Weight { + (47_143_000 as Weight) + // Standard Error: 13_000 + .saturating_add((132_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_complete(s: u32, ) -> Weight { + (193_273_000 as Weight) + // Standard Error: 22_000 + .saturating_add((288_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn cancel_as_multi(s: u32, ) -> Weight { + (143_968_000 as Weight) + // Standard Error: 42_000 + .saturating_add((161_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/polkadot-parachains/statemine/src/weights/pallet_proxy.rs b/polkadot-parachains/statemine/src/weights/pallet_proxy.rs new file mode 100644 index 00000000000..6a8a0e70f8d --- /dev/null +++ b/polkadot-parachains/statemine/src/weights/pallet_proxy.rs @@ -0,0 +1,114 @@ + +//! Autogenerated weights for pallet_proxy +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemine-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_proxy +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemine/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_proxy. +pub struct WeightInfo(PhantomData); +impl pallet_proxy::WeightInfo for WeightInfo { + fn proxy(p: u32, ) -> Weight { + (41_425_000 as Weight) + // Standard Error: 30_000 + .saturating_add((27_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + } + fn proxy_announced(a: u32, p: u32, ) -> Weight { + (86_865_000 as Weight) + // Standard Error: 48_000 + .saturating_add((664_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 50_000 + .saturating_add((260_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn remove_announcement(a: u32, p: u32, ) -> Weight { + (53_426_000 as Weight) + // Standard Error: 28_000 + .saturating_add((781_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 30_000 + .saturating_add((95_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn reject_announcement(a: u32, _p: u32, ) -> Weight { + (63_306_000 as Weight) + // Standard Error: 53_000 + .saturating_add((600_000 as Weight).saturating_mul(a as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn announce(a: u32, p: u32, ) -> Weight { + (68_365_000 as Weight) + // Standard Error: 42_000 + .saturating_add((1_019_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 44_000 + .saturating_add((456_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn add_proxy(p: u32, ) -> Weight { + (58_989_000 as Weight) + // Standard Error: 31_000 + .saturating_add((206_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_proxy(p: u32, ) -> Weight { + (57_345_000 as Weight) + // Standard Error: 12_000 + .saturating_add((190_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_proxies(p: u32, ) -> Weight { + (52_583_000 as Weight) + // Standard Error: 10_000 + .saturating_add((203_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn anonymous(p: u32, ) -> Weight { + (74_677_000 as Weight) + // Standard Error: 10_000 + .saturating_add((60_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn kill_anonymous(p: u32, ) -> Weight { + (54_531_000 as Weight) + // Standard Error: 26_000 + .saturating_add((231_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/polkadot-parachains/statemine/src/weights/pallet_timestamp.rs b/polkadot-parachains/statemine/src/weights/pallet_timestamp.rs new file mode 100644 index 00000000000..e827cc695b2 --- /dev/null +++ b/polkadot-parachains/statemine/src/weights/pallet_timestamp.rs @@ -0,0 +1,47 @@ + +//! Autogenerated weights for pallet_timestamp +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemine-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_timestamp +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemine/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_timestamp. +pub struct WeightInfo(PhantomData); +impl pallet_timestamp::WeightInfo for WeightInfo { + fn set() -> Weight { + (14_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn on_finalize() -> Weight { + (7_000_000 as Weight) + } +} diff --git a/polkadot-parachains/statemine/src/weights/pallet_utility.rs b/polkadot-parachains/statemine/src/weights/pallet_utility.rs new file mode 100644 index 00000000000..2ea32934ea2 --- /dev/null +++ b/polkadot-parachains/statemine/src/weights/pallet_utility.rs @@ -0,0 +1,52 @@ + +//! Autogenerated weights for pallet_utility +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemine-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_utility +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemine/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_utility. +pub struct WeightInfo(PhantomData); +impl pallet_utility::WeightInfo for WeightInfo { + fn batch(c: u32, ) -> Weight { + (1_626_000 as Weight) + // Standard Error: 34_000 + .saturating_add((4_399_000 as Weight).saturating_mul(c as Weight)) + } + fn as_derivative() -> Weight { + (8_000_000 as Weight) + } + fn batch_all(c: u32, ) -> Weight { + (12_789_000 as Weight) + // Standard Error: 20_000 + .saturating_add((4_375_000 as Weight).saturating_mul(c as Weight)) + } +} diff --git a/polkadot-parachains/statemint-common/Cargo.toml b/polkadot-parachains/statemint-common/Cargo.toml new file mode 100644 index 00000000000..a10f6c0cb88 --- /dev/null +++ b/polkadot-parachains/statemint-common/Cargo.toml @@ -0,0 +1,128 @@ +[build-dependencies.substrate-wasm-builder] +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '4.0.0' + +[package] +name = "runtime-common" +version = "0.8.30" +authors = ["Parity Technologies "] +edition = "2018" + +[package.metadata.docs.rs] +targets = ['x86_64-unknown-linux-gnu'] + +[dependencies.sp-consensus-aura] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '0.9.0' + +[dependencies.sp-std] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-io] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.codec] +default-features = false +features = ['derive'] +package = 'parity-scale-codec' +version = '2.0.0' + +[dependencies.frame-executive] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-support] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-system] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + + +[dependencies.pallet-balances] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-runtime] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-core] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.node-primitives] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" + +[dependencies.polkadot-runtime-common] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +# Polkadot dependencies +[dependencies.polkadot-primitives] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.pallet-collator-selection] +default-features = false +path = '../../pallets/collator-selection' + +[dev-dependencies] +serde = { version = "1.0.119" } + +[dev-dependencies.sp-io] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dev-dependencies.pallet-authorship] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + + + +[features] +default = ["std"] +std = [ + 'codec/std', + 'sp-consensus-aura/std', + 'sp-std/std', + 'sp-io/std', + 'frame-support/std', + 'frame-executive/std', + 'frame-system/std', + 'pallet-collator-selection/std', + 'pallet-balances/std', + 'node-primitives/std', + 'polkadot-runtime-common/std', + 'polkadot-primitives/std', +] diff --git a/polkadot-parachains/statemint-common/src/impls.rs b/polkadot-parachains/statemint-common/src/impls.rs new file mode 100644 index 00000000000..b9619f7310e --- /dev/null +++ b/polkadot-parachains/statemint-common/src/impls.rs @@ -0,0 +1,202 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Auxillary struct/enums for Statemint runtime. +//! Taken from polkadot/runtime/common (at a21cd64) and adapted for Statemint. + +use frame_support::traits::{Currency, Imbalance, OnUnbalanced}; + +pub type NegativeImbalance = as Currency<::AccountId>>::NegativeImbalance; + +/// Logic for the author to get a portion of fees. +pub struct ToStakingPot(sp_std::marker::PhantomData); +impl OnUnbalanced> for ToStakingPot +where + R: pallet_balances::Config + pallet_collator_selection::Config, + ::AccountId: From, + ::AccountId: Into, + ::Event: From>, +{ + fn on_nonzero_unbalanced(amount: NegativeImbalance) { + let numeric_amount = amount.peek(); + let staking_pot = >::account_id(); + >::resolve_creating( + &staking_pot, + amount, + ); + >::deposit_event(pallet_balances::Event::Deposit( + staking_pot, + numeric_amount, + )); + } +} + +pub struct DealWithFees(sp_std::marker::PhantomData); +impl OnUnbalanced> for DealWithFees +where + R: pallet_balances::Config + pallet_collator_selection::Config, + ::AccountId: From, + ::AccountId: Into, + ::Event: From>, +{ + fn on_unbalanceds(mut fees_then_tips: impl Iterator>) { + if let Some(mut fees) = fees_then_tips.next() { + if let Some(tips) = fees_then_tips.next() { + tips.merge_into(&mut fees); + } + as OnUnbalanced<_>>::on_unbalanced(fees); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use frame_support::traits::FindAuthor; + use frame_support::{parameter_types, weights::DispatchClass, PalletId}; + use frame_system::{limits, EnsureRoot}; + use polkadot_primitives::v1::AccountId; + use sp_core::H256; + use sp_runtime::{ + testing::Header, + traits::{BlakeTwo256, IdentityLookup}, + Perbill, + }; + + type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; + type Block = frame_system::mocking::MockBlock; + + frame_support::construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event}, + } + ); + + parameter_types! { + pub const BlockHashCount: u64 = 250; + pub BlockWeights: limits::BlockWeights = limits::BlockWeights::builder() + .for_class(DispatchClass::all(), |weight| { + weight.base_extrinsic = 100; + }) + .for_class(DispatchClass::non_mandatory(), |weight| { + weight.max_total = Some(1024); + }) + .build_or_panic(); + pub BlockLength: limits::BlockLength = limits::BlockLength::max(2 * 1024); + pub const AvailableBlockRatio: Perbill = Perbill::one(); + } + + impl frame_system::Config for Test { + type BaseCallFilter = (); + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Call = Call; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type Event = Event; + type BlockHashCount = BlockHashCount; + type BlockLength = BlockLength; + type BlockWeights = BlockWeights; + type DbWeight = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + } + + impl pallet_balances::Config for Test { + type Balance = u64; + type Event = Event; + type DustRemoval = (); + type ExistentialDeposit = (); + type AccountStore = System; + type MaxLocks = (); + type WeightInfo = (); + } + + pub struct OneAuthor; + impl FindAuthor for OneAuthor { + fn find_author<'a, I>(_: I) -> Option + where + I: 'a, + { + Some(Default::default()) + } + } + + parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const MaxCandidates: u32 = 20; + pub const MaxInvulnerables: u32 = 20; + } + + impl pallet_collator_selection::Config for Test { + type Event = Event; + type Currency = Balances; + type UpdateOrigin = EnsureRoot; + type PotId = PotId; + type MaxCandidates = MaxCandidates; + type MaxInvulnerables = MaxInvulnerables; + type KickThreshold = (); + type WeightInfo = (); + } + + impl pallet_authorship::Config for Test { + type FindAuthor = OneAuthor; + type UncleGenerations = (); + type FilterUncle = (); + type EventHandler = (); + } + + pub fn new_test_ext() -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + // We use default for brevity, but you can configure as desired if needed. + pallet_balances::GenesisConfig::::default() + .assimilate_storage(&mut t) + .unwrap(); + t.into() + } + + #[test] + fn test_fees_and_tip_split() { + new_test_ext().execute_with(|| { + let fee = Balances::issue(10); + let tip = Balances::issue(20); + + assert_eq!(Balances::free_balance(AccountId::default()), 0); + + DealWithFees::on_unbalanceds(vec![fee, tip].into_iter()); + + // Author gets 100% of tip and 100% of fee = 30 + assert_eq!(Balances::free_balance(CollatorSelection::account_id()), 30); + }); + } +} diff --git a/polkadot-parachains/statemint-common/src/lib.rs b/polkadot-parachains/statemint-common/src/lib.rs new file mode 100644 index 00000000000..8f048cde3ba --- /dev/null +++ b/polkadot-parachains/statemint-common/src/lib.rs @@ -0,0 +1,87 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg_attr(not(feature = "std"), no_std)] + +pub mod impls; +pub use types::*; +pub use constants::*; + +/// Common types of statemint and statemine. +mod types { + use sp_runtime::traits::{Verify, IdentifyAccount, BlakeTwo256}; + + /// An index to a block. + pub type BlockNumber = u32; + + /// Alias to 512-bit hash when used in the context of a transaction signature on the chain. + pub type Signature = sp_runtime::MultiSignature; + + /// Some way of identifying an account on the chain. We intentionally make it equivalent + /// to the public key of our transaction signing scheme. + pub type AccountId = <::Signer as IdentifyAccount>::AccountId; + + /// The type for looking up accounts. We don't expect more than 4 billion of them, but you + /// never know... + pub type AccountIndex = u32; + + /// Balance of an account. + pub type Balance = u128; + + /// Index of a transaction in the chain. + pub type Index = u32; + + /// A hash of some data used by the chain. + pub type Hash = sp_core::H256; + + /// Block header type as expected by this runtime. + pub type Header = sp_runtime::generic::Header; + + /// Digest item type. + pub type DigestItem = sp_runtime::generic::DigestItem; + + // Aura consensus authority. + pub type AuraId = sp_consensus_aura::sr25519::AuthorityId; +} + +/// Common constants of statemint and statemine +mod constants { + use super::types::BlockNumber; + use sp_runtime::Perbill; + use frame_support::weights::{Weight, constants::WEIGHT_PER_SECOND}; + /// This determines the average expected block time that we are targeting. Blocks will be + /// produced at a minimum duration defined by `SLOT_DURATION`. `SLOT_DURATION` is picked up by + /// `pallet_timestamp` which is in turn picked up by `pallet_aura` to implement `fn + /// slot_duration()`. + /// + /// Change this to adjust the block time. + pub const MILLISECS_PER_BLOCK: u64 = 12000; + pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; + + // Time is measured by number of blocks. + pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); + pub const HOURS: BlockNumber = MINUTES * 60; + pub const DAYS: BlockNumber = HOURS * 24; + + /// We assume that ~5% of the block weight is consumed by `on_initialize` handlers. This is + /// used to limit the maximal weight of a single extrinsic. + pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); + /// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used by + /// Operational extrinsics. + pub const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); + + /// We allow for 0.5 seconds of compute with a 6 second average block time. + pub const MAXIMUM_BLOCK_WEIGHT: Weight = WEIGHT_PER_SECOND / 2; +} diff --git a/polkadot-parachains/statemint/Cargo.toml b/polkadot-parachains/statemint/Cargo.toml new file mode 100644 index 00000000000..120d1dce1a8 --- /dev/null +++ b/polkadot-parachains/statemint/Cargo.toml @@ -0,0 +1,368 @@ +[build-dependencies.substrate-wasm-builder] +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '4.0.0' + +[package] +authors = ['Anonymous'] +edition = '2018' +homepage = 'https://substrate.dev' +license = 'Apache-2.0' +name = 'statemint-runtime' +repository = 'https://github.com/paritytech/substrate/' +version = '2.0.0' + +[dependencies] +smallvec = "1.6.1" + +[package.metadata.docs.rs] +targets = ['x86_64-unknown-linux-gnu'] + +[dependencies.codec] +default-features = false +features = ['derive'] +package = 'parity-scale-codec' +version = '2.0.0' + +[dependencies.frame-benchmarking] +default-features = false +git = 'https://github.com/paritytech/substrate' +optional = true +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-executive] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-support] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-system] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-system-benchmarking] +default-features = false +git = 'https://github.com/paritytech/substrate' +optional = true +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-system-rpc-runtime-api] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.hex-literal] +optional = true +version = '0.3.1' + +[dependencies.pallet-assets] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" + +[dependencies.pallet-authorship] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" + +[dependencies.pallet-balances] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-multisig] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-proxy] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-randomness-collective-flip] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-timestamp] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-transaction-payment] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-transaction-payment-rpc-runtime-api] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-utility] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.serde] +features = ['derive'] +optional = true +version = '1.0.119' + +[dependencies.node-primitives] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" + +[dependencies.sp-api] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-block-builder] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-core] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-inherents] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-io] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-offchain] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-runtime] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-session] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-std] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-transaction-pool] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-version] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +# Cumulus dependencies +[dependencies.cumulus-pallet-aura-ext] +default-features = false +path = "../../pallets/aura-ext" + +[dependencies.parachain-info] +default-features = false +path = "../pallets/parachain-info" +version = '0.1.0' + +[dependencies.cumulus-pallet-parachain-system] +path = "../../pallets/parachain-system" +default-features = false + +[dependencies.cumulus-primitives-core] +path = "../../primitives/core" +default-features = false + +[dependencies.cumulus-primitives-utility] +path = "../../primitives/utility" +default-features = false + +[dependencies.cumulus-pallet-dmp-queue] +path = "../../pallets/dmp-queue" +default-features = false + +[dependencies.cumulus-pallet-xcmp-queue] +path = "../../pallets/xcmp-queue" +default-features = false + +[dependencies.cumulus-pallet-xcm] +path = "../../pallets/xcm" +default-features = false + +# Polkadot dependencies +[dependencies.polkadot-primitives] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.polkadot-runtime-common] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.polkadot-parachain] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.xcm] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.xcm-builder] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.xcm-executor] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.pallet-xcm] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.pallet-collator-selection] +default-features = false +path = '../../pallets/collator-selection' + +[dependencies.runtime-common] +default-features = false +version = "0.8.30" +path = '../statemint-common' + +[dependencies.pallet-aura] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-session] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-consensus-aura] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '0.9.0' + + +[features] +default = ['std'] +runtime-benchmarks = [ + 'hex-literal', + 'sp-runtime/runtime-benchmarks', + 'xcm-builder/runtime-benchmarks', + 'frame-benchmarking', + 'frame-system-benchmarking', + 'frame-support/runtime-benchmarks', + 'frame-system/runtime-benchmarks', + 'pallet-assets/runtime-benchmarks', + 'pallet-balances/runtime-benchmarks', + 'pallet-multisig/runtime-benchmarks', + 'pallet-proxy/runtime-benchmarks', + 'pallet-utility/runtime-benchmarks', + 'pallet-timestamp/runtime-benchmarks', + 'pallet-xcm/runtime-benchmarks', + 'pallet-collator-selection/runtime-benchmarks', +] +std = [ + 'codec/std', + 'serde', + 'sp-consensus-aura/std', + 'pallet-aura/std', + 'sp-api/std', + 'sp-std/std', + 'sp-io/std', + 'sp-core/std', + 'sp-runtime/std', + 'sp-version/std', + 'sp-offchain/std', + 'sp-session/std', + 'sp-block-builder/std', + 'sp-transaction-pool/std', + 'sp-inherents/std', + 'frame-support/std', + 'frame-executive/std', + 'frame-system/std', + 'frame-system-rpc-runtime-api/std', + 'pallet-assets/std', + 'pallet-authorship/std', + 'pallet-balances/std', + 'pallet-multisig/std', + 'pallet-proxy/std', + 'pallet-utility/std', + 'pallet-randomness-collective-flip/std', + 'pallet-transaction-payment-rpc-runtime-api/std', + 'pallet-timestamp/std', + 'pallet-session/std', + 'pallet-xcm/std', + 'pallet-transaction-payment/std', + 'pallet-collator-selection/std', + 'node-primitives/std', + 'parachain-info/std', + "cumulus-pallet-aura-ext/std", + 'cumulus-pallet-parachain-system/std', + 'cumulus-pallet-dmp-queue/std', + "cumulus-pallet-xcmp-queue/std", + "cumulus-pallet-xcm/std", + "cumulus-primitives-core/std", + "cumulus-primitives-utility/std", + 'xcm/std', + 'xcm-builder/std', + 'xcm-executor/std', + 'polkadot-runtime-common/std', + 'runtime-common/std', + 'polkadot-primitives/std', +] diff --git a/polkadot-parachains/statemint/build.rs b/polkadot-parachains/statemint/build.rs new file mode 100644 index 00000000000..9b53d2457df --- /dev/null +++ b/polkadot-parachains/statemint/build.rs @@ -0,0 +1,9 @@ +use substrate_wasm_builder::WasmBuilder; + +fn main() { + WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} diff --git a/polkadot-parachains/statemint/src/constants.rs b/polkadot-parachains/statemint/src/constants.rs new file mode 100644 index 00000000000..1accd24ff95 --- /dev/null +++ b/polkadot-parachains/statemint/src/constants.rs @@ -0,0 +1,72 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod currency { + use node_primitives::Balance; + + /// The existential deposit. Set to 1/10 of its parent Relay Chain (v9010). + pub const EXISTENTIAL_DEPOSIT: Balance = 10 * CENTS; + + pub const UNITS: Balance = 10_000_000_000; + pub const DOLLARS: Balance = UNITS; + pub const CENTS: Balance = UNITS / 100; // 100_000_000 + pub const MILLICENTS: Balance = CENTS / 1_000; // 100_000 + + pub const fn deposit(items: u32, bytes: u32) -> Balance { + // 1/10 of Polkadot v9010 + (items as Balance * 20 * DOLLARS + (bytes as Balance) * 100 * MILLICENTS) / 10 + } +} + +/// Fee-related. +pub mod fee { + use node_primitives::Balance; + pub use sp_runtime::Perbill; + use frame_support::weights::{ + constants::ExtrinsicBaseWeight, WeightToFeeCoefficient, WeightToFeeCoefficients, + WeightToFeePolynomial, + }; + use smallvec::smallvec; + + /// The block saturation level. Fees will be updates based on this value. + pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); + + /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the + /// node's balance type. + /// + /// This should typically create a mapping between the following ranges: + /// - [0, MAXIMUM_BLOCK_WEIGHT] + /// - [Balance::min, Balance::max] + /// + /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: + /// - Setting it to `0` will essentially disable the weight fee. + /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. + pub struct WeightToFee; + impl WeightToFeePolynomial for WeightToFee { + type Balance = Balance; + fn polynomial() -> WeightToFeeCoefficients { + // in Polkadot, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: + // in Statemint, we map to 1/10 of that, or 1/100 CENT + let p = super::currency::CENTS; + let q = 100 * Balance::from(ExtrinsicBaseWeight::get()); + smallvec![WeightToFeeCoefficient { + degree: 1, + negative: false, + coeff_frac: Perbill::from_rational(p % q, q), + coeff_integer: p / q, + }] + } + } +} diff --git a/polkadot-parachains/statemint/src/lib.rs b/polkadot-parachains/statemint/src/lib.rs new file mode 100644 index 00000000000..f82b3cd89c9 --- /dev/null +++ b/polkadot-parachains/statemint/src/lib.rs @@ -0,0 +1,827 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Statemint runtime. + +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +pub mod constants; +mod weights; + +use sp_api::impl_runtime_apis; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +use sp_runtime::traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, +}; + +use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; + +use frame_system::{ + EnsureOneOf, EnsureRoot, limits::{BlockLength, BlockWeights}, +}; +use runtime_common::{ + BlockNumber, Signature, AccountId, Balance, Index, Hash, AuraId, Header, + NORMAL_DISPATCH_RATIO, AVERAGE_ON_INITIALIZE_RATIO, MAXIMUM_BLOCK_WEIGHT, SLOT_DURATION, HOURS, +}; +pub use runtime_common as common; +use runtime_common::impls::DealWithFees; +use codec::{Decode, Encode}; +use constants::{currency::*, fee::WeightToFee}; +use frame_support::{ + construct_runtime, parameter_types, match_type, + traits::{InstanceFilter, All, MaxEncodedLen}, + weights::{ + constants::{BlockExecutionWeight, ExtrinsicBaseWeight}, + DispatchClass, IdentityFee, Weight, + }, + RuntimeDebug, PalletId, +}; +use sp_runtime::Perbill; + +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; + +// Polkadot imports +use polkadot_parachain::primitives::Sibling; +use polkadot_runtime_common::{ + BlockHashCount, RocksDbWeight, SlowAdjustingFeeUpdate, +}; +use xcm::v0::{MultiAsset, Junction, MultiLocation, NetworkId, Xcm, BodyId}; +use xcm_builder::{ + AccountId32Aliases, CurrencyAdapter, LocationInverter, ParentIsDefault, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SovereignSignedViaLocation, EnsureXcmOrigin, + AllowTopLevelPaidExecutionFrom, TakeWeightCredit, FixedWeightBounds, IsConcrete, NativeAsset, + AllowUnpaidExecutionFrom, ParentAsSuperuser, SignedToAccountId32, UsingComponents, +}; +use xcm_executor::{Config, XcmExecutor}; +use pallet_xcm::{XcmPassthrough, EnsureXcm, IsMajorityOfBody}; + +/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know +/// the specifics of the runtime. They can then be made to be agnostic over specific formats +/// of data like extrinsics, allowing for them to continue syncing the network through upgrades +/// to even the core data structures. +pub mod opaque { + use super::*; + pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; + /// Opaque block header type. + pub type Header = generic::Header; + /// Opaque block type. + pub type Block = generic::Block; + /// Opaque block identifier type. + pub type BlockId = generic::BlockId; + impl_opaque_keys! { + pub struct SessionKeys { + pub aura: Aura, + } + } +} + +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("statemint"), + impl_name: create_runtime_str!("statemint"), + authoring_version: 1, + spec_version: 1, + impl_version: 1, + apis: RUNTIME_API_VERSIONS, + transaction_version: 1, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { + runtime_version: VERSION, + can_author_with: Default::default(), + } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + pub RuntimeBlockLength: BlockLength = + BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have some extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); + pub const SS58Prefix: u8 = 0; +} + +// Configure FRAME pallets to include in runtime. +impl frame_system::Config for Runtime { + type BaseCallFilter = (); + type BlockWeights = RuntimeBlockWeights; + type BlockLength = RuntimeBlockLength; + type AccountId = AccountId; + type Call = Call; + type Lookup = AccountIdLookup; + type Index = Index; + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hashing = BlakeTwo256; + type Header = Header; + type Event = Event; + type Origin = Origin; + type BlockHashCount = BlockHashCount; + type DbWeight = RocksDbWeight; + type Version = Version; + type PalletInfo = PalletInfo; + type OnNewAccount = (); + type OnKilledAccount = (); + type AccountData = pallet_balances::AccountData; + type SystemWeightInfo = (); + type SS58Prefix = SS58Prefix; + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; +} + +parameter_types! { + pub const MinimumPeriod: u64 = SLOT_DURATION / 2; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = weights::pallet_timestamp::WeightInfo; +} + +parameter_types! { + pub const UncleGenerations: u32 = 0; +} + +impl pallet_authorship::Config for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type UncleGenerations = UncleGenerations; + type FilterUncle = (); + type EventHandler = (CollatorSelection,); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; + pub const MaxLocks: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + /// The type for recording an account's balance. + type Balance = Balance; + /// The ubiquitous event type. + type Event = Event; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = weights::pallet_balances::WeightInfo; +} + +parameter_types! { + /// Relay Chain `TransactionByteFee` / 10 + pub const TransactionByteFee: Balance = 1 * MILLICENTS; +} + +impl pallet_transaction_payment::Config for Runtime { + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; + type TransactionByteFee = TransactionByteFee; + type WeightToFee = WeightToFee; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +parameter_types! { + pub const AssetDeposit: Balance = 100 * DOLLARS; // 100 DOLLARS deposit to create asset + pub const ApprovalDeposit: Balance = EXISTENTIAL_DEPOSIT; + pub const StringLimit: u32 = 50; + /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) + // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 + pub const MetadataDepositBase: Balance = deposit(1, 68); + pub const MetadataDepositPerByte: Balance = deposit(0, 1); + pub const ExecutiveBody: BodyId = BodyId::Executive; +} + +/// We allow root and the Relay Chain council to execute privileged asset operations. +pub type AssetsForceOrigin = EnsureOneOf< + AccountId, + EnsureRoot, + EnsureXcm>, +>; + +impl pallet_assets::Config for Runtime { + type Event = Event; + type Balance = Balance; + type AssetId = u32; + type Currency = Balances; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = StringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = weights::pallet_assets::WeightInfo; +} + +parameter_types! { + // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. + pub const DepositBase: Balance = deposit(1, 88); + // Additional storage item size of 32 bytes. + pub const DepositFactor: Balance = deposit(0, 32); + pub const MaxSignatories: u16 = 100; +} + +impl pallet_multisig::Config for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = MaxSignatories; + type WeightInfo = weights::pallet_multisig::WeightInfo; +} + +impl pallet_utility::Config for Runtime { + type Event = Event; + type Call = Call; + type WeightInfo = weights::pallet_utility::WeightInfo; +} + +parameter_types! { + // One storage item; key size 32, value size 8; . + pub const ProxyDepositBase: Balance = deposit(1, 40); + // Additional storage item size of 33 bytes. + pub const ProxyDepositFactor: Balance = deposit(0, 33); + pub const MaxProxies: u16 = 32; + // One storage item; key size 32, value size 16 + pub const AnnouncementDepositBase: Balance = deposit(1, 48); + pub const AnnouncementDepositFactor: Balance = deposit(0, 66); + pub const MaxPending: u16 = 32; +} + +/// The type used to represent the kinds of proxying allowed. +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug, MaxEncodedLen)] +pub enum ProxyType { + /// Fully permissioned proxy. Can execute any call on behalf of _proxied_. + Any, + /// Can execute any call that does not transfer funds or assets. + NonTransfer, + /// Proxy with the ability to reject time-delay proxy announcements. + CancelProxy, + /// Assets proxy. Can execute any call from `assets`, **including asset transfers**. + Assets, + /// Owner proxy. Can execute calls related to asset ownership. + AssetOwner, + /// Asset manager. Can execute calls related to asset management. + AssetManager, + // Collator selection proxy. Can execute calls related to collator selection mechanism. + Collator, +} +impl Default for ProxyType { + fn default() -> Self { + Self::Any + } +} +impl InstanceFilter for ProxyType { + fn filter(&self, c: &Call) -> bool { + match self { + ProxyType::Any => true, + ProxyType::NonTransfer => !matches!(c, + Call::Balances(..) | + Call::Assets(pallet_assets::Call::transfer(..)) | + Call::Assets(pallet_assets::Call::transfer_keep_alive(..)) | + Call::Assets(pallet_assets::Call::force_transfer(..)) | + Call::Assets(pallet_assets::Call::approve_transfer(..)) | + Call::Assets(pallet_assets::Call::transfer_approved(..)) + ), + ProxyType::CancelProxy => matches!(c, + Call::Proxy(pallet_proxy::Call::reject_announcement(..)) | + Call::Utility(..) | + Call::Multisig(..) + ), + ProxyType::Assets => { + matches!(c, Call::Assets(..) | Call::Utility(..) | Call::Multisig(..)) + } + ProxyType::AssetOwner => matches!(c, + Call::Assets(pallet_assets::Call::create(..)) | + Call::Assets(pallet_assets::Call::destroy(..)) | + Call::Assets(pallet_assets::Call::transfer_ownership(..)) | + Call::Assets(pallet_assets::Call::set_team(..)) | + Call::Assets(pallet_assets::Call::set_metadata(..)) | + Call::Assets(pallet_assets::Call::clear_metadata(..)) | + Call::Utility(..) | + Call::Multisig(..) + ), + ProxyType::AssetManager => matches!(c, + Call::Assets(pallet_assets::Call::mint(..)) | + Call::Assets(pallet_assets::Call::burn(..)) | + Call::Assets(pallet_assets::Call::freeze(..)) | + Call::Assets(pallet_assets::Call::thaw(..)) | + Call::Assets(pallet_assets::Call::freeze_asset(..)) | + Call::Assets(pallet_assets::Call::thaw_asset(..)) | + Call::Utility(..) | + Call::Multisig(..) + ), + ProxyType::Collator => matches!(c, + Call::CollatorSelection(..) | + Call::Utility(..) | + Call::Multisig(..) + ) + } + } + fn is_superset(&self, o: &Self) -> bool { + match (self, o) { + (x, y) if x == y => true, + (ProxyType::Any, _) => true, + (_, ProxyType::Any) => false, + (ProxyType::Assets, ProxyType::AssetOwner) => true, + (ProxyType::Assets, ProxyType::AssetManager) => true, + _ => false, + } + } +} + +impl pallet_proxy::Config for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type ProxyType = ProxyType; + type ProxyDepositBase = ProxyDepositBase; + type ProxyDepositFactor = ProxyDepositFactor; + type MaxProxies = MaxProxies; + type WeightInfo = weights::pallet_proxy::WeightInfo; + type MaxPending = MaxPending; + type CallHasher = BlakeTwo256; + type AnnouncementDepositBase = AnnouncementDepositBase; + type AnnouncementDepositFactor = AnnouncementDepositFactor; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4; + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4; +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type Event = Event; + type OnValidationData = (); + type SelfParaId = parachain_info::Pallet; + type DmpMessageHandler = DmpQueue; + type ReservedDmpWeight = ReservedDmpWeight; + type OutboundXcmpMessageSource = XcmpQueue; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; +} + +impl parachain_info::Config for Runtime {} + +impl cumulus_pallet_aura_ext::Config for Runtime {} + +parameter_types! { + pub const DotLocation: MultiLocation = MultiLocation::X1(Junction::Parent); + pub const RelayNetwork: NetworkId = NetworkId::Polkadot; + pub RelayChainOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into(); + pub Ancestry: MultiLocation = Junction::Parachain(ParachainInfo::parachain_id().into()).into(); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsDefault, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, +); + +/// Means for transacting assets on this chain. +pub type LocalAssetTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports. + (), +>; + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `Origin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + XcmPassthrough, +); + +parameter_types! { + // One XCM operation is 1_000_000 weight - almost certainly a conservative estimate. + pub UnitWeightCost: Weight = 1_000_000; +} + +match_type! { + pub type ParentOrParentsExecutivePlurality: impl Contains = { + MultiLocation::X1(Junction::Parent) | + MultiLocation::X2(Junction::Parent, Junction::Plurality { id: BodyId::Executive, .. }) + }; +} + +pub type Barrier = ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom>, + AllowUnpaidExecutionFrom, + // ^^^ Parent and its exec plurality get free execution +); + +pub struct XcmConfig; +impl Config for XcmConfig { + type Call = Call; + type XcmSender = XcmRouter; + // How to withdraw and deposit an asset. + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = NativeAsset; + type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of DOT + type LocationInverter = LocationInverter; + type Barrier = Barrier; + type Weigher = FixedWeightBounds; + type Trader = UsingComponents, DotLocation, AccountId, Balances, ()>; + type ResponseHandler = (); // Don't handle responses for now. +} + +parameter_types! { + pub const MaxDownwardMessageWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 10; +} + +/// No local origins on this chain are allowed to dispatch XCM sends/executions. +pub type LocalOriginToLocation = ( + SignedToAccountId32, +); + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = ( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +); + +impl pallet_xcm::Config for Runtime { + type Event = Event; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = All<(MultiLocation, Xcm)>; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = All<(MultiLocation, Vec)>; + type XcmReserveTransferFilter = All<(MultiLocation, Vec)>; + type Weigher = FixedWeightBounds; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; +} + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; + type ChannelInfo = ParachainSystem; +} + +impl cumulus_pallet_dmp_queue::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; + type ExecuteOverweightOrigin = EnsureRoot; +} + +parameter_types! { + pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(33); + pub const Period: u32 = 6 * HOURS; + pub const Offset: u32 = 0; +} + +impl pallet_session::Config for Runtime { + type Event = Event; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions; + type NextSessionRotation = pallet_session::PeriodicSessions; + type SessionManager = CollatorSelection; + // Essentially just Aura, but lets be pedantic. + type SessionHandler = ::KeyTypeIdProviders; + type Keys = opaque::SessionKeys; + type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const MaxCandidates: u32 = 1000; + pub const SessionLength: BlockNumber = 6 * HOURS; + pub const MaxInvulnerables: u32 = 100; +} + +/// We allow root and the Relay Chain council to execute privileged collator selection operations. +pub type CollatorSelectionUpdateOrigin = EnsureOneOf< + AccountId, + EnsureRoot, + EnsureXcm>, +>; + +impl pallet_collator_selection::Config for Runtime { + type Event = Event; + type Currency = Balances; + type UpdateOrigin = CollatorSelectionUpdateOrigin; + type PotId = PotId; + type MaxCandidates = MaxCandidates; + type MaxInvulnerables = MaxInvulnerables; + // should be a multiple of session or things will get inconsistent + type KickThreshold = Period; + type WeightInfo = weights::pallet_collator_selection::WeightInfo; +} + +// Create the runtime by composing the FRAME pallets that were previously configured. +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = opaque::Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + // System support stuff. + System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, + ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Storage, Inherent, Event} = 1, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Call, Storage} = 2, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 3, + ParachainInfo: parachain_info::{Pallet, Storage, Config} = 4, + + // Monetary stuff. + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage} = 11, + + // Collator support. the order of these 4 are important and shall not change. + Authorship: pallet_authorship::{Pallet, Call, Storage} = 20, + CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, + Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, + Aura: pallet_aura::{Pallet, Storage, Config} = 23, + AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, + + // XCM helpers. + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, + PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin} = 31, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, + DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, + + // Handy utilities. + Utility: pallet_utility::{Pallet, Call, Event} = 40, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, + Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, + + // The main stage. To include pallet-assets-freezer and pallet-uniques. + Assets: pallet_assets::{Pallet, Call, Storage, Event} = 50, + } +); + +/// The address format for describing accounts. +pub type Address = sp_runtime::MultiAddress; +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Extrinsic type that has already been checked. +pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPallets, +>; + +impl_runtime_apis! { + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) + } + + fn authorities() -> Vec { + Aura::authorities() + } + } + + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + Runtime::metadata().into() + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: sp_inherents::InherentData, + ) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + opaque::SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, KeyTypeId)>> { + opaque::SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Index { + System::account_nonce(account) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { + fn query_info( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + fn query_fee_details( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_fee_details(uxt, len) + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info() -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info() + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey}; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime {} + + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), + ]; + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + + add_benchmark!(params, batches, frame_system, SystemBench::); + add_benchmark!(params, batches, pallet_assets, Assets); + add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_multisig, Multisig); + add_benchmark!(params, batches, pallet_proxy, Proxy); + add_benchmark!(params, batches, pallet_utility, Utility); + add_benchmark!(params, batches, pallet_timestamp, Timestamp); + add_benchmark!(params, batches, pallet_collator_selection, CollatorSelection); + + if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } + Ok(batches) + } + } +} + +cumulus_pallet_parachain_system::register_validate_block!( +Runtime, +cumulus_pallet_aura_ext::BlockExecutor::, +); diff --git a/polkadot-parachains/statemint/src/weights/mod.rs b/polkadot-parachains/statemint/src/weights/mod.rs new file mode 100644 index 00000000000..619f9a943a6 --- /dev/null +++ b/polkadot-parachains/statemint/src/weights/mod.rs @@ -0,0 +1,7 @@ +pub mod pallet_assets; +pub mod pallet_balances; +pub mod pallet_multisig; +pub mod pallet_collator_selection; +pub mod pallet_proxy; +pub mod pallet_timestamp; +pub mod pallet_utility; diff --git a/polkadot-parachains/statemint/src/weights/pallet_assets.rs b/polkadot-parachains/statemint/src/weights/pallet_assets.rs new file mode 100644 index 00000000000..9a1b41900ed --- /dev/null +++ b/polkadot-parachains/statemint/src/weights/pallet_assets.rs @@ -0,0 +1,169 @@ + +//! Autogenerated weights for pallet_assets +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_assets +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_assets. +pub struct WeightInfo(PhantomData); +impl pallet_assets::WeightInfo for WeightInfo { + fn create() -> Weight { + (68_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_create() -> Weight { + (34_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn destroy(c: u32, s: u32, a: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 440_000 + .saturating_add((33_246_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 440_000 + .saturating_add((47_556_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(a as Weight))) + } + fn mint() -> Weight { + (103_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn burn() -> Weight { + (115_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn transfer() -> Weight { + (153_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn transfer_keep_alive() -> Weight { + (124_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn force_transfer() -> Weight { + (145_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn freeze() -> Weight { + (49_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn thaw() -> Weight { + (47_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn freeze_asset() -> Weight { + (34_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn thaw_asset() -> Weight { + (34_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer_ownership() -> Weight { + (39_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_team() -> Weight { + (35_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_metadata(_n: u32, s: u32, ) -> Weight { + (75_032_000 as Weight) + // Standard Error: 20_000 + .saturating_add((18_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn clear_metadata() -> Weight { + (70_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_set_metadata(n: u32, s: u32, ) -> Weight { + (34_085_000 as Weight) + // Standard Error: 21_000 + .saturating_add((48_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 21_000 + .saturating_add((53_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_clear_metadata() -> Weight { + (73_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_asset_status() -> Weight { + (33_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_transfer() -> Weight { + (67_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer_approved() -> Weight { + (149_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + fn cancel_approval() -> Weight { + (62_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_cancel_approval() -> Weight { + (71_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/polkadot-parachains/statemint/src/weights/pallet_balances.rs b/polkadot-parachains/statemint/src/weights/pallet_balances.rs new file mode 100644 index 00000000000..57e10a70aa3 --- /dev/null +++ b/polkadot-parachains/statemint/src/weights/pallet_balances.rs @@ -0,0 +1,64 @@ + +//! Autogenerated weights for pallet_balances +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_balances +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_balances. +pub struct WeightInfo(PhantomData); +impl pallet_balances::WeightInfo for WeightInfo { + fn transfer() -> Weight { + (119_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer_keep_alive() -> Weight { + (87_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_balance_creating() -> Weight { + (45_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_balance_killing() -> Weight { + (55_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_transfer() -> Weight { + (110_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/polkadot-parachains/statemint/src/weights/pallet_collator_selection.rs b/polkadot-parachains/statemint/src/weights/pallet_collator_selection.rs new file mode 100644 index 00000000000..fad9de8bab6 --- /dev/null +++ b/polkadot-parachains/statemint/src/weights/pallet_collator_selection.rs @@ -0,0 +1,83 @@ + +//! Autogenerated weights for pallet_collator_selection +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-05-04, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_collator_selection +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_collator_selection. +pub struct WeightInfo(PhantomData); +impl pallet_collator_selection::WeightInfo for WeightInfo { + fn set_invulnerables(b: u32, ) -> Weight { + (36_147_000 as Weight) + // Standard Error: 22_000 + .saturating_add((50_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_desired_candidates() -> Weight { + (25_000_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_candidacy_bond() -> Weight { + (26_000_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn register_as_candidate(c: u32, ) -> Weight { + (90_380_000 as Weight) + // Standard Error: 8_000 + .saturating_add((314_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn leave_intent(c: u32, ) -> Weight { + (65_617_000 as Weight) + // Standard Error: 4_000 + .saturating_add((325_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn note_author(c: u32, ) -> Weight { + (138_742_000 as Weight) + // Standard Error: 4_000 + .saturating_add((255_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn new_session(r: u32, c: u32, ) -> Weight { + (59_461_000 as Weight) + // Standard Error: 4_000 + .saturating_add((2_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 4_000 + .saturating_add((291_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/polkadot-parachains/statemint/src/weights/pallet_multisig.rs b/polkadot-parachains/statemint/src/weights/pallet_multisig.rs new file mode 100644 index 00000000000..f372e653085 --- /dev/null +++ b/polkadot-parachains/statemint/src/weights/pallet_multisig.rs @@ -0,0 +1,115 @@ + +//! Autogenerated weights for pallet_multisig +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_multisig +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_multisig. +pub struct WeightInfo(PhantomData); +impl pallet_multisig::WeightInfo for WeightInfo { + fn as_multi_threshold_1(z: u32, ) -> Weight { + (15_910_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + } + fn as_multi_create(s: u32, z: u32, ) -> Weight { + (80_512_000 as Weight) + // Standard Error: 3_000 + .saturating_add((107_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_create_store(s: u32, z: u32, ) -> Weight { + (90_834_000 as Weight) + // Standard Error: 2_000 + .saturating_add((106_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_approve(s: u32, z: u32, ) -> Weight { + (43_694_000 as Weight) + // Standard Error: 1_000 + .saturating_add((142_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_approve_store(s: u32, z: u32, ) -> Weight { + (86_160_000 as Weight) + // Standard Error: 5_000 + .saturating_add((148_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_complete(s: u32, z: u32, ) -> Weight { + (119_030_000 as Weight) + // Standard Error: 46_000 + .saturating_add((302_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((6_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn approve_as_multi_create(s: u32, ) -> Weight { + (82_860_000 as Weight) + // Standard Error: 24_000 + .saturating_add((95_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_approve(s: u32, ) -> Weight { + (46_197_000 as Weight) + // Standard Error: 5_000 + .saturating_add((110_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_complete(s: u32, ) -> Weight { + (193_380_000 as Weight) + // Standard Error: 10_000 + .saturating_add((297_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn cancel_as_multi(_s: u32, ) -> Weight { + (172_508_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/polkadot-parachains/statemint/src/weights/pallet_proxy.rs b/polkadot-parachains/statemint/src/weights/pallet_proxy.rs new file mode 100644 index 00000000000..6a7af9fb2f0 --- /dev/null +++ b/polkadot-parachains/statemint/src/weights/pallet_proxy.rs @@ -0,0 +1,112 @@ + +//! Autogenerated weights for pallet_proxy +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_proxy +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_proxy. +pub struct WeightInfo(PhantomData); +impl pallet_proxy::WeightInfo for WeightInfo { + fn proxy(_p: u32, ) -> Weight { + (43_004_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + } + fn proxy_announced(a: u32, p: u32, ) -> Weight { + (84_139_000 as Weight) + // Standard Error: 63_000 + .saturating_add((877_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 66_000 + .saturating_add((234_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn remove_announcement(a: u32, p: u32, ) -> Weight { + (54_559_000 as Weight) + // Standard Error: 5_000 + .saturating_add((783_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 6_000 + .saturating_add((35_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn reject_announcement(a: u32, p: u32, ) -> Weight { + (46_951_000 as Weight) + // Standard Error: 42_000 + .saturating_add((956_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 43_000 + .saturating_add((327_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn announce(a: u32, p: u32, ) -> Weight { + (77_309_000 as Weight) + // Standard Error: 40_000 + .saturating_add((815_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 42_000 + .saturating_add((258_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn add_proxy(_p: u32, ) -> Weight { + (71_647_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_proxy(p: u32, ) -> Weight { + (54_361_000 as Weight) + // Standard Error: 17_000 + .saturating_add((312_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_proxies(p: u32, ) -> Weight { + (53_211_000 as Weight) + // Standard Error: 12_000 + .saturating_add((192_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn anonymous(p: u32, ) -> Weight { + (76_563_000 as Weight) + // Standard Error: 17_000 + .saturating_add((12_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn kill_anonymous(p: u32, ) -> Weight { + (54_365_000 as Weight) + // Standard Error: 28_000 + .saturating_add((251_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/polkadot-parachains/statemint/src/weights/pallet_timestamp.rs b/polkadot-parachains/statemint/src/weights/pallet_timestamp.rs new file mode 100644 index 00000000000..573d8f9b7d1 --- /dev/null +++ b/polkadot-parachains/statemint/src/weights/pallet_timestamp.rs @@ -0,0 +1,47 @@ + +//! Autogenerated weights for pallet_timestamp +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_timestamp +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_timestamp. +pub struct WeightInfo(PhantomData); +impl pallet_timestamp::WeightInfo for WeightInfo { + fn set() -> Weight { + (16_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn on_finalize() -> Weight { + (8_000_000 as Weight) + } +} diff --git a/polkadot-parachains/statemint/src/weights/pallet_utility.rs b/polkadot-parachains/statemint/src/weights/pallet_utility.rs new file mode 100644 index 00000000000..7248388a406 --- /dev/null +++ b/polkadot-parachains/statemint/src/weights/pallet_utility.rs @@ -0,0 +1,52 @@ + +//! Autogenerated weights for pallet_utility +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_utility +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_utility. +pub struct WeightInfo(PhantomData); +impl pallet_utility::WeightInfo for WeightInfo { + fn batch(c: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 65_000 + .saturating_add((4_751_000 as Weight).saturating_mul(c as Weight)) + } + fn as_derivative() -> Weight { + (10_000_000 as Weight) + } + fn batch_all(c: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 71_000 + .saturating_add((4_866_000 as Weight).saturating_mul(c as Weight)) + } +} diff --git a/polkadot-parachains/westmint/Cargo.toml b/polkadot-parachains/westmint/Cargo.toml new file mode 100644 index 00000000000..9a6ec6206d5 --- /dev/null +++ b/polkadot-parachains/westmint/Cargo.toml @@ -0,0 +1,375 @@ +[build-dependencies.substrate-wasm-builder] +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '4.0.0' + +[package] +authors = ['Anonymous'] +edition = '2018' +homepage = 'https://substrate.dev' +license = 'Apache-2.0' +name = 'westmint-runtime' +repository = 'https://github.com/paritytech/substrate/' +version = '2.0.0' + +[dependencies] +smallvec = "1.6.1" + +[package.metadata.docs.rs] +targets = ['x86_64-unknown-linux-gnu'] + +[dependencies.codec] +default-features = false +features = ['derive'] +package = 'parity-scale-codec' +version = '2.0.0' + +[dependencies.frame-benchmarking] +default-features = false +git = 'https://github.com/paritytech/substrate' +optional = true +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-executive] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-support] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-system] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-system-benchmarking] +default-features = false +git = 'https://github.com/paritytech/substrate' +optional = true +branch = "statemint" +version = '3.0.0' + +[dependencies.frame-system-rpc-runtime-api] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.hex-literal] +optional = true +version = '0.3.1' + +[dependencies.pallet-assets] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" + +[dependencies.pallet-authorship] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" + +[dependencies.pallet-balances] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-multisig] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-proxy] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-randomness-collective-flip] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-sudo] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-timestamp] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-transaction-payment] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-transaction-payment-rpc-runtime-api] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-utility] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.serde] +features = ['derive'] +optional = true +version = '1.0.119' + +[dependencies.node-primitives] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" + +[dependencies.sp-api] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-block-builder] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-core] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-inherents] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-io] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-offchain] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-runtime] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-session] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-std] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-transaction-pool] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-version] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +# Cumulus dependencies +[dependencies.cumulus-pallet-aura-ext] +default-features = false +path = "../../pallets/aura-ext" + +[dependencies.parachain-info] +default-features = false +path = "../pallets/parachain-info" +version = '0.1.0' + +[dependencies.cumulus-pallet-parachain-system] +path = "../../pallets/parachain-system" +default-features = false + +[dependencies.cumulus-primitives-core] +path = "../../primitives/core" +default-features = false + +[dependencies.cumulus-primitives-utility] +path = "../../primitives/utility" +default-features = false + +[dependencies.cumulus-pallet-dmp-queue] +path = "../../pallets/dmp-queue" +default-features = false + +[dependencies.cumulus-pallet-xcmp-queue] +path = "../../pallets/xcmp-queue" +default-features = false + +[dependencies.cumulus-pallet-xcm] +path = "../../pallets/xcm" +default-features = false + +# Polkadot dependencies +[dependencies.polkadot-primitives] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.polkadot-runtime-common] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.polkadot-parachain] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.xcm] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.xcm-builder] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.xcm-executor] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.pallet-xcm] +git = 'https://github.com/paritytech/polkadot' +branch = "statemint" +default-features = false + +[dependencies.pallet-collator-selection] +default-features = false +path = '../../pallets/collator-selection' + +[dependencies.runtime-common] +default-features = false +version = "0.8.30" +path = '../statemint-common' + +[dependencies.pallet-aura] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.pallet-session] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '3.0.0' + +[dependencies.sp-consensus-aura] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = "statemint" +version = '0.9.0' + + +[features] +default = ['std'] +runtime-benchmarks = [ + 'hex-literal', + 'sp-runtime/runtime-benchmarks', + 'xcm-builder/runtime-benchmarks', + 'frame-benchmarking', + 'frame-system-benchmarking', + 'frame-support/runtime-benchmarks', + 'frame-system/runtime-benchmarks', + 'pallet-assets/runtime-benchmarks', + 'pallet-balances/runtime-benchmarks', + 'pallet-multisig/runtime-benchmarks', + 'pallet-proxy/runtime-benchmarks', + 'pallet-utility/runtime-benchmarks', + 'pallet-timestamp/runtime-benchmarks', + 'pallet-xcm/runtime-benchmarks', + 'pallet-collator-selection/runtime-benchmarks', +] +std = [ + 'codec/std', + 'serde', + 'sp-consensus-aura/std', + 'pallet-aura/std', + 'sp-api/std', + 'sp-std/std', + 'sp-io/std', + 'sp-core/std', + 'sp-runtime/std', + 'sp-version/std', + 'sp-offchain/std', + 'sp-session/std', + 'sp-block-builder/std', + 'sp-transaction-pool/std', + 'sp-inherents/std', + 'frame-support/std', + 'frame-executive/std', + 'frame-system/std', + 'frame-system-rpc-runtime-api/std', + 'pallet-assets/std', + 'pallet-authorship/std', + 'pallet-balances/std', + 'pallet-multisig/std', + 'pallet-proxy/std', + 'pallet-utility/std', + 'pallet-randomness-collective-flip/std', + 'pallet-transaction-payment-rpc-runtime-api/std', + 'pallet-timestamp/std', + 'pallet-sudo/std', + 'pallet-session/std', + 'pallet-xcm/std', + 'pallet-transaction-payment/std', + 'pallet-collator-selection/std', + 'node-primitives/std', + 'parachain-info/std', + "cumulus-pallet-aura-ext/std", + 'cumulus-pallet-parachain-system/std', + 'cumulus-pallet-dmp-queue/std', + "cumulus-pallet-xcmp-queue/std", + "cumulus-pallet-xcm/std", + "cumulus-primitives-core/std", + "cumulus-primitives-utility/std", + 'xcm/std', + 'xcm-builder/std', + 'xcm-executor/std', + 'polkadot-runtime-common/std', + 'runtime-common/std', + 'polkadot-primitives/std', +] diff --git a/polkadot-parachains/westmint/build.rs b/polkadot-parachains/westmint/build.rs new file mode 100644 index 00000000000..9b53d2457df --- /dev/null +++ b/polkadot-parachains/westmint/build.rs @@ -0,0 +1,9 @@ +use substrate_wasm_builder::WasmBuilder; + +fn main() { + WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} diff --git a/polkadot-parachains/westmint/src/constants.rs b/polkadot-parachains/westmint/src/constants.rs new file mode 100644 index 00000000000..cf18a6557f7 --- /dev/null +++ b/polkadot-parachains/westmint/src/constants.rs @@ -0,0 +1,72 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod currency { + use node_primitives::Balance; + + /// The existential deposit. Set to 1/10 of its parent Relay Chain. + pub const EXISTENTIAL_DEPOSIT: Balance = 100 * MILLICENTS; + + pub const UNITS: Balance = 1_000_000_000_000; + pub const CENTS: Balance = UNITS / 100; + pub const MILLICENTS: Balance = CENTS / 1_000; + pub const GRAND: Balance = CENTS * 100_000; + + pub const fn deposit(items: u32, bytes: u32) -> Balance { + // 1/10 of Westend testnet + (items as Balance * 100 * CENTS + (bytes as Balance) * 5 * MILLICENTS) / 10 + } +} + +/// Fee-related. +pub mod fee { + use node_primitives::Balance; + pub use sp_runtime::Perbill; + use frame_support::weights::{ + constants::ExtrinsicBaseWeight, WeightToFeeCoefficient, WeightToFeeCoefficients, + WeightToFeePolynomial, + }; + use smallvec::smallvec; + + /// The block saturation level. Fees will be updates based on this value. + pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); + + /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the + /// node's balance type. + /// + /// This should typically create a mapping between the following ranges: + /// - [0, MAXIMUM_BLOCK_WEIGHT] + /// - [Balance::min, Balance::max] + /// + /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: + /// - Setting it to `0` will essentially disable the weight fee. + /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. + pub struct WeightToFee; + impl WeightToFeePolynomial for WeightToFee { + type Balance = Balance; + fn polynomial() -> WeightToFeeCoefficients { + // in Polkadot, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: + // in Statemint, we map to 1/10 of that, or 1/100 CENT + let p = super::currency::CENTS; + let q = 100 * Balance::from(ExtrinsicBaseWeight::get()); + smallvec![WeightToFeeCoefficient { + degree: 1, + negative: false, + coeff_frac: Perbill::from_rational(p % q, q), + coeff_integer: p / q, + }] + } + } +} diff --git a/polkadot-parachains/westmint/src/lib.rs b/polkadot-parachains/westmint/src/lib.rs new file mode 100644 index 00000000000..19a1c49f610 --- /dev/null +++ b/polkadot-parachains/westmint/src/lib.rs @@ -0,0 +1,816 @@ +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Westmint runtime. + +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +pub mod constants; +mod weights; + +use sp_api::impl_runtime_apis; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +use sp_runtime::traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, +}; + +use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; + +use frame_system::{ + EnsureRoot, limits::{BlockLength, BlockWeights}, +}; +use runtime_common::{ + BlockNumber, Signature, AccountId, Balance, Index, Hash, AuraId, Header, + NORMAL_DISPATCH_RATIO, AVERAGE_ON_INITIALIZE_RATIO, MAXIMUM_BLOCK_WEIGHT, SLOT_DURATION, HOURS, +}; +pub use runtime_common as common; +use runtime_common::impls::DealWithFees; +use codec::{Decode, Encode}; +use constants::{currency::*, fee::WeightToFee}; +use frame_support::{ + construct_runtime, parameter_types, match_type, + traits::{InstanceFilter, All, MaxEncodedLen}, + weights::{ + constants::{BlockExecutionWeight, ExtrinsicBaseWeight}, + DispatchClass, IdentityFee, Weight, + }, + RuntimeDebug, PalletId, +}; +use sp_runtime::Perbill; + +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; + +// Polkadot imports +use polkadot_parachain::primitives::Sibling; +use polkadot_runtime_common::{ + BlockHashCount, RocksDbWeight, SlowAdjustingFeeUpdate, +}; +use xcm::v0::{MultiAsset, Junction, MultiLocation, NetworkId, Xcm}; +use xcm_builder::{ + AccountId32Aliases, CurrencyAdapter, LocationInverter, ParentIsDefault, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SovereignSignedViaLocation, EnsureXcmOrigin, + AllowTopLevelPaidExecutionFrom, TakeWeightCredit, FixedWeightBounds, IsConcrete, NativeAsset, + AllowUnpaidExecutionFrom, ParentAsSuperuser, SignedToAccountId32, UsingComponents, +}; +use xcm_executor::{Config, XcmExecutor}; +use pallet_xcm::XcmPassthrough; + +/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know +/// the specifics of the runtime. They can then be made to be agnostic over specific formats +/// of data like extrinsics, allowing for them to continue syncing the network through upgrades +/// to even the core data structures. +pub mod opaque { + use super::*; + pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; + + /// Opaque block type. + pub type Block = generic::Block; + + pub type SessionHandlers = (); + + impl_opaque_keys! { + pub struct SessionKeys { + pub aura: Aura, + } + } +} + +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("westmint"), + impl_name: create_runtime_str!("westmint"), + authoring_version: 1, + spec_version: 1, + impl_version: 1, + apis: RUNTIME_API_VERSIONS, + transaction_version: 1, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { + runtime_version: VERSION, + can_author_with: Default::default(), + } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + pub RuntimeBlockLength: BlockLength = + BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have some extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); + pub const SS58Prefix: u8 = 42; +} + +// Configure FRAME pallets to include in runtime. + +impl frame_system::Config for Runtime { + type BaseCallFilter = (); + type BlockWeights = RuntimeBlockWeights; + type BlockLength = RuntimeBlockLength; + type AccountId = AccountId; + type Call = Call; + type Lookup = AccountIdLookup; + type Index = Index; + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hashing = BlakeTwo256; + type Header = Header; + type Event = Event; + type Origin = Origin; + type BlockHashCount = BlockHashCount; + type DbWeight = RocksDbWeight; + type Version = Version; + type PalletInfo = PalletInfo; + type OnNewAccount = (); + type OnKilledAccount = (); + type AccountData = pallet_balances::AccountData; + type SystemWeightInfo = (); + type SS58Prefix = SS58Prefix; + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; +} + +parameter_types! { + pub const MinimumPeriod: u64 = SLOT_DURATION / 2; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = weights::pallet_timestamp::WeightInfo; +} + +parameter_types! { + pub const UncleGenerations: u32 = 0; +} + +impl pallet_authorship::Config for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type UncleGenerations = UncleGenerations; + type FilterUncle = (); + type EventHandler = (CollatorSelection,); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; + pub const MaxLocks: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + /// The type for recording an account's balance. + type Balance = Balance; + /// The ubiquitous event type. + type Event = Event; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = weights::pallet_balances::WeightInfo; +} + +parameter_types! { + /// Relay Chain `TransactionByteFee` / 10 + pub const TransactionByteFee: Balance = 1 * MILLICENTS; +} + +impl pallet_transaction_payment::Config for Runtime { + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; + type TransactionByteFee = TransactionByteFee; + type WeightToFee = WeightToFee; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +impl pallet_sudo::Config for Runtime { + type Event = Event; + type Call = Call; +} + +parameter_types! { + pub const AssetDeposit: Balance = 100 * UNITS; // 100 WND deposit to create asset + pub const ApprovalDeposit: Balance = EXISTENTIAL_DEPOSIT; + pub const StringLimit: u32 = 50; + /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) + // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 + pub const MetadataDepositBase: Balance = deposit(1, 68); + pub const MetadataDepositPerByte: Balance = deposit(0, 1); +} + +impl pallet_assets::Config for Runtime { + type Event = Event; + type Balance = Balance; + type AssetId = u32; + type Currency = Balances; + type ForceOrigin = EnsureRoot; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = StringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = weights::pallet_assets::WeightInfo; +} + +parameter_types! { + // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. + pub const DepositBase: Balance = deposit(1, 88); + // Additional storage item size of 32 bytes. + pub const DepositFactor: Balance = deposit(0, 32); + pub const MaxSignatories: u16 = 100; +} + +impl pallet_multisig::Config for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = MaxSignatories; + type WeightInfo = weights::pallet_multisig::WeightInfo; +} + +impl pallet_utility::Config for Runtime { + type Event = Event; + type Call = Call; + type WeightInfo = weights::pallet_utility::WeightInfo; +} + +parameter_types! { + // One storage item; key size 32, value size 8; . + pub const ProxyDepositBase: Balance = deposit(1, 40); + // Additional storage item size of 33 bytes. + pub const ProxyDepositFactor: Balance = deposit(0, 33); + pub const MaxProxies: u16 = 32; + // One storage item; key size 32, value size 16 + pub const AnnouncementDepositBase: Balance = deposit(1, 48); + pub const AnnouncementDepositFactor: Balance = deposit(0, 66); + pub const MaxPending: u16 = 32; +} + +/// The type used to represent the kinds of proxying allowed. +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug, MaxEncodedLen)] +pub enum ProxyType { + /// Fully permissioned proxy. Can execute any call on behalf of _proxied_. + Any, + /// Can execute any call that does not transfer funds, including asset transfers. + NonTransfer, + /// Proxy with the ability to reject time-delay proxy announcements. + CancelProxy, + /// Assets proxy. Can execute any call from `assets`, **including asset transfers**. + Assets, + /// Owner proxy. Can execute calls related to asset ownership. + AssetOwner, + /// Asset manager. Can execute calls related to asset management. + AssetManager, + // Collator selection proxy. Can execute calls related to collator selection mechanism. + Collator, +} +impl Default for ProxyType { + fn default() -> Self { + Self::Any + } +} +impl InstanceFilter for ProxyType { + fn filter(&self, c: &Call) -> bool { + match self { + ProxyType::Any => true, + ProxyType::NonTransfer => !matches!(c, + Call::Balances(..) | + Call::Assets(pallet_assets::Call::transfer(..)) | + Call::Assets(pallet_assets::Call::transfer_keep_alive(..)) | + Call::Assets(pallet_assets::Call::force_transfer(..)) | + Call::Assets(pallet_assets::Call::approve_transfer(..)) | + Call::Assets(pallet_assets::Call::transfer_approved(..)) + ), + ProxyType::CancelProxy => matches!(c, + Call::Proxy(pallet_proxy::Call::reject_announcement(..)) | + Call::Utility(..) | + Call::Multisig(..) + ), + ProxyType::Assets => { + matches!(c, Call::Assets(..) | Call::Utility(..) | Call::Multisig(..)) + } + ProxyType::AssetOwner => matches!(c, + Call::Assets(pallet_assets::Call::create(..)) | + Call::Assets(pallet_assets::Call::destroy(..)) | + Call::Assets(pallet_assets::Call::transfer_ownership(..)) | + Call::Assets(pallet_assets::Call::set_team(..)) | + Call::Assets(pallet_assets::Call::set_metadata(..)) | + Call::Assets(pallet_assets::Call::clear_metadata(..)) | + Call::Utility(..) | + Call::Multisig(..) + ), + ProxyType::AssetManager => matches!(c, + Call::Assets(pallet_assets::Call::mint(..)) | + Call::Assets(pallet_assets::Call::burn(..)) | + Call::Assets(pallet_assets::Call::freeze(..)) | + Call::Assets(pallet_assets::Call::thaw(..)) | + Call::Assets(pallet_assets::Call::freeze_asset(..)) | + Call::Assets(pallet_assets::Call::thaw_asset(..)) | + Call::Utility(..) | + Call::Multisig(..) + ), + ProxyType::Collator => matches!(c, + Call::CollatorSelection(..) | + Call::Utility(..) | + Call::Multisig(..) + ) + } + } + fn is_superset(&self, o: &Self) -> bool { + match (self, o) { + (x, y) if x == y => true, + (ProxyType::Any, _) => true, + (_, ProxyType::Any) => false, + (ProxyType::Assets, ProxyType::AssetOwner) => true, + (ProxyType::Assets, ProxyType::AssetManager) => true, + _ => false, + } + } +} + +impl pallet_proxy::Config for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type ProxyType = ProxyType; + type ProxyDepositBase = ProxyDepositBase; + type ProxyDepositFactor = ProxyDepositFactor; + type MaxProxies = MaxProxies; + type WeightInfo = weights::pallet_proxy::WeightInfo; + type MaxPending = MaxPending; + type CallHasher = BlakeTwo256; + type AnnouncementDepositBase = AnnouncementDepositBase; + type AnnouncementDepositFactor = AnnouncementDepositFactor; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4; + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4; +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type Event = Event; + type OnValidationData = (); + type SelfParaId = parachain_info::Pallet; + type DmpMessageHandler = DmpQueue; + type ReservedDmpWeight = ReservedDmpWeight; + type OutboundXcmpMessageSource = XcmpQueue; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; +} + +impl parachain_info::Config for Runtime {} + +impl cumulus_pallet_aura_ext::Config for Runtime {} + +parameter_types! { + pub const WestendLocation: MultiLocation = MultiLocation::X1(Junction::Parent); + pub RelayNetwork: NetworkId = NetworkId::Named(b"Westend".to_vec()); + pub RelayChainOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into(); + pub Ancestry: MultiLocation = Junction::Parachain(ParachainInfo::parachain_id().into()).into(); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsDefault, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, +); + +/// Means for transacting assets on this chain. +pub type LocalAssetTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports. + (), +>; + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `Origin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + XcmPassthrough, +); + +parameter_types! { + pub UnitWeightCost: Weight = 1_000; +} + +match_type! { + pub type ParentOrParentsPlurality: impl Contains = { + MultiLocation::X1(Junction::Parent) | + MultiLocation::X2(Junction::Parent, Junction::Plurality { .. }) + }; +} + +pub type Barrier = ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom>, + AllowUnpaidExecutionFrom, + // ^^^ Parent & its plurality gets free execution +); + +pub struct XcmConfig; +impl Config for XcmConfig { + type Call = Call; + type XcmSender = XcmRouter; + // How to withdraw and deposit an asset. + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = NativeAsset; + type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of WND + type LocationInverter = LocationInverter; + type Barrier = Barrier; + type Weigher = FixedWeightBounds; + type Trader = UsingComponents, WestendLocation, AccountId, Balances, ()>; + type ResponseHandler = (); // Don't handle responses for now. +} + +parameter_types! { + pub const MaxDownwardMessageWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 10; +} + +/// No local origins on this chain are allowed to dispatch XCM sends/executions. +pub type LocalOriginToLocation = ( + SignedToAccountId32, +); + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = ( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +); + +impl pallet_xcm::Config for Runtime { + type Event = Event; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = All<(MultiLocation, Xcm)>; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = All<(MultiLocation, Vec)>; + type XcmReserveTransferFilter = All<(MultiLocation, Vec)>; + type Weigher = FixedWeightBounds; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; +} + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; + type ChannelInfo = ParachainSystem; +} + +impl cumulus_pallet_dmp_queue::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; + type ExecuteOverweightOrigin = EnsureRoot; +} + +parameter_types! { + pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(33); + pub const Period: u32 = 6 * HOURS; + pub const Offset: u32 = 0; +} + +impl pallet_session::Config for Runtime { + type Event = Event; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions; + type NextSessionRotation = pallet_session::PeriodicSessions; + type SessionManager = CollatorSelection; + // Essentially just Aura, but lets be pedantic. + type SessionHandler = ::KeyTypeIdProviders; + type Keys = opaque::SessionKeys; + type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const MaxCandidates: u32 = 1000; + pub const SessionLength: BlockNumber = 6 * HOURS; + pub const MaxInvulnerables: u32 = 100; +} + +impl pallet_collator_selection::Config for Runtime { + type Event = Event; + type Currency = Balances; + type UpdateOrigin = EnsureRoot; + type PotId = PotId; + type MaxCandidates = MaxCandidates; + type MaxInvulnerables = MaxInvulnerables; + // should be a multiple of session or things will get inconsistent + type KickThreshold = Period; + type WeightInfo = weights::pallet_collator_selection::WeightInfo; +} + +// Create the runtime by composing the FRAME pallets that were previously configured. +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = opaque::Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + // System support stuff; + System: frame_system::{Pallet, Call, Config, Storage, Event}, + ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Storage, Inherent, Event}, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Call, Storage}, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, + ParachainInfo: parachain_info::{Pallet, Storage, Config}, + Sudo: pallet_sudo::{Pallet, Call, Config, Storage, Event}, + + // Monetary stuff; + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage}, + + // Collator support. the order of these 4 are important and shall not change. + Authorship: pallet_authorship::{Pallet, Call, Storage}, + CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config}, + Session: pallet_session::{Pallet, Call, Storage, Event, Config}, + Aura: pallet_aura::{Pallet, Storage, Config}, + AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config}, + + // The main stage. + Utility: pallet_utility::{Pallet, Call, Event}, + Assets: pallet_assets::{Pallet, Call, Storage, Event}, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event}, + Proxy: pallet_proxy::{Pallet, Call, Storage, Event}, + + // XCM helpers. + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event}, + PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin}, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin}, + DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event}, + } +); + +/// The address format for describing accounts. +pub type Address = sp_runtime::MultiAddress; +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Extrinsic type that has already been checked. +pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPallets, +>; + +impl_runtime_apis! { + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) + } + + fn authorities() -> Vec { + Aura::authorities() + } + } + + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + Runtime::metadata().into() + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: sp_inherents::InherentData, + ) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + opaque::SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, KeyTypeId)>> { + opaque::SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Index { + System::account_nonce(account) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { + fn query_info( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + fn query_fee_details( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_fee_details(uxt, len) + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info() -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info() + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey}; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime {} + + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), + ]; + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + + add_benchmark!(params, batches, frame_system, SystemBench::); + add_benchmark!(params, batches, pallet_assets, Assets); + add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_multisig, Multisig); + add_benchmark!(params, batches, pallet_proxy, Proxy); + add_benchmark!(params, batches, pallet_utility, Utility); + add_benchmark!(params, batches, pallet_timestamp, Timestamp); + add_benchmark!(params, batches, pallet_collator_selection, CollatorSelection); + + if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } + Ok(batches) + } + } +} + +cumulus_pallet_parachain_system::register_validate_block!( +Runtime, +cumulus_pallet_aura_ext::BlockExecutor::, +); diff --git a/polkadot-parachains/westmint/src/weights/mod.rs b/polkadot-parachains/westmint/src/weights/mod.rs new file mode 100644 index 00000000000..619f9a943a6 --- /dev/null +++ b/polkadot-parachains/westmint/src/weights/mod.rs @@ -0,0 +1,7 @@ +pub mod pallet_assets; +pub mod pallet_balances; +pub mod pallet_multisig; +pub mod pallet_collator_selection; +pub mod pallet_proxy; +pub mod pallet_timestamp; +pub mod pallet_utility; diff --git a/polkadot-parachains/westmint/src/weights/pallet_assets.rs b/polkadot-parachains/westmint/src/weights/pallet_assets.rs new file mode 100644 index 00000000000..9a1b41900ed --- /dev/null +++ b/polkadot-parachains/westmint/src/weights/pallet_assets.rs @@ -0,0 +1,169 @@ + +//! Autogenerated weights for pallet_assets +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_assets +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_assets. +pub struct WeightInfo(PhantomData); +impl pallet_assets::WeightInfo for WeightInfo { + fn create() -> Weight { + (68_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_create() -> Weight { + (34_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn destroy(c: u32, s: u32, a: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 440_000 + .saturating_add((33_246_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 440_000 + .saturating_add((47_556_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(a as Weight))) + } + fn mint() -> Weight { + (103_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn burn() -> Weight { + (115_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn transfer() -> Weight { + (153_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn transfer_keep_alive() -> Weight { + (124_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn force_transfer() -> Weight { + (145_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn freeze() -> Weight { + (49_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn thaw() -> Weight { + (47_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn freeze_asset() -> Weight { + (34_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn thaw_asset() -> Weight { + (34_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer_ownership() -> Weight { + (39_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_team() -> Weight { + (35_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_metadata(_n: u32, s: u32, ) -> Weight { + (75_032_000 as Weight) + // Standard Error: 20_000 + .saturating_add((18_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn clear_metadata() -> Weight { + (70_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_set_metadata(n: u32, s: u32, ) -> Weight { + (34_085_000 as Weight) + // Standard Error: 21_000 + .saturating_add((48_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 21_000 + .saturating_add((53_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_clear_metadata() -> Weight { + (73_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_asset_status() -> Weight { + (33_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_transfer() -> Weight { + (67_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer_approved() -> Weight { + (149_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + fn cancel_approval() -> Weight { + (62_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_cancel_approval() -> Weight { + (71_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/polkadot-parachains/westmint/src/weights/pallet_balances.rs b/polkadot-parachains/westmint/src/weights/pallet_balances.rs new file mode 100644 index 00000000000..57e10a70aa3 --- /dev/null +++ b/polkadot-parachains/westmint/src/weights/pallet_balances.rs @@ -0,0 +1,64 @@ + +//! Autogenerated weights for pallet_balances +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_balances +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_balances. +pub struct WeightInfo(PhantomData); +impl pallet_balances::WeightInfo for WeightInfo { + fn transfer() -> Weight { + (119_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer_keep_alive() -> Weight { + (87_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_balance_creating() -> Weight { + (45_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_balance_killing() -> Weight { + (55_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_transfer() -> Weight { + (110_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/polkadot-parachains/westmint/src/weights/pallet_collator_selection.rs b/polkadot-parachains/westmint/src/weights/pallet_collator_selection.rs new file mode 100644 index 00000000000..fad9de8bab6 --- /dev/null +++ b/polkadot-parachains/westmint/src/weights/pallet_collator_selection.rs @@ -0,0 +1,83 @@ + +//! Autogenerated weights for pallet_collator_selection +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-05-04, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_collator_selection +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_collator_selection. +pub struct WeightInfo(PhantomData); +impl pallet_collator_selection::WeightInfo for WeightInfo { + fn set_invulnerables(b: u32, ) -> Weight { + (36_147_000 as Weight) + // Standard Error: 22_000 + .saturating_add((50_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_desired_candidates() -> Weight { + (25_000_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_candidacy_bond() -> Weight { + (26_000_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn register_as_candidate(c: u32, ) -> Weight { + (90_380_000 as Weight) + // Standard Error: 8_000 + .saturating_add((314_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn leave_intent(c: u32, ) -> Weight { + (65_617_000 as Weight) + // Standard Error: 4_000 + .saturating_add((325_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn note_author(c: u32, ) -> Weight { + (138_742_000 as Weight) + // Standard Error: 4_000 + .saturating_add((255_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn new_session(r: u32, c: u32, ) -> Weight { + (59_461_000 as Weight) + // Standard Error: 4_000 + .saturating_add((2_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 4_000 + .saturating_add((291_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/polkadot-parachains/westmint/src/weights/pallet_multisig.rs b/polkadot-parachains/westmint/src/weights/pallet_multisig.rs new file mode 100644 index 00000000000..f372e653085 --- /dev/null +++ b/polkadot-parachains/westmint/src/weights/pallet_multisig.rs @@ -0,0 +1,115 @@ + +//! Autogenerated weights for pallet_multisig +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_multisig +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_multisig. +pub struct WeightInfo(PhantomData); +impl pallet_multisig::WeightInfo for WeightInfo { + fn as_multi_threshold_1(z: u32, ) -> Weight { + (15_910_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + } + fn as_multi_create(s: u32, z: u32, ) -> Weight { + (80_512_000 as Weight) + // Standard Error: 3_000 + .saturating_add((107_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_create_store(s: u32, z: u32, ) -> Weight { + (90_834_000 as Weight) + // Standard Error: 2_000 + .saturating_add((106_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_approve(s: u32, z: u32, ) -> Weight { + (43_694_000 as Weight) + // Standard Error: 1_000 + .saturating_add((142_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_approve_store(s: u32, z: u32, ) -> Weight { + (86_160_000 as Weight) + // Standard Error: 5_000 + .saturating_add((148_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_complete(s: u32, z: u32, ) -> Weight { + (119_030_000 as Weight) + // Standard Error: 46_000 + .saturating_add((302_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((6_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn approve_as_multi_create(s: u32, ) -> Weight { + (82_860_000 as Weight) + // Standard Error: 24_000 + .saturating_add((95_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_approve(s: u32, ) -> Weight { + (46_197_000 as Weight) + // Standard Error: 5_000 + .saturating_add((110_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_complete(s: u32, ) -> Weight { + (193_380_000 as Weight) + // Standard Error: 10_000 + .saturating_add((297_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn cancel_as_multi(_s: u32, ) -> Weight { + (172_508_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/polkadot-parachains/westmint/src/weights/pallet_proxy.rs b/polkadot-parachains/westmint/src/weights/pallet_proxy.rs new file mode 100644 index 00000000000..6a7af9fb2f0 --- /dev/null +++ b/polkadot-parachains/westmint/src/weights/pallet_proxy.rs @@ -0,0 +1,112 @@ + +//! Autogenerated weights for pallet_proxy +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_proxy +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_proxy. +pub struct WeightInfo(PhantomData); +impl pallet_proxy::WeightInfo for WeightInfo { + fn proxy(_p: u32, ) -> Weight { + (43_004_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + } + fn proxy_announced(a: u32, p: u32, ) -> Weight { + (84_139_000 as Weight) + // Standard Error: 63_000 + .saturating_add((877_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 66_000 + .saturating_add((234_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn remove_announcement(a: u32, p: u32, ) -> Weight { + (54_559_000 as Weight) + // Standard Error: 5_000 + .saturating_add((783_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 6_000 + .saturating_add((35_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn reject_announcement(a: u32, p: u32, ) -> Weight { + (46_951_000 as Weight) + // Standard Error: 42_000 + .saturating_add((956_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 43_000 + .saturating_add((327_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn announce(a: u32, p: u32, ) -> Weight { + (77_309_000 as Weight) + // Standard Error: 40_000 + .saturating_add((815_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 42_000 + .saturating_add((258_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn add_proxy(_p: u32, ) -> Weight { + (71_647_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_proxy(p: u32, ) -> Weight { + (54_361_000 as Weight) + // Standard Error: 17_000 + .saturating_add((312_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_proxies(p: u32, ) -> Weight { + (53_211_000 as Weight) + // Standard Error: 12_000 + .saturating_add((192_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn anonymous(p: u32, ) -> Weight { + (76_563_000 as Weight) + // Standard Error: 17_000 + .saturating_add((12_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn kill_anonymous(p: u32, ) -> Weight { + (54_365_000 as Weight) + // Standard Error: 28_000 + .saturating_add((251_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/polkadot-parachains/westmint/src/weights/pallet_timestamp.rs b/polkadot-parachains/westmint/src/weights/pallet_timestamp.rs new file mode 100644 index 00000000000..573d8f9b7d1 --- /dev/null +++ b/polkadot-parachains/westmint/src/weights/pallet_timestamp.rs @@ -0,0 +1,47 @@ + +//! Autogenerated weights for pallet_timestamp +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_timestamp +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_timestamp. +pub struct WeightInfo(PhantomData); +impl pallet_timestamp::WeightInfo for WeightInfo { + fn set() -> Weight { + (16_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn on_finalize() -> Weight { + (8_000_000 as Weight) + } +} diff --git a/polkadot-parachains/westmint/src/weights/pallet_utility.rs b/polkadot-parachains/westmint/src/weights/pallet_utility.rs new file mode 100644 index 00000000000..7248388a406 --- /dev/null +++ b/polkadot-parachains/westmint/src/weights/pallet_utility.rs @@ -0,0 +1,52 @@ + +//! Autogenerated weights for pallet_utility +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/statemint +// benchmark +// --chain +// statemint-dev +// --execution +// wasm +// --wasm-execution +// compiled +// --pallet +// pallet_utility +// --extrinsic +// * +// --steps +// 20 +// --repeat +// 10 +// --raw +// --output +// ./runtime/statemint/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_utility. +pub struct WeightInfo(PhantomData); +impl pallet_utility::WeightInfo for WeightInfo { + fn batch(c: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 65_000 + .saturating_add((4_751_000 as Weight).saturating_mul(c as Weight)) + } + fn as_derivative() -> Weight { + (10_000_000 as Weight) + } + fn batch_all(c: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 71_000 + .saturating_add((4_866_000 as Weight).saturating_mul(c as Weight)) + } +} From b2eb583dd20bd2ac3d4305293457864cea7ed84b Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Sun, 30 May 2021 15:24:03 +0200 Subject: [PATCH 02/17] Versioning. --- Cargo.lock | 4799 +++++++---------- pallets/collator-selection/Cargo.toml | 32 +- polkadot-parachains/statemine/Cargo.toml | 78 +- .../statemint-common/Cargo.toml | 30 +- polkadot-parachains/statemint/Cargo.toml | 78 +- polkadot-parachains/westmint/Cargo.toml | 80 +- 6 files changed, 1991 insertions(+), 3106 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3b35ee51e87..971b4337cbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -477,7 +477,7 @@ checksum = "6736e2428df2ca2848d846c43e88745121a6654696e349ce0054a420815a7409" [[package]] name = "beefy-gadget" version = "0.1.0" -source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#5f2d59bdaae602d381d02a3ee705c34b511a7114" +source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#74db10469a09cd4647b0a5348d7db92c98c580a5" dependencies = [ "beefy-primitives", "futures 0.3.14", @@ -489,23 +489,23 @@ dependencies = [ "sc-keystore", "sc-network", "sc-network-gossip", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-keystore", + "sp-runtime", + "sp-utils", + "substrate-prometheus-endpoint", "thiserror", ] [[package]] name = "beefy-gadget-rpc" version = "0.1.0" -source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#5f2d59bdaae602d381d02a3ee705c34b511a7114" +source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#74db10469a09cd4647b0a5348d7db92c98c580a5" dependencies = [ "beefy-gadget", "beefy-primitives", @@ -519,21 +519,21 @@ dependencies = [ "sc-rpc", "serde", "serde_json", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-runtime", ] [[package]] name = "beefy-primitives" version = "0.1.0" -source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#5f2d59bdaae602d381d02a3ee705c34b511a7114" +source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#74db10469a09cd4647b0a5348d7db92c98c580a5" dependencies = [ "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] @@ -709,109 +709,109 @@ dependencies = [ [[package]] name = "bp-header-chain" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "finality-grandpa", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", "parity-scale-codec", "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", "sp-finality-grandpa", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "bp-messages" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bp-runtime", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std", ] [[package]] name = "bp-polkadot-core" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bp-messages", "bp-runtime", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-core", + "sp-runtime", + "sp-std", + "sp-version", ] [[package]] name = "bp-rococo" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bp-header-chain", "bp-messages", "bp-polkadot-core", "bp-runtime", "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-runtime", + "sp-std", + "sp-version", ] [[package]] name = "bp-runtime" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", "hash-db", "num-traits", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", ] [[package]] name = "bp-test-utils" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bp-header-chain", "ed25519-dalek", "finality-grandpa", "parity-scale-codec", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", "sp-finality-grandpa", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "bp-wococo" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bp-header-chain", "bp-messages", "bp-polkadot-core", "bp-runtime", "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-runtime", + "sp-std", + "sp-version", ] [[package]] @@ -1413,16 +1413,16 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-overseer", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "sc-client-api", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-io", "sp-keyring", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-state-machine", "substrate-test-client", "tracing", ] @@ -1442,17 +1442,17 @@ dependencies = [ "sc-consensus-aura", "sc-consensus-slots", "sc-telemetry", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", "tracing", ] @@ -1469,22 +1469,22 @@ dependencies = [ "futures 0.3.14", "futures-timer 3.0.2", "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "polkadot-runtime", "polkadot-test-client", "sc-cli", "sc-client-api", "sc-service", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-tracing", + "sp-trie", + "substrate-prometheus-endpoint", "substrate-test-utils", "tokio 0.2.24", "tracing", @@ -1502,14 +1502,14 @@ dependencies = [ "parking_lot 0.10.2", "polkadot-service", "sc-client-api", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", + "substrate-prometheus-endpoint", "tracing", ] @@ -1525,21 +1525,21 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "polkadot-node-primitives", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", + "polkadot-primitives", "polkadot-service", "polkadot-statement-table", "polkadot-test-client", "sc-cli", "sc-client-api", "sc-service", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", "sp-keyring", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore", + "sp-runtime", "substrate-test-utils", "tokio 0.2.24", "tracing", @@ -1557,8 +1557,8 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-overseer", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", + "polkadot-primitives", "polkadot-service", "polkadot-statement-table", "polkadot-test-client", @@ -1566,13 +1566,13 @@ dependencies = [ "sc-cli", "sc-client-api", "sc-service", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-consensus", + "sp-core", "sp-keyring", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore", + "sp-maybe-compressed-blob", + "sp-runtime", "substrate-test-utils", "tokio 0.2.24", "tracing", @@ -1589,7 +1589,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "polkadot-overseer", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "polkadot-service", "sc-chain-spec", "sc-client-api", @@ -1597,11 +1597,11 @@ dependencies = [ "sc-service", "sc-telemetry", "sc-tracing", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", "tracing", ] @@ -1610,16 +1610,16 @@ name = "cumulus-pallet-aura-ext" version = "0.1.0" dependencies = [ "cumulus-pallet-parachain-system", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-executive", + "frame-support", + "frame-system", + "pallet-aura", "parity-scale-codec", "serde", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", + "sp-consensus-aura", + "sp-runtime", + "sp-std", ] [[package]] @@ -1627,19 +1627,19 @@ name = "cumulus-pallet-dmp-queue" version = "0.1.0" dependencies = [ "cumulus-primitives-core", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", "parity-scale-codec", "rand 0.8.3", "rand_chacha 0.3.0", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", + "xcm", + "xcm-executor", ] [[package]] @@ -1652,35 +1652,35 @@ dependencies = [ "cumulus-test-relay-sproof-builder", "env_logger 0.7.1", "environmental", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "hash-db", "hex-literal 0.2.1", "lazy_static", "log", "memory-db", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances", "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", "sc-client-api", "sc-executor", "sc-executor-common", "serde", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-externalities", + "sp-inherents", + "sp-io", "sp-keyring", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "sp-version", "substrate-test-runtime-client", "trie-db", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm", ] [[package]] @@ -1688,14 +1688,14 @@ name = "cumulus-pallet-xcm" version = "0.1.0" dependencies = [ "cumulus-primitives-core", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", "serde", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", ] [[package]] @@ -1703,16 +1703,16 @@ name = "cumulus-pallet-xcmp-queue" version = "0.1.0" dependencies = [ "cumulus-primitives-core", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", "parity-scale-codec", "rand 0.8.3", "rand_chacha 0.3.0", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", ] [[package]] @@ -1721,30 +1721,30 @@ version = "0.1.0" dependencies = [ "cumulus-pallet-xcm", "cumulus-primitives-core", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", "serde", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-runtime", + "sp-std", + "xcm", ] [[package]] name = "cumulus-primitives-core" version = "0.1.0" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", "impl-trait-for-tuples", "parity-scale-codec", - "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-primitives", + "sp-api", + "sp-runtime", + "sp-std", + "sp-trie", + "xcm", ] [[package]] @@ -1756,13 +1756,13 @@ dependencies = [ "parity-scale-codec", "polkadot-service", "sc-client-api", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", "tracing", ] @@ -1771,16 +1771,16 @@ name = "cumulus-primitives-utility" version = "0.1.0" dependencies = [ "cumulus-primitives-core", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", "impl-trait-for-tuples", "parity-scale-codec", - "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-primitives", + "sp-runtime", + "sp-std", + "sp-trie", + "xcm", ] [[package]] @@ -1795,40 +1795,40 @@ dependencies = [ "cumulus-ping", "cumulus-primitives-core", "cumulus-primitives-utility", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-executive", + "frame-support", + "frame-system", "hex", "hex-literal 0.3.1", "log", - "pallet-assets 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=master)", + "pallet-assets", + "pallet-aura", + "pallet-balances", + "pallet-randomness-collective-flip", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-xcm", "parachain-info", "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder 4.0.0", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -1840,31 +1840,31 @@ dependencies = [ "cumulus-pallet-xcm", "cumulus-primitives-core", "cumulus-primitives-utility", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-executive", + "frame-support", + "frame-system", "hex", "hex-literal 0.3.1", "log", "parachain-info", "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-api", + "sp-block-builder", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder 4.0.0", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -1876,23 +1876,23 @@ dependencies = [ "cumulus-test-relay-sproof-builder", "cumulus-test-runtime", "cumulus-test-service", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system", + "pallet-balances", + "pallet-transaction-payment", "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "sc-block-builder", "sc-consensus", "sc-service", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-inherents", "sp-keyring", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-state-machine", "sp-test-primitives", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-timestamp", "substrate-test-client", ] @@ -1902,10 +1902,10 @@ version = "0.1.0" dependencies = [ "cumulus-primitives-core", "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-primitives", + "sp-runtime", + "sp-state-machine", + "sp-std", ] [[package]] @@ -1921,29 +1921,29 @@ version = "0.1.0" dependencies = [ "cumulus-pallet-parachain-system", "cumulus-primitives-core", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-executive", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-randomness-collective-flip", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "parity-scale-codec", + "polkadot-parachain", + "serde", + "sp-api", + "sp-block-builder", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder 4.0.0", ] [[package]] @@ -1952,29 +1952,29 @@ version = "0.1.0" dependencies = [ "cumulus-pallet-parachain-system", "cumulus-primitives-core", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-executive", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-randomness-collective-flip", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "parity-scale-codec", + "polkadot-parachain", + "serde", + "sp-api", + "sp-block-builder", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder 4.0.0", ] [[package]] @@ -1991,13 +1991,13 @@ dependencies = [ "cumulus-test-relay-validation-worker-provider", "cumulus-test-runtime", "cumulus-test-runtime-upgrade", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system", "futures 0.3.14", "jsonrpc-core", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment", "parity-scale-codec", "polkadot-overseer", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "polkadot-service", "polkadot-test-runtime", "polkadot-test-service", @@ -2015,20 +2015,20 @@ dependencies = [ "sc-tracing", "sc-transaction-pool", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-arithmetic", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-core", "sp-keyring", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-timestamp", + "sp-transaction-pool", + "sp-trie", "substrate-test-client", "substrate-test-utils", "tokio 0.2.24", @@ -2551,7 +2551,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", ] @@ -2569,49 +2569,30 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "3.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "linregress", - "log", - "parity-scale-codec", - "paste 1.0.4", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "frame-benchmarking" -version = "3.1.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support", + "frame-system", "linregress", "log", "parity-scale-codec", "paste 1.0.4", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api", + "sp-io", + "sp-runtime", + "sp-runtime-interface", + "sp-std", + "sp-storage", ] [[package]] name = "frame-benchmarking-cli" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "Inflector", "chrono", - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", "handlebars", "parity-scale-codec", "sc-cli", @@ -2619,113 +2600,61 @@ dependencies = [ "sc-executor", "sc-service", "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-runtime", + "sp-state-machine", "structopt", ] [[package]] name = "frame-election-provider-support" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic", "sp-npos-elections", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "frame-executive" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std", ] [[package]] name = "frame-executive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "frame-metadata" -version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ + "frame-support", + "frame-system", "parity-scale-codec", - "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-tracing", ] [[package]] name = "frame-metadata" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "parity-scale-codec", - "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "frame-support" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "bitflags", - "frame-metadata 13.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support-procedural 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "impl-trait-for-tuples", - "log", - "once_cell", "parity-scale-codec", - "paste 1.0.4", "serde", - "smallvec 1.6.1", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-std", ] [[package]] name = "frame-support" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "bitflags", - "frame-metadata 13.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support-procedural 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-metadata", + "frame-support-procedural", "impl-trait-for-tuples", "log", "max-encoded-len", @@ -2734,48 +2663,24 @@ dependencies = [ "paste 1.0.4", "serde", "smallvec 1.6.1", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "frame-support-procedural" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "Inflector", - "frame-support-procedural-tools 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "proc-macro2 1.0.26", - "quote 1.0.9", - "syn 1.0.68", + "sp-arithmetic", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-state-machine", + "sp-std", + "sp-tracing", ] [[package]] name = "frame-support-procedural" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "Inflector", - "frame-support-procedural-tools 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "proc-macro2 1.0.26", - "quote 1.0.9", - "syn 1.0.68", -] - -[[package]] -name = "frame-support-procedural-tools" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support-procedural-tools-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "proc-macro-crate 1.0.0", + "frame-support-procedural-tools", "proc-macro2 1.0.26", "quote 1.0.9", "syn 1.0.68", @@ -2784,9 +2689,9 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support-procedural-tools-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support-procedural-tools-derive", "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", "quote 1.0.9", @@ -2796,17 +2701,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "proc-macro2 1.0.26", - "quote 1.0.9", - "syn 1.0.68", -] - -[[package]] -name = "frame-support-procedural-tools-derive" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", @@ -2816,79 +2711,53 @@ dependencies = [ [[package]] name = "frame-system" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "frame-system" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support", "impl-trait-for-tuples", "log", "parity-scale-codec", "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", ] [[package]] name = "frame-system-benchmarking" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-benchmarking", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] name = "frame-system-rpc-runtime-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "frame-system-rpc-runtime-api" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api", ] [[package]] name = "frame-try-runtime" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-runtime", + "sp-std", ] [[package]] @@ -3958,20 +3827,21 @@ dependencies = [ [[package]] name = "kusama-runtime" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "beefy-primitives", "bitvec", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", "frame-try-runtime", "log", + "max-encoded-len", "pallet-authority-discovery", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", "pallet-babe", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances", "pallet-bounties", "pallet-collective", "pallet-democracy", @@ -3984,54 +3854,54 @@ dependencies = [ "pallet-indices", "pallet-membership", "pallet-mmr-primitives", - "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-multisig", "pallet-nicks", "pallet-offences", - "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-proxy", + "pallet-randomness-collective-flip", "pallet-recovery", "pallet-scheduler", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session", "pallet-society", "pallet-staking", "pallet-staking-reward-fn", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp", "pallet-tips", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", - "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-utility", "pallet-vesting", - "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=master)", + "pallet-xcm", "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", "rustc-hex", "serde", "serde_derive", "smallvec 1.6.1", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-arithmetic", "sp-authority-discovery", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-inherents", + "sp-io", "sp-npos-elections", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", "static_assertions", "substrate-wasm-builder 3.0.0", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -4737,7 +4607,7 @@ dependencies = [ [[package]] name = "max-encoded-len" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "impl-trait-for-tuples", "max-encoded-len-derive", @@ -4748,7 +4618,7 @@ dependencies = [ [[package]] name = "max-encoded-len-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", @@ -4836,7 +4706,7 @@ dependencies = [ [[package]] name = "metered-channel" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", @@ -5092,13 +4962,13 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system", "parity-scale-codec", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-application-crypto", + "sp-core", + "sp-runtime", ] [[package]] @@ -5250,430 +5120,374 @@ dependencies = [ [[package]] name = "pallet-assets" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-assets" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-benchmarking", + "frame-support", + "frame-system", "max-encoded-len", "parity-scale-codec", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "pallet-aura" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-aura" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support", + "frame-system", + "pallet-session", + "pallet-timestamp", "parity-scale-codec", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-application-crypto", + "sp-consensus-aura", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-authority-discovery" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", + "pallet-session", "parity-scale-codec", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", "sp-authority-discovery", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-authorship" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "impl-trait-for-tuples", - "parity-scale-codec", - "sp-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-authorship" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support", + "frame-system", "impl-trait-for-tuples", "parity-scale-codec", - "sp-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-authorship", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-babe" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-support", + "frame-system", "log", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", + "pallet-session", + "pallet-timestamp", "parity-scale-codec", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", "sp-consensus-babe", "sp-consensus-vrf", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-balances" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "log", - "parity-scale-codec", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", ] [[package]] name = "pallet-balances" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-benchmarking", + "frame-support", + "frame-system", "log", "max-encoded-len", "parity-scale-codec", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-beefy" version = "0.1.0" -source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#5f2d59bdaae602d381d02a3ee705c34b511a7114" +source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=master#74db10469a09cd4647b0a5348d7db92c98c580a5" dependencies = [ "beefy-primitives", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", + "pallet-session", "parity-scale-codec", "serde", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-bounties" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "pallet-treasury", "parity-scale-codec", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-bridge-grandpa" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bp-header-chain", "bp-runtime", "bp-test-utils", "finality-grandpa", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", "num-traits", "parity-scale-codec", "serde", "sp-finality-grandpa", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", + "sp-trie", ] [[package]] name = "pallet-collator-selection" version = "3.0.0" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-benchmarking", + "frame-support", + "frame-system", "log", - "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-aura", + "pallet-authorship", + "pallet-balances", + "pallet-session", + "pallet-timestamp", "parity-scale-codec", "serde", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-consensus-aura", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-tracing", ] [[package]] name = "pallet-collective" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-democracy" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-support", + "frame-system", "parity-scale-codec", "serde", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-election-provider-multi-phase" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "frame-election-provider-support", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", "parity-scale-codec", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic", + "sp-core", + "sp-io", "sp-npos-elections", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", "static_assertions", ] [[package]] name = "pallet-elections-phragmen" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-io", "sp-npos-elections", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-gilt" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-grandpa" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +version = "3.1.0" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-support", + "frame-system", "log", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", + "pallet-session", "parity-scale-codec", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", + "sp-core", "sp-finality-grandpa", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", ] [[package]] name = "pallet-identity" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "enumflags2", - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-im-online" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", "parity-scale-codec", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", ] [[package]] name = "pallet-indices" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-io", "sp-keyring", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-membership" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-support", + "frame-system", "log", "parity-scale-codec", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-mmr" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "ckb-merkle-mountain-range", - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-support", + "frame-system", "pallet-mmr-primitives", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-mmr-primitives" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", "parity-scale-codec", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-mmr-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -5681,233 +5495,173 @@ dependencies = [ "pallet-mmr-primitives", "parity-scale-codec", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-core", "sp-rpc", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", ] [[package]] name = "pallet-multisig" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-multisig" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-nicks" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-offences" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances", "parity-scale-codec", "serde", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-proxy" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-staking", + "sp-std", ] [[package]] name = "pallet-proxy" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-benchmarking", + "frame-support", + "frame-system", "max-encoded-len", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "pallet-randomness-collective-flip" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "safe-mix", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-randomness-collective-flip" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support", + "frame-system", "parity-scale-codec", "safe-mix", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-recovery" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "enumflags2", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-scheduler" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-support", + "frame-system", "log", "parity-scale-codec", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-session" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "impl-trait-for-tuples", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-session" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support", + "frame-system", "impl-trait-for-tuples", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-timestamp", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-trie", ] [[package]] name = "pallet-society" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", "rand_chacha 0.2.2", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-staking" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "frame-election-provider-support", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", + "pallet-session", "parity-scale-codec", "paste 1.0.4", "serde", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", "static_assertions", ] [[package]] name = "pallet-staking-reward-curve" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", @@ -5918,243 +5672,157 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "log", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-sudo" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic", ] [[package]] name = "pallet-sudo" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "parity-scale-codec", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "pallet-timestamp" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "impl-trait-for-tuples", - "log", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-timestamp" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-benchmarking", + "frame-support", + "frame-system", "impl-trait-for-tuples", "log", "parity-scale-codec", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", + "sp-timestamp", ] [[package]] name = "pallet-tips" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "pallet-treasury", "parity-scale-codec", "serde", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-transaction-payment" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "serde", - "smallvec 1.6.1", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-transaction-payment" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-support", + "frame-system", "parity-scale-codec", "serde", "smallvec 1.6.1", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-transaction-payment-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", - "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-core", "sp-rpc", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-transaction-payment-rpc-runtime-api" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", ] [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-transaction-payment", "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api", + "sp-runtime", ] [[package]] name = "pallet-treasury" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "impl-trait-for-tuples", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances", "parity-scale-codec", "serde", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-utility" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-utility" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-benchmarking", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-vesting" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "enumflags2", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "pallet-xcm" -version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", - "serde", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-xcm" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", "serde", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", ] [[package]] @@ -6162,8 +5830,8 @@ name = "parachain-info" version = "0.1.0" dependencies = [ "cumulus-primitives-core", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "parity-scale-codec", "serde", ] @@ -6291,12 +5959,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "parity-wasm" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" - [[package]] name = "parity-wasm" version = "0.42.2" @@ -6619,34 +6281,34 @@ checksum = "989d43012e2ca1c4a02507c67282691a0a3207f9dc67cec596b43fe925b3d325" [[package]] name = "polkadot-approval-distribution" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "tracing", ] [[package]] name = "polkadot-availability-bitfield-distribution" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "tracing", ] [[package]] name = "polkadot-availability-distribution" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "lru", @@ -6657,11 +6319,11 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "rand 0.8.3", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", + "sp-core", + "sp-keystore", "thiserror", "tracing", ] @@ -6669,7 +6331,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "lru", @@ -6679,7 +6341,7 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "rand 0.8.3", "thiserror", "tracing", @@ -6688,7 +6350,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "frame-benchmarking-cli", "futures 0.3.14", @@ -6697,8 +6359,8 @@ dependencies = [ "polkadot-service", "sc-cli", "sc-service", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-trie", "structopt", "substrate-build-script-utils", "thiserror", @@ -6728,13 +6390,13 @@ dependencies = [ "jsonrpc-core", "log", "nix", - "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-sudo", "parity-scale-codec", "parking_lot 0.10.2", "polkadot-cli", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", "polkadot-service", "polkadot-test-client", "polkadot-test-runtime", @@ -6754,23 +6416,23 @@ dependencies = [ "sc-tracing", "sc-transaction-pool", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-timestamp", + "sp-transaction-pool", "structopt", "substrate-build-script-utils", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint", "substrate-test-client", "substrate-test-runtime-client", "tempfile", @@ -6781,7 +6443,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "always-assert", "futures 0.3.14", @@ -6790,10 +6452,10 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-primitives", + "sp-core", + "sp-keystore", + "sp-runtime", "thiserror", "tracing", ] @@ -6801,60 +6463,48 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" -dependencies = [ - "parity-scale-codec", - "parity-util-mem", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "polkadot-core-primitives" -version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "parity-scale-codec", "parity-util-mem", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] name = "polkadot-erasure-coding" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "reed-solomon-novelpoly", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-trie", "thiserror", ] [[package]] name = "polkadot-gossip-support" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-primitives", + "sp-application-crypto", + "sp-keystore", "tracing", ] [[package]] name = "polkadot-network-bridge" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "async-trait", "futures 0.3.14", @@ -6863,10 +6513,10 @@ dependencies = [ "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "sc-authority-discovery", "sc-network", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus", "strum", "tracing", ] @@ -6874,7 +6524,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "parity-scale-codec", @@ -6882,9 +6532,9 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-primitives", + "sp-core", + "sp-maybe-compressed-blob", "thiserror", "tracing", ] @@ -6892,7 +6542,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bitvec", "derive_more 0.99.11", @@ -6906,22 +6556,22 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-overseer", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "sc-client-api", "sc-keystore", "schnorrkel", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", + "sp-blockchain", + "sp-consensus", + "sp-consensus-slots", + "sp-runtime", "tracing", ] [[package]] name = "polkadot-node-core-av-store" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bitvec", "futures 0.3.14", @@ -6933,7 +6583,7 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-overseer", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "thiserror", "tracing", ] @@ -6941,7 +6591,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bitvec", "futures 0.3.14", @@ -6949,9 +6599,9 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "polkadot-statement-table", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore", "thiserror", "tracing", ] @@ -6959,13 +6609,13 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-primitives", + "sp-keystore", "thiserror", "tracing", "wasm-timer", @@ -6974,14 +6624,14 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-selection" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-primitives", + "sp-keystore", "thiserror", "tracing", ] @@ -6989,7 +6639,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "async-trait", "futures 0.3.14", @@ -6998,39 +6648,39 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-parachain", + "polkadot-primitives", + "sp-maybe-compressed-blob", "tracing", ] [[package]] name = "polkadot-node-core-chain-api" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-primitives", + "sp-blockchain", "tracing", ] [[package]] name = "polkadot-node-core-parachains-inherent" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "async-trait", "futures 0.3.14", "futures-timer 3.0.2", "polkadot-node-subsystem", "polkadot-overseer", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-primitives", + "sp-blockchain", + "sp-inherents", + "sp-runtime", "thiserror", "tracing", ] @@ -7038,14 +6688,14 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bitvec", "futures 0.3.14", "futures-timer 3.0.2", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "thiserror", "tracing", ] @@ -7053,7 +6703,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "always-assert", "assert_matches", @@ -7064,42 +6714,42 @@ dependencies = [ "libc", "parity-scale-codec", "pin-project 1.0.4", - "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-core-primitives", + "polkadot-parachain", "rand 0.8.3", "sc-executor", "sc-executor-common", "sc-executor-wasmtime", "slotmap", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-externalities", + "sp-io", + "sp-wasm-interface", "tracing", ] [[package]] name = "polkadot-node-core-runtime-api" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "memory-lru", "parity-util-mem", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-primitives", + "sp-api", "sp-authority-discovery", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", "tracing", ] [[package]] name = "polkadot-node-jaeger" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "async-std", "lazy_static", @@ -7108,22 +6758,22 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.11.1", "polkadot-node-primitives", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "sc-network", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", "thiserror", ] [[package]] name = "polkadot-node-network-protocol" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "parity-scale-codec", "polkadot-node-jaeger", "polkadot-node-primitives", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "sc-network", "strum", "thiserror", @@ -7132,21 +6782,21 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "futures 0.3.14", "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", + "polkadot-primitives", "polkadot-statement-table", "schnorrkel", "serde", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", "sp-consensus-babe", "sp-consensus-vrf", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-maybe-compressed-blob", + "sp-runtime", "thiserror", "zstd", ] @@ -7154,7 +6804,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "async-std", "async-trait", @@ -7170,13 +6820,13 @@ dependencies = [ "polkadot-node-jaeger", "polkadot-node-network-protocol", "polkadot-node-primitives", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "polkadot-procmacro-subsystem-dispatch-gen", "polkadot-statement-table", "sc-network", "smallvec 1.6.1", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "substrate-prometheus-endpoint", "thiserror", "tracing", ] @@ -7184,7 +6834,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-test-helpers" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "async-trait", "futures 0.3.14", @@ -7195,18 +6845,18 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "polkadot-statement-table", "sc-network", "smallvec 1.6.1", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", "tracing", ] [[package]] name = "polkadot-node-subsystem-util" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "async-trait", "futures 0.3.14", @@ -7219,14 +6869,14 @@ dependencies = [ "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "rand 0.8.3", "sc-network", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", + "sp-core", + "sp-keystore", "streamunordered", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint", "thiserror", "tracing", ] @@ -7234,7 +6884,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "async-trait", "futures 0.3.14", @@ -7242,106 +6892,62 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "polkadot-procmacro-overseer-subsystems-gen", "sc-client-api", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", "tracing", ] [[package]] name = "polkadot-parachain" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" -dependencies = [ - "derive_more 0.99.11", - "parity-scale-codec", - "parity-util-mem", - "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "polkadot-parachain" -version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "derive_more 0.99.11", "parity-scale-codec", "parity-util-mem", - "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "polkadot-primitives" -version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" -dependencies = [ - "bitvec", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "hex-literal 0.3.1", - "parity-scale-codec", - "parity-util-mem", - "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-core-primitives", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-authority-discovery", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "thiserror", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] name = "polkadot-primitives" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bitvec", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system", "hex-literal 0.3.1", "parity-scale-codec", "parity-util-mem", - "polkadot-core-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-core-primitives", + "polkadot-parachain", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", "sp-authority-discovery", - "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-trie", + "sp-version", "thiserror", ] [[package]] name = "polkadot-procmacro-overseer-subsystems-gen" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "assert_matches", "proc-macro2 1.0.26", @@ -7352,7 +6958,7 @@ dependencies = [ [[package]] name = "polkadot-procmacro-subsystem-dispatch-gen" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "assert_matches", "proc-macro2 1.0.26", @@ -7363,7 +6969,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "beefy-gadget", "beefy-gadget-rpc", @@ -7371,7 +6977,7 @@ dependencies = [ "pallet-mmr-rpc", "pallet-transaction-payment-rpc", "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "sc-chain-spec", "sc-client-api", "sc-consensus-babe", @@ -7382,34 +6988,35 @@ dependencies = [ "sc-keystore", "sc-rpc", "sc-sync-state-rpc", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", "sp-consensus-babe", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore", + "sp-runtime", + "sp-transaction-pool", "substrate-frame-rpc-system", ] [[package]] name = "polkadot-runtime" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "beefy-primitives", "bitvec", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", "frame-try-runtime", "log", + "max-encoded-len", "pallet-authority-discovery", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", "pallet-babe", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances", "pallet-bounties", "pallet-collective", "pallet-democracy", @@ -7421,44 +7028,44 @@ dependencies = [ "pallet-indices", "pallet-membership", "pallet-mmr-primitives", - "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-multisig", "pallet-nicks", "pallet-offences", - "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-proxy", + "pallet-randomness-collective-flip", "pallet-scheduler", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session", "pallet-staking", "pallet-staking-reward-curve", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp", "pallet-tips", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", - "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-utility", "pallet-vesting", "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", + "polkadot-runtime-common", "rustc-hex", "serde", "serde_derive", "smallvec 1.6.1", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", "sp-authority-discovery", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-inherents", + "sp-io", "sp-npos-elections", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", "static_assertions", "substrate-wasm-builder 3.0.0", ] @@ -7466,170 +7073,91 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" -dependencies = [ - "beefy-primitives", - "bitvec", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "impl-trait-for-tuples", - "libsecp256k1", - "log", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-beefy", - "pallet-mmr", - "pallet-offences", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-staking", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-treasury", - "pallet-vesting", - "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "rustc-hex", - "serde", - "serde_derive", - "slot-range-helper 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "static_assertions", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", -] - -[[package]] -name = "polkadot-runtime-common" -version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "beefy-primitives", "bitvec", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "impl-trait-for-tuples", "libsecp256k1", "log", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", + "pallet-balances", "pallet-beefy", "pallet-mmr", "pallet-offences", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session", "pallet-staking", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp", + "pallet-transaction-payment", "pallet-treasury", "pallet-vesting", "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-primitives", + "polkadot-runtime-parachains", "rustc-hex", "serde", "serde_derive", - "slot-range-helper 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "slot-range-helper", + "sp-api", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", "static_assertions", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "xcm", ] [[package]] name = "polkadot-runtime-parachains" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "bitvec", "derive_more 0.99.11", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "log", "pallet-authority-discovery", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", + "pallet-balances", "pallet-offences", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session", "pallet-staking", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp", "pallet-vesting", "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "rand 0.8.3", "rand_chacha 0.3.0", "rustc-hex", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", -] - -[[package]] -name = "polkadot-runtime-parachains" -version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" -dependencies = [ - "bitvec", - "derive_more 0.99.11", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "log", - "pallet-authority-discovery", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-offences", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-staking", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-vesting", - "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "rand 0.8.3", - "rand_chacha 0.3.0", - "rustc-hex", - "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "sp-api", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "xcm", + "xcm-executor", ] [[package]] name = "polkadot-service" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "beefy-gadget", "beefy-primitives", - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-system-rpc-runtime-api", "futures 0.3.14", "hex-literal 0.3.1", "kusama-runtime", @@ -7639,7 +7167,7 @@ dependencies = [ "pallet-im-online", "pallet-mmr-primitives", "pallet-staking", - "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment-rpc-runtime-api", "polkadot-approval-distribution", "polkadot-availability-bitfield-distribution", "polkadot-availability-distribution", @@ -7662,11 +7190,11 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-overseer", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", + "polkadot-primitives", "polkadot-rpc", "polkadot-runtime", - "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-parachains", "polkadot-statement-distribution", "rococo-runtime", "sc-authority-discovery", @@ -7688,26 +7216,26 @@ dependencies = [ "sc-telemetry", "sc-transaction-pool", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", "sp-authority-discovery", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", "sp-finality-grandpa", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-storage", + "sp-timestamp", + "sp-transaction-pool", + "sp-trie", + "substrate-prometheus-endpoint", "thiserror", "tracing", "westend-runtime", @@ -7716,7 +7244,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "arrayvec 0.5.2", "futures 0.3.14", @@ -7726,10 +7254,10 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "sc-network", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore", + "sp-staking", "thiserror", "tracing", ] @@ -7737,116 +7265,116 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "polkadot-primitives", + "sp-core", ] [[package]] name = "polkadot-test-client" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "parity-scale-codec", "polkadot-node-subsystem", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-primitives", "polkadot-test-runtime", "polkadot-test-service", "sc-block-builder", "sc-consensus", "sc-service", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-consensus", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-timestamp", "substrate-test-client", ] [[package]] name = "polkadot-test-runtime" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "beefy-primitives", "bitvec", "frame-election-provider-support", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", "log", "pallet-authority-discovery", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", "pallet-babe", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances", "pallet-grandpa", "pallet-indices", "pallet-mmr-primitives", "pallet-nicks", "pallet-offences", - "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-randomness-collective-flip", + "pallet-session", "pallet-staking", "pallet-staking-reward-curve", - "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", "pallet-vesting", "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", "rustc-hex", "serde", "serde_derive", "smallvec 1.6.1", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", "sp-authority-discovery", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", "substrate-wasm-builder 3.0.0", ] [[package]] name = "polkadot-test-service" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-benchmarking", + "frame-system", "futures 0.1.30", "futures 0.3.14", "hex", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances", "pallet-staking", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-transaction-payment", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-overseer", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", + "polkadot-primitives", "polkadot-rpc", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-runtime-common", + "polkadot-runtime-parachains", "polkadot-service", "polkadot-test-runtime", "rand 0.8.3", @@ -7862,17 +7390,17 @@ dependencies = [ "sc-service", "sc-tracing", "sc-transaction-pool", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic", "sp-authority-discovery", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-consensus", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", "sp-finality-grandpa", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents", "sp-keyring", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-state-machine", "substrate-test-client", "tempfile", "tracing", @@ -8106,13 +7634,13 @@ dependencies = [ [[package]] name = "pwasm-utils" -version = "0.14.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f53bc2558e8376358ebdc28301546471d67336584f6438ed4b7c7457a055fd7" +checksum = "a0e517f47d9964362883182404b68d0b6949382c0baa40aa5ffca94f5f1e3481" dependencies = [ "byteorder", "log", - "parity-wasm 0.41.0", + "parity-wasm 0.42.2", ] [[package]] @@ -8555,17 +8083,18 @@ dependencies = [ [[package]] name = "remote-externalities" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "env_logger 0.8.3", - "hex-literal 0.3.1", + "hex", "jsonrpsee-proc-macros", "jsonrpsee-ws-client", "log", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "serde_json", + "sp-core", + "sp-io", + "sp-runtime", ] [[package]] @@ -8631,21 +8160,22 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "beefy-primitives", "bp-rococo", "bp-wococo", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", "hex-literal 0.3.1", "log", + "max-encoded-len", "pallet-authority-discovery", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", "pallet-babe", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances", "pallet-beefy", "pallet-bridge-grandpa", "pallet-collective", @@ -8656,42 +8186,42 @@ dependencies = [ "pallet-mmr", "pallet-mmr-primitives", "pallet-offences", - "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-proxy", + "pallet-session", "pallet-staking", "pallet-staking-reward-curve", - "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=master)", - "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "pallet-xcm", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", "serde", "serde_derive", "smallvec 1.6.1", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", "sp-authority-discovery", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", "substrate-wasm-builder 3.0.0", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -8708,23 +8238,23 @@ dependencies = [ name = "runtime-common" version = "0.8.30" dependencies = [ - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-executive", + "frame-support", + "frame-system", "node-primitives", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-authorship", + "pallet-balances", "pallet-collator-selection", "parity-scale-codec", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-primitives", + "polkadot-runtime-common", "serde", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-consensus-aura", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "substrate-wasm-builder 4.0.0", ] [[package]] @@ -8861,7 +8391,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -8878,19 +8408,19 @@ dependencies = [ "sc-client-api", "sc-network", "serde_json", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", "sp-authority-discovery", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-core", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", ] [[package]] name = "sc-basic-authorship" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.3.14", "futures-timer 3.0.2", @@ -8900,36 +8430,36 @@ dependencies = [ "sc-client-api", "sc-proposer-metrics", "sc-telemetry", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-transaction-pool", + "substrate-prometheus-endpoint", ] [[package]] name = "sc-block-builder" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", "sc-client-api", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", ] [[package]] name = "sc-chain-spec" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8943,14 +8473,14 @@ dependencies = [ "serde_json", "sp-chain-spec", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-runtime", ] [[package]] name = "sc-chain-spec-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", @@ -8961,7 +8491,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "chrono", "fdlimit", @@ -8982,14 +8512,14 @@ dependencies = [ "sc-tracing", "serde", "serde_json", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-core", "sp-keyring", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-panic-handler 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore", + "sp-panic-handler", + "sp-runtime", + "sp-utils", + "sp-version", "structopt", "thiserror", "tiny-bip39", @@ -8999,7 +8529,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "derive_more 0.99.11", "fnv", @@ -9011,29 +8541,29 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.11.1", "sc-executor", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-database 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-database", + "sp-externalities", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-storage", + "sp-transaction-pool", + "sp-trie", + "sp-utils", + "sp-version", + "substrate-prometheus-endpoint", ] [[package]] name = "sc-client-db" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "blake2-rfc", "hash-db", @@ -9049,33 +8579,33 @@ dependencies = [ "sc-client-api", "sc-executor", "sc-state-db", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-database 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-database", + "sp-runtime", + "sp-state-machine", + "sp-trie", + "substrate-prometheus-endpoint", ] [[package]] name = "sc-consensus" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parking_lot 0.11.1", "sc-client-api", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-consensus", + "sp-runtime", ] [[package]] name = "sc-consensus-aura" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -9087,26 +8617,26 @@ dependencies = [ "sc-client-api", "sc-consensus-slots", "sc-telemetry", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-aura", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-version", + "substrate-prometheus-endpoint", ] [[package]] name = "sc-consensus-babe" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -9131,28 +8661,28 @@ dependencies = [ "sc-telemetry", "schnorrkel", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", "sp-consensus-babe", - "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-consensus-slots", "sp-consensus-vrf", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-utils", + "sp-version", + "substrate-prometheus-endpoint", ] [[package]] name = "sc-consensus-babe-rpc" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", @@ -9163,33 +8693,33 @@ dependencies = [ "sc-consensus-epochs", "sc-rpc-api", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-blockchain", + "sp-consensus", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-keystore", + "sp-runtime", ] [[package]] name = "sc-consensus-epochs" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "fork-tree", "parity-scale-codec", "sc-client-api", "sc-consensus", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-runtime", ] [[package]] name = "sc-consensus-slots" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "futures 0.3.14", @@ -9199,116 +8729,114 @@ dependencies = [ "parity-scale-codec", "sc-client-api", "sc-telemetry", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-timestamp", + "sp-trie", "thiserror", ] [[package]] name = "sc-consensus-uncles" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "sc-client-api", - "sp-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-authorship", + "sp-runtime", "thiserror", ] [[package]] name = "sc-executor" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "derive_more 0.99.11", "lazy_static", "libsecp256k1", "log", "parity-scale-codec", - "parity-wasm 0.41.0", + "parity-wasm 0.42.2", "parking_lot 0.11.1", "sc-executor-common", "sc-executor-wasmi", "sc-executor-wasmtime", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-panic-handler 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-core", + "sp-externalities", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface", "sp-serializer", "sp-tasks", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "wasmi 0.6.2", + "sp-trie", + "sp-version", + "sp-wasm-interface", + "wasmi", ] [[package]] name = "sc-executor-common" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "derive_more 0.99.11", "parity-scale-codec", - "parity-wasm 0.41.0", "pwasm-utils", "sp-allocator", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-maybe-compressed-blob", "sp-serializer", - "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-wasm-interface", "thiserror", - "wasmi 0.6.2", + "wasmi", ] [[package]] name = "sc-executor-wasmi" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "log", "parity-scale-codec", "sc-executor-common", "sp-allocator", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "wasmi 0.6.2", + "sp-core", + "sp-runtime-interface", + "sp-wasm-interface", + "wasmi", ] [[package]] name = "sc-executor-wasmtime" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "log", "parity-scale-codec", - "parity-wasm 0.41.0", - "pwasm-utils", + "parity-wasm 0.42.2", "sc-executor-common", "scoped-tls", "sp-allocator", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-runtime-interface", + "sp-wasm-interface", "wasmtime", ] [[package]] name = "sc-finality-grandpa" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -9331,24 +8859,25 @@ dependencies = [ "sc-network-gossip", "sc-telemetry", "serde_json", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", "sp-finality-grandpa", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-utils", + "substrate-prometheus-endpoint", + "wasm-timer", ] [[package]] name = "sc-finality-grandpa-rpc" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "derive_more 0.99.11", "finality-grandpa", @@ -9364,15 +8893,15 @@ dependencies = [ "sc-rpc", "serde", "serde_json", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-core", + "sp-runtime", ] [[package]] name = "sc-finality-grandpa-warp-sync" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", @@ -9385,33 +8914,33 @@ dependencies = [ "sc-finality-grandpa", "sc-network", "sc-service", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", "sp-finality-grandpa", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", ] [[package]] name = "sc-informant" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "ansi_term 0.12.1", "futures 0.3.14", + "futures-timer 3.0.2", "log", "parity-util-mem", "sc-client-api", "sc-network", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-runtime", + "sp-transaction-pool", "wasm-timer", ] [[package]] name = "sc-keystore" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -9422,16 +8951,16 @@ dependencies = [ "parking_lot 0.11.1", "rand 0.7.3", "serde_json", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", + "sp-core", + "sp-keystore", "subtle 2.4.0", ] [[package]] name = "sc-light" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "hash-db", "lazy_static", @@ -9439,18 +8968,18 @@ dependencies = [ "parking_lot 0.11.1", "sc-client-api", "sc-executor", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-externalities", + "sp-runtime", + "sp-state-machine", ] [[package]] name = "sc-network" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-std", "async-trait", @@ -9486,13 +9015,13 @@ dependencies = [ "serde", "serde_json", "smallvec 1.6.1", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-utils", + "substrate-prometheus-endpoint", "thiserror", "unsigned-varint 0.6.0", "void", @@ -9503,7 +9032,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.3.14", "futures-timer 3.0.2", @@ -9511,8 +9040,8 @@ dependencies = [ "log", "lru", "sc-network", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "substrate-prometheus-endpoint", "tracing", "wasm-timer", ] @@ -9520,7 +9049,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "bytes 0.5.6", "fnv", @@ -9537,40 +9066,40 @@ dependencies = [ "sc-client-api", "sc-keystore", "sc-network", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-core", + "sp-offchain", + "sp-runtime", + "sp-utils", "threadpool", ] [[package]] name = "sc-peerset" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.3.14", "libp2p", "log", "serde_json", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-utils", "wasm-timer", ] [[package]] name = "sc-proposer-metrics" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "log", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-prometheus-endpoint", ] [[package]] name = "sc-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.3.14", "hash-db", @@ -9586,26 +9115,26 @@ dependencies = [ "sc-rpc-api", "sc-tracing", "serde_json", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", "sp-chain-spec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-keystore", + "sp-offchain", "sp-rpc", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-tracing", + "sp-transaction-pool", + "sp-utils", + "sp-version", ] [[package]] name = "sc-rpc-api" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", @@ -9619,18 +9148,18 @@ dependencies = [ "serde", "serde_json", "sp-chain-spec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", "sp-rpc", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-tracing", + "sp-transaction-pool", + "sp-version", ] [[package]] name = "sc-rpc-server" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.1.30", "jsonrpc-core", @@ -9641,14 +9170,14 @@ dependencies = [ "log", "serde", "serde_json", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "substrate-prometheus-endpoint", ] [[package]] name = "sc-service" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "directories", @@ -9683,25 +9212,25 @@ dependencies = [ "sc-transaction-pool", "serde", "serde_json", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-externalities", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-tracing", + "sp-transaction-pool", + "sp-trie", + "sp-utils", + "sp-version", + "substrate-prometheus-endpoint", "tempfile", "thiserror", "tracing", @@ -9712,7 +9241,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "log", "parity-scale-codec", @@ -9720,14 +9249,14 @@ dependencies = [ "parity-util-mem-derive", "parking_lot 0.11.1", "sc-client-api", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", "thiserror", ] [[package]] name = "sc-sync-state-rpc" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -9739,15 +9268,15 @@ dependencies = [ "sc-finality-grandpa", "sc-rpc-api", "serde_json", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-runtime", "thiserror", ] [[package]] name = "sc-telemetry" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "chrono", "futures 0.3.14", @@ -9767,7 +9296,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "ansi_term 0.12.1", "atty", @@ -9784,14 +9313,14 @@ dependencies = [ "sc-tracing-proc-macro", "serde", "serde_json", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", "sp-rpc", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-storage", + "sp-tracing", "thiserror", "tracing", "tracing-log", @@ -9804,7 +9333,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", @@ -9815,7 +9344,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", @@ -9825,11 +9354,11 @@ dependencies = [ "parking_lot 0.11.1", "retain_mut", "serde", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-transaction-pool", + "sp-utils", "thiserror", "wasm-timer", ] @@ -9837,7 +9366,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.3.14", "futures-diagnose", @@ -9848,14 +9377,14 @@ dependencies = [ "parking_lot 0.11.1", "sc-client-api", "sc-transaction-graph", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-tracing", + "sp-transaction-pool", + "sp-utils", + "substrate-prometheus-endpoint", "thiserror", "wasm-timer", ] @@ -10176,25 +9705,13 @@ dependencies = [ [[package]] name = "slot-range-helper" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "enumn", "parity-scale-codec", "paste 1.0.4", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "slot-range-helper" -version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" -dependencies = [ - "enumn", - "parity-scale-codec", - "paste 1.0.4", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-runtime", + "sp-std", ] [[package]] @@ -10279,53 +9796,36 @@ dependencies = [ [[package]] name = "sp-allocator" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "log", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "thiserror", -] - -[[package]] -name = "sp-api" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "hash-db", "log", - "parity-scale-codec", - "sp-api-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-std", + "sp-wasm-interface", "thiserror", ] [[package]] name = "sp-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "hash-db", "log", "parity-scale-codec", - "sp-api-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api-proc-macro", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-version", "thiserror", ] [[package]] name = "sp-api-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "blake2-rfc", "proc-macro-crate 1.0.0", @@ -10334,171 +9834,91 @@ dependencies = [ "syn 1.0.68", ] -[[package]] -name = "sp-api-proc-macro" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "blake2-rfc", - "proc-macro-crate 1.0.0", - "proc-macro2 1.0.26", - "quote 1.0.9", - "syn 1.0.68", -] - -[[package]] -name = "sp-application-crypto" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "parity-scale-codec", - "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - [[package]] name = "sp-application-crypto" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "max-encoded-len", "parity-scale-codec", "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "sp-arithmetic" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "integer-sqrt", - "num-traits", - "parity-scale-codec", - "serde", - "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "static_assertions", + "sp-core", + "sp-io", + "sp-std", ] [[package]] name = "sp-arithmetic" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "integer-sqrt", "num-traits", "parity-scale-codec", "serde", - "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-debug-derive", + "sp-std", "static_assertions", ] [[package]] name = "sp-authority-discovery" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "sp-authorship" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "async-trait", "parity-scale-codec", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-authorship" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "parity-scale-codec", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "sp-block-builder" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-block-builder" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api", + "sp-inherents", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-blockchain" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.3.14", "log", "lru", "parity-scale-codec", "parking_lot 0.11.1", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-database 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "thiserror", -] - -[[package]] -name = "sp-blockchain" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "futures 0.3.14", - "log", - "lru", - "parity-scale-codec", - "parking_lot 0.11.1", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-database 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api", + "sp-consensus", + "sp-database", + "sp-runtime", + "sp-state-machine", "thiserror", ] [[package]] name = "sp-chain-spec" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "serde", "serde_json", @@ -10507,7 +9927,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "futures 0.3.14", @@ -10517,43 +9937,16 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.11.1", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "thiserror", - "wasm-timer", -] - -[[package]] -name = "sp-consensus" -version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "async-trait", - "futures 0.3.14", - "futures-timer 3.0.2", - "libp2p", - "log", - "parity-scale-codec", - "parking_lot 0.11.1", - "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-utils 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "substrate-prometheus-endpoint 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "sp-utils", + "sp-version", + "substrate-prometheus-endpoint", "thiserror", "wasm-timer", ] @@ -10561,139 +9954,68 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "sp-consensus-aura" -version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "async-trait", - "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api", + "sp-application-crypto", + "sp-consensus", + "sp-consensus-slots", + "sp-inherents", + "sp-runtime", + "sp-std", + "sp-timestamp", ] [[package]] name = "sp-consensus-babe" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "merlin", "parity-scale-codec", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-slots 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-consensus", + "sp-consensus-slots", "sp-consensus-vrf", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "sp-consensus-slots" -version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "parity-scale-codec", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-std", + "sp-timestamp", ] [[package]] name = "sp-consensus-slots" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-arithmetic", + "sp-runtime", ] [[package]] name = "sp-consensus-vrf" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", "schnorrkel", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-core" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "base58", - "blake2-rfc", - "byteorder", - "dyn-clonable", - "ed25519-dalek", - "futures 0.3.14", - "hash-db", - "hash256-std-hasher", - "hex", - "impl-serde", - "lazy_static", - "libsecp256k1", - "log", - "merlin", - "num-traits", - "parity-scale-codec", - "parity-util-mem", - "parking_lot 0.11.1", - "primitive-types", - "rand 0.7.3", - "regex", - "schnorrkel", - "secrecy", - "serde", - "sha2 0.9.2", - "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-bip39", - "thiserror", - "tiny-bip39", - "tiny-keccak", - "twox-hash", - "wasmi 0.6.2", - "zeroize", -] - -[[package]] -name = "sp-core" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "base58", "blake2-rfc", @@ -10721,52 +10043,33 @@ dependencies = [ "secrecy", "serde", "sha2 0.9.2", - "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-debug-derive", + "sp-externalities", + "sp-runtime-interface", + "sp-std", + "sp-storage", "substrate-bip39", "thiserror", "tiny-bip39", "tiny-keccak", "twox-hash", - "wasmi 0.9.0", + "wasmi", "zeroize", ] [[package]] name = "sp-database" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "kvdb", "parking_lot 0.11.1", ] -[[package]] -name = "sp-database" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "kvdb", - "parking_lot 0.11.1", -] - -[[package]] -name = "sp-debug-derive" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "proc-macro2 1.0.26", - "quote 1.0.9", - "syn 1.0.68", -] - [[package]] name = "sp-debug-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", @@ -10776,99 +10079,49 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "environmental", "parity-scale-codec", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "sp-externalities" -version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "environmental", - "parity-scale-codec", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std", + "sp-storage", ] [[package]] name = "sp-finality-grandpa" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "finality-grandpa", "log", "parity-scale-codec", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-inherents" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "impl-trait-for-tuples", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-runtime", + "sp-std", "thiserror", ] -[[package]] -name = "sp-inherents" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "async-trait", - "impl-trait-for-tuples", - "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "thiserror", -] - -[[package]] -name = "sp-io" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "futures 0.3.14", - "hash-db", - "libsecp256k1", - "log", - "parity-scale-codec", - "parking_lot 0.11.1", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "tracing", - "tracing-core", -] - [[package]] name = "sp-io" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.3.14", "hash-db", @@ -10876,16 +10129,16 @@ dependencies = [ "log", "parity-scale-codec", "parking_lot 0.11.1", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-maybe-compressed-blob", + "sp-runtime-interface", + "sp-state-machine", + "sp-std", + "sp-tracing", + "sp-trie", + "sp-wasm-interface", "tracing", "tracing-core", ] @@ -10893,18 +10146,18 @@ dependencies = [ [[package]] name = "sp-keyring" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "lazy_static", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-runtime", "strum", ] [[package]] name = "sp-keystore" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -10914,39 +10167,14 @@ dependencies = [ "parking_lot 0.11.1", "schnorrkel", "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "sp-keystore" -version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "async-trait", - "derive_more 0.99.11", - "futures 0.3.14", - "merlin", - "parity-scale-codec", - "parking_lot 0.11.1", - "schnorrkel", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core", + "sp-externalities", ] [[package]] name = "sp-maybe-compressed-blob" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "ruzstd", - "zstd", -] - -[[package]] -name = "sp-maybe-compressed-blob" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "ruzstd", "zstd", @@ -10955,20 +10183,20 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", "serde", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-arithmetic", + "sp-core", "sp-npos-elections-compact", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-std", ] [[package]] name = "sp-npos-elections-compact" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", @@ -10979,35 +10207,17 @@ dependencies = [ [[package]] name = "sp-offchain" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "sp-offchain" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "sp-panic-handler" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "backtrace", + "sp-api", + "sp-core", + "sp-runtime", ] [[package]] name = "sp-panic-handler" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "backtrace", ] @@ -11015,39 +10225,18 @@ dependencies = [ [[package]] name = "sp-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "rustc-hash", "serde", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", "tracing-core", ] [[package]] name = "sp-runtime" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "either", - "hash256-std-hasher", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "parity-util-mem", - "paste 1.0.4", - "rand 0.7.3", - "serde", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "sp-runtime" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "either", "hash256-std-hasher", @@ -11059,63 +10248,34 @@ dependencies = [ "paste 1.0.4", "rand 0.7.3", "serde", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "sp-runtime-interface" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "impl-trait-for-tuples", - "parity-scale-codec", - "primitive-types", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime-interface-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "static_assertions", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-std", ] [[package]] name = "sp-runtime-interface" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", "primitive-types", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime-interface-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-storage 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-tracing 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-wasm-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-externalities", + "sp-runtime-interface-proc-macro", + "sp-std", + "sp-storage", + "sp-tracing", + "sp-wasm-interface", "static_assertions", ] [[package]] name = "sp-runtime-interface-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "Inflector", - "proc-macro-crate 1.0.0", - "proc-macro2 1.0.26", - "quote 1.0.9", - "syn 1.0.68", -] - -[[package]] -name = "sp-runtime-interface-proc-macro" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "Inflector", "proc-macro-crate 1.0.0", @@ -11127,7 +10287,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "serde", "serde_json", @@ -11136,76 +10296,30 @@ dependencies = [ [[package]] name = "sp-session" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "sp-session" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api", + "sp-core", + "sp-runtime", + "sp-staking", + "sp-std", ] [[package]] name = "sp-staking" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "sp-staking" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "parity-scale-codec", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", -] - -[[package]] -name = "sp-state-machine" -version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "hash-db", - "log", - "num-traits", - "parity-scale-codec", - "parking_lot 0.11.1", - "rand 0.7.3", - "smallvec 1.6.1", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-panic-handler 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "thiserror", - "tracing", - "trie-db", - "trie-root 0.16.0", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-state-machine" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "hash-db", "log", @@ -11214,11 +10328,11 @@ dependencies = [ "parking_lot 0.11.1", "rand 0.7.3", "smallvec 1.6.1", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-panic-handler 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-core", + "sp-externalities", + "sp-panic-handler", + "sp-std", + "sp-trie", "thiserror", "tracing", "trie-db", @@ -11228,95 +10342,60 @@ dependencies = [ [[package]] name = "sp-std" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" - -[[package]] -name = "sp-std" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" - -[[package]] -name = "sp-storage" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "impl-serde", - "parity-scale-codec", - "ref-cast", - "serde", - "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" [[package]] name = "sp-storage" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "impl-serde", "parity-scale-codec", "ref-cast", "serde", - "sp-debug-derive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-debug-derive", + "sp-std", ] [[package]] name = "sp-tasks" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "log", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-externalities", + "sp-io", + "sp-runtime-interface", + "sp-std", ] [[package]] name = "sp-test-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", "parity-util-mem", "serde", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-application-crypto", + "sp-core", + "sp-runtime", ] [[package]] name = "sp-timestamp" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "futures-timer 3.0.2", "log", "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "thiserror", - "wasm-timer", -] - -[[package]] -name = "sp-timestamp" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "async-trait", - "futures-timer 3.0.2", - "log", - "parity-scale-codec", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api", + "sp-inherents", + "sp-runtime", + "sp-std", "thiserror", "wasm-timer", ] @@ -11324,7 +10403,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "erased-serde", "log", @@ -11333,25 +10412,7 @@ dependencies = [ "serde", "serde_json", "slog", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "sp-tracing" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "erased-serde", - "log", - "parity-scale-codec", - "parking_lot 0.10.2", - "serde", - "serde_json", - "slog", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-std", "tracing", "tracing-core", "tracing-subscriber", @@ -11360,79 +10421,37 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", "log", "parity-scale-codec", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "thiserror", -] - -[[package]] -name = "sp-transaction-pool" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "derive_more 0.99.11", - "futures 0.3.14", - "log", - "parity-scale-codec", - "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-api", + "sp-blockchain", + "sp-runtime", "thiserror", ] [[package]] name = "sp-trie" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "hash-db", "memory-db", "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-std", "trie-db", "trie-root 0.16.0", ] -[[package]] -name = "sp-trie" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "hash-db", - "memory-db", - "parity-scale-codec", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "trie-db", - "trie-root 0.16.0", -] - -[[package]] -name = "sp-utils" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "futures 0.3.14", - "futures-core", - "futures-timer 3.0.2", - "lazy_static", - "prometheus", -] - [[package]] name = "sp-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.3.14", "futures-core", @@ -11444,45 +10463,20 @@ dependencies = [ [[package]] name = "sp-version" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "impl-serde", - "parity-scale-codec", - "serde", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", -] - -[[package]] -name = "sp-version" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "impl-serde", "parity-scale-codec", "serde", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-version-proc-macro 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-runtime", + "sp-std", + "sp-version-proc-macro", ] [[package]] name = "sp-version-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "parity-scale-codec", - "proc-macro-crate 1.0.0", - "proc-macro2 1.0.26", - "quote 1.0.9", - "syn 1.0.68", -] - -[[package]] -name = "sp-version-proc-macro" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "parity-scale-codec", "proc-macro-crate 1.0.0", @@ -11494,23 +10488,12 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "wasmi 0.6.2", -] - -[[package]] -name = "sp-wasm-interface" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "impl-trait-for-tuples", - "parity-scale-codec", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "wasmi 0.9.0", + "sp-std", + "wasmi", ] [[package]] @@ -11536,52 +10519,52 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-core", "cumulus-primitives-utility", - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", "frame-system-benchmarking", - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system-rpc-runtime-api", "hex-literal 0.3.1", "node-primitives", - "pallet-assets 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-assets", + "pallet-aura", + "pallet-authorship", + "pallet-balances", "pallet-collator-selection", - "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "pallet-multisig", + "pallet-proxy", + "pallet-randomness-collective-flip", + "pallet-session", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "pallet-xcm", "parachain-info", "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", "runtime-common", "serde", "smallvec 1.6.1", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder 4.0.0", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -11595,52 +10578,52 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-core", "cumulus-primitives-utility", - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", "frame-system-benchmarking", - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system-rpc-runtime-api", "hex-literal 0.3.1", "node-primitives", - "pallet-assets 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-assets", + "pallet-aura", + "pallet-authorship", + "pallet-balances", "pallet-collator-selection", - "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "pallet-multisig", + "pallet-proxy", + "pallet-randomness-collective-flip", + "pallet-session", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "pallet-xcm", "parachain-info", "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", "runtime-common", "serde", "smallvec 1.6.1", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder 4.0.0", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -11781,7 +10764,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "platforms", ] @@ -11789,9 +10772,9 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-system-rpc-runtime-api", "futures 0.3.14", "jsonrpc-core", "jsonrpc-core-client", @@ -11801,32 +10784,18 @@ dependencies = [ "sc-client-api", "sc-rpc-api", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-transaction-pool", ] [[package]] name = "substrate-prometheus-endpoint" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" -dependencies = [ - "async-std", - "derive_more 0.99.11", - "futures-util", - "hyper 0.13.9", - "log", - "prometheus", - "tokio 0.2.24", -] - -[[package]] -name = "substrate-prometheus-endpoint" -version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-std", "derive_more 0.99.11", @@ -11840,7 +10809,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "async-trait", "futures 0.1.30", @@ -11857,60 +10826,60 @@ dependencies = [ "sc-service", "serde", "serde_json", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-blockchain", + "sp-consensus", + "sp-core", "sp-keyring", - "sp-keystore 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-keystore", + "sp-runtime", + "sp-state-machine", ] [[package]] name = "substrate-test-runtime" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "cfg-if 1.0.0", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", "log", "memory-db", "pallet-babe", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-timestamp", "parity-scale-codec", "parity-util-mem", "sc-service", "serde", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-application-crypto 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-consensus-aura", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-externalities", "sp-finality-grandpa", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-inherents", + "sp-io", "sp-keyring", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime-interface 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-trie 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain", + "sp-runtime", + "sp-runtime-interface", + "sp-session", + "sp-state-machine", + "sp-std", + "sp-transaction-pool", + "sp-trie", + "sp-version", + "substrate-wasm-builder 4.0.0", "trie-db", ] [[package]] name = "substrate-test-runtime-client" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.3.14", "parity-scale-codec", @@ -11919,11 +10888,11 @@ dependencies = [ "sc-consensus", "sc-light", "sc-service", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-consensus 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", "substrate-test-client", "substrate-test-runtime", ] @@ -11931,7 +10900,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "futures 0.3.14", "substrate-test-utils-derive", @@ -11941,7 +10910,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "proc-macro-crate 1.0.0", "quote 1.0.9", @@ -11967,29 +10936,13 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "ansi_term 0.12.1", "atty", "build-helper", "cargo_metadata 0.13.1", - "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "tempfile", - "toml", - "walkdir", - "wasm-gc-api", -] - -[[package]] -name = "substrate-wasm-builder" -version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=statemint#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "ansi_term 0.12.1", - "atty", - "build-helper", - "cargo_metadata 0.13.1", - "sp-maybe-compressed-blob 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "sp-maybe-compressed-blob", "tempfile", "toml", "walkdir", @@ -12488,9 +11441,9 @@ checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" [[package]] name = "tracing" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if 1.0.0", "log", @@ -12501,9 +11454,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41768be5b9f3489491825f56f01f25290aa1d3e7cc97e182d4d34360493ba6fa" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", @@ -12512,9 +11465,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" dependencies = [ "lazy_static", ] @@ -12661,7 +11614,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#cb308ac8d289b3089560a61a2bb6b6093af26f53" +source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ "frame-try-runtime", "log", @@ -12671,12 +11624,12 @@ dependencies = [ "sc-client-api", "sc-executor", "sc-service", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-blockchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-externalities 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-state-machine 0.9.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-externalities", + "sp-runtime", + "sp-state-machine", "structopt", ] @@ -13025,20 +11978,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wasmi" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf617d864d25af3587aa745529f7aaa541066c876d57e050c0d0c85c61c92aff" -dependencies = [ - "libc", - "memory_units", - "num-rational", - "num-traits", - "parity-wasm 0.41.0", - "wasmi-validation 0.3.0", -] - [[package]] name = "wasmi" version = "0.9.0" @@ -13051,16 +11990,7 @@ dependencies = [ "num-rational", "num-traits", "parity-wasm 0.42.2", - "wasmi-validation 0.4.0", -] - -[[package]] -name = "wasmi-validation" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea78c597064ba73596099281e2f4cfc019075122a65cdda3205af94f0b264d93" -dependencies = [ - "parity-wasm 0.41.0", + "wasmi-validation", ] [[package]] @@ -13348,20 +12278,21 @@ dependencies = [ [[package]] name = "westend-runtime" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "beefy-primitives", "bitvec", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", "frame-try-runtime", "log", + "max-encoded-len", "pallet-authority-discovery", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-authorship", "pallet-babe", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-balances", "pallet-collective", "pallet-democracy", "pallet-election-provider-multi-phase", @@ -13372,54 +12303,54 @@ dependencies = [ "pallet-indices", "pallet-membership", "pallet-mmr-primitives", - "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-multisig", "pallet-nicks", "pallet-offences", - "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-proxy", + "pallet-randomness-collective-flip", "pallet-recovery", "pallet-scheduler", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-session", "pallet-society", "pallet-staking", "pallet-staking-reward-curve", - "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", - "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "pallet-utility", "pallet-vesting", - "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=master)", + "pallet-xcm", "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "polkadot-runtime-parachains 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", "rustc-hex", "serde", "serde_derive", "smallvec 1.6.1", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-api", "sp-authority-discovery", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-block-builder", "sp-consensus-babe", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-core", + "sp-inherents", + "sp-io", "sp-npos-elections", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-staking 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", "static_assertions", "substrate-wasm-builder 3.0.0", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -13433,53 +12364,53 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-core", "cumulus-primitives-utility", - "frame-benchmarking 3.1.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-executive 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", "frame-system-benchmarking", - "frame-system-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "frame-system-rpc-runtime-api", "hex-literal 0.3.1", "node-primitives", - "pallet-assets 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-aura 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-authorship 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-balances 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", + "pallet-assets", + "pallet-aura", + "pallet-authorship", + "pallet-balances", "pallet-collator-selection", - "pallet-multisig 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-proxy 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-randomness-collective-flip 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-sudo 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-timestamp 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-transaction-payment-rpc-runtime-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-utility 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "pallet-xcm 0.1.0 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "pallet-multisig", + "pallet-proxy", + "pallet-randomness-collective-flip", + "pallet-session", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "pallet-xcm", "parachain-info", "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "polkadot-primitives 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "polkadot-runtime-common 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", "runtime-common", "serde", "smallvec 1.6.1", - "sp-api 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-block-builder 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-consensus-aura 0.9.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-inherents 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-offchain 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-session 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-transaction-pool 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "sp-version 3.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "substrate-wasm-builder 4.0.0 (git+https://github.com/paritytech/substrate?branch=statemint)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "xcm-builder 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder 4.0.0", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -13589,17 +12520,7 @@ dependencies = [ [[package]] name = "xcm" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" -dependencies = [ - "derivative", - "impl-trait-for-tuples", - "parity-scale-codec", -] - -[[package]] -name = "xcm" -version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ "derivative", "impl-trait-for-tuples", @@ -13609,73 +12530,37 @@ dependencies = [ [[package]] name = "xcm-builder" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", + "frame-system", "impl-trait-for-tuples", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", -] - -[[package]] -name = "xcm-builder" -version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "frame-system 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "impl-trait-for-tuples", - "pallet-transaction-payment 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "parity-scale-codec", - "polkadot-parachain 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", - "xcm-executor 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", -] - -[[package]] -name = "xcm-executor" -version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=master#ca22bdca70a595db8b7ad1502919769d1472ffb9" -dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "impl-trait-for-tuples", - "log", + "pallet-transaction-payment", "parity-scale-codec", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=master)", + "polkadot-parachain", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", ] [[package]] name = "xcm-executor" version = "0.9.3" -source = "git+https://github.com/paritytech/polkadot?branch=statemint#5fd5f0f6eb3cad50c2badb2f10636eefe7686e69" +source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907853f120c752aaa01631a0b3e783" dependencies = [ - "frame-support 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", + "frame-support", "impl-trait-for-tuples", "log", "parity-scale-codec", - "sp-arithmetic 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-core 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-io 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-runtime 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "sp-std 3.0.0 (git+https://github.com/paritytech/substrate?branch=master)", - "xcm 0.9.3 (git+https://github.com/paritytech/polkadot?branch=statemint)", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", ] [[package]] diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml index 15d98e3da74..82a7974095a 100644 --- a/pallets/collator-selection/Cargo.toml +++ b/pallets/collator-selection/Cargo.toml @@ -16,25 +16,25 @@ targets = ['x86_64-unknown-linux-gnu'] log = { version = "0.4.0", default-features = false } codec = { default-features = false, features = ['derive'], package = 'parity-scale-codec', version = '2.0.0' } serde = { version = "1.0.119", default-features = false } -sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -sp-staking = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -frame-support = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -frame-system = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -pallet-authorship = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -pallet-session = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +sp-staking = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +frame-support = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +frame-system = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +pallet-authorship = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +pallet-session = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } -frame-benchmarking = { default-features = false, optional = true, git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +frame-benchmarking = { default-features = false, optional = true, git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } [dev-dependencies] -sp-core = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -sp-io = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -sp-tracing = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -sp-runtime = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -pallet-timestamp = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -sp-consensus-aura = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '0.9.0' } -pallet-balances = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } -pallet-aura = { git = 'https://github.com/paritytech/substrate', branch = "statemint", version = '3.0.0' } +sp-core = { git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +sp-io = { git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +sp-tracing = { git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +sp-runtime = { git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +pallet-timestamp = { git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +sp-consensus-aura = { git = 'https://github.com/paritytech/substrate', branch = "master", version = '0.9.0' } +pallet-balances = { git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } +pallet-aura = { git = 'https://github.com/paritytech/substrate', branch = "master", version = '3.0.0' } [features] default = ['std'] diff --git a/polkadot-parachains/statemine/Cargo.toml b/polkadot-parachains/statemine/Cargo.toml index bef112a4a51..e1fb92f33e1 100644 --- a/polkadot-parachains/statemine/Cargo.toml +++ b/polkadot-parachains/statemine/Cargo.toml @@ -1,6 +1,6 @@ [build-dependencies.substrate-wasm-builder] git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '4.0.0' [package] @@ -28,38 +28,38 @@ version = '2.0.0' default-features = false git = 'https://github.com/paritytech/substrate' optional = true -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-executive] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-support] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-system] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-system-benchmarking] default-features = false git = 'https://github.com/paritytech/substrate' optional = true -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-system-rpc-runtime-api] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.hex-literal] @@ -69,65 +69,65 @@ version = '0.3.1' [dependencies.pallet-assets] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" [dependencies.pallet-authorship] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" [dependencies.pallet-balances] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-multisig] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-proxy] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-randomness-collective-flip] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-timestamp] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-transaction-payment] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-transaction-payment-rpc-runtime-api] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-utility] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-aura] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.serde] @@ -138,78 +138,78 @@ version = '1.0.119' [dependencies.node-primitives] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" [dependencies.sp-api] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-block-builder] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-core] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-inherents] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-io] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-offchain] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-runtime] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-session] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-std] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-transaction-pool] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-version] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-consensus-aura] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '0.9.0' # Cumulus dependencies @@ -249,37 +249,37 @@ default-features = false # Polkadot dependencies [dependencies.polkadot-primitives] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.polkadot-runtime-common] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.polkadot-parachain] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.xcm] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.xcm-builder] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.xcm-executor] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.pallet-xcm] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.pallet-collator-selection] @@ -294,7 +294,7 @@ path = '../statemint-common' [dependencies.pallet-session] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' diff --git a/polkadot-parachains/statemint-common/Cargo.toml b/polkadot-parachains/statemint-common/Cargo.toml index a10f6c0cb88..16fd66ea9be 100644 --- a/polkadot-parachains/statemint-common/Cargo.toml +++ b/polkadot-parachains/statemint-common/Cargo.toml @@ -1,6 +1,6 @@ [build-dependencies.substrate-wasm-builder] git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '4.0.0' [package] @@ -15,19 +15,19 @@ targets = ['x86_64-unknown-linux-gnu'] [dependencies.sp-consensus-aura] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '0.9.0' [dependencies.sp-std] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-io] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.codec] @@ -39,54 +39,54 @@ version = '2.0.0' [dependencies.frame-executive] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-support] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-system] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-balances] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-runtime] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-core] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.node-primitives] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" [dependencies.polkadot-runtime-common] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false # Polkadot dependencies [dependencies.polkadot-primitives] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.pallet-collator-selection] @@ -99,13 +99,13 @@ serde = { version = "1.0.119" } [dev-dependencies.sp-io] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dev-dependencies.pallet-authorship] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' diff --git a/polkadot-parachains/statemint/Cargo.toml b/polkadot-parachains/statemint/Cargo.toml index 120d1dce1a8..03a55e99122 100644 --- a/polkadot-parachains/statemint/Cargo.toml +++ b/polkadot-parachains/statemint/Cargo.toml @@ -1,6 +1,6 @@ [build-dependencies.substrate-wasm-builder] git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '4.0.0' [package] @@ -28,38 +28,38 @@ version = '2.0.0' default-features = false git = 'https://github.com/paritytech/substrate' optional = true -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-executive] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-support] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-system] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-system-benchmarking] default-features = false git = 'https://github.com/paritytech/substrate' optional = true -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-system-rpc-runtime-api] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.hex-literal] @@ -69,59 +69,59 @@ version = '0.3.1' [dependencies.pallet-assets] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" [dependencies.pallet-authorship] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" [dependencies.pallet-balances] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-multisig] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-proxy] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-randomness-collective-flip] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-timestamp] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-transaction-payment] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-transaction-payment-rpc-runtime-api] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-utility] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.serde] @@ -132,72 +132,72 @@ version = '1.0.119' [dependencies.node-primitives] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" [dependencies.sp-api] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-block-builder] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-core] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-inherents] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-io] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-offchain] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-runtime] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-session] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-std] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-transaction-pool] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-version] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' # Cumulus dependencies @@ -237,37 +237,37 @@ default-features = false # Polkadot dependencies [dependencies.polkadot-primitives] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.polkadot-runtime-common] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.polkadot-parachain] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.xcm] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.xcm-builder] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.xcm-executor] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.pallet-xcm] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.pallet-collator-selection] @@ -282,19 +282,19 @@ path = '../statemint-common' [dependencies.pallet-aura] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-session] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-consensus-aura] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '0.9.0' diff --git a/polkadot-parachains/westmint/Cargo.toml b/polkadot-parachains/westmint/Cargo.toml index 9a6ec6206d5..9fe5087240c 100644 --- a/polkadot-parachains/westmint/Cargo.toml +++ b/polkadot-parachains/westmint/Cargo.toml @@ -1,6 +1,6 @@ [build-dependencies.substrate-wasm-builder] git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '4.0.0' [package] @@ -28,38 +28,38 @@ version = '2.0.0' default-features = false git = 'https://github.com/paritytech/substrate' optional = true -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-executive] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-support] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-system] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-system-benchmarking] default-features = false git = 'https://github.com/paritytech/substrate' optional = true -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.frame-system-rpc-runtime-api] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.hex-literal] @@ -69,65 +69,65 @@ version = '0.3.1' [dependencies.pallet-assets] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" [dependencies.pallet-authorship] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" [dependencies.pallet-balances] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-multisig] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-proxy] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-randomness-collective-flip] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-sudo] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-timestamp] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-transaction-payment] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-transaction-payment-rpc-runtime-api] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-utility] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.serde] @@ -138,72 +138,72 @@ version = '1.0.119' [dependencies.node-primitives] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" [dependencies.sp-api] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-block-builder] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-core] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-inherents] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-io] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-offchain] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-runtime] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-session] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-std] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-transaction-pool] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-version] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' # Cumulus dependencies @@ -243,37 +243,37 @@ default-features = false # Polkadot dependencies [dependencies.polkadot-primitives] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.polkadot-runtime-common] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.polkadot-parachain] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.xcm] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.xcm-builder] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.xcm-executor] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.pallet-xcm] git = 'https://github.com/paritytech/polkadot' -branch = "statemint" +branch = "master" default-features = false [dependencies.pallet-collator-selection] @@ -288,19 +288,19 @@ path = '../statemint-common' [dependencies.pallet-aura] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.pallet-session] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '3.0.0' [dependencies.sp-consensus-aura] default-features = false git = 'https://github.com/paritytech/substrate' -branch = "statemint" +branch = "master" version = '0.9.0' From 5557bbb7362fd7a5e85e40df59ca323e0ee875bd Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 31 May 2021 12:01:47 +0200 Subject: [PATCH 03/17] Fixes --- Cargo.lock | 47 +-- polkadot-parachains/statemine/Cargo.toml | 452 ++++++---------------- polkadot-parachains/statemint/Cargo.toml | 452 ++++++---------------- polkadot-parachains/westmint/Cargo.toml | 459 ++++++----------------- 4 files changed, 332 insertions(+), 1078 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e854fee903..56b0af6d7a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2725,20 +2725,6 @@ dependencies = [ "sp-version", ] -[[package]] -name = "frame-system-benchmarking" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "sp-core", - "sp-runtime", - "sp-std", -] - [[package]] name = "frame-system-rpc-runtime-api" version = "3.0.0" @@ -5507,7 +5493,6 @@ name = "pallet-multisig" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -5551,7 +5536,6 @@ name = "pallet-proxy" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking", "frame-support", "frame-system", "max-encoded-len", @@ -5703,7 +5687,6 @@ dependencies = [ "log", "parity-scale-codec", "sp-inherents", - "sp-io", "sp-runtime", "sp-std", "sp-timestamp", @@ -5787,7 +5770,6 @@ name = "pallet-utility" version = "3.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" dependencies = [ - "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -10510,22 +10492,24 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "statemine-runtime" -version = "2.0.0" +version = "0.1.0" dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", "cumulus-pallet-xcm", "cumulus-pallet-xcmp-queue", + "cumulus-ping", "cumulus-primitives-core", "cumulus-primitives-utility", - "frame-benchmarking", "frame-executive", "frame-support", "frame-system", - "frame-system-benchmarking", "frame-system-rpc-runtime-api", + "hex", "hex-literal 0.3.1", + "log", + "max-encoded-len", "node-primitives", "pallet-assets", "pallet-aura", @@ -10536,6 +10520,7 @@ dependencies = [ "pallet-proxy", "pallet-randomness-collective-flip", "pallet-session", + "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -10544,7 +10529,6 @@ dependencies = [ "parachain-info", "parity-scale-codec", "polkadot-parachain", - "polkadot-primitives", "polkadot-runtime-common", "runtime-common", "serde", @@ -10569,22 +10553,24 @@ dependencies = [ [[package]] name = "statemint-runtime" -version = "2.0.0" +version = "0.1.0" dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", "cumulus-pallet-xcm", "cumulus-pallet-xcmp-queue", + "cumulus-ping", "cumulus-primitives-core", "cumulus-primitives-utility", - "frame-benchmarking", "frame-executive", "frame-support", "frame-system", - "frame-system-benchmarking", "frame-system-rpc-runtime-api", + "hex", "hex-literal 0.3.1", + "log", + "max-encoded-len", "node-primitives", "pallet-assets", "pallet-aura", @@ -10595,6 +10581,7 @@ dependencies = [ "pallet-proxy", "pallet-randomness-collective-flip", "pallet-session", + "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -10603,7 +10590,6 @@ dependencies = [ "parachain-info", "parity-scale-codec", "polkadot-parachain", - "polkadot-primitives", "polkadot-runtime-common", "runtime-common", "serde", @@ -12355,22 +12341,24 @@ dependencies = [ [[package]] name = "westmint-runtime" -version = "2.0.0" +version = "0.1.0" dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", "cumulus-pallet-xcm", "cumulus-pallet-xcmp-queue", + "cumulus-ping", "cumulus-primitives-core", "cumulus-primitives-utility", - "frame-benchmarking", "frame-executive", "frame-support", "frame-system", - "frame-system-benchmarking", "frame-system-rpc-runtime-api", + "hex", "hex-literal 0.3.1", + "log", + "max-encoded-len", "node-primitives", "pallet-assets", "pallet-aura", @@ -12390,7 +12378,6 @@ dependencies = [ "parachain-info", "parity-scale-codec", "polkadot-parachain", - "polkadot-primitives", "polkadot-runtime-common", "runtime-common", "serde", diff --git a/polkadot-parachains/statemine/Cargo.toml b/polkadot-parachains/statemine/Cargo.toml index e1fb92f33e1..18b53b2a79e 100644 --- a/polkadot-parachains/statemine/Cargo.toml +++ b/polkadot-parachains/statemine/Cargo.toml @@ -1,368 +1,126 @@ -[build-dependencies.substrate-wasm-builder] -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '4.0.0' - [package] -authors = ['Anonymous'] -edition = '2018' -homepage = 'https://substrate.dev' -license = 'Apache-2.0' name = 'statemine-runtime' -repository = 'https://github.com/paritytech/substrate/' -version = '2.0.0' +version = '0.1.0' +authors = ["Parity Technologies "] +edition = '2018' +description = "Kusama variant of Statemint parachain runtime" [dependencies] +serde = { version = "1.0.101", optional = true, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"] } +log = { version = "0.4.14", default-features = false } +parachain-info = { path = "../pallets/parachain-info", default-features = false } smallvec = "1.6.1" -[package.metadata.docs.rs] -targets = ['x86_64-unknown-linux-gnu'] - -[dependencies.codec] -default-features = false -features = ['derive'] -package = 'parity-scale-codec' -version = '2.0.0' - -[dependencies.frame-benchmarking] -default-features = false -git = 'https://github.com/paritytech/substrate' -optional = true -branch = "master" -version = '3.0.0' - -[dependencies.frame-executive] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-support] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-system] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-system-benchmarking] -default-features = false -git = 'https://github.com/paritytech/substrate' -optional = true -branch = "master" -version = '3.0.0' - -[dependencies.frame-system-rpc-runtime-api] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.hex-literal] -optional = true -version = '0.3.1' - -[dependencies.pallet-assets] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" - -[dependencies.pallet-authorship] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" - -[dependencies.pallet-balances] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-multisig] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-proxy] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-randomness-collective-flip] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-timestamp] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-transaction-payment] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-transaction-payment-rpc-runtime-api] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-utility] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-aura] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.serde] -features = ['derive'] -optional = true -version = '1.0.119' - -[dependencies.node-primitives] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" - -[dependencies.sp-api] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-block-builder] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-core] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-inherents] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-io] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-offchain] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-runtime] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-session] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-std] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-transaction-pool] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-version] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-consensus-aura] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '0.9.0' +# Substrate dependencies +sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-proxy = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +node-primitives = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +max-encoded-len = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } # Cumulus dependencies -[dependencies.cumulus-pallet-aura-ext] -default-features = false -path = "../../pallets/aura-ext" - -[dependencies.parachain-info] -default-features = false -path = "../pallets/parachain-info" -version = '0.1.0' - -[dependencies.cumulus-pallet-parachain-system] -path = "../../pallets/parachain-system" -default-features = false - -[dependencies.cumulus-primitives-core] -path = "../../primitives/core" -default-features = false - -[dependencies.cumulus-primitives-utility] -path = "../../primitives/utility" -default-features = false - -[dependencies.cumulus-pallet-dmp-queue] -path = "../../pallets/dmp-queue" -default-features = false - -[dependencies.cumulus-pallet-xcmp-queue] -path = "../../pallets/xcmp-queue" -default-features = false - -[dependencies.cumulus-pallet-xcm] -path = "../../pallets/xcm" -default-features = false +cumulus-pallet-aura-ext = { path = "../../pallets/aura-ext", default-features = false } +cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false } +cumulus-primitives-core = { path = "../../primitives/core", default-features = false } +cumulus-primitives-utility = { path = "../../primitives/utility", default-features = false } +cumulus-pallet-dmp-queue = { path = "../../pallets/dmp-queue", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue", default-features = false } +cumulus-pallet-xcm = { path = "../../pallets/xcm", default-features = false } +cumulus-ping = { path = "../pallets/ping", default-features = false } +pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } +runtime-common = { path = "../statemint-common", default-features = false } # Polkadot dependencies -[dependencies.polkadot-primitives] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.polkadot-runtime-common] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.polkadot-parachain] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.xcm] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false +polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -[dependencies.xcm-builder] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.xcm-executor] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.pallet-xcm] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.pallet-collator-selection] -default-features = false -path = '../../pallets/collator-selection' - -[dependencies.runtime-common] -default-features = false -version = "0.8.30" -path = '../statemint-common' - -[dependencies.pallet-session] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' +[dev-dependencies] +hex-literal = "0.3.1" +hex = "0.4.3" +[build-dependencies] +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } [features] -default = ['std'] -runtime-benchmarks = [ - 'hex-literal', - 'xcm-builder/runtime-benchmarks', - 'sp-runtime/runtime-benchmarks', - 'frame-benchmarking', - 'frame-support/runtime-benchmarks', - 'frame-system-benchmarking', - 'frame-system/runtime-benchmarks', - 'pallet-assets/runtime-benchmarks', - 'pallet-balances/runtime-benchmarks', - 'pallet-multisig/runtime-benchmarks', - 'pallet-proxy/runtime-benchmarks', - 'pallet-utility/runtime-benchmarks', - 'pallet-timestamp/runtime-benchmarks', - 'pallet-collator-selection/runtime-benchmarks', - 'pallet-xcm/runtime-benchmarks', -] +default = [ "std" ] std = [ - 'codec/std', - 'serde', - 'sp-api/std', - 'sp-std/std', - 'sp-io/std', - 'sp-core/std', - 'sp-runtime/std', - 'sp-version/std', - 'sp-offchain/std', - 'sp-session/std', - 'sp-block-builder/std', - 'sp-transaction-pool/std', - 'sp-inherents/std', - 'sp-consensus-aura/std', - 'frame-support/std', - 'frame-executive/std', - 'frame-system/std', - 'frame-system-rpc-runtime-api/std', - 'pallet-assets/std', - 'pallet-aura/std', - 'pallet-authorship/std', - 'pallet-balances/std', - 'pallet-multisig/std', - 'pallet-proxy/std', - 'pallet-session/std', - 'pallet-utility/std', - 'pallet-randomness-collective-flip/std', - 'pallet-transaction-payment-rpc-runtime-api/std', - 'pallet-timestamp/std', - 'pallet-xcm/std', - 'pallet-transaction-payment/std', - 'pallet-collator-selection/std', - 'node-primitives/std', - 'parachain-info/std', + "codec/std", + "serde", + "log/std", + "sp-api/std", + "sp-std/std", + "sp-io/std", + "sp-core/std", + "sp-runtime/std", + "sp-version/std", + "sp-offchain/std", + "sp-session/std", + "sp-block-builder/std", + "sp-transaction-pool/std", + "sp-inherents/std", + "frame-support/std", + "frame-executive/std", + "frame-system/std", + "frame-system-rpc-runtime-api/std", + "pallet-assets/std", + "pallet-authorship/std", + "pallet-aura/std", + "pallet-balances/std", + "pallet-multisig/std", + "pallet-proxy/std", + "pallet-randomness-collective-flip/std", + "pallet-session/std", + "pallet-sudo/std", + "pallet-timestamp/std", + "pallet-transaction-payment/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-utility/std", + "parachain-info/std", "cumulus-pallet-aura-ext/std", - 'cumulus-pallet-parachain-system/std', - 'cumulus-pallet-dmp-queue/std', + "pallet-collator-selection/std", + "cumulus-pallet-dmp-queue/std", + "cumulus-pallet-parachain-system/std", "cumulus-pallet-xcmp-queue/std", "cumulus-pallet-xcm/std", "cumulus-primitives-core/std", "cumulus-primitives-utility/std", - 'xcm/std', - 'xcm-builder/std', - 'xcm-executor/std', - 'polkadot-runtime-common/std', - 'runtime-common/std', - 'polkadot-primitives/std', + "cumulus-ping/std", + "xcm/std", + "xcm-builder/std", + "xcm-executor/std", + "sp-consensus-aura/std", + "node-primitives/std", ] diff --git a/polkadot-parachains/statemint/Cargo.toml b/polkadot-parachains/statemint/Cargo.toml index 03a55e99122..97ac06f1eff 100644 --- a/polkadot-parachains/statemint/Cargo.toml +++ b/polkadot-parachains/statemint/Cargo.toml @@ -1,368 +1,126 @@ -[build-dependencies.substrate-wasm-builder] -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '4.0.0' - [package] -authors = ['Anonymous'] -edition = '2018' -homepage = 'https://substrate.dev' -license = 'Apache-2.0' name = 'statemint-runtime' -repository = 'https://github.com/paritytech/substrate/' -version = '2.0.0' +version = '0.1.0' +authors = ["Parity Technologies "] +edition = '2018' +description = "Statemint parachain runtime" [dependencies] +serde = { version = "1.0.101", optional = true, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"] } +log = { version = "0.4.14", default-features = false } +parachain-info = { path = "../pallets/parachain-info", default-features = false } smallvec = "1.6.1" -[package.metadata.docs.rs] -targets = ['x86_64-unknown-linux-gnu'] - -[dependencies.codec] -default-features = false -features = ['derive'] -package = 'parity-scale-codec' -version = '2.0.0' - -[dependencies.frame-benchmarking] -default-features = false -git = 'https://github.com/paritytech/substrate' -optional = true -branch = "master" -version = '3.0.0' - -[dependencies.frame-executive] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-support] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-system] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-system-benchmarking] -default-features = false -git = 'https://github.com/paritytech/substrate' -optional = true -branch = "master" -version = '3.0.0' - -[dependencies.frame-system-rpc-runtime-api] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.hex-literal] -optional = true -version = '0.3.1' - -[dependencies.pallet-assets] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" - -[dependencies.pallet-authorship] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" - -[dependencies.pallet-balances] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-multisig] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-proxy] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-randomness-collective-flip] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-timestamp] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-transaction-payment] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-transaction-payment-rpc-runtime-api] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-utility] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.serde] -features = ['derive'] -optional = true -version = '1.0.119' - -[dependencies.node-primitives] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" - -[dependencies.sp-api] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-block-builder] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-core] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-inherents] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-io] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-offchain] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-runtime] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-session] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-std] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-transaction-pool] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-version] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' +# Substrate dependencies +sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-proxy = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +node-primitives = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +max-encoded-len = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } # Cumulus dependencies -[dependencies.cumulus-pallet-aura-ext] -default-features = false -path = "../../pallets/aura-ext" - -[dependencies.parachain-info] -default-features = false -path = "../pallets/parachain-info" -version = '0.1.0' - -[dependencies.cumulus-pallet-parachain-system] -path = "../../pallets/parachain-system" -default-features = false - -[dependencies.cumulus-primitives-core] -path = "../../primitives/core" -default-features = false - -[dependencies.cumulus-primitives-utility] -path = "../../primitives/utility" -default-features = false - -[dependencies.cumulus-pallet-dmp-queue] -path = "../../pallets/dmp-queue" -default-features = false - -[dependencies.cumulus-pallet-xcmp-queue] -path = "../../pallets/xcmp-queue" -default-features = false - -[dependencies.cumulus-pallet-xcm] -path = "../../pallets/xcm" -default-features = false +cumulus-pallet-aura-ext = { path = "../../pallets/aura-ext", default-features = false } +cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false } +cumulus-primitives-core = { path = "../../primitives/core", default-features = false } +cumulus-primitives-utility = { path = "../../primitives/utility", default-features = false } +cumulus-pallet-dmp-queue = { path = "../../pallets/dmp-queue", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue", default-features = false } +cumulus-pallet-xcm = { path = "../../pallets/xcm", default-features = false } +cumulus-ping = { path = "../pallets/ping", default-features = false } +pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } +runtime-common = { path = "../statemint-common", default-features = false } # Polkadot dependencies -[dependencies.polkadot-primitives] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.polkadot-runtime-common] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.polkadot-parachain] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.xcm] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.xcm-builder] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.xcm-executor] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false +polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -[dependencies.pallet-xcm] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.pallet-collator-selection] -default-features = false -path = '../../pallets/collator-selection' - -[dependencies.runtime-common] -default-features = false -version = "0.8.30" -path = '../statemint-common' - -[dependencies.pallet-aura] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-session] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-consensus-aura] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '0.9.0' +[dev-dependencies] +hex-literal = "0.3.1" +hex = "0.4.3" +[build-dependencies] +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } [features] -default = ['std'] -runtime-benchmarks = [ - 'hex-literal', - 'sp-runtime/runtime-benchmarks', - 'xcm-builder/runtime-benchmarks', - 'frame-benchmarking', - 'frame-system-benchmarking', - 'frame-support/runtime-benchmarks', - 'frame-system/runtime-benchmarks', - 'pallet-assets/runtime-benchmarks', - 'pallet-balances/runtime-benchmarks', - 'pallet-multisig/runtime-benchmarks', - 'pallet-proxy/runtime-benchmarks', - 'pallet-utility/runtime-benchmarks', - 'pallet-timestamp/runtime-benchmarks', - 'pallet-xcm/runtime-benchmarks', - 'pallet-collator-selection/runtime-benchmarks', -] +default = [ "std" ] std = [ - 'codec/std', - 'serde', - 'sp-consensus-aura/std', - 'pallet-aura/std', - 'sp-api/std', - 'sp-std/std', - 'sp-io/std', - 'sp-core/std', - 'sp-runtime/std', - 'sp-version/std', - 'sp-offchain/std', - 'sp-session/std', - 'sp-block-builder/std', - 'sp-transaction-pool/std', - 'sp-inherents/std', - 'frame-support/std', - 'frame-executive/std', - 'frame-system/std', - 'frame-system-rpc-runtime-api/std', - 'pallet-assets/std', - 'pallet-authorship/std', - 'pallet-balances/std', - 'pallet-multisig/std', - 'pallet-proxy/std', - 'pallet-utility/std', - 'pallet-randomness-collective-flip/std', - 'pallet-transaction-payment-rpc-runtime-api/std', - 'pallet-timestamp/std', - 'pallet-session/std', - 'pallet-xcm/std', - 'pallet-transaction-payment/std', - 'pallet-collator-selection/std', - 'node-primitives/std', - 'parachain-info/std', + "codec/std", + "serde", + "log/std", + "sp-api/std", + "sp-std/std", + "sp-io/std", + "sp-core/std", + "sp-runtime/std", + "sp-version/std", + "sp-offchain/std", + "sp-session/std", + "sp-block-builder/std", + "sp-transaction-pool/std", + "sp-inherents/std", + "frame-support/std", + "frame-executive/std", + "frame-system/std", + "frame-system-rpc-runtime-api/std", + "pallet-assets/std", + "pallet-authorship/std", + "pallet-aura/std", + "pallet-balances/std", + "pallet-multisig/std", + "pallet-proxy/std", + "pallet-randomness-collective-flip/std", + "pallet-session/std", + "pallet-sudo/std", + "pallet-timestamp/std", + "pallet-transaction-payment/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-utility/std", + "parachain-info/std", "cumulus-pallet-aura-ext/std", - 'cumulus-pallet-parachain-system/std', - 'cumulus-pallet-dmp-queue/std', + "pallet-collator-selection/std", + "cumulus-pallet-dmp-queue/std", + "cumulus-pallet-parachain-system/std", "cumulus-pallet-xcmp-queue/std", "cumulus-pallet-xcm/std", "cumulus-primitives-core/std", "cumulus-primitives-utility/std", - 'xcm/std', - 'xcm-builder/std', - 'xcm-executor/std', - 'polkadot-runtime-common/std', - 'runtime-common/std', - 'polkadot-primitives/std', + "cumulus-ping/std", + "xcm/std", + "xcm-builder/std", + "xcm-executor/std", + "sp-consensus-aura/std", + "node-primitives/std", ] diff --git a/polkadot-parachains/westmint/Cargo.toml b/polkadot-parachains/westmint/Cargo.toml index 9fe5087240c..92d3f67f278 100644 --- a/polkadot-parachains/westmint/Cargo.toml +++ b/polkadot-parachains/westmint/Cargo.toml @@ -1,375 +1,126 @@ -[build-dependencies.substrate-wasm-builder] -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '4.0.0' - [package] -authors = ['Anonymous'] -edition = '2018' -homepage = 'https://substrate.dev' -license = 'Apache-2.0' name = 'westmint-runtime' -repository = 'https://github.com/paritytech/substrate/' -version = '2.0.0' +version = '0.1.0' +authors = ["Parity Technologies "] +edition = '2018' +description = "Westend variant of Statemint parachain runtime" [dependencies] +serde = { version = "1.0.101", optional = true, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"] } +log = { version = "0.4.14", default-features = false } +parachain-info = { path = "../pallets/parachain-info", default-features = false } smallvec = "1.6.1" -[package.metadata.docs.rs] -targets = ['x86_64-unknown-linux-gnu'] - -[dependencies.codec] -default-features = false -features = ['derive'] -package = 'parity-scale-codec' -version = '2.0.0' - -[dependencies.frame-benchmarking] -default-features = false -git = 'https://github.com/paritytech/substrate' -optional = true -branch = "master" -version = '3.0.0' - -[dependencies.frame-executive] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-support] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-system] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-system-benchmarking] -default-features = false -git = 'https://github.com/paritytech/substrate' -optional = true -branch = "master" -version = '3.0.0' - -[dependencies.frame-system-rpc-runtime-api] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.hex-literal] -optional = true -version = '0.3.1' - -[dependencies.pallet-assets] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" - -[dependencies.pallet-authorship] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" - -[dependencies.pallet-balances] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-multisig] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-proxy] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-randomness-collective-flip] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-sudo] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-timestamp] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-transaction-payment] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-transaction-payment-rpc-runtime-api] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-utility] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.serde] -features = ['derive'] -optional = true -version = '1.0.119' - -[dependencies.node-primitives] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" - -[dependencies.sp-api] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-block-builder] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-core] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-inherents] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-io] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-offchain] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-runtime] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-session] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-std] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-transaction-pool] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-version] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' +# Substrate dependencies +sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-proxy = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +node-primitives = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +max-encoded-len = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } # Cumulus dependencies -[dependencies.cumulus-pallet-aura-ext] -default-features = false -path = "../../pallets/aura-ext" - -[dependencies.parachain-info] -default-features = false -path = "../pallets/parachain-info" -version = '0.1.0' - -[dependencies.cumulus-pallet-parachain-system] -path = "../../pallets/parachain-system" -default-features = false - -[dependencies.cumulus-primitives-core] -path = "../../primitives/core" -default-features = false - -[dependencies.cumulus-primitives-utility] -path = "../../primitives/utility" -default-features = false - -[dependencies.cumulus-pallet-dmp-queue] -path = "../../pallets/dmp-queue" -default-features = false - -[dependencies.cumulus-pallet-xcmp-queue] -path = "../../pallets/xcmp-queue" -default-features = false - -[dependencies.cumulus-pallet-xcm] -path = "../../pallets/xcm" -default-features = false +cumulus-pallet-aura-ext = { path = "../../pallets/aura-ext", default-features = false } +cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false } +cumulus-primitives-core = { path = "../../primitives/core", default-features = false } +cumulus-primitives-utility = { path = "../../primitives/utility", default-features = false } +cumulus-pallet-dmp-queue = { path = "../../pallets/dmp-queue", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue", default-features = false } +cumulus-pallet-xcm = { path = "../../pallets/xcm", default-features = false } +cumulus-ping = { path = "../pallets/ping", default-features = false } +pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } +runtime-common = { path = "../statemint-common", default-features = false } # Polkadot dependencies -[dependencies.polkadot-primitives] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.polkadot-runtime-common] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.polkadot-parachain] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.xcm] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.xcm-builder] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.xcm-executor] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false +polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -[dependencies.pallet-xcm] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false - -[dependencies.pallet-collator-selection] -default-features = false -path = '../../pallets/collator-selection' - -[dependencies.runtime-common] -default-features = false -version = "0.8.30" -path = '../statemint-common' - -[dependencies.pallet-aura] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.pallet-session] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-consensus-aura] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '0.9.0' +[dev-dependencies] +hex-literal = "0.3.1" +hex = "0.4.3" +[build-dependencies] +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } [features] -default = ['std'] -runtime-benchmarks = [ - 'hex-literal', - 'sp-runtime/runtime-benchmarks', - 'xcm-builder/runtime-benchmarks', - 'frame-benchmarking', - 'frame-system-benchmarking', - 'frame-support/runtime-benchmarks', - 'frame-system/runtime-benchmarks', - 'pallet-assets/runtime-benchmarks', - 'pallet-balances/runtime-benchmarks', - 'pallet-multisig/runtime-benchmarks', - 'pallet-proxy/runtime-benchmarks', - 'pallet-utility/runtime-benchmarks', - 'pallet-timestamp/runtime-benchmarks', - 'pallet-xcm/runtime-benchmarks', - 'pallet-collator-selection/runtime-benchmarks', -] +default = [ "std" ] std = [ - 'codec/std', - 'serde', - 'sp-consensus-aura/std', - 'pallet-aura/std', - 'sp-api/std', - 'sp-std/std', - 'sp-io/std', - 'sp-core/std', - 'sp-runtime/std', - 'sp-version/std', - 'sp-offchain/std', - 'sp-session/std', - 'sp-block-builder/std', - 'sp-transaction-pool/std', - 'sp-inherents/std', - 'frame-support/std', - 'frame-executive/std', - 'frame-system/std', - 'frame-system-rpc-runtime-api/std', - 'pallet-assets/std', - 'pallet-authorship/std', - 'pallet-balances/std', - 'pallet-multisig/std', - 'pallet-proxy/std', - 'pallet-utility/std', - 'pallet-randomness-collective-flip/std', - 'pallet-transaction-payment-rpc-runtime-api/std', - 'pallet-timestamp/std', - 'pallet-sudo/std', - 'pallet-session/std', - 'pallet-xcm/std', - 'pallet-transaction-payment/std', - 'pallet-collator-selection/std', - 'node-primitives/std', - 'parachain-info/std', + "codec/std", + "serde", + "log/std", + "sp-api/std", + "sp-std/std", + "sp-io/std", + "sp-core/std", + "sp-runtime/std", + "sp-version/std", + "sp-offchain/std", + "sp-session/std", + "sp-block-builder/std", + "sp-transaction-pool/std", + "sp-inherents/std", + "frame-support/std", + "frame-executive/std", + "frame-system/std", + "frame-system-rpc-runtime-api/std", + "pallet-assets/std", + "pallet-authorship/std", + "pallet-aura/std", + "pallet-balances/std", + "pallet-multisig/std", + "pallet-proxy/std", + "pallet-randomness-collective-flip/std", + "pallet-session/std", + "pallet-sudo/std", + "pallet-timestamp/std", + "pallet-transaction-payment/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-utility/std", + "parachain-info/std", "cumulus-pallet-aura-ext/std", - 'cumulus-pallet-parachain-system/std', - 'cumulus-pallet-dmp-queue/std', + "pallet-collator-selection/std", + "cumulus-pallet-dmp-queue/std", + "cumulus-pallet-parachain-system/std", "cumulus-pallet-xcmp-queue/std", "cumulus-pallet-xcm/std", "cumulus-primitives-core/std", "cumulus-primitives-utility/std", - 'xcm/std', - 'xcm-builder/std', - 'xcm-executor/std', - 'polkadot-runtime-common/std', - 'runtime-common/std', - 'polkadot-primitives/std', + "cumulus-ping/std", + "xcm/std", + "xcm-builder/std", + "xcm-executor/std", + "sp-consensus-aura/std", + "node-primitives/std", ] From 735ab2536c97ffc1a30bc723913d9a8ebd979bf8 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 31 May 2021 12:19:58 +0200 Subject: [PATCH 04/17] Fixes --- Cargo.lock | 3 +++ polkadot-parachains/Cargo.toml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 56b0af6d7a6..85a5b387d66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6412,6 +6412,8 @@ dependencies = [ "sp-session", "sp-timestamp", "sp-transaction-pool", + "statemine-runtime", + "statemint-runtime", "structopt", "substrate-build-script-utils", "substrate-prometheus-endpoint", @@ -6420,6 +6422,7 @@ dependencies = [ "tempfile", "tokio 0.2.24", "trie-root 0.15.2", + "westmint-runtime", ] [[package]] diff --git a/polkadot-parachains/Cargo.toml b/polkadot-parachains/Cargo.toml index 38f379092bc..e0c60a0f2d4 100644 --- a/polkadot-parachains/Cargo.toml +++ b/polkadot-parachains/Cargo.toml @@ -24,6 +24,9 @@ hex-literal = "0.2.1" # Parachain runtimes rococo-parachain-runtime = { package = "cumulus-rococo-parachain-runtime", path = "rococo-runtime" } shell-runtime = { package = "cumulus-shell-runtime", path = "shell-runtime" } +statemint-runtime = { path = "statemint" } +statemine-runtime = { path = "statemine" } +westmint-runtime = { path = "westmint" } # Substrate dependencies sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } From ae1acbde899cafe1daff8718feb0a20257868ed5 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 31 May 2021 12:39:07 +0200 Subject: [PATCH 05/17] Fixes --- Cargo.lock | 53 ++++++++++--------- polkadot-parachains/Cargo.toml | 1 + polkadot-parachains/src/chain_spec.rs | 8 +-- polkadot-parachains/statemine/Cargo.toml | 3 +- .../statemint-common/Cargo.toml | 2 +- polkadot-parachains/statemint/Cargo.toml | 3 +- polkadot-parachains/westmint/Cargo.toml | 3 +- 7 files changed, 39 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 85a5b387d66..3414fb511b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6413,6 +6413,7 @@ dependencies = [ "sp-timestamp", "sp-transaction-pool", "statemine-runtime", + "statemint-common", "statemint-runtime", "structopt", "substrate-build-script-utils", @@ -8219,29 +8220,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "runtime-common" -version = "0.8.30" -dependencies = [ - "frame-executive", - "frame-support", - "frame-system", - "node-primitives", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-common", - "serde", - "sp-consensus-aura", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "substrate-wasm-builder 4.0.0", -] - [[package]] name = "rust-argon2" version = "0.8.3" @@ -10533,7 +10511,6 @@ dependencies = [ "parity-scale-codec", "polkadot-parachain", "polkadot-runtime-common", - "runtime-common", "serde", "smallvec 1.6.1", "sp-api", @@ -10548,12 +10525,36 @@ dependencies = [ "sp-std", "sp-transaction-pool", "sp-version", + "statemint-common", "substrate-wasm-builder 4.0.0", "xcm", "xcm-builder", "xcm-executor", ] +[[package]] +name = "statemint-common" +version = "0.8.30" +dependencies = [ + "frame-executive", + "frame-support", + "frame-system", + "node-primitives", + "pallet-authorship", + "pallet-balances", + "pallet-collator-selection", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime-common", + "serde", + "sp-consensus-aura", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "substrate-wasm-builder 4.0.0", +] + [[package]] name = "statemint-runtime" version = "0.1.0" @@ -10594,7 +10595,6 @@ dependencies = [ "parity-scale-codec", "polkadot-parachain", "polkadot-runtime-common", - "runtime-common", "serde", "smallvec 1.6.1", "sp-api", @@ -10609,6 +10609,7 @@ dependencies = [ "sp-std", "sp-transaction-pool", "sp-version", + "statemint-common", "substrate-wasm-builder 4.0.0", "xcm", "xcm-builder", @@ -12382,7 +12383,6 @@ dependencies = [ "parity-scale-codec", "polkadot-parachain", "polkadot-runtime-common", - "runtime-common", "serde", "smallvec 1.6.1", "sp-api", @@ -12397,6 +12397,7 @@ dependencies = [ "sp-std", "sp-transaction-pool", "sp-version", + "statemint-common", "substrate-wasm-builder 4.0.0", "xcm", "xcm-builder", diff --git a/polkadot-parachains/Cargo.toml b/polkadot-parachains/Cargo.toml index e0c60a0f2d4..d3311af4b63 100644 --- a/polkadot-parachains/Cargo.toml +++ b/polkadot-parachains/Cargo.toml @@ -27,6 +27,7 @@ shell-runtime = { package = "cumulus-shell-runtime", path = "shell-runtime" } statemint-runtime = { path = "statemint" } statemine-runtime = { path = "statemine" } westmint-runtime = { path = "westmint" } +statemint-common = { path = "statemint-common" } # Substrate dependencies sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } diff --git a/polkadot-parachains/src/chain_spec.rs b/polkadot-parachains/src/chain_spec.rs index ada1569d9d6..01eeeae8f71 100644 --- a/polkadot-parachains/src/chain_spec.rs +++ b/polkadot-parachains/src/chain_spec.rs @@ -193,16 +193,16 @@ fn shell_testnet_genesis(parachain_id: ParaId) -> shell_runtime::GenesisConfig { } } - +use runtime_common::Balance as StatemintBalance; /// Specialized `ChainSpec` for the normal parachain runtime. pub type StatemintChainSpec = sc_service::GenericChainSpec; pub type StatemineChainSpec = sc_service::GenericChainSpec; pub type WestmintChainSpec = sc_service::GenericChainSpec; -const STATEMINT_ED: Balance = statemint_runtime::constants::currency::EXISTENTIAL_DEPOSIT; -const STATEMINE_ED: Balance = statemine_runtime::constants::currency::EXISTENTIAL_DEPOSIT; -const WESTMINT_ED: Balance = westmint_runtime::constants::currency::EXISTENTIAL_DEPOSIT; +const STATEMINT_ED: StatemintBalance = statemint_runtime::constants::currency::EXISTENTIAL_DEPOSIT; +const STATEMINE_ED: StatemintBalance = statemine_runtime::constants::currency::EXISTENTIAL_DEPOSIT; +const WESTMINT_ED: StatemintBalance = westmint_runtime::constants::currency::EXISTENTIAL_DEPOSIT; /// Helper function to generate a crypto pair from seed pub fn get_pair_from_seed(seed: &str) -> ::Public { diff --git a/polkadot-parachains/statemine/Cargo.toml b/polkadot-parachains/statemine/Cargo.toml index 18b53b2a79e..bac1bece3b8 100644 --- a/polkadot-parachains/statemine/Cargo.toml +++ b/polkadot-parachains/statemine/Cargo.toml @@ -57,7 +57,7 @@ cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue", default-feature cumulus-pallet-xcm = { path = "../../pallets/xcm", default-features = false } cumulus-ping = { path = "../pallets/ping", default-features = false } pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } -runtime-common = { path = "../statemint-common", default-features = false } +statemint-common = { path = "../statemint-common", default-features = false } # Polkadot dependencies polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } @@ -123,4 +123,5 @@ std = [ "xcm-executor/std", "sp-consensus-aura/std", "node-primitives/std", + "statemint-common/std", ] diff --git a/polkadot-parachains/statemint-common/Cargo.toml b/polkadot-parachains/statemint-common/Cargo.toml index 16fd66ea9be..d1b4d6a7426 100644 --- a/polkadot-parachains/statemint-common/Cargo.toml +++ b/polkadot-parachains/statemint-common/Cargo.toml @@ -4,7 +4,7 @@ branch = "master" version = '4.0.0' [package] -name = "runtime-common" +name = "statemint-common" version = "0.8.30" authors = ["Parity Technologies "] edition = "2018" diff --git a/polkadot-parachains/statemint/Cargo.toml b/polkadot-parachains/statemint/Cargo.toml index 97ac06f1eff..ffc40aa4fbc 100644 --- a/polkadot-parachains/statemint/Cargo.toml +++ b/polkadot-parachains/statemint/Cargo.toml @@ -57,7 +57,7 @@ cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue", default-feature cumulus-pallet-xcm = { path = "../../pallets/xcm", default-features = false } cumulus-ping = { path = "../pallets/ping", default-features = false } pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } -runtime-common = { path = "../statemint-common", default-features = false } +statemint-common = { path = "../statemint-common", default-features = false } # Polkadot dependencies polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } @@ -123,4 +123,5 @@ std = [ "xcm-executor/std", "sp-consensus-aura/std", "node-primitives/std", + "statemint-common/std", ] diff --git a/polkadot-parachains/westmint/Cargo.toml b/polkadot-parachains/westmint/Cargo.toml index 92d3f67f278..326565aac13 100644 --- a/polkadot-parachains/westmint/Cargo.toml +++ b/polkadot-parachains/westmint/Cargo.toml @@ -57,7 +57,7 @@ cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue", default-feature cumulus-pallet-xcm = { path = "../../pallets/xcm", default-features = false } cumulus-ping = { path = "../pallets/ping", default-features = false } pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } -runtime-common = { path = "../statemint-common", default-features = false } +statemint-common = { path = "../statemint-common", default-features = false } # Polkadot dependencies polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } @@ -123,4 +123,5 @@ std = [ "xcm-executor/std", "sp-consensus-aura/std", "node-primitives/std", + "statemint-common/std", ] From be961aea064daaac79bdf6788258ee6d798d5b67 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 31 May 2021 12:42:17 +0200 Subject: [PATCH 06/17] Fixes --- polkadot-parachains/src/chain_spec.rs | 2 +- polkadot-parachains/statemine/src/lib.rs | 6 +++--- polkadot-parachains/statemint/src/lib.rs | 6 +++--- polkadot-parachains/westmint/src/lib.rs | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/polkadot-parachains/src/chain_spec.rs b/polkadot-parachains/src/chain_spec.rs index 01eeeae8f71..cb7af85e799 100644 --- a/polkadot-parachains/src/chain_spec.rs +++ b/polkadot-parachains/src/chain_spec.rs @@ -193,7 +193,7 @@ fn shell_testnet_genesis(parachain_id: ParaId) -> shell_runtime::GenesisConfig { } } -use runtime_common::Balance as StatemintBalance; +use statemint_common::Balance as StatemintBalance; /// Specialized `ChainSpec` for the normal parachain runtime. pub type StatemintChainSpec = sc_service::GenericChainSpec; diff --git a/polkadot-parachains/statemine/src/lib.rs b/polkadot-parachains/statemine/src/lib.rs index abf35ab357d..4d56082645c 100644 --- a/polkadot-parachains/statemine/src/lib.rs +++ b/polkadot-parachains/statemine/src/lib.rs @@ -42,12 +42,12 @@ use sp_version::RuntimeVersion; use frame_system::{ EnsureOneOf, EnsureRoot, limits::{BlockLength, BlockWeights}, }; -use runtime_common::{ +use statemint_common::{ BlockNumber, Signature, AccountId, Balance, Index, Hash, AuraId, Header, NORMAL_DISPATCH_RATIO, AVERAGE_ON_INITIALIZE_RATIO, MAXIMUM_BLOCK_WEIGHT, SLOT_DURATION, HOURS, }; -pub use runtime_common as common; -use runtime_common::impls::DealWithFees; +pub use statemint_common as common; +use statemint_common::impls::DealWithFees; use codec::{Decode, Encode}; use constants::{currency::*, fee::WeightToFee}; use frame_support::{ diff --git a/polkadot-parachains/statemint/src/lib.rs b/polkadot-parachains/statemint/src/lib.rs index f82b3cd89c9..63e3c264c20 100644 --- a/polkadot-parachains/statemint/src/lib.rs +++ b/polkadot-parachains/statemint/src/lib.rs @@ -42,12 +42,12 @@ use sp_version::RuntimeVersion; use frame_system::{ EnsureOneOf, EnsureRoot, limits::{BlockLength, BlockWeights}, }; -use runtime_common::{ +use statemint_common::{ BlockNumber, Signature, AccountId, Balance, Index, Hash, AuraId, Header, NORMAL_DISPATCH_RATIO, AVERAGE_ON_INITIALIZE_RATIO, MAXIMUM_BLOCK_WEIGHT, SLOT_DURATION, HOURS, }; -pub use runtime_common as common; -use runtime_common::impls::DealWithFees; +pub use statemint_common as common; +use statemint_common::impls::DealWithFees; use codec::{Decode, Encode}; use constants::{currency::*, fee::WeightToFee}; use frame_support::{ diff --git a/polkadot-parachains/westmint/src/lib.rs b/polkadot-parachains/westmint/src/lib.rs index 19a1c49f610..4a1c484f2b2 100644 --- a/polkadot-parachains/westmint/src/lib.rs +++ b/polkadot-parachains/westmint/src/lib.rs @@ -42,12 +42,12 @@ use sp_version::RuntimeVersion; use frame_system::{ EnsureRoot, limits::{BlockLength, BlockWeights}, }; -use runtime_common::{ +use statemint_common::{ BlockNumber, Signature, AccountId, Balance, Index, Hash, AuraId, Header, NORMAL_DISPATCH_RATIO, AVERAGE_ON_INITIALIZE_RATIO, MAXIMUM_BLOCK_WEIGHT, SLOT_DURATION, HOURS, }; -pub use runtime_common as common; -use runtime_common::impls::DealWithFees; +pub use statemint_common as common; +use statemint_common::impls::DealWithFees; use codec::{Decode, Encode}; use constants::{currency::*, fee::WeightToFee}; use frame_support::{ From c5d6e84b044f6a40b00c5f97713c54dd3d7835f9 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 31 May 2021 13:04:18 +0200 Subject: [PATCH 07/17] Fixes --- polkadot-parachains/src/chain_spec.rs | 22 +++++++++++----------- polkadot-parachains/src/command.rs | 26 +++++++++++++------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/polkadot-parachains/src/chain_spec.rs b/polkadot-parachains/src/chain_spec.rs index cb7af85e799..5d9c76caee4 100644 --- a/polkadot-parachains/src/chain_spec.rs +++ b/polkadot-parachains/src/chain_spec.rs @@ -239,12 +239,12 @@ pub fn westmint_session_keys(keys: AuraId) -> westmint_runtime::opaque::SessionK westmint_runtime::opaque::SessionKeys { aura: keys } } -pub fn statemint_development_config(id: ParaId) -> ChainSpec { - let mut properties = Properties::new(); +pub fn statemint_development_config(id: ParaId) -> StatemintChainSpec { + let mut properties = sc_chain_spec::Properties::new(); properties.insert("tokenSymbol".into(), "DOT".into()); properties.insert("tokenDecimals".into(), 10.into()); - ChainSpec::from_genesis( + StatemintChainSpec::from_genesis( // Name "Statemint Development", // ID @@ -279,12 +279,12 @@ pub fn statemint_development_config(id: ParaId) -> ChainSpec { ) } -pub fn statemint_local_config(id: ParaId) -> ChainSpec { - let mut properties = Properties::new(); +pub fn statemint_local_config(id: ParaId) -> StatemintChainSpec { + let mut properties = sc_chain_spec::Properties::new(); properties.insert("tokenSymbol".into(), "DOT".into()); properties.insert("tokenDecimals".into(), 10.into()); - ChainSpec::from_genesis( + StatemintChainSpec::from_genesis( // Name "Statemint Local", // ID @@ -370,7 +370,7 @@ fn statemint_genesis( } pub fn statemine_development_config(id: ParaId) -> StatemineChainSpec { - let mut properties = Properties::new(); + let mut properties = sc_chain_spec::Properties::new(); properties.insert("tokenSymbol".into(), "KSM".into()); properties.insert("tokenDecimals".into(), 12.into()); @@ -410,7 +410,7 @@ pub fn statemine_development_config(id: ParaId) -> StatemineChainSpec { } pub fn statemine_local_config(id: ParaId) -> StatemineChainSpec { - let mut properties = Properties::new(); + let mut properties = sc_chain_spec::Properties::new(); properties.insert("tokenSymbol".into(), "KSM".into()); properties.insert("tokenDecimals".into(), 12.into()); @@ -461,7 +461,7 @@ pub fn statemine_local_config(id: ParaId) -> StatemineChainSpec { } pub fn statemine_config(id: ParaId) -> StatemineChainSpec { - let mut properties = Properties::new(); + let mut properties = sc_chain_spec::Properties::new(); properties.insert("tokenSymbol".into(), "KSM".into()); properties.insert("tokenDecimals".into(), 12.into()); @@ -544,7 +544,7 @@ fn statemine_genesis( } pub fn westmint_development_config(id: ParaId) -> WestmintChainSpec { - let mut properties = Properties::new(); + let mut properties = sc_chain_spec::Properties::new(); properties.insert("tokenSymbol".into(), "WND".into()); properties.insert("tokenDecimals".into(), 12.into()); @@ -585,7 +585,7 @@ pub fn westmint_development_config(id: ParaId) -> WestmintChainSpec { } pub fn westmint_local_config(id: ParaId) -> WestmintChainSpec { - let mut properties = Properties::new(); + let mut properties = sc_chain_spec::Properties::new(); properties.insert("tokenSymbol".into(), "WND".into()); properties.insert("tokenDecimals".into(), 12.into()); diff --git a/polkadot-parachains/src/command.rs b/polkadot-parachains/src/command.rs index 60dee182179..64ac14513cd 100644 --- a/polkadot-parachains/src/command.rs +++ b/polkadot-parachains/src/command.rs @@ -36,18 +36,18 @@ fn load_spec( id: &str, para_id: ParaId, ) -> std::result::Result, String> { - match id { - "staging" => Ok(Box::new(chain_spec::staging_test_net(para_id))), - "tick" => Ok(Box::new(chain_spec::ChainSpec::from_json_bytes( + Ok(match id { + "staging" => Box::new(chain_spec::staging_test_net(para_id)), + "tick" => Box::new(chain_spec::ChainSpec::from_json_bytes( &include_bytes!("../res/tick.json")[..], - )?)), - "trick" => Ok(Box::new(chain_spec::ChainSpec::from_json_bytes( + )?), + "trick" => Box::new(chain_spec::ChainSpec::from_json_bytes( &include_bytes!("../res/trick.json")[..], - )?)), - "track" => Ok(Box::new(chain_spec::ChainSpec::from_json_bytes( + )?), + "track" => Box::new(chain_spec::ChainSpec::from_json_bytes( &include_bytes!("../res/track.json")[..], - )?)), - "shell" => Ok(Box::new(chain_spec::get_shell_chain_spec(para_id))), + )?), + "shell" => Box::new(chain_spec::get_shell_chain_spec(para_id)), "statemint-dev" => Box::new(chain_spec::statemint_development_config(para_id)), "statemint-local" => Box::new(chain_spec::statemint_local_config(para_id)), "statemine-dev" => Box::new(chain_spec::statemine_development_config(para_id)), @@ -55,8 +55,8 @@ fn load_spec( "statemine" => Box::new(chain_spec::statemine_config(para_id)), "westmint-dev" => Box::new(chain_spec::westmint_development_config(para_id)), "westmint-local" => Box::new(chain_spec::westmint_local_config(para_id)), - "" => Ok(Box::new(chain_spec::get_chain_spec(para_id))), - path => Ok({ + "" => Box::new(chain_spec::get_chain_spec(para_id)), + path => { let chain_spec = chain_spec::ChainSpec::from_json_file(path.into())?; if use_statemine_runtime(&chain_spec) { Box::new(chain_spec::StatemineChainSpec::from_json_file(path.into())?) @@ -67,8 +67,8 @@ fn load_spec( } else { Box::new(chain_spec) } - }), - } + } + }) } impl SubstrateCli for Cli { From 7acb831dac26e28201a6ac543dfc398f9449adf0 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 31 May 2021 23:53:28 +0200 Subject: [PATCH 08/17] Benchmarking --- Cargo.lock | 417 ++++++++++++++--------- polkadot-parachains/Cargo.toml | 13 + polkadot-parachains/src/cli.rs | 4 + polkadot-parachains/src/command.rs | 21 +- polkadot-parachains/src/service.rs | 24 ++ polkadot-parachains/statemine/Cargo.toml | 20 ++ polkadot-parachains/statemint/Cargo.toml | 20 ++ polkadot-parachains/westmint/Cargo.toml | 20 ++ 8 files changed, 377 insertions(+), 162 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3414fb511b3..668efc8dcd7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2551,7 +2551,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", ] @@ -2569,7 +2569,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "3.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -2588,7 +2588,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "Inflector", "chrono", @@ -2611,7 +2611,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -2624,7 +2624,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -2639,7 +2639,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "serde", @@ -2650,7 +2650,7 @@ dependencies = [ [[package]] name = "frame-support" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "bitflags", "frame-metadata", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "Inflector", "frame-support-procedural-tools", @@ -2689,7 +2689,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate 1.0.0", @@ -2701,7 +2701,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", @@ -2711,7 +2711,7 @@ dependencies = [ [[package]] name = "frame-system" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -2725,10 +2725,24 @@ dependencies = [ "sp-version", ] +[[package]] +name = "frame-system-benchmarking" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "sp-core", + "sp-runtime", + "sp-std", +] + [[package]] name = "frame-system-rpc-runtime-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "sp-api", @@ -2737,7 +2751,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "parity-scale-codec", @@ -3817,11 +3831,14 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907 dependencies = [ "beefy-primitives", "bitvec", + "frame-benchmarking", "frame-executive", "frame-support", "frame-system", + "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", + "hex-literal 0.3.1", "log", "max-encoded-len", "pallet-authority-discovery", @@ -3843,11 +3860,13 @@ dependencies = [ "pallet-multisig", "pallet-nicks", "pallet-offences", + "pallet-offences-benchmarking", "pallet-proxy", "pallet-randomness-collective-flip", "pallet-recovery", "pallet-scheduler", "pallet-session", + "pallet-session-benchmarking", "pallet-society", "pallet-staking", "pallet-staking-reward-fn", @@ -4593,7 +4612,7 @@ dependencies = [ [[package]] name = "max-encoded-len" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "impl-trait-for-tuples", "max-encoded-len-derive", @@ -4604,7 +4623,7 @@ dependencies = [ [[package]] name = "max-encoded-len-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", @@ -4948,7 +4967,7 @@ dependencies = [ [[package]] name = "node-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-system", "parity-scale-codec", @@ -5106,7 +5125,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-benchmarking", "frame-support", @@ -5120,7 +5139,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5136,7 +5155,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5151,7 +5170,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5165,7 +5184,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-benchmarking", "frame-support", @@ -5188,7 +5207,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-benchmarking", "frame-support", @@ -5218,8 +5237,9 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "pallet-treasury", @@ -5276,8 +5296,9 @@ dependencies = [ [[package]] name = "pallet-collective" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "log", @@ -5291,7 +5312,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-benchmarking", "frame-support", @@ -5306,13 +5327,15 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-election-provider-support", "frame-support", "frame-system", "log", "parity-scale-codec", + "rand 0.7.3", "sp-arithmetic", "sp-core", "sp-io", @@ -5325,8 +5348,9 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "log", @@ -5341,7 +5365,7 @@ dependencies = [ [[package]] name = "pallet-gilt" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-benchmarking", "frame-support", @@ -5355,7 +5379,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "3.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-benchmarking", "frame-support", @@ -5377,7 +5401,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5392,8 +5416,9 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "log", @@ -5410,8 +5435,9 @@ dependencies = [ [[package]] name = "pallet-indices" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -5425,7 +5451,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-benchmarking", "frame-support", @@ -5440,7 +5466,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "ckb-merkle-mountain-range", "frame-benchmarking", @@ -5457,7 +5483,7 @@ dependencies = [ [[package]] name = "pallet-mmr-primitives" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5473,7 +5499,7 @@ dependencies = [ [[package]] name = "pallet-mmr-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -5491,8 +5517,9 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -5505,7 +5532,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5518,7 +5545,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5531,11 +5558,34 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-offences-benchmarking" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "pallet-babe", + "pallet-balances", + "pallet-grandpa", + "pallet-im-online", + "pallet-offences", + "pallet-session", + "pallet-staking", + "parity-scale-codec", + "sp-runtime", + "sp-staking", + "sp-std", +] + [[package]] name = "pallet-proxy" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "max-encoded-len", @@ -5549,7 +5599,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5562,7 +5612,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "enumflags2", "frame-support", @@ -5576,7 +5626,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-benchmarking", "frame-support", @@ -5591,7 +5641,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5607,10 +5657,26 @@ dependencies = [ "sp-trie", ] +[[package]] +name = "pallet-session-benchmarking" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-session", + "pallet-staking", + "rand 0.7.3", + "sp-runtime", + "sp-session", + "sp-std", +] + [[package]] name = "pallet-society" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5623,8 +5689,9 @@ dependencies = [ [[package]] name = "pallet-staking" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-election-provider-support", "frame-support", "frame-system", @@ -5633,6 +5700,7 @@ dependencies = [ "pallet-session", "parity-scale-codec", "paste 1.0.4", + "rand_chacha 0.2.2", "serde", "sp-application-crypto", "sp-io", @@ -5645,7 +5713,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", @@ -5656,7 +5724,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "log", "sp-arithmetic", @@ -5665,7 +5733,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5678,7 +5746,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-benchmarking", "frame-support", @@ -5687,6 +5755,7 @@ dependencies = [ "log", "parity-scale-codec", "sp-inherents", + "sp-io", "sp-runtime", "sp-std", "sp-timestamp", @@ -5695,8 +5764,9 @@ dependencies = [ [[package]] name = "pallet-tips" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "pallet-treasury", @@ -5709,7 +5779,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-support", "frame-system", @@ -5725,7 +5795,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -5742,7 +5812,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5753,8 +5823,9 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "impl-trait-for-tuples", @@ -5768,8 +5839,9 @@ dependencies = [ [[package]] name = "pallet-utility" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -5782,9 +5854,10 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "enumflags2", + "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -6367,6 +6440,8 @@ dependencies = [ "cumulus-shell-runtime", "derive_more 0.15.0", "exit-future 0.1.4", + "frame-benchmarking", + "frame-benchmarking-cli", "futures 0.3.14", "hex-literal 0.2.1", "jsonrpc-core", @@ -6992,11 +7067,14 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907 dependencies = [ "beefy-primitives", "bitvec", + "frame-benchmarking", "frame-executive", "frame-support", "frame-system", + "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", + "hex-literal 0.3.1", "log", "max-encoded-len", "pallet-authority-discovery", @@ -7017,10 +7095,12 @@ dependencies = [ "pallet-multisig", "pallet-nicks", "pallet-offences", + "pallet-offences-benchmarking", "pallet-proxy", "pallet-randomness-collective-flip", "pallet-scheduler", "pallet-session", + "pallet-session-benchmarking", "pallet-staking", "pallet-staking-reward-curve", "pallet-timestamp", @@ -7063,12 +7143,14 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907 dependencies = [ "beefy-primitives", "bitvec", + "frame-benchmarking", "frame-support", "frame-system", "impl-trait-for-tuples", "libsecp256k1", "log", "pallet-authorship", + "pallet-babe", "pallet-balances", "pallet-beefy", "pallet-mmr", @@ -7105,8 +7187,10 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907 dependencies = [ "bitvec", "derive_more 0.99.11", + "frame-benchmarking", "frame-support", "frame-system", + "libsecp256k1", "log", "pallet-authority-discovery", "pallet-authorship", @@ -8069,7 +8153,7 @@ dependencies = [ [[package]] name = "remote-externalities" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "env_logger 0.8.3", "hex", @@ -8104,9 +8188,9 @@ dependencies = [ [[package]] name = "retain_mut" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53552c6c49e1e13f1a203ef0080ab3bbef0beb570a528993e83df057a9d9bba1" +checksum = "e9c17925a9027d298a4603d286befe3f9dc0e8ed02523141914eb628798d6e5b" [[package]] name = "ring" @@ -8354,7 +8438,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -8383,7 +8467,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.3.14", "futures-timer 3.0.2", @@ -8406,7 +8490,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -8422,7 +8506,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8443,7 +8527,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", @@ -8454,7 +8538,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "chrono", "fdlimit", @@ -8492,7 +8576,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "derive_more 0.99.11", "fnv", @@ -8526,7 +8610,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "blake2-rfc", "hash-db", @@ -8556,7 +8640,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parking_lot 0.11.1", "sc-client-api", @@ -8568,7 +8652,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -8599,7 +8683,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -8645,7 +8729,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", @@ -8669,7 +8753,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "fork-tree", "parity-scale-codec", @@ -8682,7 +8766,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "futures 0.3.14", @@ -8710,7 +8794,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "sc-client-api", "sp-authorship", @@ -8721,7 +8805,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "derive_more 0.99.11", "lazy_static", @@ -8750,7 +8834,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "derive_more 0.99.11", "parity-scale-codec", @@ -8767,7 +8851,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "log", "parity-scale-codec", @@ -8782,7 +8866,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "log", "parity-scale-codec", @@ -8799,7 +8883,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -8840,7 +8924,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "derive_more 0.99.11", "finality-grandpa", @@ -8864,7 +8948,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-warp-sync" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", @@ -8885,7 +8969,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "ansi_term 0.12.1", "futures 0.3.14", @@ -8903,7 +8987,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -8923,7 +9007,7 @@ dependencies = [ [[package]] name = "sc-light" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "hash-db", "lazy_static", @@ -8942,7 +9026,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-std", "async-trait", @@ -8995,7 +9079,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.3.14", "futures-timer 3.0.2", @@ -9012,7 +9096,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "bytes 0.5.6", "fnv", @@ -9040,7 +9124,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.3.14", "libp2p", @@ -9053,7 +9137,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -9062,7 +9146,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.3.14", "hash-db", @@ -9097,7 +9181,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", @@ -9122,7 +9206,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.1.30", "jsonrpc-core", @@ -9140,7 +9224,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "directories", @@ -9204,7 +9288,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "log", "parity-scale-codec", @@ -9219,7 +9303,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -9239,7 +9323,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "chrono", "futures 0.3.14", @@ -9259,7 +9343,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "ansi_term 0.12.1", "atty", @@ -9296,7 +9380,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", @@ -9307,7 +9391,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", @@ -9329,7 +9413,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.3.14", "futures-diagnose", @@ -9759,7 +9843,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "log", "sp-core", @@ -9771,7 +9855,7 @@ dependencies = [ [[package]] name = "sp-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "hash-db", "log", @@ -9788,7 +9872,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "blake2-rfc", "proc-macro-crate 1.0.0", @@ -9800,7 +9884,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "max-encoded-len", "parity-scale-codec", @@ -9813,7 +9897,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "integer-sqrt", "num-traits", @@ -9827,7 +9911,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "sp-api", @@ -9839,7 +9923,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "parity-scale-codec", @@ -9851,7 +9935,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "sp-api", @@ -9863,7 +9947,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.3.14", "log", @@ -9881,7 +9965,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "serde", "serde_json", @@ -9890,7 +9974,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "futures 0.3.14", @@ -9917,7 +10001,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "parity-scale-codec", @@ -9934,7 +10018,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "merlin", @@ -9956,7 +10040,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "sp-arithmetic", @@ -9966,7 +10050,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -9978,7 +10062,7 @@ dependencies = [ [[package]] name = "sp-core" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "base58", "blake2-rfc", @@ -10023,7 +10107,7 @@ dependencies = [ [[package]] name = "sp-database" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "kvdb", "parking_lot 0.11.1", @@ -10032,7 +10116,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", @@ -10042,7 +10126,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "environmental", "parity-scale-codec", @@ -10053,7 +10137,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "finality-grandpa", "log", @@ -10070,7 +10154,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -10084,7 +10168,7 @@ dependencies = [ [[package]] name = "sp-io" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.3.14", "hash-db", @@ -10109,7 +10193,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "lazy_static", "sp-core", @@ -10120,7 +10204,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "derive_more 0.99.11", @@ -10137,7 +10221,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "ruzstd", "zstd", @@ -10146,7 +10230,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "serde", @@ -10159,7 +10243,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.26", @@ -10170,7 +10254,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "sp-api", "sp-core", @@ -10180,7 +10264,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "backtrace", ] @@ -10188,7 +10272,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "rustc-hash", "serde", @@ -10199,7 +10283,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "either", "hash256-std-hasher", @@ -10221,7 +10305,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -10238,7 +10322,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "Inflector", "proc-macro-crate 1.0.0", @@ -10250,7 +10334,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "serde", "serde_json", @@ -10259,7 +10343,7 @@ dependencies = [ [[package]] name = "sp-session" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "sp-api", @@ -10272,7 +10356,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -10282,7 +10366,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "hash-db", "log", @@ -10305,12 +10389,12 @@ dependencies = [ [[package]] name = "sp-std" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" [[package]] name = "sp-storage" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "impl-serde", "parity-scale-codec", @@ -10323,7 +10407,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "log", "sp-core", @@ -10336,7 +10420,7 @@ dependencies = [ [[package]] name = "sp-test-primitives" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "parity-util-mem", @@ -10349,7 +10433,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "futures-timer 3.0.2", @@ -10366,7 +10450,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "erased-serde", "log", @@ -10384,7 +10468,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "derive_more 0.99.11", "futures 0.3.14", @@ -10400,7 +10484,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "hash-db", "memory-db", @@ -10414,7 +10498,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.3.14", "futures-core", @@ -10426,7 +10510,7 @@ dependencies = [ [[package]] name = "sp-version" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "impl-serde", "parity-scale-codec", @@ -10439,7 +10523,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "parity-scale-codec", "proc-macro-crate 1.0.0", @@ -10451,7 +10535,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -10483,9 +10567,11 @@ dependencies = [ "cumulus-ping", "cumulus-primitives-core", "cumulus-primitives-utility", + "frame-benchmarking", "frame-executive", "frame-support", "frame-system", + "frame-system-benchmarking", "frame-system-rpc-runtime-api", "hex", "hex-literal 0.3.1", @@ -10567,9 +10653,11 @@ dependencies = [ "cumulus-ping", "cumulus-primitives-core", "cumulus-primitives-utility", + "frame-benchmarking", "frame-executive", "frame-support", "frame-system", + "frame-system-benchmarking", "frame-system-rpc-runtime-api", "hex", "hex-literal 0.3.1", @@ -10754,7 +10842,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "platforms", ] @@ -10762,7 +10850,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.14", @@ -10785,7 +10873,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-std", "derive_more 0.99.11", @@ -10799,7 +10887,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "async-trait", "futures 0.1.30", @@ -10828,7 +10916,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "cfg-if 1.0.0", "frame-support", @@ -10869,7 +10957,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.3.14", "parity-scale-codec", @@ -10890,7 +10978,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "futures 0.3.14", "substrate-test-utils-derive", @@ -10900,7 +10988,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "proc-macro-crate 1.0.0", "quote 1.0.9", @@ -10926,7 +11014,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "ansi_term 0.12.1", "atty", @@ -11604,7 +11692,7 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate?branch=master#be1b8ef0eefd6e8fbc7abb3d33262d139277da13" +source = "git+https://github.com/paritytech/substrate?branch=master#fc29e14efd84d34ef4362b9671300611fb41b52b" dependencies = [ "frame-try-runtime", "log", @@ -11630,7 +11718,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59" dependencies = [ "cfg-if 0.1.10", - "rand 0.6.5", + "rand 0.7.3", "static_assertions", ] @@ -12272,11 +12360,14 @@ source = "git+https://github.com/paritytech/polkadot?branch=master#25951e45b1907 dependencies = [ "beefy-primitives", "bitvec", + "frame-benchmarking", "frame-executive", "frame-support", "frame-system", + "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", + "hex-literal 0.3.1", "log", "max-encoded-len", "pallet-authority-discovery", @@ -12296,11 +12387,13 @@ dependencies = [ "pallet-multisig", "pallet-nicks", "pallet-offences", + "pallet-offences-benchmarking", "pallet-proxy", "pallet-randomness-collective-flip", "pallet-recovery", "pallet-scheduler", "pallet-session", + "pallet-session-benchmarking", "pallet-society", "pallet-staking", "pallet-staking-reward-curve", @@ -12355,9 +12448,11 @@ dependencies = [ "cumulus-ping", "cumulus-primitives-core", "cumulus-primitives-utility", + "frame-benchmarking", "frame-executive", "frame-support", "frame-system", + "frame-system-benchmarking", "frame-system-rpc-runtime-api", "hex", "hex-literal 0.3.1", diff --git a/polkadot-parachains/Cargo.toml b/polkadot-parachains/Cargo.toml index d3311af4b63..3ffe96f2916 100644 --- a/polkadot-parachains/Cargo.toml +++ b/polkadot-parachains/Cargo.toml @@ -30,6 +30,8 @@ westmint-runtime = { path = "westmint" } statemint-common = { path = "statemint-common" } # Substrate dependencies +frame-benchmarking = { git = 'https://github.com/paritytech/substrate', branch = "master" } +frame-benchmarking-cli = { git = 'https://github.com/paritytech/substrate', branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -79,6 +81,8 @@ polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "m polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master" } polkadot-parachain = { git = "https://github.com/paritytech/polkadot", branch = "master" } + + [build-dependencies] substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -99,3 +103,12 @@ polkadot-test-service = { git = "https://github.com/paritytech/polkadot", branch pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "master" } substrate-test-client = { git = "https://github.com/paritytech/substrate", branch = "master" } substrate-test-runtime-client = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[features] +default = [] +runtime-benchmarks = [ + 'polkadot-service/runtime-benchmarks', + 'statemint-runtime/runtime-benchmarks', + 'statemine-runtime/runtime-benchmarks', + 'westmint-runtime/runtime-benchmarks', +] diff --git a/polkadot-parachains/src/cli.rs b/polkadot-parachains/src/cli.rs index 7b2e3186e35..4fb2816ff29 100644 --- a/polkadot-parachains/src/cli.rs +++ b/polkadot-parachains/src/cli.rs @@ -50,6 +50,10 @@ pub enum Subcommand { /// Revert the chain to a previous state. Revert(sc_cli::RevertCmd), + + /// The custom benchmark subcommmand benchmarking runtime pallets. + #[structopt(name = "benchmark", about = "Benchmark runtime pallets.")] + Benchmark(frame_benchmarking_cli::BenchmarkCmd), } /// Command for exporting the genesis state of the parachain diff --git a/polkadot-parachains/src/command.rs b/polkadot-parachains/src/command.rs index 64ac14513cd..8b5624e9ad9 100644 --- a/polkadot-parachains/src/command.rs +++ b/polkadot-parachains/src/command.rs @@ -17,6 +17,7 @@ use crate::{ chain_spec, cli::{Cli, RelayChainCli, Subcommand}, + service::{StatemineRuntimeExecutor, StatemintRuntimeExecutor, WestmintRuntimeExecutor}, }; use codec::Encode; use cumulus_client_service::genesis::generate_genesis_block; @@ -29,8 +30,11 @@ use sc_cli::{ }; use sc_service::config::{BasePath, PrometheusConfig}; use sp_core::hexdisplay::HexDisplay; -use sp_runtime::traits::Block as BlockT; +use sp_runtime::{traits::Block as BlockT, generic, OpaqueExtrinsic}; use std::{io::Write, net::SocketAddr}; +use statemint_common::Header; + +pub type Block = generic::Block; fn load_spec( id: &str, @@ -306,6 +310,21 @@ pub fn run() -> Result<()> { Ok(()) } + Some(Subcommand::Benchmark(cmd)) => { + if cfg!(feature = "runtime-benchmarks") { + let runner = cli.create_runner(cmd)?; + if use_statemine_runtime(&*runner.config().chain_spec) { + runner.sync_run(|config| cmd.run::(config)) + } else if use_westmint_runtime(&*runner.config().chain_spec) { + runner.sync_run(|config| cmd.run::(config)) + } else { + runner.sync_run(|config| cmd.run::(config)) + } + } else { + Err("Benchmarking wasn't enabled when building the node. \ + You can enable it with `--features runtime-benchmarks`.".into()) + } + }, None => { let runner = cli.create_runner(&cli.run.normalize())?; let use_shell = use_shell_runtime(&*runner.config().chain_spec); diff --git a/polkadot-parachains/src/service.rs b/polkadot-parachains/src/service.rs index a6790c3dc47..ca9656a5618 100644 --- a/polkadot-parachains/src/service.rs +++ b/polkadot-parachains/src/service.rs @@ -58,6 +58,30 @@ native_executor_instance!( shell_runtime::native_version, ); +// Native Statemint executor instance. +native_executor_instance!( + pub StatemintRuntimeExecutor, + statemint_runtime::api::dispatch, + statemint_runtime::native_version, + frame_benchmarking::benchmarking::HostFunctions, +); + +// Native Statemine executor instance. +native_executor_instance!( + pub StatemineRuntimeExecutor, + statemine_runtime::api::dispatch, + statemine_runtime::native_version, + frame_benchmarking::benchmarking::HostFunctions, +); + +// Native Westmint executor instance. +native_executor_instance!( + pub WestmintRuntimeExecutor, + westmint_runtime::api::dispatch, + westmint_runtime::native_version, + frame_benchmarking::benchmarking::HostFunctions, +); + /// Starts a `ServiceBuilder` for a full service. /// /// Use this macro if you don't actually need the full service, but just the builder in order to diff --git a/polkadot-parachains/statemine/Cargo.toml b/polkadot-parachains/statemine/Cargo.toml index bac1bece3b8..85b50683faa 100644 --- a/polkadot-parachains/statemine/Cargo.toml +++ b/polkadot-parachains/statemine/Cargo.toml @@ -11,6 +11,7 @@ codec = { package = "parity-scale-codec", version = "2.0.0", default-features = log = { version = "0.4.14", default-features = false } parachain-info = { path = "../pallets/parachain-info", default-features = false } smallvec = "1.6.1" +hex-literal = { version = '0.3.1', optional = true } # Substrate dependencies sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -26,6 +27,8 @@ sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } +frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -76,6 +79,23 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [features] default = [ "std" ] +runtime-benchmarks = [ + 'hex-literal', + 'sp-runtime/runtime-benchmarks', + 'xcm-builder/runtime-benchmarks', + 'frame-benchmarking', + 'frame-system-benchmarking', + 'frame-support/runtime-benchmarks', + 'frame-system/runtime-benchmarks', + 'pallet-assets/runtime-benchmarks', + 'pallet-balances/runtime-benchmarks', + 'pallet-multisig/runtime-benchmarks', + 'pallet-proxy/runtime-benchmarks', + 'pallet-utility/runtime-benchmarks', + 'pallet-timestamp/runtime-benchmarks', + 'pallet-xcm/runtime-benchmarks', + 'pallet-collator-selection/runtime-benchmarks', +] std = [ "codec/std", "serde", diff --git a/polkadot-parachains/statemint/Cargo.toml b/polkadot-parachains/statemint/Cargo.toml index ffc40aa4fbc..14210a5ae05 100644 --- a/polkadot-parachains/statemint/Cargo.toml +++ b/polkadot-parachains/statemint/Cargo.toml @@ -11,6 +11,7 @@ codec = { package = "parity-scale-codec", version = "2.0.0", default-features = log = { version = "0.4.14", default-features = false } parachain-info = { path = "../pallets/parachain-info", default-features = false } smallvec = "1.6.1" +hex-literal = { version = '0.3.1', optional = true } # Substrate dependencies sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -26,6 +27,8 @@ sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } +frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -76,6 +79,23 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [features] default = [ "std" ] +runtime-benchmarks = [ + 'hex-literal', + 'sp-runtime/runtime-benchmarks', + 'xcm-builder/runtime-benchmarks', + 'frame-benchmarking', + 'frame-system-benchmarking', + 'frame-support/runtime-benchmarks', + 'frame-system/runtime-benchmarks', + 'pallet-assets/runtime-benchmarks', + 'pallet-balances/runtime-benchmarks', + 'pallet-multisig/runtime-benchmarks', + 'pallet-proxy/runtime-benchmarks', + 'pallet-utility/runtime-benchmarks', + 'pallet-timestamp/runtime-benchmarks', + 'pallet-xcm/runtime-benchmarks', + 'pallet-collator-selection/runtime-benchmarks', +] std = [ "codec/std", "serde", diff --git a/polkadot-parachains/westmint/Cargo.toml b/polkadot-parachains/westmint/Cargo.toml index 326565aac13..fbf14cb771a 100644 --- a/polkadot-parachains/westmint/Cargo.toml +++ b/polkadot-parachains/westmint/Cargo.toml @@ -11,6 +11,7 @@ codec = { package = "parity-scale-codec", version = "2.0.0", default-features = log = { version = "0.4.14", default-features = false } parachain-info = { path = "../pallets/parachain-info", default-features = false } smallvec = "1.6.1" +hex-literal = { version = '0.3.1', optional = true } # Substrate dependencies sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -26,6 +27,8 @@ sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } +frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } @@ -76,6 +79,23 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran [features] default = [ "std" ] +runtime-benchmarks = [ + 'hex-literal', + 'sp-runtime/runtime-benchmarks', + 'xcm-builder/runtime-benchmarks', + 'frame-benchmarking', + 'frame-system-benchmarking', + 'frame-support/runtime-benchmarks', + 'frame-system/runtime-benchmarks', + 'pallet-assets/runtime-benchmarks', + 'pallet-balances/runtime-benchmarks', + 'pallet-multisig/runtime-benchmarks', + 'pallet-proxy/runtime-benchmarks', + 'pallet-utility/runtime-benchmarks', + 'pallet-timestamp/runtime-benchmarks', + 'pallet-xcm/runtime-benchmarks', + 'pallet-collator-selection/runtime-benchmarks', +] std = [ "codec/std", "serde", From bd98eb46d36aca84d2b036d2dce139ba1ce09d12 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 1 Jun 2021 11:05:19 +0200 Subject: [PATCH 09/17] kick patch (paritytech/statemin#88) --- .../collator-selection/src/benchmarking.rs | 27 +++-- pallets/collator-selection/src/lib.rs | 33 +++--- pallets/collator-selection/src/tests.rs | 20 ++-- pallets/collator-selection/src/weights.rs | 106 +++++++++--------- 4 files changed, 99 insertions(+), 87 deletions(-) diff --git a/pallets/collator-selection/src/benchmarking.rs b/pallets/collator-selection/src/benchmarking.rs index c7570905a0e..c11b76ba2fd 100644 --- a/pallets/collator-selection/src/benchmarking.rs +++ b/pallets/collator-selection/src/benchmarking.rs @@ -134,21 +134,21 @@ benchmarks! { // worse case is paying a non-existing candidate account. note_author { - let c in 1 .. T::MaxCandidates::get(); >::put(T::Currency::minimum_balance()); - >::put(c); - register_candidates::(c); - T::Currency::make_free_balance_be( &>::account_id(), - T::Currency::minimum_balance() * 2u32.into(), + T::Currency::minimum_balance() * 4u32.into(), ); let author = account("author", 0, SEED); + let new_block: T::BlockNumber = 10u32.into(); + + frame_system::Pallet::::set_block_number(new_block); assert!(T::Currency::free_balance(&author) == 0u32.into()); }: { as EventHandler<_, _>>::note_author(author.clone()) } verify { assert!(T::Currency::free_balance(&author) > 0u32.into()); + assert_eq!(frame_system::Pallet::::block_number(), new_block); } // worse case is on new session. @@ -162,25 +162,28 @@ benchmarks! { frame_system::Pallet::::set_block_number(0u32.into()); register_candidates::(c); - let new_block: T::BlockNumber = 20u32.into(); + let new_block: T::BlockNumber = 1800u32.into(); + let zero_block: T::BlockNumber = 0u32.into(); + let candidates = >::get(); - let mut candidates = >::get(); - let non_removals = if c > r { c - r } else { 0 }; + let non_removals = c.saturating_sub(r); + for i in 0..c { + >::insert(candidates[i as usize].who.clone(), zero_block); + } for i in 0..non_removals { - candidates[i as usize].last_block = new_block; + >::insert(candidates[i as usize].who.clone(), new_block); } - >::put(candidates.clone()); let pre_length = >::get().len(); - frame_system::Pallet::::set_block_number(new_block.clone()); + frame_system::Pallet::::set_block_number(new_block); assert!(>::get().len() == c as usize); }: { as SessionManager<_>>::new_session(0) } verify { - assert!(>::get().len() <= pre_length); + assert!(>::get().len() < pre_length); } } diff --git a/pallets/collator-selection/src/lib.rs b/pallets/collator-selection/src/lib.rs index c7c9f2741cd..8285c67dede 100644 --- a/pallets/collator-selection/src/lib.rs +++ b/pallets/collator-selection/src/lib.rs @@ -85,7 +85,7 @@ pub mod pallet { use frame_support::{ sp_runtime::{ RuntimeDebug, - traits::{AccountIdConversion, CheckedSub, Zero}, + traits::{AccountIdConversion, CheckedSub, Zero, Saturating}, }, weights::DispatchClass, }; @@ -141,13 +141,11 @@ pub mod pallet { /// Basic information about a collation candidate. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] - pub struct CandidateInfo { + pub struct CandidateInfo { /// Account identifier. pub who: AccountId, /// Reserved deposit. pub deposit: Balance, - /// Last block at which they authored a block. - pub last_block: BlockNumber, } #[pallet::pallet] @@ -164,10 +162,15 @@ pub mod pallet { #[pallet::getter(fn candidates)] pub type Candidates = StorageValue< _, - Vec, T::BlockNumber>>, + Vec>>, ValueQuery, >; + /// Last block authored by collator. + #[pallet::storage] + #[pallet::getter(fn last_authored_block)] + pub type LastAuthoredBlock = StorageMap<_, Twox64Concat, T::AccountId, T::BlockNumber, ValueQuery>; + /// Desired number of candidates. /// /// This should ideally always be less than [`Config::MaxCandidates`] for weights to be correct. @@ -298,7 +301,8 @@ pub mod pallet { ensure!(!Self::invulnerables().contains(&who), Error::::AlreadyInvulnerable); let deposit = Self::candidacy_bond(); - let incoming = CandidateInfo { who: who.clone(), deposit, last_block: frame_system::Pallet::::block_number() }; + // First authored block is current block plus kick threshold to handle session delay + let incoming = CandidateInfo { who: who.clone(), deposit }; let current_count = >::try_mutate(|candidates| -> Result { @@ -307,6 +311,7 @@ pub mod pallet { } else { T::Currency::reserve(&who, deposit)?; candidates.push(incoming); + >::insert(who.clone(), frame_system::Pallet::::block_number() + T::KickThreshold::get()); Ok(candidates.len()) } })?; @@ -336,6 +341,7 @@ pub mod pallet { let index = candidates.iter().position(|candidate| candidate.who == *who).ok_or(Error::::NotCandidate)?; T::Currency::unreserve(&who, candidates[index].deposit); candidates.remove(index); + >::remove(who.clone()); Ok(candidates.len()) }); Self::deposit_event(Event::CandidateRemoved(who.clone())); @@ -353,11 +359,12 @@ pub mod pallet { collators } /// Kicks out and candidates that did not produce a block in the kick threshold. - pub fn kick_stale_candidates(candidates: Vec, T::BlockNumber>>) -> Vec { + pub fn kick_stale_candidates(candidates: Vec>>) -> Vec { let now = frame_system::Pallet::::block_number(); let kick_threshold = T::KickThreshold::get(); let new_candidates = candidates.into_iter().filter_map(|c| { - let since_last = now - c.last_block; + let last_block = >::get(c.who.clone()); + let since_last = now.saturating_sub(last_block); if since_last < kick_threshold { Some(c.who) } else { @@ -385,14 +392,10 @@ pub mod pallet { // `reward` is half of pot account minus ED, this should never fail. let _success = T::Currency::transfer(&pot, &author, reward, KeepAlive); debug_assert!(_success.is_ok()); - let candidates_len = >::mutate(|candidates| -> usize { - if let Some(found) = candidates.iter_mut().find(|candidate| candidate.who == author) { - found.last_block = frame_system::Pallet::::block_number(); - } - candidates.len() - }); + >::insert(author, frame_system::Pallet::::block_number()); + frame_system::Pallet::::register_extra_weight_unchecked( - T::WeightInfo::note_author(candidates_len as u32), + T::WeightInfo::note_author(), DispatchClass::Mandatory, ); } diff --git a/pallets/collator-selection/src/tests.rs b/pallets/collator-selection/src/tests.rs index a1f00718cfc..47157fdbda4 100644 --- a/pallets/collator-selection/src/tests.rs +++ b/pallets/collator-selection/src/tests.rs @@ -124,8 +124,9 @@ fn cannot_register_dupe_candidate() { new_test_ext().execute_with(|| { // can add 3 as candidate assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(3))); - let addition = CandidateInfo { who: 3, deposit: 10, last_block: 0 }; + let addition = CandidateInfo { who: 3, deposit: 10 }; assert_eq!(CollatorSelection::candidates(), vec![addition]); + assert_eq!(CollatorSelection::last_authored_block(3), 10); assert_eq!(Balances::free_balance(3), 90); // but no more @@ -192,6 +193,7 @@ fn leave_intent() { // bond is returned assert_ok!(CollatorSelection::leave_intent(Origin::signed(3))); assert_eq!(Balances::free_balance(3), 100); + assert_eq!(CollatorSelection::last_authored_block(3), 0); }); } @@ -211,10 +213,10 @@ fn authorship_event_handler() { let collator = CandidateInfo { who: 4, deposit: 10, - last_block: 0 }; assert_eq!(CollatorSelection::candidates(), vec![collator]); + assert_eq!(CollatorSelection::last_authored_block(4), 0); // half of the pot goes to the collator who's the author (4 in tests). assert_eq!(Balances::free_balance(4), 140); @@ -240,11 +242,10 @@ fn fees_edgecases() { let collator = CandidateInfo { who: 4, deposit: 10, - last_block: 0 }; assert_eq!(CollatorSelection::candidates(), vec![collator]); - + assert_eq!(CollatorSelection::last_authored_block(4), 0); // Nothing received assert_eq!(Balances::free_balance(4), 90); // all fee stays @@ -295,18 +296,23 @@ fn kick_mechanism() { // add a new collator assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(3))); assert_ok!(CollatorSelection::register_as_candidate(Origin::signed(4))); + initialize_to_block(10); assert_eq!(CollatorSelection::candidates().len(), 2); - initialize_to_block(21); + initialize_to_block(20); assert_eq!(SessionChangeBlock::get(), 20); // 4 authored this block, gets to stay 3 was kicked assert_eq!(CollatorSelection::candidates().len(), 1); - assert_eq!(SessionHandlerCollators::get(), vec![1, 2, 4]); + // 3 will be kicked after 1 session delay + assert_eq!(SessionHandlerCollators::get(), vec![1, 2, 3, 4]); let collator = CandidateInfo { who: 4, deposit: 10, - last_block: 21 }; assert_eq!(CollatorSelection::candidates(), vec![collator]); + assert_eq!(CollatorSelection::last_authored_block(4), 20); + initialize_to_block(30); + // 3 gets kicked after 1 session delay + assert_eq!(SessionHandlerCollators::get(), vec![1, 2, 4]); // kicked collator gets funds back assert_eq!(Balances::free_balance(3), 100); }); diff --git a/pallets/collator-selection/src/weights.rs b/pallets/collator-selection/src/weights.rs index 5c5099543c9..a9f3a8893d3 100644 --- a/pallets/collator-selection/src/weights.rs +++ b/pallets/collator-selection/src/weights.rs @@ -28,7 +28,7 @@ pub trait WeightInfo { fn set_candidacy_bond() -> Weight; fn register_as_candidate(_c: u32) -> Weight; fn leave_intent(_c: u32) -> Weight; - fn note_author(_c: u32) -> Weight; + fn note_author() -> Weight; fn new_session(_c: u32, _r: u32) -> Weight; } @@ -36,48 +36,48 @@ pub trait WeightInfo { pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { fn set_invulnerables(b: u32, ) -> Weight { - (28_060_000 as Weight) - // Standard Error: 1_000 - .saturating_add((118_000 as Weight).saturating_mul(b as Weight)) + (18_563_000 as Weight) + // Standard Error: 0 + .saturating_add((68_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_desired_candidates() -> Weight { - (25_000_000 as Weight) + (16_363_000 as Weight) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_candidacy_bond() -> Weight { - (25_000_000 as Weight) + (16_840_000 as Weight) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn register_as_candidate(c: u32, ) -> Weight { - (82_496_000 as Weight) - // Standard Error: 1_000 - .saturating_add((266_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + (71_196_000 as Weight) + // Standard Error: 0 + .saturating_add((198_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn leave_intent(c: u32, ) -> Weight { - (65_836_000 as Weight) - // Standard Error: 2_000 - .saturating_add((273_000 as Weight).saturating_mul(c as Weight)) + (55_336_000 as Weight) + // Standard Error: 0 + .saturating_add((151_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - fn note_author(c: u32, ) -> Weight { - (108_730_000 as Weight) - // Standard Error: 3_000 - .saturating_add((286_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(T::DbWeight::get().reads(4 as Weight)) + fn note_author() -> Weight { + (71_461_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn new_session(r: u32, c: u32, ) -> Weight { - (50_005_000 as Weight) - // Standard Error: 2_000 - .saturating_add((8_000 as Weight).saturating_mul(r as Weight)) - // Standard Error: 2_000 - .saturating_add((291_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + (0 as Weight) + // Standard Error: 1_010_000 + .saturating_add((109_961_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_010_000 + .saturating_add((151_952_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(c as Weight))) } } @@ -85,47 +85,47 @@ impl WeightInfo for SubstrateWeight { // For backwards compatibility and tests impl WeightInfo for () { fn set_invulnerables(b: u32, ) -> Weight { - (28_060_000 as Weight) - // Standard Error: 1_000 - .saturating_add((118_000 as Weight).saturating_mul(b as Weight)) + (18_563_000 as Weight) + // Standard Error: 0 + .saturating_add((68_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } fn set_desired_candidates() -> Weight { - (25_000_000 as Weight) + (16_363_000 as Weight) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } fn set_candidacy_bond() -> Weight { - (25_000_000 as Weight) + (16_840_000 as Weight) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } fn register_as_candidate(c: u32, ) -> Weight { - (82_496_000 as Weight) - // Standard Error: 1_000 - .saturating_add((266_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(RocksDbWeight::get().reads(3 as Weight)) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + (71_196_000 as Weight) + // Standard Error: 0 + .saturating_add((198_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } fn leave_intent(c: u32, ) -> Weight { - (65_836_000 as Weight) - // Standard Error: 2_000 - .saturating_add((273_000 as Weight).saturating_mul(c as Weight)) + (55_336_000 as Weight) + // Standard Error: 0 + .saturating_add((151_000 as Weight).saturating_mul(c as Weight)) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } - fn note_author(c: u32, ) -> Weight { - (108_730_000 as Weight) - // Standard Error: 3_000 - .saturating_add((286_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(RocksDbWeight::get().reads(4 as Weight)) + fn note_author() -> Weight { + (71_461_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } fn new_session(r: u32, c: u32, ) -> Weight { - (50_005_000 as Weight) - // Standard Error: 2_000 - .saturating_add((8_000 as Weight).saturating_mul(r as Weight)) - // Standard Error: 2_000 - .saturating_add((291_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(RocksDbWeight::get().reads(3 as Weight)) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + (0 as Weight) + // Standard Error: 1_010_000 + .saturating_add((109_961_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_010_000 + .saturating_add((151_952_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(RocksDbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(RocksDbWeight::get().writes((2 as Weight).saturating_mul(r as Weight))) + .saturating_add(RocksDbWeight::get().writes((2 as Weight).saturating_mul(c as Weight))) } } From a42fadd54191d242ef2acd01df93ccfedf96295d Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 1 Jun 2021 11:07:18 +0200 Subject: [PATCH 10/17] Westmint Chain Spec (paritytech/statemint#90) --- polkadot-parachains/src/chain_spec.rs | 47 +++++++++++++++++++++++++++ polkadot-parachains/src/command.rs | 1 + 2 files changed, 48 insertions(+) diff --git a/polkadot-parachains/src/chain_spec.rs b/polkadot-parachains/src/chain_spec.rs index 5d9c76caee4..b9b5f7bbd50 100644 --- a/polkadot-parachains/src/chain_spec.rs +++ b/polkadot-parachains/src/chain_spec.rs @@ -636,6 +636,53 @@ pub fn westmint_local_config(id: ParaId) -> WestmintChainSpec { ) } +pub fn westmint_config(id: ParaId) -> WestmintChainSpec { + let mut properties = sc_chain_spec::Properties::new(); + properties.insert("tokenSymbol".into(), "WND".into()); + properties.insert("tokenDecimals".into(), 12.into()); + + WestmintChainSpec::from_genesis( + // Name + "Westmint", + // ID + "westmint", + ChainType::Live, + move || { + westmint_genesis( + // initial collators. + vec![( + hex!("9cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325").into(), + hex!("9cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325").unchecked_into() + ), + ( + hex!("12a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876").into(), + hex!("12a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876").unchecked_into() + ), + ( + hex!("1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f").into(), + hex!("1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f").unchecked_into() + ), + ( + hex!("98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322").into(), + hex!("98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322").unchecked_into() + ), + ], + vec![], + hex!("6648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342").into(), + id, + ) + }, + vec![], + None, + None, + Some(properties), + Extensions { + relay_chain: "westend".into(), + para_id: id.into(), + }, + ) +} + fn westmint_genesis( invulnerables: Vec<(AccountId, AuraId)>, endowed_accounts: Vec, diff --git a/polkadot-parachains/src/command.rs b/polkadot-parachains/src/command.rs index 8b5624e9ad9..e85d5a90dd2 100644 --- a/polkadot-parachains/src/command.rs +++ b/polkadot-parachains/src/command.rs @@ -59,6 +59,7 @@ fn load_spec( "statemine" => Box::new(chain_spec::statemine_config(para_id)), "westmint-dev" => Box::new(chain_spec::westmint_development_config(para_id)), "westmint-local" => Box::new(chain_spec::westmint_local_config(para_id)), + "westmint" => Box::new(chain_spec::westmint_config(para_id)), "" => Box::new(chain_spec::get_chain_spec(para_id)), path => { let chain_spec = chain_spec::ChainSpec::from_json_file(path.into())?; From 5aad76a319cc1e25676e4cd6bc57b4d4aed05c8b Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 1 Jun 2021 11:21:53 +0200 Subject: [PATCH 11/17] Tidy the common .toml --- Cargo.lock | 8 +- Cargo.toml | 6 +- pallets/collator-selection/Cargo.toml | 4 +- polkadot-parachains/Cargo.toml | 6 +- .../Cargo.toml | 2 +- .../{statemine => statemine-runtime}/build.rs | 0 .../src/constants.rs | 0 .../src/lib.rs | 0 .../src/weights/mod.rs | 0 .../src/weights/pallet_assets.rs | 0 .../src/weights/pallet_balances.rs | 0 .../src/weights/pallet_collator_selection.rs | 0 .../src/weights/pallet_multisig.rs | 0 .../src/weights/pallet_proxy.rs | 0 .../src/weights/pallet_timestamp.rs | 0 .../src/weights/pallet_utility.rs | 0 .../statemint-common/Cargo.toml | 121 ++++-------------- .../Cargo.toml | 2 +- .../{statemint => statemint-runtime}/build.rs | 0 .../src/constants.rs | 0 .../src/lib.rs | 0 .../src/weights/mod.rs | 0 .../src/weights/pallet_assets.rs | 0 .../src/weights/pallet_balances.rs | 0 .../src/weights/pallet_collator_selection.rs | 0 .../src/weights/pallet_multisig.rs | 0 .../src/weights/pallet_proxy.rs | 0 .../src/weights/pallet_timestamp.rs | 0 .../src/weights/pallet_utility.rs | 0 .../{westmint => westmint-runtime}/Cargo.toml | 2 +- .../{westmint => westmint-runtime}/build.rs | 0 .../src/constants.rs | 0 .../{westmint => westmint-runtime}/src/lib.rs | 0 .../src/weights/mod.rs | 0 .../src/weights/pallet_assets.rs | 0 .../src/weights/pallet_balances.rs | 0 .../src/weights/pallet_collator_selection.rs | 0 .../src/weights/pallet_multisig.rs | 0 .../src/weights/pallet_proxy.rs | 0 .../src/weights/pallet_timestamp.rs | 0 .../src/weights/pallet_utility.rs | 0 41 files changed, 40 insertions(+), 111 deletions(-) rename polkadot-parachains/{statemine => statemine-runtime}/Cargo.toml (99%) rename polkadot-parachains/{statemine => statemine-runtime}/build.rs (100%) rename polkadot-parachains/{statemine => statemine-runtime}/src/constants.rs (100%) rename polkadot-parachains/{statemine => statemine-runtime}/src/lib.rs (100%) rename polkadot-parachains/{statemine => statemine-runtime}/src/weights/mod.rs (100%) rename polkadot-parachains/{statemine => statemine-runtime}/src/weights/pallet_assets.rs (100%) rename polkadot-parachains/{statemine => statemine-runtime}/src/weights/pallet_balances.rs (100%) rename polkadot-parachains/{statemine => statemine-runtime}/src/weights/pallet_collator_selection.rs (100%) rename polkadot-parachains/{statemine => statemine-runtime}/src/weights/pallet_multisig.rs (100%) rename polkadot-parachains/{statemine => statemine-runtime}/src/weights/pallet_proxy.rs (100%) rename polkadot-parachains/{statemine => statemine-runtime}/src/weights/pallet_timestamp.rs (100%) rename polkadot-parachains/{statemine => statemine-runtime}/src/weights/pallet_utility.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/Cargo.toml (99%) rename polkadot-parachains/{statemint => statemint-runtime}/build.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/src/constants.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/src/lib.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/src/weights/mod.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/src/weights/pallet_assets.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/src/weights/pallet_balances.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/src/weights/pallet_collator_selection.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/src/weights/pallet_multisig.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/src/weights/pallet_proxy.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/src/weights/pallet_timestamp.rs (100%) rename polkadot-parachains/{statemint => statemint-runtime}/src/weights/pallet_utility.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/Cargo.toml (99%) rename polkadot-parachains/{westmint => westmint-runtime}/build.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/src/constants.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/src/lib.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/src/weights/mod.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/src/weights/pallet_assets.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/src/weights/pallet_balances.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/src/weights/pallet_collator_selection.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/src/weights/pallet_multisig.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/src/weights/pallet_proxy.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/src/weights/pallet_timestamp.rs (100%) rename polkadot-parachains/{westmint => westmint-runtime}/src/weights/pallet_utility.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 668efc8dcd7..837aea14141 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10557,7 +10557,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "statemine-runtime" -version = "0.1.0" +version = "1.0.0" dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", @@ -10620,7 +10620,7 @@ dependencies = [ [[package]] name = "statemint-common" -version = "0.8.30" +version = "1.0.0" dependencies = [ "frame-executive", "frame-support", @@ -10643,7 +10643,7 @@ dependencies = [ [[package]] name = "statemint-runtime" -version = "0.1.0" +version = "1.0.0" dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", @@ -12438,7 +12438,7 @@ dependencies = [ [[package]] name = "westmint-runtime" -version = "0.1.0" +version = "1.0.0" dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", diff --git a/Cargo.toml b/Cargo.toml index 6c577eb54eb..e42baff20f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,9 +22,9 @@ members = [ "polkadot-parachains/rococo-runtime", "polkadot-parachains/shell-runtime", "polkadot-parachains/statemint-common", - "polkadot-parachains/statemint", - "polkadot-parachains/statemine", - "polkadot-parachains/westmint", + "polkadot-parachains/statemint-runtime", + "polkadot-parachains/statemine-runtime", + "polkadot-parachains/westmint-runtime", "test/runtime", "test/runtime-upgrade", "test/client", diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml index 82a7974095a..0d8c0179556 100644 --- a/pallets/collator-selection/Cargo.toml +++ b/pallets/collator-selection/Cargo.toml @@ -1,12 +1,12 @@ [package] authors = ['Anonymous'] -description = 'parachain staking pallet.' +description = 'Simple staking pallet with a fixed stake.' edition = '2018' homepage = 'https://substrate.dev' license = 'Apache-2.0' name = 'pallet-collator-selection' readme = 'README.md' -repository = 'https://github.com/paritytech/substrate/' +repository = 'https://github.com/paritytech/cumulus/' version = '3.0.0' [package.metadata.docs.rs] diff --git a/polkadot-parachains/Cargo.toml b/polkadot-parachains/Cargo.toml index 3ffe96f2916..be5ad29e020 100644 --- a/polkadot-parachains/Cargo.toml +++ b/polkadot-parachains/Cargo.toml @@ -24,9 +24,9 @@ hex-literal = "0.2.1" # Parachain runtimes rococo-parachain-runtime = { package = "cumulus-rococo-parachain-runtime", path = "rococo-runtime" } shell-runtime = { package = "cumulus-shell-runtime", path = "shell-runtime" } -statemint-runtime = { path = "statemint" } -statemine-runtime = { path = "statemine" } -westmint-runtime = { path = "westmint" } +statemint-runtime = { path = "statemint-runtime" } +statemine-runtime = { path = "statemine-runtime" } +westmint-runtime = { path = "westmint-runtime" } statemint-common = { path = "statemint-common" } # Substrate dependencies diff --git a/polkadot-parachains/statemine/Cargo.toml b/polkadot-parachains/statemine-runtime/Cargo.toml similarity index 99% rename from polkadot-parachains/statemine/Cargo.toml rename to polkadot-parachains/statemine-runtime/Cargo.toml index 85b50683faa..f1c1a2f3c9e 100644 --- a/polkadot-parachains/statemine/Cargo.toml +++ b/polkadot-parachains/statemine-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = 'statemine-runtime' -version = '0.1.0' +version = '1.0.0' authors = ["Parity Technologies "] edition = '2018' description = "Kusama variant of Statemint parachain runtime" diff --git a/polkadot-parachains/statemine/build.rs b/polkadot-parachains/statemine-runtime/build.rs similarity index 100% rename from polkadot-parachains/statemine/build.rs rename to polkadot-parachains/statemine-runtime/build.rs diff --git a/polkadot-parachains/statemine/src/constants.rs b/polkadot-parachains/statemine-runtime/src/constants.rs similarity index 100% rename from polkadot-parachains/statemine/src/constants.rs rename to polkadot-parachains/statemine-runtime/src/constants.rs diff --git a/polkadot-parachains/statemine/src/lib.rs b/polkadot-parachains/statemine-runtime/src/lib.rs similarity index 100% rename from polkadot-parachains/statemine/src/lib.rs rename to polkadot-parachains/statemine-runtime/src/lib.rs diff --git a/polkadot-parachains/statemine/src/weights/mod.rs b/polkadot-parachains/statemine-runtime/src/weights/mod.rs similarity index 100% rename from polkadot-parachains/statemine/src/weights/mod.rs rename to polkadot-parachains/statemine-runtime/src/weights/mod.rs diff --git a/polkadot-parachains/statemine/src/weights/pallet_assets.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_assets.rs similarity index 100% rename from polkadot-parachains/statemine/src/weights/pallet_assets.rs rename to polkadot-parachains/statemine-runtime/src/weights/pallet_assets.rs diff --git a/polkadot-parachains/statemine/src/weights/pallet_balances.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_balances.rs similarity index 100% rename from polkadot-parachains/statemine/src/weights/pallet_balances.rs rename to polkadot-parachains/statemine-runtime/src/weights/pallet_balances.rs diff --git a/polkadot-parachains/statemine/src/weights/pallet_collator_selection.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_collator_selection.rs similarity index 100% rename from polkadot-parachains/statemine/src/weights/pallet_collator_selection.rs rename to polkadot-parachains/statemine-runtime/src/weights/pallet_collator_selection.rs diff --git a/polkadot-parachains/statemine/src/weights/pallet_multisig.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_multisig.rs similarity index 100% rename from polkadot-parachains/statemine/src/weights/pallet_multisig.rs rename to polkadot-parachains/statemine-runtime/src/weights/pallet_multisig.rs diff --git a/polkadot-parachains/statemine/src/weights/pallet_proxy.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_proxy.rs similarity index 100% rename from polkadot-parachains/statemine/src/weights/pallet_proxy.rs rename to polkadot-parachains/statemine-runtime/src/weights/pallet_proxy.rs diff --git a/polkadot-parachains/statemine/src/weights/pallet_timestamp.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_timestamp.rs similarity index 100% rename from polkadot-parachains/statemine/src/weights/pallet_timestamp.rs rename to polkadot-parachains/statemine-runtime/src/weights/pallet_timestamp.rs diff --git a/polkadot-parachains/statemine/src/weights/pallet_utility.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_utility.rs similarity index 100% rename from polkadot-parachains/statemine/src/weights/pallet_utility.rs rename to polkadot-parachains/statemine-runtime/src/weights/pallet_utility.rs diff --git a/polkadot-parachains/statemint-common/Cargo.toml b/polkadot-parachains/statemint-common/Cargo.toml index d1b4d6a7426..683cb2197eb 100644 --- a/polkadot-parachains/statemint-common/Cargo.toml +++ b/polkadot-parachains/statemint-common/Cargo.toml @@ -1,114 +1,43 @@ -[build-dependencies.substrate-wasm-builder] -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '4.0.0' - [package] name = "statemint-common" -version = "0.8.30" +version = "1.0.0" authors = ["Parity Technologies "] edition = "2018" +description = "Logic which is common to all Statemint variant runtimes" [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] -[dependencies.sp-consensus-aura] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '0.9.0' - -[dependencies.sp-std] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-io] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.codec] -default-features = false -features = ['derive'] -package = 'parity-scale-codec' -version = '2.0.0' - -[dependencies.frame-executive] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-support] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.frame-system] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - - -[dependencies.pallet-balances] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-runtime] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.sp-core] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dependencies.node-primitives] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" - -[dependencies.polkadot-runtime-common] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false +[dependencies] +# External dependencies +codec = { package = 'parity-scale-codec', version = '2.0.0', features = ['derive'], default-features = false } + +# Substrate dependencies +sp-consensus-aura = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } +sp-std = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } +sp-io = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } +frame-executive = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } +frame-support = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } +frame-system = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } +pallet-balances = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } +sp-runtime = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } +sp-core = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } +node-primitives = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } # Polkadot dependencies -[dependencies.polkadot-primitives] -git = 'https://github.com/paritytech/polkadot' -branch = "master" -default-features = false +polkadot-runtime-common = { git = 'https://github.com/paritytech/polkadot', branch = "master", default-features = false } +polkadot-primitives = { git = 'https://github.com/paritytech/polkadot', branch = "master", default-features = false } -[dependencies.pallet-collator-selection] -default-features = false -path = '../../pallets/collator-selection' +# Local dependencies +pallet-collator-selection = { path = '../../pallets/collator-selection', default-features = false } [dev-dependencies] serde = { version = "1.0.119" } +sp-io = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } +pallet-authorship = { git = 'https://github.com/paritytech/substrate', branch = "master", default-features = false } -[dev-dependencies.sp-io] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - -[dev-dependencies.pallet-authorship] -default-features = false -git = 'https://github.com/paritytech/substrate' -branch = "master" -version = '3.0.0' - - +[build-dependencies] +substrate-wasm-builder = { git = 'https://github.com/paritytech/substrate', branch = "master" } [features] default = ["std"] diff --git a/polkadot-parachains/statemint/Cargo.toml b/polkadot-parachains/statemint-runtime/Cargo.toml similarity index 99% rename from polkadot-parachains/statemint/Cargo.toml rename to polkadot-parachains/statemint-runtime/Cargo.toml index 14210a5ae05..4f906aaaccf 100644 --- a/polkadot-parachains/statemint/Cargo.toml +++ b/polkadot-parachains/statemint-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = 'statemint-runtime' -version = '0.1.0' +version = '1.0.0' authors = ["Parity Technologies "] edition = '2018' description = "Statemint parachain runtime" diff --git a/polkadot-parachains/statemint/build.rs b/polkadot-parachains/statemint-runtime/build.rs similarity index 100% rename from polkadot-parachains/statemint/build.rs rename to polkadot-parachains/statemint-runtime/build.rs diff --git a/polkadot-parachains/statemint/src/constants.rs b/polkadot-parachains/statemint-runtime/src/constants.rs similarity index 100% rename from polkadot-parachains/statemint/src/constants.rs rename to polkadot-parachains/statemint-runtime/src/constants.rs diff --git a/polkadot-parachains/statemint/src/lib.rs b/polkadot-parachains/statemint-runtime/src/lib.rs similarity index 100% rename from polkadot-parachains/statemint/src/lib.rs rename to polkadot-parachains/statemint-runtime/src/lib.rs diff --git a/polkadot-parachains/statemint/src/weights/mod.rs b/polkadot-parachains/statemint-runtime/src/weights/mod.rs similarity index 100% rename from polkadot-parachains/statemint/src/weights/mod.rs rename to polkadot-parachains/statemint-runtime/src/weights/mod.rs diff --git a/polkadot-parachains/statemint/src/weights/pallet_assets.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_assets.rs similarity index 100% rename from polkadot-parachains/statemint/src/weights/pallet_assets.rs rename to polkadot-parachains/statemint-runtime/src/weights/pallet_assets.rs diff --git a/polkadot-parachains/statemint/src/weights/pallet_balances.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_balances.rs similarity index 100% rename from polkadot-parachains/statemint/src/weights/pallet_balances.rs rename to polkadot-parachains/statemint-runtime/src/weights/pallet_balances.rs diff --git a/polkadot-parachains/statemint/src/weights/pallet_collator_selection.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_collator_selection.rs similarity index 100% rename from polkadot-parachains/statemint/src/weights/pallet_collator_selection.rs rename to polkadot-parachains/statemint-runtime/src/weights/pallet_collator_selection.rs diff --git a/polkadot-parachains/statemint/src/weights/pallet_multisig.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_multisig.rs similarity index 100% rename from polkadot-parachains/statemint/src/weights/pallet_multisig.rs rename to polkadot-parachains/statemint-runtime/src/weights/pallet_multisig.rs diff --git a/polkadot-parachains/statemint/src/weights/pallet_proxy.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_proxy.rs similarity index 100% rename from polkadot-parachains/statemint/src/weights/pallet_proxy.rs rename to polkadot-parachains/statemint-runtime/src/weights/pallet_proxy.rs diff --git a/polkadot-parachains/statemint/src/weights/pallet_timestamp.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_timestamp.rs similarity index 100% rename from polkadot-parachains/statemint/src/weights/pallet_timestamp.rs rename to polkadot-parachains/statemint-runtime/src/weights/pallet_timestamp.rs diff --git a/polkadot-parachains/statemint/src/weights/pallet_utility.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_utility.rs similarity index 100% rename from polkadot-parachains/statemint/src/weights/pallet_utility.rs rename to polkadot-parachains/statemint-runtime/src/weights/pallet_utility.rs diff --git a/polkadot-parachains/westmint/Cargo.toml b/polkadot-parachains/westmint-runtime/Cargo.toml similarity index 99% rename from polkadot-parachains/westmint/Cargo.toml rename to polkadot-parachains/westmint-runtime/Cargo.toml index fbf14cb771a..84c36165e1d 100644 --- a/polkadot-parachains/westmint/Cargo.toml +++ b/polkadot-parachains/westmint-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = 'westmint-runtime' -version = '0.1.0' +version = '1.0.0' authors = ["Parity Technologies "] edition = '2018' description = "Westend variant of Statemint parachain runtime" diff --git a/polkadot-parachains/westmint/build.rs b/polkadot-parachains/westmint-runtime/build.rs similarity index 100% rename from polkadot-parachains/westmint/build.rs rename to polkadot-parachains/westmint-runtime/build.rs diff --git a/polkadot-parachains/westmint/src/constants.rs b/polkadot-parachains/westmint-runtime/src/constants.rs similarity index 100% rename from polkadot-parachains/westmint/src/constants.rs rename to polkadot-parachains/westmint-runtime/src/constants.rs diff --git a/polkadot-parachains/westmint/src/lib.rs b/polkadot-parachains/westmint-runtime/src/lib.rs similarity index 100% rename from polkadot-parachains/westmint/src/lib.rs rename to polkadot-parachains/westmint-runtime/src/lib.rs diff --git a/polkadot-parachains/westmint/src/weights/mod.rs b/polkadot-parachains/westmint-runtime/src/weights/mod.rs similarity index 100% rename from polkadot-parachains/westmint/src/weights/mod.rs rename to polkadot-parachains/westmint-runtime/src/weights/mod.rs diff --git a/polkadot-parachains/westmint/src/weights/pallet_assets.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_assets.rs similarity index 100% rename from polkadot-parachains/westmint/src/weights/pallet_assets.rs rename to polkadot-parachains/westmint-runtime/src/weights/pallet_assets.rs diff --git a/polkadot-parachains/westmint/src/weights/pallet_balances.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_balances.rs similarity index 100% rename from polkadot-parachains/westmint/src/weights/pallet_balances.rs rename to polkadot-parachains/westmint-runtime/src/weights/pallet_balances.rs diff --git a/polkadot-parachains/westmint/src/weights/pallet_collator_selection.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_collator_selection.rs similarity index 100% rename from polkadot-parachains/westmint/src/weights/pallet_collator_selection.rs rename to polkadot-parachains/westmint-runtime/src/weights/pallet_collator_selection.rs diff --git a/polkadot-parachains/westmint/src/weights/pallet_multisig.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_multisig.rs similarity index 100% rename from polkadot-parachains/westmint/src/weights/pallet_multisig.rs rename to polkadot-parachains/westmint-runtime/src/weights/pallet_multisig.rs diff --git a/polkadot-parachains/westmint/src/weights/pallet_proxy.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_proxy.rs similarity index 100% rename from polkadot-parachains/westmint/src/weights/pallet_proxy.rs rename to polkadot-parachains/westmint-runtime/src/weights/pallet_proxy.rs diff --git a/polkadot-parachains/westmint/src/weights/pallet_timestamp.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_timestamp.rs similarity index 100% rename from polkadot-parachains/westmint/src/weights/pallet_timestamp.rs rename to polkadot-parachains/westmint-runtime/src/weights/pallet_timestamp.rs diff --git a/polkadot-parachains/westmint/src/weights/pallet_utility.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_utility.rs similarity index 100% rename from polkadot-parachains/westmint/src/weights/pallet_utility.rs rename to polkadot-parachains/westmint-runtime/src/weights/pallet_utility.rs From 46e061375100545b026d46bbe300d73a084abb9a Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 1 Jun 2021 11:24:12 +0200 Subject: [PATCH 12/17] Update weights --- .../src/weights/pallet_assets.rs | 94 ++++++++-------- .../src/weights/pallet_balances.rs | 36 +++---- .../src/weights/pallet_collator_selection.rs | 74 ++++++------- .../src/weights/pallet_multisig.rs | 86 +++++++-------- .../src/weights/pallet_proxy.rs | 102 +++++++++--------- .../src/weights/pallet_timestamp.rs | 30 ++---- .../src/weights/pallet_utility.rs | 40 +++---- .../src/weights/pallet_assets.rs | 92 ++++++++-------- .../src/weights/pallet_balances.rs | 36 +++---- .../src/weights/pallet_collator_selection.rs | 76 ++++++------- .../src/weights/pallet_multisig.rs | 84 +++++++-------- .../src/weights/pallet_proxy.rs | 102 +++++++++--------- .../src/weights/pallet_timestamp.rs | 30 ++---- .../src/weights/pallet_utility.rs | 40 +++---- .../src/weights/pallet_assets.rs | 92 ++++++++-------- .../src/weights/pallet_balances.rs | 36 +++---- .../src/weights/pallet_collator_selection.rs | 76 ++++++------- .../src/weights/pallet_multisig.rs | 84 +++++++-------- .../src/weights/pallet_proxy.rs | 102 +++++++++--------- .../src/weights/pallet_timestamp.rs | 30 ++---- .../src/weights/pallet_utility.rs | 40 +++---- 21 files changed, 615 insertions(+), 767 deletions(-) diff --git a/polkadot-parachains/statemine-runtime/src/weights/pallet_assets.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_assets.rs index 9a1b41900ed..2fef7c64ede 100644 --- a/polkadot-parachains/statemine-runtime/src/weights/pallet_assets.rs +++ b/polkadot-parachains/statemine-runtime/src/weights/pallet_assets.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_assets //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_assets -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemine-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_assets +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./ +// --output=./runtime/statemine/src/weights/ #![allow(unused_parens)] @@ -37,21 +29,23 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_assets::WeightInfo for WeightInfo { fn create() -> Weight { - (68_000_000 as Weight) + (44_224_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_create() -> Weight { - (34_000_000 as Weight) + (22_533_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn destroy(c: u32, s: u32, a: u32, ) -> Weight { (0 as Weight) - // Standard Error: 440_000 - .saturating_add((33_246_000 as Weight).saturating_mul(c as Weight)) - // Standard Error: 440_000 - .saturating_add((47_556_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 37_000 + .saturating_add((21_529_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 37_000 + .saturating_add((28_905_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 377_000 + .saturating_add((3_745_000 as Weight).saturating_mul(a as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(s as Weight))) @@ -61,108 +55,106 @@ impl pallet_assets::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(a as Weight))) } fn mint() -> Weight { - (103_000_000 as Weight) + (49_078_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn burn() -> Weight { - (115_000_000 as Weight) + (55_886_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn transfer() -> Weight { - (153_000_000 as Weight) + (84_857_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn transfer_keep_alive() -> Weight { - (124_000_000 as Weight) + (71_330_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn force_transfer() -> Weight { - (145_000_000 as Weight) + (85_127_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn freeze() -> Weight { - (49_000_000 as Weight) + (31_403_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn thaw() -> Weight { - (47_000_000 as Weight) + (31_250_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn freeze_asset() -> Weight { - (34_000_000 as Weight) + (22_097_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn thaw_asset() -> Weight { - (34_000_000 as Weight) + (22_245_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_ownership() -> Weight { - (39_000_000 as Weight) + (25_479_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_team() -> Weight { - (35_000_000 as Weight) + (22_271_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_metadata(_n: u32, s: u32, ) -> Weight { - (75_032_000 as Weight) - // Standard Error: 20_000 - .saturating_add((18_000 as Weight).saturating_mul(s as Weight)) + (50_315_000 as Weight) + // Standard Error: 0 + .saturating_add((8_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn clear_metadata() -> Weight { - (70_000_000 as Weight) + (48_134_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn force_set_metadata(n: u32, s: u32, ) -> Weight { - (34_085_000 as Weight) - // Standard Error: 21_000 - .saturating_add((48_000 as Weight).saturating_mul(n as Weight)) - // Standard Error: 21_000 - .saturating_add((53_000 as Weight).saturating_mul(s as Weight)) + fn force_set_metadata(_n: u32, s: u32, ) -> Weight { + (25_933_000 as Weight) + // Standard Error: 0 + .saturating_add((7_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_clear_metadata() -> Weight { - (73_000_000 as Weight) + (49_243_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_asset_status() -> Weight { - (33_000_000 as Weight) + (22_305_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn approve_transfer() -> Weight { - (67_000_000 as Weight) + (48_885_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_approved() -> Weight { - (149_000_000 as Weight) + (108_026_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) } fn cancel_approval() -> Weight { - (62_000_000 as Weight) + (48_943_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_cancel_approval() -> Weight { - (71_000_000 as Weight) + (56_914_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } diff --git a/polkadot-parachains/statemine-runtime/src/weights/pallet_balances.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_balances.rs index c3060cb9c0e..6d264d6e885 100644 --- a/polkadot-parachains/statemine-runtime/src/weights/pallet_balances.rs +++ b/polkadot-parachains/statemine-runtime/src/weights/pallet_balances.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_balances //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemine-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_balances -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemine-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_balances +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemine/src/weights/ +// --output=./runtime/statemine/src/weights/ #![allow(unused_parens)] @@ -37,27 +29,27 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_balances::WeightInfo for WeightInfo { fn transfer() -> Weight { - (121_000_000 as Weight) + (79_381_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_keep_alive() -> Weight { - (89_000_000 as Weight) + (58_057_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_creating() -> Weight { - (45_000_000 as Weight) + (28_834_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_killing() -> Weight { - (55_000_000 as Weight) + (36_213_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_transfer() -> Weight { - (118_000_000 as Weight) + (78_526_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } diff --git a/polkadot-parachains/statemine-runtime/src/weights/pallet_collator_selection.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_collator_selection.rs index dfca2ab7d63..1c47f9071f5 100644 --- a/polkadot-parachains/statemine-runtime/src/weights/pallet_collator_selection.rs +++ b/polkadot-parachains/statemine-runtime/src/weights/pallet_collator_selection.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_collator_selection //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-05-04, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemine-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_collator_selection -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemine-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_collator_selection +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemine/src/weights/ +// --output=./runtime/statemine/src/weights/ #![allow(unused_parens)] @@ -37,47 +29,47 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_collator_selection::WeightInfo for WeightInfo { fn set_invulnerables(b: u32, ) -> Weight { - (34_775_000 as Weight) - // Standard Error: 2_000 - .saturating_add((159_000 as Weight).saturating_mul(b as Weight)) + (18_481_000 as Weight) + // Standard Error: 0 + .saturating_add((67_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_desired_candidates() -> Weight { - (29_000_000 as Weight) + (16_376_000 as Weight) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_candidacy_bond() -> Weight { - (30_000_000 as Weight) + (17_031_000 as Weight) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn register_as_candidate(c: u32, ) -> Weight { - (116_537_000 as Weight) - // Standard Error: 4_000 - .saturating_add((330_000 as Weight).saturating_mul(c as Weight)) + (72_345_000 as Weight) + // Standard Error: 0 + .saturating_add((197_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn leave_intent(c: u32, ) -> Weight { - (66_542_000 as Weight) + (55_446_000 as Weight) // Standard Error: 0 - .saturating_add((335_000 as Weight).saturating_mul(c as Weight)) + .saturating_add((153_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - fn note_author(c: u32, ) -> Weight { - (118_918_000 as Weight) - // Standard Error: 1_000 - .saturating_add((334_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(T::DbWeight::get().reads(4 as Weight)) + fn note_author() -> Weight { + (71_828_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn new_session(r: u32, c: u32, ) -> Weight { - (45_567_000 as Weight) - // Standard Error: 3_000 - .saturating_add((16_000 as Weight).saturating_mul(r as Weight)) - // Standard Error: 3_000 - .saturating_add((359_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + (0 as Weight) + // Standard Error: 1_004_000 + .saturating_add((110_066_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_004_000 + .saturating_add((152_035_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(c as Weight))) } } diff --git a/polkadot-parachains/statemine-runtime/src/weights/pallet_multisig.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_multisig.rs index cb16c5c93b1..c6b4b28eabf 100644 --- a/polkadot-parachains/statemine-runtime/src/weights/pallet_multisig.rs +++ b/polkadot-parachains/statemine-runtime/src/weights/pallet_multisig.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_multisig //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemine-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_multisig -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemine-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_multisig +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemine/src/weights/ +// --output=./runtime/statemine/src/weights/ #![allow(unused_parens)] @@ -37,78 +29,80 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_multisig::WeightInfo for WeightInfo { fn as_multi_threshold_1(z: u32, ) -> Weight { - (15_968_000 as Weight) + (15_911_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) } - fn as_multi_create(s: u32, _z: u32, ) -> Weight { - (87_843_000 as Weight) - // Standard Error: 19_000 - .saturating_add((193_000 as Weight).saturating_mul(s as Weight)) + fn as_multi_create(s: u32, z: u32, ) -> Weight { + (55_326_000 as Weight) + // Standard Error: 0 + .saturating_add((133_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn as_multi_create_store(s: u32, z: u32, ) -> Weight { - (89_845_000 as Weight) - // Standard Error: 8_000 - .saturating_add((131_000 as Weight).saturating_mul(s as Weight)) + (62_423_000 as Weight) + // Standard Error: 0 + .saturating_add((133_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn as_multi_approve(s: u32, z: u32, ) -> Weight { - (42_425_000 as Weight) - // Standard Error: 6_000 - .saturating_add((152_000 as Weight).saturating_mul(s as Weight)) + (32_430_000 as Weight) + // Standard Error: 0 + .saturating_add((148_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn as_multi_approve_store(s: u32, z: u32, ) -> Weight { - (90_210_000 as Weight) - // Standard Error: 8_000 - .saturating_add((129_000 as Weight).saturating_mul(s as Weight)) + (59_789_000 as Weight) + // Standard Error: 0 + .saturating_add((165_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn as_multi_complete(s: u32, z: u32, ) -> Weight { - (119_722_000 as Weight) - // Standard Error: 7_000 - .saturating_add((227_000 as Weight).saturating_mul(s as Weight)) + (80_926_000 as Weight) + // Standard Error: 0 + .saturating_add((276_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((5_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn approve_as_multi_create(s: u32, ) -> Weight { - (80_661_000 as Weight) - // Standard Error: 6_000 - .saturating_add((160_000 as Weight).saturating_mul(s as Weight)) + (54_860_000 as Weight) + // Standard Error: 0 + .saturating_add((134_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn approve_as_multi_approve(s: u32, ) -> Weight { - (47_143_000 as Weight) - // Standard Error: 13_000 - .saturating_add((132_000 as Weight).saturating_mul(s as Weight)) + (31_924_000 as Weight) + // Standard Error: 0 + .saturating_add((154_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn approve_as_multi_complete(s: u32, ) -> Weight { - (193_273_000 as Weight) - // Standard Error: 22_000 - .saturating_add((288_000 as Weight).saturating_mul(s as Weight)) + (154_001_000 as Weight) + // Standard Error: 0 + .saturating_add((281_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn cancel_as_multi(s: u32, ) -> Weight { - (143_968_000 as Weight) - // Standard Error: 42_000 - .saturating_add((161_000 as Weight).saturating_mul(s as Weight)) + (103_770_000 as Weight) + // Standard Error: 0 + .saturating_add((130_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } diff --git a/polkadot-parachains/statemine-runtime/src/weights/pallet_proxy.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_proxy.rs index 6a8a0e70f8d..40b03c31454 100644 --- a/polkadot-parachains/statemine-runtime/src/weights/pallet_proxy.rs +++ b/polkadot-parachains/statemine-runtime/src/weights/pallet_proxy.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_proxy //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemine-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_proxy -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemine-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_proxy +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemine/src/weights/ +// --output=./runtime/statemine/src/weights/ #![allow(unused_parens)] @@ -37,77 +29,79 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_proxy::WeightInfo for WeightInfo { fn proxy(p: u32, ) -> Weight { - (41_425_000 as Weight) - // Standard Error: 30_000 - .saturating_add((27_000 as Weight).saturating_mul(p as Weight)) + (27_318_000 as Weight) + // Standard Error: 1_000 + .saturating_add((208_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) } fn proxy_announced(a: u32, p: u32, ) -> Weight { - (86_865_000 as Weight) - // Standard Error: 48_000 - .saturating_add((664_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 50_000 - .saturating_add((260_000 as Weight).saturating_mul(p as Weight)) + (60_665_000 as Weight) + // Standard Error: 2_000 + .saturating_add((677_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((197_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn remove_announcement(a: u32, p: u32, ) -> Weight { - (53_426_000 as Weight) - // Standard Error: 28_000 - .saturating_add((781_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 30_000 - .saturating_add((95_000 as Weight).saturating_mul(p as Weight)) + (39_455_000 as Weight) + // Standard Error: 2_000 + .saturating_add((687_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((3_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - fn reject_announcement(a: u32, _p: u32, ) -> Weight { - (63_306_000 as Weight) - // Standard Error: 53_000 - .saturating_add((600_000 as Weight).saturating_mul(a as Weight)) + fn reject_announcement(a: u32, p: u32, ) -> Weight { + (39_411_000 as Weight) + // Standard Error: 2_000 + .saturating_add((686_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((3_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn announce(a: u32, p: u32, ) -> Weight { - (68_365_000 as Weight) - // Standard Error: 42_000 - .saturating_add((1_019_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 44_000 - .saturating_add((456_000 as Weight).saturating_mul(p as Weight)) + (54_386_000 as Weight) + // Standard Error: 2_000 + .saturating_add((677_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((194_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn add_proxy(p: u32, ) -> Weight { - (58_989_000 as Weight) - // Standard Error: 31_000 - .saturating_add((206_000 as Weight).saturating_mul(p as Weight)) + (37_411_000 as Weight) + // Standard Error: 2_000 + .saturating_add((298_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxy(p: u32, ) -> Weight { - (57_345_000 as Weight) - // Standard Error: 12_000 - .saturating_add((190_000 as Weight).saturating_mul(p as Weight)) + (36_658_000 as Weight) + // Standard Error: 2_000 + .saturating_add((332_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxies(p: u32, ) -> Weight { - (52_583_000 as Weight) - // Standard Error: 10_000 - .saturating_add((203_000 as Weight).saturating_mul(p as Weight)) + (34_893_000 as Weight) + // Standard Error: 1_000 + .saturating_add((209_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn anonymous(p: u32, ) -> Weight { - (74_677_000 as Weight) - // Standard Error: 10_000 - .saturating_add((60_000 as Weight).saturating_mul(p as Weight)) + (51_243_000 as Weight) + // Standard Error: 1_000 + .saturating_add((44_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn kill_anonymous(p: u32, ) -> Weight { - (54_531_000 as Weight) - // Standard Error: 26_000 - .saturating_add((231_000 as Weight).saturating_mul(p as Weight)) + (37_188_000 as Weight) + // Standard Error: 1_000 + .saturating_add((208_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } diff --git a/polkadot-parachains/statemine-runtime/src/weights/pallet_timestamp.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_timestamp.rs index e827cc695b2..1fc4b5aadea 100644 --- a/polkadot-parachains/statemine-runtime/src/weights/pallet_timestamp.rs +++ b/polkadot-parachains/statemine-runtime/src/weights/pallet_timestamp.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_timestamp //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemine-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_timestamp -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemine-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_timestamp +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemine/src/weights/ +// --output=./runtime/statemine/src/weights/ #![allow(unused_parens)] @@ -37,11 +29,11 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { - (14_000_000 as Weight) + (7_543_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn on_finalize() -> Weight { - (7_000_000 as Weight) + (4_272_000 as Weight) } } diff --git a/polkadot-parachains/statemine-runtime/src/weights/pallet_utility.rs b/polkadot-parachains/statemine-runtime/src/weights/pallet_utility.rs index 2ea32934ea2..622bd8b6954 100644 --- a/polkadot-parachains/statemine-runtime/src/weights/pallet_utility.rs +++ b/polkadot-parachains/statemine-runtime/src/weights/pallet_utility.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_utility //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemine-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemine-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_utility -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemine-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_utility +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemine/src/weights/ +// --output=./runtime/statemine/src/weights/ #![allow(unused_parens)] @@ -37,16 +29,16 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_utility::WeightInfo for WeightInfo { fn batch(c: u32, ) -> Weight { - (1_626_000 as Weight) - // Standard Error: 34_000 - .saturating_add((4_399_000 as Weight).saturating_mul(c as Weight)) + (16_177_000 as Weight) + // Standard Error: 0 + .saturating_add((4_582_000 as Weight).saturating_mul(c as Weight)) } fn as_derivative() -> Weight { - (8_000_000 as Weight) + (7_848_000 as Weight) } fn batch_all(c: u32, ) -> Weight { - (12_789_000 as Weight) - // Standard Error: 20_000 - .saturating_add((4_375_000 as Weight).saturating_mul(c as Weight)) + (17_745_000 as Weight) + // Standard Error: 0 + .saturating_add((4_578_000 as Weight).saturating_mul(c as Weight)) } } diff --git a/polkadot-parachains/statemint-runtime/src/weights/pallet_assets.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_assets.rs index 9a1b41900ed..8d29d5fe0db 100644 --- a/polkadot-parachains/statemint-runtime/src/weights/pallet_assets.rs +++ b/polkadot-parachains/statemint-runtime/src/weights/pallet_assets.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_assets //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_assets -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_assets +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,21 +29,23 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_assets::WeightInfo for WeightInfo { fn create() -> Weight { - (68_000_000 as Weight) + (44_125_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_create() -> Weight { - (34_000_000 as Weight) + (22_842_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn destroy(c: u32, s: u32, a: u32, ) -> Weight { (0 as Weight) - // Standard Error: 440_000 - .saturating_add((33_246_000 as Weight).saturating_mul(c as Weight)) - // Standard Error: 440_000 - .saturating_add((47_556_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 37_000 + .saturating_add((21_822_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 37_000 + .saturating_add((29_044_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 370_000 + .saturating_add((3_000_000 as Weight).saturating_mul(a as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(s as Weight))) @@ -61,108 +55,106 @@ impl pallet_assets::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(a as Weight))) } fn mint() -> Weight { - (103_000_000 as Weight) + (49_933_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn burn() -> Weight { - (115_000_000 as Weight) + (56_434_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn transfer() -> Weight { - (153_000_000 as Weight) + (85_393_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn transfer_keep_alive() -> Weight { - (124_000_000 as Weight) + (72_039_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn force_transfer() -> Weight { - (145_000_000 as Weight) + (85_214_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn freeze() -> Weight { - (49_000_000 as Weight) + (31_915_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn thaw() -> Weight { - (47_000_000 as Weight) + (31_296_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn freeze_asset() -> Weight { - (34_000_000 as Weight) + (22_272_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn thaw_asset() -> Weight { - (34_000_000 as Weight) + (22_336_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_ownership() -> Weight { - (39_000_000 as Weight) + (25_526_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_team() -> Weight { - (35_000_000 as Weight) + (22_632_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_metadata(_n: u32, s: u32, ) -> Weight { - (75_032_000 as Weight) - // Standard Error: 20_000 - .saturating_add((18_000 as Weight).saturating_mul(s as Weight)) + (50_330_000 as Weight) + // Standard Error: 0 + .saturating_add((9_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn clear_metadata() -> Weight { - (70_000_000 as Weight) + (48_266_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn force_set_metadata(n: u32, s: u32, ) -> Weight { - (34_085_000 as Weight) - // Standard Error: 21_000 - .saturating_add((48_000 as Weight).saturating_mul(n as Weight)) - // Standard Error: 21_000 - .saturating_add((53_000 as Weight).saturating_mul(s as Weight)) + fn force_set_metadata(_n: u32, s: u32, ) -> Weight { + (26_249_000 as Weight) + // Standard Error: 0 + .saturating_add((6_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_clear_metadata() -> Weight { - (73_000_000 as Weight) + (49_616_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_asset_status() -> Weight { - (33_000_000 as Weight) + (22_596_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn approve_transfer() -> Weight { - (67_000_000 as Weight) + (48_708_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_approved() -> Weight { - (149_000_000 as Weight) + (108_476_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) } fn cancel_approval() -> Weight { - (62_000_000 as Weight) + (49_157_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_cancel_approval() -> Weight { - (71_000_000 as Weight) + (56_862_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } diff --git a/polkadot-parachains/statemint-runtime/src/weights/pallet_balances.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_balances.rs index 57e10a70aa3..2105a17d530 100644 --- a/polkadot-parachains/statemint-runtime/src/weights/pallet_balances.rs +++ b/polkadot-parachains/statemint-runtime/src/weights/pallet_balances.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_balances //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_balances -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_balances +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,27 +29,27 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_balances::WeightInfo for WeightInfo { fn transfer() -> Weight { - (119_000_000 as Weight) + (79_601_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_keep_alive() -> Weight { - (87_000_000 as Weight) + (58_429_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_creating() -> Weight { - (45_000_000 as Weight) + (29_124_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_killing() -> Weight { - (55_000_000 as Weight) + (36_476_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_transfer() -> Weight { - (110_000_000 as Weight) + (78_772_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } diff --git a/polkadot-parachains/statemint-runtime/src/weights/pallet_collator_selection.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_collator_selection.rs index fad9de8bab6..cc687af762f 100644 --- a/polkadot-parachains/statemint-runtime/src/weights/pallet_collator_selection.rs +++ b/polkadot-parachains/statemint-runtime/src/weights/pallet_collator_selection.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_collator_selection //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-05-04, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_collator_selection -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_collator_selection +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,47 +29,47 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_collator_selection::WeightInfo for WeightInfo { fn set_invulnerables(b: u32, ) -> Weight { - (36_147_000 as Weight) - // Standard Error: 22_000 - .saturating_add((50_000 as Weight).saturating_mul(b as Weight)) + (18_563_000 as Weight) + // Standard Error: 0 + .saturating_add((68_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_desired_candidates() -> Weight { - (25_000_000 as Weight) + (16_363_000 as Weight) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_candidacy_bond() -> Weight { - (26_000_000 as Weight) + (16_840_000 as Weight) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn register_as_candidate(c: u32, ) -> Weight { - (90_380_000 as Weight) - // Standard Error: 8_000 - .saturating_add((314_000 as Weight).saturating_mul(c as Weight)) + (71_196_000 as Weight) + // Standard Error: 0 + .saturating_add((198_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn leave_intent(c: u32, ) -> Weight { - (65_617_000 as Weight) - // Standard Error: 4_000 - .saturating_add((325_000 as Weight).saturating_mul(c as Weight)) + (55_336_000 as Weight) + // Standard Error: 0 + .saturating_add((151_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - fn note_author(c: u32, ) -> Weight { - (138_742_000 as Weight) - // Standard Error: 4_000 - .saturating_add((255_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(T::DbWeight::get().reads(4 as Weight)) + fn note_author() -> Weight { + (71_461_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn new_session(r: u32, c: u32, ) -> Weight { - (59_461_000 as Weight) - // Standard Error: 4_000 - .saturating_add((2_000 as Weight).saturating_mul(r as Weight)) - // Standard Error: 4_000 - .saturating_add((291_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + (0 as Weight) + // Standard Error: 1_010_000 + .saturating_add((109_961_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_010_000 + .saturating_add((151_952_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(c as Weight))) } } diff --git a/polkadot-parachains/statemint-runtime/src/weights/pallet_multisig.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_multisig.rs index f372e653085..e1b7bd5b902 100644 --- a/polkadot-parachains/statemint-runtime/src/weights/pallet_multisig.rs +++ b/polkadot-parachains/statemint-runtime/src/weights/pallet_multisig.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_multisig //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_multisig -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_multisig +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,78 +29,80 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_multisig::WeightInfo for WeightInfo { fn as_multi_threshold_1(z: u32, ) -> Weight { - (15_910_000 as Weight) + (14_936_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) } fn as_multi_create(s: u32, z: u32, ) -> Weight { - (80_512_000 as Weight) - // Standard Error: 3_000 - .saturating_add((107_000 as Weight).saturating_mul(s as Weight)) + (56_090_000 as Weight) + // Standard Error: 1_000 + .saturating_add((63_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn as_multi_create_store(s: u32, z: u32, ) -> Weight { - (90_834_000 as Weight) - // Standard Error: 2_000 - .saturating_add((106_000 as Weight).saturating_mul(s as Weight)) + (62_519_000 as Weight) + // Standard Error: 1_000 + .saturating_add((66_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn as_multi_approve(s: u32, z: u32, ) -> Weight { - (43_694_000 as Weight) - // Standard Error: 1_000 - .saturating_add((142_000 as Weight).saturating_mul(s as Weight)) + (30_781_000 as Weight) + // Standard Error: 0 + .saturating_add((111_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn as_multi_approve_store(s: u32, z: u32, ) -> Weight { - (86_160_000 as Weight) - // Standard Error: 5_000 - .saturating_add((148_000 as Weight).saturating_mul(s as Weight)) + (60_393_000 as Weight) + // Standard Error: 0 + .saturating_add((118_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn as_multi_complete(s: u32, z: u32, ) -> Weight { - (119_030_000 as Weight) - // Standard Error: 46_000 - .saturating_add((302_000 as Weight).saturating_mul(s as Weight)) + (81_704_000 as Weight) + // Standard Error: 1_000 + .saturating_add((248_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 - .saturating_add((6_000 as Weight).saturating_mul(z as Weight)) + .saturating_add((5_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn approve_as_multi_create(s: u32, ) -> Weight { - (82_860_000 as Weight) - // Standard Error: 24_000 - .saturating_add((95_000 as Weight).saturating_mul(s as Weight)) + (55_585_000 as Weight) + // Standard Error: 1_000 + .saturating_add((115_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn approve_as_multi_approve(s: u32, ) -> Weight { - (46_197_000 as Weight) - // Standard Error: 5_000 - .saturating_add((110_000 as Weight).saturating_mul(s as Weight)) + (33_483_000 as Weight) + // Standard Error: 1_000 + .saturating_add((82_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn approve_as_multi_complete(s: u32, ) -> Weight { - (193_380_000 as Weight) - // Standard Error: 10_000 - .saturating_add((297_000 as Weight).saturating_mul(s as Weight)) + (154_732_000 as Weight) + // Standard Error: 1_000 + .saturating_add((253_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } - fn cancel_as_multi(_s: u32, ) -> Weight { - (172_508_000 as Weight) + fn cancel_as_multi(s: u32, ) -> Weight { + (104_447_000 as Weight) + // Standard Error: 1_000 + .saturating_add((114_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } diff --git a/polkadot-parachains/statemint-runtime/src/weights/pallet_proxy.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_proxy.rs index 6a7af9fb2f0..97e97ac73e6 100644 --- a/polkadot-parachains/statemint-runtime/src/weights/pallet_proxy.rs +++ b/polkadot-parachains/statemint-runtime/src/weights/pallet_proxy.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_proxy //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_proxy -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_proxy +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -36,76 +28,80 @@ use sp_std::marker::PhantomData; /// Weight functions for pallet_proxy. pub struct WeightInfo(PhantomData); impl pallet_proxy::WeightInfo for WeightInfo { - fn proxy(_p: u32, ) -> Weight { - (43_004_000 as Weight) + fn proxy(p: u32, ) -> Weight { + (27_585_000 as Weight) + // Standard Error: 1_000 + .saturating_add((203_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) } fn proxy_announced(a: u32, p: u32, ) -> Weight { - (84_139_000 as Weight) - // Standard Error: 63_000 - .saturating_add((877_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 66_000 - .saturating_add((234_000 as Weight).saturating_mul(p as Weight)) + (61_093_000 as Weight) + // Standard Error: 2_000 + .saturating_add((680_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((201_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn remove_announcement(a: u32, p: u32, ) -> Weight { - (54_559_000 as Weight) - // Standard Error: 5_000 - .saturating_add((783_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 6_000 - .saturating_add((35_000 as Weight).saturating_mul(p as Weight)) + (39_494_000 as Weight) + // Standard Error: 2_000 + .saturating_add((686_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((1_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn reject_announcement(a: u32, p: u32, ) -> Weight { - (46_951_000 as Weight) - // Standard Error: 42_000 - .saturating_add((956_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 43_000 - .saturating_add((327_000 as Weight).saturating_mul(p as Weight)) + (39_817_000 as Weight) + // Standard Error: 2_000 + .saturating_add((685_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((1_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn announce(a: u32, p: u32, ) -> Weight { - (77_309_000 as Weight) - // Standard Error: 40_000 - .saturating_add((815_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 42_000 - .saturating_add((258_000 as Weight).saturating_mul(p as Weight)) + (54_835_000 as Weight) + // Standard Error: 2_000 + .saturating_add((684_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((205_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - fn add_proxy(_p: u32, ) -> Weight { - (71_647_000 as Weight) + fn add_proxy(p: u32, ) -> Weight { + (37_625_000 as Weight) + // Standard Error: 2_000 + .saturating_add((300_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxy(p: u32, ) -> Weight { - (54_361_000 as Weight) - // Standard Error: 17_000 - .saturating_add((312_000 as Weight).saturating_mul(p as Weight)) + (36_945_000 as Weight) + // Standard Error: 3_000 + .saturating_add((325_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxies(p: u32, ) -> Weight { - (53_211_000 as Weight) - // Standard Error: 12_000 - .saturating_add((192_000 as Weight).saturating_mul(p as Weight)) + (35_128_000 as Weight) + // Standard Error: 1_000 + .saturating_add((209_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn anonymous(p: u32, ) -> Weight { - (76_563_000 as Weight) - // Standard Error: 17_000 - .saturating_add((12_000 as Weight).saturating_mul(p as Weight)) + (51_624_000 as Weight) + // Standard Error: 1_000 + .saturating_add((41_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn kill_anonymous(p: u32, ) -> Weight { - (54_365_000 as Weight) - // Standard Error: 28_000 - .saturating_add((251_000 as Weight).saturating_mul(p as Weight)) + (37_469_000 as Weight) + // Standard Error: 1_000 + .saturating_add((204_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } diff --git a/polkadot-parachains/statemint-runtime/src/weights/pallet_timestamp.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_timestamp.rs index 573d8f9b7d1..f016bc460dd 100644 --- a/polkadot-parachains/statemint-runtime/src/weights/pallet_timestamp.rs +++ b/polkadot-parachains/statemint-runtime/src/weights/pallet_timestamp.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_timestamp //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_timestamp -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_timestamp +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,11 +29,11 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { - (16_000_000 as Weight) + (7_687_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn on_finalize() -> Weight { - (8_000_000 as Weight) + (4_303_000 as Weight) } } diff --git a/polkadot-parachains/statemint-runtime/src/weights/pallet_utility.rs b/polkadot-parachains/statemint-runtime/src/weights/pallet_utility.rs index 7248388a406..3b7c921de4c 100644 --- a/polkadot-parachains/statemint-runtime/src/weights/pallet_utility.rs +++ b/polkadot-parachains/statemint-runtime/src/weights/pallet_utility.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_utility //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_utility -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_utility +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,16 +29,16 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_utility::WeightInfo for WeightInfo { fn batch(c: u32, ) -> Weight { - (0 as Weight) - // Standard Error: 65_000 - .saturating_add((4_751_000 as Weight).saturating_mul(c as Weight)) + (15_408_000 as Weight) + // Standard Error: 0 + .saturating_add((4_571_000 as Weight).saturating_mul(c as Weight)) } fn as_derivative() -> Weight { - (10_000_000 as Weight) + (7_817_000 as Weight) } fn batch_all(c: u32, ) -> Weight { - (0 as Weight) - // Standard Error: 71_000 - .saturating_add((4_866_000 as Weight).saturating_mul(c as Weight)) + (16_520_000 as Weight) + // Standard Error: 0 + .saturating_add((4_571_000 as Weight).saturating_mul(c as Weight)) } } diff --git a/polkadot-parachains/westmint-runtime/src/weights/pallet_assets.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_assets.rs index 9a1b41900ed..8d29d5fe0db 100644 --- a/polkadot-parachains/westmint-runtime/src/weights/pallet_assets.rs +++ b/polkadot-parachains/westmint-runtime/src/weights/pallet_assets.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_assets //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_assets -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_assets +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,21 +29,23 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_assets::WeightInfo for WeightInfo { fn create() -> Weight { - (68_000_000 as Weight) + (44_125_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_create() -> Weight { - (34_000_000 as Weight) + (22_842_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn destroy(c: u32, s: u32, a: u32, ) -> Weight { (0 as Weight) - // Standard Error: 440_000 - .saturating_add((33_246_000 as Weight).saturating_mul(c as Weight)) - // Standard Error: 440_000 - .saturating_add((47_556_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 37_000 + .saturating_add((21_822_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 37_000 + .saturating_add((29_044_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 370_000 + .saturating_add((3_000_000 as Weight).saturating_mul(a as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(s as Weight))) @@ -61,108 +55,106 @@ impl pallet_assets::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(a as Weight))) } fn mint() -> Weight { - (103_000_000 as Weight) + (49_933_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn burn() -> Weight { - (115_000_000 as Weight) + (56_434_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn transfer() -> Weight { - (153_000_000 as Weight) + (85_393_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn transfer_keep_alive() -> Weight { - (124_000_000 as Weight) + (72_039_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn force_transfer() -> Weight { - (145_000_000 as Weight) + (85_214_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn freeze() -> Weight { - (49_000_000 as Weight) + (31_915_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn thaw() -> Weight { - (47_000_000 as Weight) + (31_296_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn freeze_asset() -> Weight { - (34_000_000 as Weight) + (22_272_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn thaw_asset() -> Weight { - (34_000_000 as Weight) + (22_336_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_ownership() -> Weight { - (39_000_000 as Weight) + (25_526_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_team() -> Weight { - (35_000_000 as Weight) + (22_632_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_metadata(_n: u32, s: u32, ) -> Weight { - (75_032_000 as Weight) - // Standard Error: 20_000 - .saturating_add((18_000 as Weight).saturating_mul(s as Weight)) + (50_330_000 as Weight) + // Standard Error: 0 + .saturating_add((9_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn clear_metadata() -> Weight { - (70_000_000 as Weight) + (48_266_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - fn force_set_metadata(n: u32, s: u32, ) -> Weight { - (34_085_000 as Weight) - // Standard Error: 21_000 - .saturating_add((48_000 as Weight).saturating_mul(n as Weight)) - // Standard Error: 21_000 - .saturating_add((53_000 as Weight).saturating_mul(s as Weight)) + fn force_set_metadata(_n: u32, s: u32, ) -> Weight { + (26_249_000 as Weight) + // Standard Error: 0 + .saturating_add((6_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_clear_metadata() -> Weight { - (73_000_000 as Weight) + (49_616_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_asset_status() -> Weight { - (33_000_000 as Weight) + (22_596_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn approve_transfer() -> Weight { - (67_000_000 as Weight) + (48_708_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_approved() -> Weight { - (149_000_000 as Weight) + (108_476_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) } fn cancel_approval() -> Weight { - (62_000_000 as Weight) + (49_157_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_cancel_approval() -> Weight { - (71_000_000 as Weight) + (56_862_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } diff --git a/polkadot-parachains/westmint-runtime/src/weights/pallet_balances.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_balances.rs index 57e10a70aa3..2105a17d530 100644 --- a/polkadot-parachains/westmint-runtime/src/weights/pallet_balances.rs +++ b/polkadot-parachains/westmint-runtime/src/weights/pallet_balances.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_balances //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_balances -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_balances +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,27 +29,27 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_balances::WeightInfo for WeightInfo { fn transfer() -> Weight { - (119_000_000 as Weight) + (79_601_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_keep_alive() -> Weight { - (87_000_000 as Weight) + (58_429_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_creating() -> Weight { - (45_000_000 as Weight) + (29_124_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_killing() -> Weight { - (55_000_000 as Weight) + (36_476_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_transfer() -> Weight { - (110_000_000 as Weight) + (78_772_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } diff --git a/polkadot-parachains/westmint-runtime/src/weights/pallet_collator_selection.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_collator_selection.rs index fad9de8bab6..cc687af762f 100644 --- a/polkadot-parachains/westmint-runtime/src/weights/pallet_collator_selection.rs +++ b/polkadot-parachains/westmint-runtime/src/weights/pallet_collator_selection.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_collator_selection //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-05-04, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_collator_selection -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_collator_selection +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,47 +29,47 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_collator_selection::WeightInfo for WeightInfo { fn set_invulnerables(b: u32, ) -> Weight { - (36_147_000 as Weight) - // Standard Error: 22_000 - .saturating_add((50_000 as Weight).saturating_mul(b as Weight)) + (18_563_000 as Weight) + // Standard Error: 0 + .saturating_add((68_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_desired_candidates() -> Weight { - (25_000_000 as Weight) + (16_363_000 as Weight) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_candidacy_bond() -> Weight { - (26_000_000 as Weight) + (16_840_000 as Weight) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn register_as_candidate(c: u32, ) -> Weight { - (90_380_000 as Weight) - // Standard Error: 8_000 - .saturating_add((314_000 as Weight).saturating_mul(c as Weight)) + (71_196_000 as Weight) + // Standard Error: 0 + .saturating_add((198_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn leave_intent(c: u32, ) -> Weight { - (65_617_000 as Weight) - // Standard Error: 4_000 - .saturating_add((325_000 as Weight).saturating_mul(c as Weight)) + (55_336_000 as Weight) + // Standard Error: 0 + .saturating_add((151_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - fn note_author(c: u32, ) -> Weight { - (138_742_000 as Weight) - // Standard Error: 4_000 - .saturating_add((255_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(T::DbWeight::get().reads(4 as Weight)) + fn note_author() -> Weight { + (71_461_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn new_session(r: u32, c: u32, ) -> Weight { - (59_461_000 as Weight) - // Standard Error: 4_000 - .saturating_add((2_000 as Weight).saturating_mul(r as Weight)) - // Standard Error: 4_000 - .saturating_add((291_000 as Weight).saturating_mul(c as Weight)) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + (0 as Weight) + // Standard Error: 1_010_000 + .saturating_add((109_961_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_010_000 + .saturating_add((151_952_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(c as Weight))) } } diff --git a/polkadot-parachains/westmint-runtime/src/weights/pallet_multisig.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_multisig.rs index f372e653085..e1b7bd5b902 100644 --- a/polkadot-parachains/westmint-runtime/src/weights/pallet_multisig.rs +++ b/polkadot-parachains/westmint-runtime/src/weights/pallet_multisig.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_multisig //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_multisig -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_multisig +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,78 +29,80 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_multisig::WeightInfo for WeightInfo { fn as_multi_threshold_1(z: u32, ) -> Weight { - (15_910_000 as Weight) + (14_936_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) } fn as_multi_create(s: u32, z: u32, ) -> Weight { - (80_512_000 as Weight) - // Standard Error: 3_000 - .saturating_add((107_000 as Weight).saturating_mul(s as Weight)) + (56_090_000 as Weight) + // Standard Error: 1_000 + .saturating_add((63_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn as_multi_create_store(s: u32, z: u32, ) -> Weight { - (90_834_000 as Weight) - // Standard Error: 2_000 - .saturating_add((106_000 as Weight).saturating_mul(s as Weight)) + (62_519_000 as Weight) + // Standard Error: 1_000 + .saturating_add((66_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn as_multi_approve(s: u32, z: u32, ) -> Weight { - (43_694_000 as Weight) - // Standard Error: 1_000 - .saturating_add((142_000 as Weight).saturating_mul(s as Weight)) + (30_781_000 as Weight) + // Standard Error: 0 + .saturating_add((111_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn as_multi_approve_store(s: u32, z: u32, ) -> Weight { - (86_160_000 as Weight) - // Standard Error: 5_000 - .saturating_add((148_000 as Weight).saturating_mul(s as Weight)) + (60_393_000 as Weight) + // Standard Error: 0 + .saturating_add((118_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn as_multi_complete(s: u32, z: u32, ) -> Weight { - (119_030_000 as Weight) - // Standard Error: 46_000 - .saturating_add((302_000 as Weight).saturating_mul(s as Weight)) + (81_704_000 as Weight) + // Standard Error: 1_000 + .saturating_add((248_000 as Weight).saturating_mul(s as Weight)) // Standard Error: 0 - .saturating_add((6_000 as Weight).saturating_mul(z as Weight)) + .saturating_add((5_000 as Weight).saturating_mul(z as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn approve_as_multi_create(s: u32, ) -> Weight { - (82_860_000 as Weight) - // Standard Error: 24_000 - .saturating_add((95_000 as Weight).saturating_mul(s as Weight)) + (55_585_000 as Weight) + // Standard Error: 1_000 + .saturating_add((115_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn approve_as_multi_approve(s: u32, ) -> Weight { - (46_197_000 as Weight) - // Standard Error: 5_000 - .saturating_add((110_000 as Weight).saturating_mul(s as Weight)) + (33_483_000 as Weight) + // Standard Error: 1_000 + .saturating_add((82_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn approve_as_multi_complete(s: u32, ) -> Weight { - (193_380_000 as Weight) - // Standard Error: 10_000 - .saturating_add((297_000 as Weight).saturating_mul(s as Weight)) + (154_732_000 as Weight) + // Standard Error: 1_000 + .saturating_add((253_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } - fn cancel_as_multi(_s: u32, ) -> Weight { - (172_508_000 as Weight) + fn cancel_as_multi(s: u32, ) -> Weight { + (104_447_000 as Weight) + // Standard Error: 1_000 + .saturating_add((114_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } diff --git a/polkadot-parachains/westmint-runtime/src/weights/pallet_proxy.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_proxy.rs index 6a7af9fb2f0..97e97ac73e6 100644 --- a/polkadot-parachains/westmint-runtime/src/weights/pallet_proxy.rs +++ b/polkadot-parachains/westmint-runtime/src/weights/pallet_proxy.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_proxy //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_proxy -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_proxy +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -36,76 +28,80 @@ use sp_std::marker::PhantomData; /// Weight functions for pallet_proxy. pub struct WeightInfo(PhantomData); impl pallet_proxy::WeightInfo for WeightInfo { - fn proxy(_p: u32, ) -> Weight { - (43_004_000 as Weight) + fn proxy(p: u32, ) -> Weight { + (27_585_000 as Weight) + // Standard Error: 1_000 + .saturating_add((203_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) } fn proxy_announced(a: u32, p: u32, ) -> Weight { - (84_139_000 as Weight) - // Standard Error: 63_000 - .saturating_add((877_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 66_000 - .saturating_add((234_000 as Weight).saturating_mul(p as Weight)) + (61_093_000 as Weight) + // Standard Error: 2_000 + .saturating_add((680_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((201_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn remove_announcement(a: u32, p: u32, ) -> Weight { - (54_559_000 as Weight) - // Standard Error: 5_000 - .saturating_add((783_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 6_000 - .saturating_add((35_000 as Weight).saturating_mul(p as Weight)) + (39_494_000 as Weight) + // Standard Error: 2_000 + .saturating_add((686_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((1_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn reject_announcement(a: u32, p: u32, ) -> Weight { - (46_951_000 as Weight) - // Standard Error: 42_000 - .saturating_add((956_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 43_000 - .saturating_add((327_000 as Weight).saturating_mul(p as Weight)) + (39_817_000 as Weight) + // Standard Error: 2_000 + .saturating_add((685_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((1_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn announce(a: u32, p: u32, ) -> Weight { - (77_309_000 as Weight) - // Standard Error: 40_000 - .saturating_add((815_000 as Weight).saturating_mul(a as Weight)) - // Standard Error: 42_000 - .saturating_add((258_000 as Weight).saturating_mul(p as Weight)) + (54_835_000 as Weight) + // Standard Error: 2_000 + .saturating_add((684_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 2_000 + .saturating_add((205_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - fn add_proxy(_p: u32, ) -> Weight { - (71_647_000 as Weight) + fn add_proxy(p: u32, ) -> Weight { + (37_625_000 as Weight) + // Standard Error: 2_000 + .saturating_add((300_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxy(p: u32, ) -> Weight { - (54_361_000 as Weight) - // Standard Error: 17_000 - .saturating_add((312_000 as Weight).saturating_mul(p as Weight)) + (36_945_000 as Weight) + // Standard Error: 3_000 + .saturating_add((325_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxies(p: u32, ) -> Weight { - (53_211_000 as Weight) - // Standard Error: 12_000 - .saturating_add((192_000 as Weight).saturating_mul(p as Weight)) + (35_128_000 as Weight) + // Standard Error: 1_000 + .saturating_add((209_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn anonymous(p: u32, ) -> Weight { - (76_563_000 as Weight) - // Standard Error: 17_000 - .saturating_add((12_000 as Weight).saturating_mul(p as Weight)) + (51_624_000 as Weight) + // Standard Error: 1_000 + .saturating_add((41_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn kill_anonymous(p: u32, ) -> Weight { - (54_365_000 as Weight) - // Standard Error: 28_000 - .saturating_add((251_000 as Weight).saturating_mul(p as Weight)) + (37_469_000 as Weight) + // Standard Error: 1_000 + .saturating_add((204_000 as Weight).saturating_mul(p as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } diff --git a/polkadot-parachains/westmint-runtime/src/weights/pallet_timestamp.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_timestamp.rs index 573d8f9b7d1..f016bc460dd 100644 --- a/polkadot-parachains/westmint-runtime/src/weights/pallet_timestamp.rs +++ b/polkadot-parachains/westmint-runtime/src/weights/pallet_timestamp.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_timestamp //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_timestamp -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_timestamp +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,11 +29,11 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { - (16_000_000 as Weight) + (7_687_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn on_finalize() -> Weight { - (8_000_000 as Weight) + (4_303_000 as Weight) } } diff --git a/polkadot-parachains/westmint-runtime/src/weights/pallet_utility.rs b/polkadot-parachains/westmint-runtime/src/weights/pallet_utility.rs index 7248388a406..3b7c921de4c 100644 --- a/polkadot-parachains/westmint-runtime/src/weights/pallet_utility.rs +++ b/polkadot-parachains/westmint-runtime/src/weights/pallet_utility.rs @@ -2,29 +2,21 @@ //! Autogenerated weights for pallet_utility //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 -//! DATE: 2021-04-21, STEPS: `[20, ]`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-05-31, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("statemint-dev"), DB CACHE: 128 // Executed Command: // ./target/release/statemint // benchmark -// --chain -// statemint-dev -// --execution -// wasm -// --wasm-execution -// compiled -// --pallet -// pallet_utility -// --extrinsic -// * -// --steps -// 20 -// --repeat -// 10 +// --chain=statemint-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_utility +// --extrinsic=* +// --steps=50 +// --repeat=20 // --raw -// --output -// ./runtime/statemint/src/weights/ +// --output=./runtime/statemint/src/weights/ #![allow(unused_parens)] @@ -37,16 +29,16 @@ use sp_std::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_utility::WeightInfo for WeightInfo { fn batch(c: u32, ) -> Weight { - (0 as Weight) - // Standard Error: 65_000 - .saturating_add((4_751_000 as Weight).saturating_mul(c as Weight)) + (15_408_000 as Weight) + // Standard Error: 0 + .saturating_add((4_571_000 as Weight).saturating_mul(c as Weight)) } fn as_derivative() -> Weight { - (10_000_000 as Weight) + (7_817_000 as Weight) } fn batch_all(c: u32, ) -> Weight { - (0 as Weight) - // Standard Error: 71_000 - .saturating_add((4_866_000 as Weight).saturating_mul(c as Weight)) + (16_520_000 as Weight) + // Standard Error: 0 + .saturating_add((4_571_000 as Weight).saturating_mul(c as Weight)) } } From c4d7292540806047f362cb38694f44e49af71f74 Mon Sep 17 00:00:00 2001 From: Alexander Popiak Date: Tue, 1 Jun 2021 11:34:35 +0200 Subject: [PATCH 13/17] add westmint sudo key comment --- polkadot-parachains/src/chain_spec.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/polkadot-parachains/src/chain_spec.rs b/polkadot-parachains/src/chain_spec.rs index b9b5f7bbd50..470b93da3e3 100644 --- a/polkadot-parachains/src/chain_spec.rs +++ b/polkadot-parachains/src/chain_spec.rs @@ -668,6 +668,7 @@ pub fn westmint_config(id: ParaId) -> WestmintChainSpec { ), ], vec![], + // re-use the Westend sudo key hex!("6648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342").into(), id, ) From accc1107b68e5c2025647bc086a6fb0efffdfe3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 1 Jun 2021 15:59:03 +0200 Subject: [PATCH 14/17] Port consensus stuff --- Cargo.lock | 1 + polkadot-parachains/Cargo.toml | 1 + polkadot-parachains/src/command.rs | 148 ++++++++-- polkadot-parachains/src/service.rs | 460 ++++++++++++++++++++++++++--- 4 files changed, 543 insertions(+), 67 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 837aea14141..99fc8a0452c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6427,6 +6427,7 @@ name = "polkadot-collator" version = "0.1.0" dependencies = [ "assert_cmd", + "async-trait", "cumulus-client-cli", "cumulus-client-collator", "cumulus-client-consensus-aura", diff --git a/polkadot-parachains/Cargo.toml b/polkadot-parachains/Cargo.toml index be5ad29e020..51bf31fc3ff 100644 --- a/polkadot-parachains/Cargo.toml +++ b/polkadot-parachains/Cargo.toml @@ -20,6 +20,7 @@ codec = { package = "parity-scale-codec", version = "2.0.0" } structopt = "0.3.3" serde = { version = "1.0.101", features = ["derive"] } hex-literal = "0.2.1" +async-trait = "0.1.42" # Parachain runtimes rococo-parachain-runtime = { package = "cumulus-rococo-parachain-runtime", path = "rococo-runtime" } diff --git a/polkadot-parachains/src/command.rs b/polkadot-parachains/src/command.rs index e85d5a90dd2..7fe1f501c99 100644 --- a/polkadot-parachains/src/command.rs +++ b/polkadot-parachains/src/command.rs @@ -17,7 +17,10 @@ use crate::{ chain_spec, cli::{Cli, RelayChainCli, Subcommand}, - service::{StatemineRuntimeExecutor, StatemintRuntimeExecutor, WestmintRuntimeExecutor}, + service::{ + StatemineRuntimeExecutor, StatemintRuntimeExecutor, WestmintRuntimeExecutor, new_partial, + RococoParachainRuntimeExecutor, ShellRuntimeExecutor, Block, + }, }; use codec::Encode; use cumulus_client_service::genesis::generate_genesis_block; @@ -30,11 +33,45 @@ use sc_cli::{ }; use sc_service::config::{BasePath, PrometheusConfig}; use sp_core::hexdisplay::HexDisplay; -use sp_runtime::{traits::Block as BlockT, generic, OpaqueExtrinsic}; +use sp_runtime::traits::Block as BlockT; use std::{io::Write, net::SocketAddr}; -use statemint_common::Header; -pub type Block = generic::Block; +trait IdentifyChain { + fn is_shell(&self) -> bool; + fn is_statemint(&self) -> bool; + fn is_statemine(&self) -> bool; + fn is_westmint(&self) -> bool; +} + +impl IdentifyChain for dyn sc_service::ChainSpec { + fn is_shell(&self) -> bool { + self.id().starts_with("shell") + } + fn is_statemint(&self) -> bool { + self.id().starts_with("statemint") + } + fn is_statemine(&self) -> bool { + self.id().starts_with("statemine") + } + fn is_westmint(&self) -> bool { + self.id().starts_with("westmint") + } +} + +impl IdentifyChain for T { + fn is_shell(&self) -> bool { + ::is_shell(self) + } + fn is_statemint(&self) -> bool { + ::is_statemint(self) + } + fn is_statemine(&self) -> bool { + ::is_statemine(self) + } + fn is_westmint(&self) -> bool { + ::is_westmint(self) + } +} fn load_spec( id: &str, @@ -63,11 +100,13 @@ fn load_spec( "" => Box::new(chain_spec::get_chain_spec(para_id)), path => { let chain_spec = chain_spec::ChainSpec::from_json_file(path.into())?; - if use_statemine_runtime(&chain_spec) { + if chain_spec.is_statemint() { + Box::new(chain_spec::StatemintChainSpec::from_json_file(path.into())?) + } else if chain_spec.is_statemine() { Box::new(chain_spec::StatemineChainSpec::from_json_file(path.into())?) - } else if use_westmint_runtime(&chain_spec) { + } else if chain_spec.is_westmint() { Box::new(chain_spec::WestmintChainSpec::from_json_file(path.into())?) - } else if use_shell_runtime(&chain_spec) { + } else if chain_spec.is_shell() { Box::new(chain_spec::ShellChainSpec::from_json_file(path.into())?) } else { Box::new(chain_spec) @@ -112,7 +151,11 @@ impl SubstrateCli for Cli { } fn native_runtime_version(chain_spec: &Box) -> &'static RuntimeVersion { - if use_shell_runtime(&**chain_spec) { + if chain_spec.is_statemint() { + &statemint_runtime::VERSION + } else if chain_spec.is_statemine() { + &statemine_runtime::VERSION + } else if chain_spec.is_shell() { &shell_runtime::VERSION } else { &rococo_parachain_runtime::VERSION @@ -170,24 +213,37 @@ fn extract_genesis_wasm(chain_spec: &Box) -> Result bool { - chain_spec.id().starts_with("shell") -} - -fn use_statemine_runtime(chain_spec: &dyn ChainSpec) -> bool { - chain_spec.id().starts_with("statemine") -} - -fn use_westmint_runtime(chain_spec: &dyn ChainSpec) -> bool { - chain_spec.id().starts_with("westmint") -} - -use crate::service::{new_partial, RococoParachainRuntimeExecutor, ShellRuntimeExecutor}; - macro_rules! construct_async_run { (|$components:ident, $cli:ident, $cmd:ident, $config:ident| $( $code:tt )* ) => {{ let runner = $cli.create_runner($cmd)?; - if use_shell_runtime(&*runner.config().chain_spec) { + if runner.config().chain_spec.is_westmint() { + runner.async_run(|$config| { + let $components = new_partial::( + &$config, + crate::service::statemint_build_import_queue, + )?; + let task_manager = $components.task_manager; + { $( $code )* }.map(|v| (v, task_manager)) + }) + } else if runner.config().chain_spec.is_statemine() { + runner.async_run(|$config| { + let $components = new_partial::( + &$config, + crate::service::statemint_build_import_queue, + )?; + let task_manager = $components.task_manager; + { $( $code )* }.map(|v| (v, task_manager)) + }) + } else if runner.config().chain_spec.is_statemint() { + runner.async_run(|$config| { + let $components = new_partial::( + &$config, + crate::service::statemint_build_import_queue, + )?; + let task_manager = $components.task_manager; + { $( $code )* }.map(|v| (v, task_manager)) + }) + } else if runner.config().chain_spec.is_shell() { runner.async_run(|$config| { let $components = new_partial::( &$config, @@ -314,21 +370,23 @@ pub fn run() -> Result<()> { Some(Subcommand::Benchmark(cmd)) => { if cfg!(feature = "runtime-benchmarks") { let runner = cli.create_runner(cmd)?; - if use_statemine_runtime(&*runner.config().chain_spec) { + if runner.config().chain_spec.is_statemine() { runner.sync_run(|config| cmd.run::(config)) - } else if use_westmint_runtime(&*runner.config().chain_spec) { + } else if runner.config().chain_spec.is_westmint() { runner.sync_run(|config| cmd.run::(config)) - } else { + } else if runner.config().chain_spec.is_statemint() { runner.sync_run(|config| cmd.run::(config)) + } else { + Err("Chain doesn't support benchmarking".into()) } } else { Err("Benchmarking wasn't enabled when building the node. \ - You can enable it with `--features runtime-benchmarks`.".into()) + You can enable it with `--features runtime-benchmarks`." + .into()) } - }, + } None => { let runner = cli.create_runner(&cli.run.normalize())?; - let use_shell = use_shell_runtime(&*runner.config().chain_spec); runner.run_node_until_exit(|config| async move { // TODO @@ -370,7 +428,37 @@ pub fn run() -> Result<()> { } ); - if use_shell { + if config.chain_spec.is_statemint() { + crate::service::start_statemint_node::( + config, + key, + polkadot_config, + id, + ) + .await + .map(|r| r.0) + .map_err(Into::into) + } else if config.chain_spec.is_statemine() { + crate::service::start_statemint_node::( + config, + key, + polkadot_config, + id, + ) + .await + .map(|r| r.0) + .map_err(Into::into) + } else if config.chain_spec.is_westmint() { + crate::service::start_statemint_node::( + config, + key, + polkadot_config, + id, + ) + .await + .map(|r| r.0) + .map_err(Into::into) + } else if config.chain_spec.is_shell() { crate::service::start_shell_node(config, key, polkadot_config, id) .await .map(|r| r.0) diff --git a/polkadot-parachains/src/service.rs b/polkadot-parachains/src/service.rs index ca9656a5618..7dc9277a2dd 100644 --- a/polkadot-parachains/src/service.rs +++ b/polkadot-parachains/src/service.rs @@ -17,12 +17,16 @@ use cumulus_client_consensus_aura::{ build_aura_consensus, BuildAuraConsensusParams, SlotProportion, }; -use cumulus_client_consensus_common::ParachainConsensus; +use cumulus_client_consensus_common::{ + ParachainConsensus, ParachainCandidate, ParachainBlockImport, +}; use cumulus_client_network::build_block_announce_validator; use cumulus_client_service::{ prepare_node_config, start_collator, start_full_node, StartCollatorParams, StartFullNodeParams, }; -use cumulus_primitives_core::ParaId; +use cumulus_primitives_core::{ + ParaId, relay_chain::v1::{Hash as PHash, PersistedValidationData}, +}; use polkadot_primitives::v1::CollatorPair; use sc_client_api::ExecutorProvider; @@ -30,12 +34,18 @@ use sc_executor::native_executor_instance; use sc_network::NetworkService; use sc_service::{Configuration, PartialComponents, Role, TFullBackend, TFullClient, TaskManager}; use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; -use sp_api::ConstructRuntimeApi; -use sp_consensus::SlotData; +use sp_api::{ConstructRuntimeApi, ApiExt}; +use sp_consensus::{ + BlockImportParams, BlockOrigin, SlotData, + import_queue::{BasicQueue, CacheKeyId, Verifier as VerifierT}, +}; +use sp_consensus_aura::{sr25519::AuthorityId as AuraId, AuraApi}; use sp_keystore::SyncCryptoStorePtr; -use sp_runtime::traits::BlakeTwo256; +use sp_runtime::{traits::{BlakeTwo256, Header as HeaderT}, generic::BlockId}; use std::sync::Arc; use substrate_prometheus_endpoint::Registry; +use futures::lock::Mutex; +use cumulus_client_consensus_relay_chain::Verifier as RelayChainVerifier; pub use sc_executor::NativeExecutor; @@ -350,7 +360,9 @@ where /// Build the import queue for the rococo parachain runtime. pub fn rococo_parachain_build_import_queue( - client: Arc>, + client: Arc< + TFullClient, + >, config: &Configuration, telemetry: Option, task_manager: &TaskManager, @@ -363,33 +375,29 @@ pub fn rococo_parachain_build_import_queue( > { let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - cumulus_client_consensus_aura::import_queue::< - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - _, - _, - >(cumulus_client_consensus_aura::ImportQueueParams { - block_import: client.clone(), - client: client.clone(), - create_inherent_data_providers: move |_, _| async move { - let time = sp_timestamp::InherentDataProvider::from_system_time(); + cumulus_client_consensus_aura::import_queue::( + cumulus_client_consensus_aura::ImportQueueParams { + block_import: client.clone(), + client: client.clone(), + create_inherent_data_providers: move |_, _| async move { + let time = sp_timestamp::InherentDataProvider::from_system_time(); - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_duration( - *time, - slot_duration.slot_duration(), - ); + let slot = + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_duration( + *time, + slot_duration.slot_duration(), + ); - Ok((time, slot)) + Ok((time, slot)) + }, + registry: config.prometheus_registry().clone(), + can_author_with: sp_consensus::CanAuthorWithNativeVersion::new( + client.executor().clone(), + ), + spawner: &task_manager.spawn_essential_handle(), + telemetry, }, - registry: config.prometheus_registry().clone(), - can_author_with: sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()), - spawner: &task_manager.spawn_essential_handle(), - telemetry, - }) + ) .map_err(Into::into) } @@ -399,9 +407,10 @@ pub async fn start_rococo_parachain_node( collator_key: CollatorPair, polkadot_config: Configuration, id: ParaId, -) -> sc_service::error::Result< - (TaskManager, Arc>) -> { +) -> sc_service::error::Result<( + TaskManager, + Arc>, +)> { start_node_impl::( parachain_config, collator_key, @@ -510,15 +519,16 @@ pub fn shell_build_import_queue( .map_err(Into::into) } -/// Start a rococo-shell parachain node. +/// Start a polkadator-shell parachain node. pub async fn start_shell_node( parachain_config: Configuration, collator_key: CollatorPair, polkadot_config: Configuration, id: ParaId, -) -> sc_service::error::Result< - (TaskManager, Arc>) -> { +) -> sc_service::error::Result<( + TaskManager, + Arc>, +)> { start_node_impl::( parachain_config, collator_key, @@ -581,3 +591,379 @@ pub async fn start_shell_node( ) .await } + +enum BuildOnAccess { + Uninitialized(Option R + Send + Sync>>), + Initialized(R), +} + +impl BuildOnAccess { + fn get_mut(&mut self) -> &mut R { + loop { + match self { + Self::Uninitialized(f) => { + *self = Self::Initialized((f.take().unwrap())()); + } + Self::Initialized(ref mut r) => return r, + } + } + } +} + +/// Special [`ParachainConsensus`] implementation that waits for the upgrade from +/// shell to a parachain runtime that implements Aura. +struct WaitForAuraConsensus { + client: Arc, + aura_consensus: Arc>>>>, + relay_chain_consensus: Arc>>>, +} + +impl Clone for WaitForAuraConsensus { + fn clone(&self) -> Self { + Self { + client: self.client.clone(), + aura_consensus: self.aura_consensus.clone(), + relay_chain_consensus: self.relay_chain_consensus.clone(), + } + } +} + +#[async_trait::async_trait] +impl ParachainConsensus for WaitForAuraConsensus +where + Client: sp_api::ProvideRuntimeApi + Send + Sync, + Client::Api: AuraApi, +{ + async fn produce_candidate( + &mut self, + parent: &Header, + relay_parent: PHash, + validation_data: &PersistedValidationData, + ) -> Option> { + let block_id = BlockId::hash(parent.hash()); + if self + .client + .runtime_api() + .has_api::>(&block_id) + .unwrap_or(false) + { + self.aura_consensus + .lock() + .await + .get_mut() + .produce_candidate(parent, relay_parent, validation_data) + .await + } else { + self.relay_chain_consensus + .lock() + .await + .produce_candidate(parent, relay_parent, validation_data) + .await + } + } +} + +struct Verifier { + client: Arc, + aura_verifier: BuildOnAccess>>, + relay_chain_verifier: Box>, +} + +#[async_trait::async_trait] +impl VerifierT for Verifier +where + Client: sp_api::ProvideRuntimeApi + Send + Sync, + Client::Api: AuraApi, +{ + async fn verify( + &mut self, + origin: BlockOrigin, + header: Header, + justifications: Option, + body: Option::Extrinsic>>, + ) -> Result< + ( + BlockImportParams, + Option)>>, + ), + String, + > { + let block_id = BlockId::hash(*header.parent_hash()); + + if self + .client + .runtime_api() + .has_api::>(&block_id) + .unwrap_or(false) + { + self.aura_verifier + .get_mut() + .verify(origin, header, justifications, body) + .await + } else { + self.relay_chain_verifier + .verify(origin, header, justifications, body) + .await + } + } +} + +/// Build the import queue for the statemint/statemine/westmine runtime. +pub fn statemint_build_import_queue( + client: Arc>, + config: &Configuration, + telemetry_handle: Option, + task_manager: &TaskManager, +) -> Result< + sp_consensus::DefaultImportQueue>, + sc_service::Error, +> +where + RuntimeApi: ConstructRuntimeApi> + + Send + + Sync + + 'static, + RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue + + sp_api::Metadata + + sp_session::SessionKeys + + sp_api::ApiExt< + Block, + StateBackend = sc_client_api::StateBackendFor, Block>, + > + sp_offchain::OffchainWorkerApi + + sp_block_builder::BlockBuilder + + sp_consensus_aura::AuraApi, + sc_client_api::StateBackendFor, Block>: sp_api::StateBackend, + Executor: sc_executor::NativeExecutionDispatch + 'static, +{ + let client2 = client.clone(); + + let aura_verifier = move || { + let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client2).unwrap(); + + Box::new(cumulus_client_consensus_aura::build_verifier::< + sp_consensus_aura::sr25519::AuthorityPair, + _, + _, + _, + >(cumulus_client_consensus_aura::BuildVerifierParams { + client: client2.clone(), + create_inherent_data_providers: move |_, _| async move { + let time = sp_timestamp::InherentDataProvider::from_system_time(); + + let slot = + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_duration( + *time, + slot_duration.slot_duration(), + ); + + Ok((time, slot)) + }, + can_author_with: sp_consensus::CanAuthorWithNativeVersion::new( + client2.executor().clone(), + ), + telemetry: telemetry_handle, + })) as Box<_> + }; + + let relay_chain_verifier = Box::new(RelayChainVerifier::new(client.clone(), |_, _| async { + Ok(()) + })) as Box<_>; + + let verifier = Verifier { + client: client.clone(), + relay_chain_verifier, + aura_verifier: BuildOnAccess::Uninitialized(Some(Box::new(aura_verifier))), + }; + + let registry = config.prometheus_registry().clone(); + let spawner = task_manager.spawn_essential_handle(); + + Ok(BasicQueue::new( + verifier, + Box::new(ParachainBlockImport::new(client.clone())), + None, + &spawner, + registry, + )) +} + +/// Start a statemint/statemine/westmint parachain node. +pub async fn start_statemint_node( + parachain_config: Configuration, + collator_key: CollatorPair, + polkadot_config: Configuration, + id: ParaId, +) -> sc_service::error::Result<( + TaskManager, + Arc>, +)> +where + RuntimeApi: ConstructRuntimeApi> + + Send + + Sync + + 'static, + RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue + + sp_api::Metadata + + sp_session::SessionKeys + + sp_api::ApiExt< + Block, + StateBackend = sc_client_api::StateBackendFor, Block>, + > + sp_offchain::OffchainWorkerApi + + sp_block_builder::BlockBuilder + + cumulus_primitives_core::CollectCollationInfo + + sp_consensus_aura::AuraApi, + sc_client_api::StateBackendFor, Block>: sp_api::StateBackend, + Executor: sc_executor::NativeExecutionDispatch + 'static, +{ + start_node_impl::( + parachain_config, + collator_key, + polkadot_config, + id, + |_| Default::default(), + statemint_build_import_queue, + |client, + prometheus_registry, + telemetry, + task_manager, + relay_chain_node, + transaction_pool, + sync_oracle, + keystore, + force_authoring| { + let client2 = client.clone(); + let relay_chain_backend = relay_chain_node.backend.clone(); + let relay_chain_client = relay_chain_node.client.clone(); + let spawn_handle = task_manager.spawn_handle(); + let transaction_pool2 = transaction_pool.clone(); + let telemetry2 = telemetry.clone(); + let prometheus_registry2 = prometheus_registry.map(|r| (*r).clone()); + + let aura_consensus = BuildOnAccess::Uninitialized(Some( + Box::new(move || { + let slot_duration = + cumulus_client_consensus_aura::slot_duration(&*client2).unwrap(); + + let proposer_factory = + sc_basic_authorship::ProposerFactory::with_proof_recording( + spawn_handle, + client2.clone(), + transaction_pool2, + prometheus_registry2.as_ref(), + telemetry2.clone(), + ); + + let relay_chain_backend2 = relay_chain_backend.clone(); + let relay_chain_client2 = relay_chain_client.clone(); + + build_aura_consensus::< + sp_consensus_aura::sr25519::AuthorityPair, + _, + _, + _, + _, + _, + _, + _, + _, + _, + >(BuildAuraConsensusParams { + proposer_factory, + create_inherent_data_providers: + move |_, (relay_parent, validation_data)| { + let parachain_inherent = + cumulus_primitives_parachain_inherent::ParachainInherentData::create_at_with_client( + relay_parent, + &relay_chain_client, + &*relay_chain_backend, + &validation_data, + id, + ); + async move { + let time = + sp_timestamp::InherentDataProvider::from_system_time(); + + let slot = + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_duration( + *time, + slot_duration.slot_duration(), + ); + + let parachain_inherent = + parachain_inherent.ok_or_else(|| { + Box::::from( + "Failed to create parachain inherent", + ) + })?; + Ok((time, slot, parachain_inherent)) + } + }, + block_import: client2.clone(), + relay_chain_client: relay_chain_client2, + relay_chain_backend: relay_chain_backend2, + para_client: client2.clone(), + backoff_authoring_blocks: Option::<()>::None, + sync_oracle, + keystore, + force_authoring, + slot_duration, + // We got around 500ms for proposing + block_proposal_slot_portion: SlotProportion::new(1f32 / 24f32), + telemetry: telemetry2, + }) + }), + )); + + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( + task_manager.spawn_handle(), + client.clone(), + transaction_pool, + prometheus_registry.clone(), + telemetry.clone(), + ); + + let relay_chain_backend = relay_chain_node.backend.clone(); + let relay_chain_client = relay_chain_node.client.clone(); + + let relay_chain_consensus = + cumulus_client_consensus_relay_chain::build_relay_chain_consensus( + cumulus_client_consensus_relay_chain::BuildRelayChainConsensusParams { + para_id: id, + proposer_factory, + block_import: client.clone(), + relay_chain_client: relay_chain_node.client.clone(), + relay_chain_backend: relay_chain_node.backend.clone(), + create_inherent_data_providers: + move |_, (relay_parent, validation_data)| { + let parachain_inherent = + cumulus_primitives_parachain_inherent::ParachainInherentData::create_at_with_client( + relay_parent, + &relay_chain_client, + &*relay_chain_backend, + &validation_data, + id, + ); + async move { + let parachain_inherent = + parachain_inherent.ok_or_else(|| { + Box::::from( + "Failed to create parachain inherent", + ) + })?; + Ok(parachain_inherent) + } + }, + }, + ); + + let parachain_consensus = Box::new(WaitForAuraConsensus { + client: client.clone(), + aura_consensus: Arc::new(Mutex::new(aura_consensus)), + relay_chain_consensus: Arc::new(Mutex::new(relay_chain_consensus)), + }); + + Ok(parachain_consensus) + }, + ) + .await +} From 2a761ed5177c1df1487ccb57a48a4679a3b2fa4e Mon Sep 17 00:00:00 2001 From: Alexander Popiak Date: Tue, 1 Jun 2021 17:55:01 +0200 Subject: [PATCH 15/17] fix typo --- polkadot-parachains/src/service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polkadot-parachains/src/service.rs b/polkadot-parachains/src/service.rs index 7dc9277a2dd..ac02626e620 100644 --- a/polkadot-parachains/src/service.rs +++ b/polkadot-parachains/src/service.rs @@ -519,7 +519,7 @@ pub fn shell_build_import_queue( .map_err(Into::into) } -/// Start a polkadator-shell parachain node. +/// Start a polkadat-shell parachain node. pub async fn start_shell_node( parachain_config: Configuration, collator_key: CollatorPair, From 6e5a093594a1a3b366fb7b7a624a5ad67eb7fd9d Mon Sep 17 00:00:00 2001 From: Alexander Popiak Date: Tue, 1 Jun 2021 17:57:27 +0200 Subject: [PATCH 16/17] fix typo ... again --- polkadot-parachains/src/service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polkadot-parachains/src/service.rs b/polkadot-parachains/src/service.rs index ac02626e620..681a16a7912 100644 --- a/polkadot-parachains/src/service.rs +++ b/polkadot-parachains/src/service.rs @@ -519,7 +519,7 @@ pub fn shell_build_import_queue( .map_err(Into::into) } -/// Start a polkadat-shell parachain node. +/// Start a polkadot-shell parachain node. pub async fn start_shell_node( parachain_config: Configuration, collator_key: CollatorPair, From ffc2ba83f8da71788719951072a68482986c2411 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Tue, 1 Jun 2021 18:06:36 +0200 Subject: [PATCH 17/17] Recognise Westmint --- polkadot-parachains/src/command.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/polkadot-parachains/src/command.rs b/polkadot-parachains/src/command.rs index 7fe1f501c99..920888bc2f1 100644 --- a/polkadot-parachains/src/command.rs +++ b/polkadot-parachains/src/command.rs @@ -155,6 +155,8 @@ impl SubstrateCli for Cli { &statemint_runtime::VERSION } else if chain_spec.is_statemine() { &statemine_runtime::VERSION + } else if chain_spec.is_westmint() { + &westmint_runtime::VERSION } else if chain_spec.is_shell() { &shell_runtime::VERSION } else {