diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 686c66bba..6c01ed1a3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,7 +11,7 @@ jobs: SUBWASM_VERSION: 0.15.0 strategy: matrix: - chain: ["ipci","alpha","main"] + chain: ["alpha","main"] steps: - uses: actions/checkout@v2 with: @@ -234,7 +234,7 @@ jobs: run: | mkdir -p release/tmp/ cd release/tmp/ - mkdir robonomics robonomics-alpha ipci x86_64 aarch64 + mkdir robonomics robonomics-alpha x86_64 aarch64 - name: get x86_64 binary uses: actions/download-artifact@v2 @@ -258,24 +258,17 @@ jobs: name: alpha-runtime path: release/tmp/robonomics-alpha - - uses: actions/download-artifact@v2 - with: - name: ipci-runtime - path: release/tmp/ipci - - id: compress_artefacts shell: bash run: | cd release/ echo "::set-output name=main::$(jq -r '.core_version' tmp/robonomics/main-info.json | awk '{print $1}')" echo "::set-output name=alpha::$(jq -r '.core_version' tmp/robonomics-alpha/alpha-info.json | awk '{print $1}')" - echo "::set-output name=ipci::$(jq -r '.core_version' tmp/ipci/ipci-info.json | awk '{print $1}')" chmod +x tmp/x86_64/robonomics tmp/aarch64/robonomics tar -czvf robonomics-"${{ steps.get_version.outputs.version-without-v }}"-x86_64-unknown-linux-gnu.tar.gz -C tmp/x86_64/ robonomics tar -czvf robonomics-"${{ steps.get_version.outputs.version-without-v }}"-aarch64-unknown-linux-gnu.tar.gz -C tmp/aarch64/ robonomics cd tmp/robonomics;tar -czvf ../../runtime-"$(jq -r '.core_version' main-info.json | awk '{print $1}')".tar.gz *;cd ../../ cd tmp/robonomics-alpha;tar -czvf ../../runtime-"$(jq -r '.core_version' alpha-info.json | awk '{print $1}')".tar.gz *;cd ../../ - cd tmp/ipci;tar -czvf ../../runtime-"$(jq -r '.core_version' ipci-info.json | awk '{print $1}')".tar.gz *;cd ../../ echo "${{ steps.get_version.outputs.version-without-v }}" > version sha256sum *.tar.gz > sha256sum rm -rf tmp/ @@ -306,7 +299,7 @@ jobs: id: gen_release_body shell: bash run: | - r="> Native runtimes: \`${{ steps.compress_artefacts.outputs.main }}\`, \`${{ steps.compress_artefacts.outputs.alpha }}\`, \`${{ steps.compress_artefacts.outputs.ipci }}\`"$'\n' + r="> Native runtimes: \`${{ steps.compress_artefacts.outputs.main }}\`, \`${{ steps.compress_artefacts.outputs.alpha }}\`"$'\n' r=$r$'\n' r=$r$'\n'"Changelog" r=$r$'\n'"--------------" diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml index 3c34c4fa0..3f85b6ee9 100644 --- a/.github/workflows/srtool.yml +++ b/.github/workflows/srtool.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - chain: ["ipci","alpha","main"] + chain: ["alpha","main"] steps: - uses: actions/checkout@v2 with: diff --git a/Cargo.lock b/Cargo.lock index f77386d3a..6b147d019 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,7 +44,7 @@ checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ "cfg-if 1.0.0", "cipher", - "cpufeatures 0.2.2", + "cpufeatures", "opaque-debug 0.3.0", ] @@ -84,7 +84,7 @@ dependencies = [ [[package]] name = "alpha-runtime" -version = "1.9.9" +version = "2.0.0" dependencies = [ "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", @@ -98,7 +98,6 @@ dependencies = [ "frame-system-rpc-runtime-api", "hex-literal 0.2.2", "lazy_static", - "pallet-asset-tx-payment", "pallet-assets", "pallet-balances", "pallet-bounties", @@ -120,7 +119,7 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", "pallet-utility", - "pallet-xcm", + "pallet-xcm 0.9.23", "parachain-info", "parity-scale-codec", "polkadot-parachain", @@ -158,14 +157,14 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] name = "anyhow" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" [[package]] name = "approx" @@ -252,25 +251,24 @@ dependencies = [ [[package]] name = "async-global-executor" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c290043c9a95b05d45e952fb6383c67bcb61471f60cfa21e890dba6654234f43" +checksum = "fd8b508d585e01084059b60f06ade4cb7415cd2e4084b71dd1cb44e7d3fb9880" dependencies = [ "async-channel", "async-executor", "async-io", - "async-mutex", + "async-lock", "blocking", "futures-lite", - "num_cpus", "once_cell", ] [[package]] name = "async-io" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" +checksum = "e5e18f61464ae81cde0a23e713ae8fd299580c54d697a35820cfd0625b8b0e07" dependencies = [ "concurrent-queue", "futures-lite", @@ -280,9 +278,9 @@ dependencies = [ "parking", "polling", "slab", - "socket2 0.4.4", + "socket2", "waker-fn", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -294,20 +292,11 @@ dependencies = [ "event-listener", ] -[[package]] -name = "async-mutex" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" -dependencies = [ - "event-listener", -] - [[package]] name = "async-process" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83137067e3a2a6a06d67168e49e68a0957d215410473a740cea95a2425c0b7c6" +checksum = "cf2c06e30a24e8c78a3987d07f0930edf76ef35e027e7bdb063fccafdad1f60c" dependencies = [ "async-io", "blocking", @@ -317,7 +306,7 @@ dependencies = [ "libc", "once_cell", "signal-hook", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -331,6 +320,7 @@ dependencies = [ "async-global-executor", "async-io", "async-lock", + "async-process", "crossbeam-utils", "futures-channel", "futures-core", @@ -342,7 +332,7 @@ dependencies = [ "memchr", "num_cpus", "once_cell", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "pin-utils", "slab", "wasm-bindgen-futures", @@ -350,15 +340,16 @@ dependencies = [ [[package]] name = "async-std-resolver" -version = "0.20.4" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf3e776afdf3a2477ef4854b85ba0dff3bd85792f685fb3c68948b4d304e4f0" +checksum = "0f2f8a4a203be3325981310ab243a28e6e4ea55b6519bffce05d41ab60e09ad8" dependencies = [ "async-std", "async-trait", "futures-io", "futures-util", "pin-utils", + "socket2", "trust-dns-resolver", ] @@ -370,39 +361,26 @@ checksum = "30696a84d817107fc028e049980e09d5e140e8da8f1caeb17e8e950658a3cea9" [[package]] name = "async-trait" -version = "0.1.53" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "asynchronous-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4401f0a3622dad2e0763fa79e0eb328bc70fb7dccfdd645341f00d671247d6" -dependencies = [ - "bytes 1.1.0", - "futures-sink", - "futures-util", - "memchr", - "pin-project-lite 0.2.8", -] - [[package]] name = "asynchronous-codec" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0de5164e5edbf51c45fb8c2d9664ae1c095cce1b265ecf7569093c0d66ef690" dependencies = [ - "bytes 1.1.0", + "bytes", "futures-sink", "futures-util", "memchr", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", ] [[package]] @@ -428,7 +406,7 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -446,31 +424,31 @@ dependencies = [ "futures-core", "getrandom 0.2.6", "instant", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "rand 0.8.5", "tokio", ] [[package]] name = "backtrace" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e121dee8023ce33ab248d9ce1493df03c3b38a659b240096fcbd7048ff9c31f" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" dependencies = [ "addr2line", "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.28.4", "rustc-demangle", ] [[package]] name = "base-x" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" +checksum = "dc19a4937b4fbd3fe3379793130e42060d10627a360f2127802b10b87e7baf74" [[package]] name = "base16ct" @@ -496,17 +474,11 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "base64ct" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" - [[package]] name = "beef" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed554bd50246729a1ec158d08aa3235d1b69d94ad120ebe187e28894787e736" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" dependencies = [ "serde", ] @@ -514,17 +486,19 @@ dependencies = [ [[package]] name = "beefy-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "beefy-primitives", "fnv", "futures 0.3.21", + "futures-timer", "hex", "log", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sc-chain-spec", "sc-client-api", + "sc-finality-grandpa", "sc-keystore", "sc-network", "sc-network-gossip", @@ -533,8 +507,10 @@ dependencies = [ "sp-application-crypto", "sp-arithmetic", "sp-blockchain", + "sp-consensus", "sp-core", "sp-keystore", + "sp-mmr-primitives", "sp-runtime", "substrate-prometheus-endpoint", "thiserror", @@ -544,18 +520,15 @@ dependencies = [ [[package]] name = "beefy-gadget-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "beefy-gadget", "beefy-primitives", "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-pubsub", + "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sc-rpc", "sc-utils", "serde", @@ -567,12 +540,12 @@ dependencies = [ [[package]] name = "beefy-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" [[package]] name = "beefy-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "scale-info", @@ -635,17 +608,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "blake2" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e37d16930f5459780f5621038b6382b9bb37c19016f39fb6b5808d831f174" -dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - [[package]] name = "blake2" version = "0.10.4" @@ -667,39 +629,24 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "0.5.11" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" +checksum = "72936ee4afc7f8f736d1c38383b56480b5497b4617b4a77bdbf1d2ababc76127" dependencies = [ "arrayref", - "arrayvec 0.5.2", + "arrayvec 0.7.2", "constant_time_eq", ] [[package]] name = "blake2s_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", -] - -[[package]] -name = "blake3" -version = "0.3.8" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" +checksum = "db539cc2b5f6003621f1cd9ef92d7ded8ea5232c7de0f9faa2de251cd98730d4" dependencies = [ "arrayref", - "arrayvec 0.5.2", - "cc", - "cfg-if 0.1.10", + "arrayvec 0.7.2", "constant_time_eq", - "crypto-mac 0.8.0", - "digest 0.9.0", ] [[package]] @@ -778,9 +725,9 @@ dependencies = [ [[package]] name = "bounded-vec" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b47cca82fca99417fe405f09d93bb8fff90bdd03d13c631f18096ee123b4281c" +checksum = "3372be4090bf9d4da36bd8ba7ce6ca1669503d0cf6e667236c6df7f053153eb6" dependencies = [ "thiserror", ] @@ -811,9 +758,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.9.1" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" [[package]] name = "byte-slice-cast" @@ -833,16 +780,6 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" -[[package]] -name = "bytes" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -dependencies = [ - "byteorder", - "iovec", -] - [[package]] name = "bytes" version = "1.1.0" @@ -868,9 +805,9 @@ checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" [[package]] name = "camino" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3132262930b0522068049f5870a856ab8affc80c70d08b6ecb785771a6fc23" +checksum = "869119e97797867fd90f5e22af7d0bd274bd4635ebb9eb68c04f3f513ae6c412" dependencies = [ "serde", ] @@ -892,7 +829,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver 1.0.7", + "semver 1.0.9", "serde", "serde_json", ] @@ -935,21 +872,21 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chacha20" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee7ad89dc1128635074c268ee661f90c3f7e83d9fd12910608c36b47d6c3412" +checksum = "01b72a433d0cf2aef113ba70f62634c56fddb0f244e6377185c56a7cadbd8f91" dependencies = [ "cfg-if 1.0.0", "cipher", - "cpufeatures 0.1.5", + "cpufeatures", "zeroize", ] [[package]] name = "chacha20poly1305" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1580317203210c517b6d44794abfbe600698276db18127e37ad3e69bf5e848e5" +checksum = "3b84ed6d1d5f7aa9bdde921a5090e0ca4d934d250ea3b402a5fab3a994e28a2a" dependencies = [ "aead", "chacha20", @@ -968,18 +905,20 @@ dependencies = [ "num-integer", "num-traits", "time", - "winapi 0.3.9", + "winapi", ] [[package]] name = "cid" -version = "0.6.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff0e3bc0b6446b3f9663c1a6aba6ef06c5aeaa1bc92bd18077be337198ab9768" +checksum = "fc949bff6704880faf064c42a4854032ab07bfcf3a4fcb82a57470acededb69c" dependencies = [ + "core2", "multibase", - "multihash 0.13.2", - "unsigned-varint 0.5.1", + "multihash", + "serde", + "unsigned-varint", ] [[package]] @@ -1002,9 +941,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.3.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" +checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b" dependencies = [ "glob", "libc", @@ -1013,16 +952,16 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.8" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71c47df61d9e16dc010b55dba1952a57d8c215dbb533fd13cdd13369aac73b1c" +checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", "bitflags", "clap_derive", + "clap_lex", "indexmap", "lazy_static", - "os_str_bytes", "strsim", "termcolor", "textwrap", @@ -1030,18 +969,18 @@ dependencies = [ [[package]] name = "clap_complete" -version = "3.1.1" +version = "3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6f3613c0a3cddfd78b41b10203eb322cb29b600cbdf808a7d3db95691b8e25" +checksum = "da92e6facd8d73c22745a5d3cbb59bdf8e46e3235c923e516527d8e81eec14a4" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "3.1.7" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" +checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" dependencies = [ "heck 0.4.0", "proc-macro-error", @@ -1050,6 +989,38 @@ dependencies = [ "syn", ] +[[package]] +name = "clap_lex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "coarsetime" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "454038500439e141804c655b4cd1bc6a70bcb95cd2bc9463af5661b6956f0e46" +dependencies = [ + "libc", + "once_cell", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "comfy-table" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b103d85ca6e209388771bfb7aa6b68a7aeec4afbf6f0a0264bfbf50360e5212e" +dependencies = [ + "strum 0.23.0", + "strum_macros 0.23.1", + "unicode-width", +] + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -1094,21 +1065,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] -name = "cpp_demangle" -version = "0.3.5" +name = "core2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" dependencies = [ - "cfg-if 1.0.0", + "memchr", ] [[package]] -name = "cpufeatures" -version = "0.1.5" +name = "cpp_demangle" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" dependencies = [ - "libc", + "cfg-if 1.0.0", ] [[package]] @@ -1122,18 +1093,18 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.80.1" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62fc68cdb867b7d27b5f33cd65eb11376dfb41a2d09568a1a2c2bc1dc204f4ef" +checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.80.1" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31253a44ab62588f8235a996cc9b0636d98a299190069ced9628b8547329b47a" +checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" dependencies = [ "cranelift-bforest", "cranelift-codegen-meta", @@ -1148,33 +1119,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.80.1" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a20ab4627d30b702fb1b8a399882726d216b8164d3b3fa6189e3bf901506afe" +checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.80.1" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6687d9668dacfed4468361f7578d86bded8ca4db978f734d9b631494bebbb5b8" +checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" [[package]] name = "cranelift-entity" -version = "0.80.1" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77c5d72db97ba2cb36f69037a709edbae0d29cb25503775891e7151c5c874bf" +checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.80.1" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426dca83f63c7c64ea459eb569aadc5e0c66536c0042ed5d693f91830e8750d0" +checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" dependencies = [ "cranelift-codegen", "log", @@ -1184,9 +1155,9 @@ dependencies = [ [[package]] name = "cranelift-native" -version = "0.80.1" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8007864b5d0c49b026c861a15761785a2871124e401630c03ef1426e6d0d559e" +checksum = "501241b0cdf903412ec9075385ac9f2b1eb18a89044d1538e97fab603231f70c" dependencies = [ "cranelift-codegen", "libc", @@ -1195,9 +1166,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.80.1" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94cf12c071415ba261d897387ae5350c4d83c238376c8c5a96514ecfa2ea66a3" +checksum = "16d9e4211bbc3268042a96dd4de5bd979cda22434991d035f5f8eacba987fad2" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1253,6 +1224,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -1311,15 +1292,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "ct-logs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" -dependencies = [ - "sct 0.6.1", -] - [[package]] name = "ctor" version = "0.1.22" @@ -1353,18 +1325,18 @@ dependencies = [ [[package]] name = "cumulus-client-cli" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "clap", "sc-cli", "sc-service", - "url 2.2.2", + "url", ] [[package]] name = "cumulus-client-collator" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "cumulus-client-consensus-common", "cumulus-client-network", @@ -1372,7 +1344,7 @@ dependencies = [ "cumulus-relay-chain-interface", "futures 0.3.21", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-overseer", @@ -1388,7 +1360,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-aura" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "async-trait", "cumulus-client-consensus-common", @@ -1417,7 +1389,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-common" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "async-trait", "cumulus-relay-chain-interface", @@ -1438,14 +1410,14 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-relay-chain" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "async-trait", "cumulus-client-consensus-common", "cumulus-primitives-core", "cumulus-relay-chain-interface", "futures 0.3.21", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sc-client-api", "sc-consensus", "sp-api", @@ -1462,7 +1434,7 @@ dependencies = [ [[package]] name = "cumulus-client-network" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "async-trait", "cumulus-relay-chain-interface", @@ -1470,7 +1442,7 @@ dependencies = [ "futures 0.3.21", "futures-timer", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "polkadot-node-primitives", "polkadot-parachain", "polkadot-primitives", @@ -1487,7 +1459,7 @@ dependencies = [ [[package]] name = "cumulus-client-pov-recovery" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "cumulus-primitives-core", "cumulus-relay-chain-interface", @@ -1511,7 +1483,7 @@ dependencies = [ [[package]] name = "cumulus-client-service" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "cumulus-client-cli", "cumulus-client-collator", @@ -1520,7 +1492,7 @@ dependencies = [ "cumulus-primitives-core", "cumulus-relay-chain-interface", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "polkadot-overseer", "polkadot-primitives", "sc-chain-spec", @@ -1538,28 +1510,10 @@ dependencies = [ "tracing", ] -[[package]] -name = "cumulus-pallet-aura-ext" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" -dependencies = [ - "frame-executive", - "frame-support", - "frame-system", - "pallet-aura", - "parity-scale-codec", - "scale-info", - "serde", - "sp-application-crypto", - "sp-consensus-aura", - "sp-runtime", - "sp-std", -] - [[package]] name = "cumulus-pallet-dmp-queue" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -1577,7 +1531,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "cumulus-pallet-parachain-system-proc-macro", "cumulus-primitives-core", @@ -1607,9 +1561,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system-proc-macro" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -1618,7 +1572,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcm" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -1635,7 +1589,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcmp-queue" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -1653,7 +1607,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-core" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "frame-support", "parity-scale-codec", @@ -1669,7 +1623,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-parachain-inherent" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -1689,23 +1643,10 @@ dependencies = [ "tracing", ] -[[package]] -name = "cumulus-primitives-timestamp" -version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" -dependencies = [ - "cumulus-primitives-core", - "futures 0.3.21", - "parity-scale-codec", - "sp-inherents", - "sp-std", - "sp-timestamp", -] - [[package]] name = "cumulus-primitives-utility" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -1722,20 +1663,23 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-inprocess-interface" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "async-trait", "cumulus-primitives-core", "cumulus-relay-chain-interface", "futures 0.3.21", "futures-timer", - "parking_lot 0.12.0", + "parking_lot 0.12.1", + "polkadot-cli", "polkadot-client", "polkadot-service", + "sc-cli", "sc-client-api", "sc-consensus-babe", "sc-network", "sc-service", + "sc-sysinfo", "sc-telemetry", "sc-tracing", "sp-api", @@ -1750,15 +1694,15 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-interface" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "async-trait", "cumulus-primitives-core", "derive_more", "futures 0.3.21", - "jsonrpsee-core 0.9.0", + "jsonrpsee-core", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "polkadot-overseer", "polkadot-service", "sc-client-api", @@ -1774,7 +1718,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-rpc-interface" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "async-trait", "backoff", @@ -1782,9 +1726,9 @@ dependencies = [ "cumulus-relay-chain-interface", "futures 0.3.21", "futures-timer", - "jsonrpsee 0.9.0", + "jsonrpsee", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "polkadot-service", "sc-client-api", "sc-rpc-api", @@ -1794,13 +1738,13 @@ dependencies = [ "sp-state-machine", "sp-storage", "tracing", - "url 2.2.2", + "url", ] [[package]] name = "cumulus-test-relay-sproof-builder" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "cumulus-primitives-core", "parity-scale-codec", @@ -1836,6 +1780,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek" +version = "4.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4033478fbf70d6acf2655ac70da91ee65852d69daf7a67bf7a2f518fb47aafcf" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "data-encoding" version = "2.3.2" @@ -1891,7 +1848,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", + "rustc_version", "syn", ] @@ -1951,7 +1908,7 @@ checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", "redox_users", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1962,7 +1919,7 @@ checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", "redox_users", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1972,7 +1929,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" dependencies = [ "byteorder", - "quick-error 1.2.3", + "quick-error", ] [[package]] @@ -1983,9 +1940,9 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "dtoa" -version = "0.4.8" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" +checksum = "5caaa75cbd2b960ff1e5392d2cfb1f44717fffe12fc1f32b7b5d1267f99732a6" [[package]] name = "dyn-clonable" @@ -2022,14 +1979,15 @@ checksum = "d0d69ae62e0ce582d56380743515fefaf1a8c70cec685d9677636d7e30ae9dc9" dependencies = [ "der", "elliptic-curve", + "rfc6979", "signature", ] [[package]] name = "ed25519" -version = "1.4.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d5c4b5e5959dc2c2b89918d8e2cc40fcdd623cef026ed09d2f0ee05199dc8e4" +checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" dependencies = [ "signature", ] @@ -2074,9 +2032,9 @@ dependencies = [ [[package]] name = "enum-as-inner" -version = "0.3.4" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570d109b813e904becc80d8d5da38376818a143348413f7149f1340fe04754d4" +checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" dependencies = [ "heck 0.4.0", "proc-macro2", @@ -2086,18 +2044,18 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.6.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" +checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.6.4" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" +checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" dependencies = [ "proc-macro2", "quote", @@ -2106,9 +2064,9 @@ dependencies = [ [[package]] name = "enumn" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e58b112d5099aa0857c5d05f0eacab86406dd8c0f85fe5d320a13256d29ecf4" +checksum = "052bc8773a98bd051ff37db74a8a25f00e6bfa2cbd03373390c72e9f7afbf344" dependencies = [ "proc-macro2", "quote", @@ -2142,7 +2100,7 @@ checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" dependencies = [ "errno-dragonfly", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2176,7 +2134,7 @@ version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a718c0675c555c5f976fff4ea9e2c150fa06cefa201cadef87cfbf9324075881" dependencies = [ - "blake3 1.3.1", + "blake3", "fs-err", "proc-macro2", "quote", @@ -2184,14 +2142,15 @@ dependencies = [ [[package]] name = "expander" -version = "0.0.5" +version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309f21c39e8e38e4b6eda07e155bd7a4e5fc4d707cefd0402cc82a8b6bb65aaa" +checksum = "3774182a5df13c3d1690311ad32fbe913feef26baba609fa2dd5f72042bd2ab6" dependencies = [ - "blake2 0.10.4", + "blake2", "fs-err", "proc-macro2", "quote", + "syn", ] [[package]] @@ -2233,7 +2192,7 @@ checksum = "f5aa1e3ae159e592ad222dc90c5acbad632b527779ba88486abe92782ab268bd" dependencies = [ "expander 0.0.4", "indexmap", - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -2251,9 +2210,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2958d04124b9f27f175eaeb9a9f383d026098aa837eadd8ba22c11f13a05b9e" +checksum = "131655483be284720a17d74ff97592b8e76576dc25563148601df2d7c9080924" dependencies = [ "rand_core 0.6.3", "subtle", @@ -2305,13 +2264,11 @@ checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if 1.0.0", "crc32fast", - "libc", "libz-sys", "miniz_oxide", ] @@ -2325,7 +2282,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", ] @@ -2337,13 +2294,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" dependencies = [ "matches", - "percent-encoding 2.1.0", + "percent-encoding", ] [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -2365,28 +2322,34 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "Inflector", "chrono", "clap", + "comfy-table", "frame-benchmarking", "frame-support", + "frame-system", "handlebars", "hash-db", "hex", "itertools", "kvdb", + "lazy_static", "linked-hash-map", "log", "memory-db", "parity-scale-codec", "rand 0.8.5", + "rand_pcg 0.3.1", + "sc-block-builder", "sc-cli", "sc-client-api", "sc-client-db", "sc-executor", "sc-service", + "sc-sysinfo", "serde", "serde_json", "serde_nanos", @@ -2395,32 +2358,48 @@ dependencies = [ "sp-core", "sp-database", "sp-externalities", + "sp-inherents", "sp-keystore", "sp-runtime", "sp-state-machine", - "sp-std", "sp-storage", "sp-trie", + "tempfile", + "thiserror", + "thousands", +] + +[[package]] +name = "frame-election-provider-solution-type" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ + "frame-election-provider-solution-type", "frame-support", "frame-system", "parity-scale-codec", "scale-info", "sp-arithmetic", "sp-npos-elections", + "sp-runtime", "sp-std", ] [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -2448,12 +2427,13 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "bitflags", "frame-metadata", "frame-support-procedural", "impl-trait-for-tuples", + "k256", "log", "once_cell", "parity-scale-codec", @@ -2477,7 +2457,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "Inflector", "frame-support-procedural-tools", @@ -2489,10 +2469,10 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support-procedural-tools-derive", - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -2501,7 +2481,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "proc-macro2", "quote", @@ -2511,7 +2491,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "log", @@ -2528,7 +2508,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -2543,7 +2523,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "sp-api", @@ -2552,7 +2532,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "sp-api", @@ -2575,7 +2555,7 @@ dependencies = [ "lazy_static", "libc", "libloading 0.5.2", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2585,7 +2565,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2594,22 +2574,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags", - "fuchsia-zircon-sys", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - [[package]] name = "funty" version = "2.0.0" @@ -2682,7 +2646,7 @@ dependencies = [ "futures-io", "memchr", "parking", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "waker-fn", ] @@ -2699,13 +2663,13 @@ dependencies = [ [[package]] name = "futures-rustls" -version = "0.21.1" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1387e07917c711fb4ee4f48ea0adb04a3c9739e53ef85bf43ae1edc2937a8b" +checksum = "e01fe9932a224b72b45336d96040aa86386d674a31d0af27d800ea7bc8ca97fe" dependencies = [ "futures-io", - "rustls 0.19.1", - "webpki 0.21.4", + "rustls", + "webpki", ] [[package]] @@ -2740,7 +2704,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "pin-utils", "slab", ] @@ -2830,9 +2794,9 @@ dependencies = [ [[package]] name = "gloo-timers" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d12a7f4e95cfe710f1d624fb1210b7d961a5fb05c4fd942f4feab06e61f590e" +checksum = "5fb7d06c1c8cc2a29bee7ec961009a0b2caa0793ee4900c2ffb348734ba1c8f9" dependencies = [ "futures-channel", "futures-core", @@ -2857,7 +2821,7 @@ version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ - "bytes 1.1.0", + "bytes", "fnv", "futures-core", "futures-sink", @@ -2866,22 +2830,22 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.7.1", + "tokio-util", "tracing", ] [[package]] name = "handlebars" -version = "4.2.2" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d6a30320f094710245150395bc763ad23128d6a1ebbad7594dc4164b62c56b" +checksum = "d113a9853e5accd30f43003560b5563ffbb007e3f325e8b103fa0d0029c6e6df" dependencies = [ "log", "pest", "pest_derive", - "quick-error 2.0.1", "serde", "serde_json", + "thiserror", ] [[package]] @@ -2910,9 +2874,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" dependencies = [ "ahash", ] @@ -3017,36 +2981,36 @@ checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ "libc", "match_cfg", - "winapi 0.3.9", + "winapi", ] [[package]] name = "http" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ - "bytes 1.1.0", + "bytes", "fnv", - "itoa 1.0.1", + "itoa 1.0.2", ] [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 1.1.0", + "bytes", "http", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", ] [[package]] name = "httparse" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -3062,11 +3026,11 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.18" +version = "0.14.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" +checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" dependencies = [ - "bytes 1.1.0", + "bytes", "futures-channel", "futures-core", "futures-util", @@ -3075,32 +3039,15 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.1", - "pin-project-lite 0.2.8", - "socket2 0.4.4", + "itoa 1.0.2", + "pin-project-lite 0.2.9", + "socket2", "tokio", "tower-service", "tracing", "want", ] -[[package]] -name = "hyper-rustls" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" -dependencies = [ - "ct-logs", - "futures-util", - "hyper", - "log", - "rustls 0.19.1", - "rustls-native-certs 0.5.0", - "tokio", - "tokio-rustls 0.22.0", - "webpki 0.21.4", -] - [[package]] name = "hyper-rustls" version = "0.23.0" @@ -3110,22 +3057,10 @@ dependencies = [ "http", "hyper", "log", - "rustls 0.20.4", - "rustls-native-certs 0.6.1", + "rustls", + "rustls-native-certs", "tokio", - "tokio-rustls 0.23.3", - "webpki-roots 0.22.3", -] - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "tokio-rustls", ] [[package]] @@ -3141,39 +3076,30 @@ dependencies = [ [[package]] name = "if-addrs" -version = "0.6.7" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2273e421f7c4f0fc99e1934fe4776f59d8df2972f4199d703fc0da9f2a9f73de" +checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" dependencies = [ - "if-addrs-sys", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] -name = "if-addrs-sys" -version = "0.3.2" +name = "if-watch" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de74b9dd780476e837e5eb5ab7c88b49ed304126e412030a0adba99c8efe79ea" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "if-watch" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8ab7f67bad3240049cb24fb9cb0b4c2c6af4c245840917fbbdededeee91179" +checksum = "ae8f4a3c3d4c89351ca83e120c1c00b27df945d38e05695668c9d4b4f7bc52f3" dependencies = [ "async-io", + "core-foundation", + "fnv", "futures 0.3.21", - "futures-lite", "if-addrs", "ipnet", - "libc", "log", - "winapi 0.3.9", + "rtnetlink", + "system-configuration", + "windows", ] [[package]] @@ -3207,9 +3133,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +checksum = "e6012d540c5baa3589337a98ce73408de9b5a25ec9fc2c6fd6be8f0d39e0ca5a" dependencies = [ "autocfg", "hashbrown 0.11.2", @@ -3242,21 +3168,9 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ef6787e7f0faedc040f95716bdd0e62bcfcf4ba93da053b62dea2691c13864" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "iovec" -version = "0.1.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] +checksum = "ec58677acfea8a15352d42fc87d11d63596ade9239e0a7c9352914417515dbe6" [[package]] name = "ip_network" @@ -3264,86 +3178,23 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" -[[package]] -name = "ipci-runtime" -version = "1.9.9" -dependencies = [ - "cumulus-pallet-aura-ext", - "cumulus-pallet-parachain-system", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "lazy_static", - "pallet-assets", - "pallet-aura", - "pallet-authorship", - "pallet-bags-list", - "pallet-balances", - "pallet-bounties", - "pallet-collective", - "pallet-election-provider-multi-phase", - "pallet-identity", - "pallet-im-online", - "pallet-membership", - "pallet-offences", - "pallet-preimage", - "pallet-robonomics-datalog", - "pallet-scheduler", - "pallet-session", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "parachain-info", - "parity-scale-codec", - "robonomics-primitives", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-io", - "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", -] - [[package]] name = "ipconfig" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" +checksum = "723519edce41262b05d4143ceb95050e4c614f483e78e9fd9e39a8275a84ad98" dependencies = [ - "socket2 0.3.19", + "socket2", "widestring", - "winapi 0.3.9", + "winapi", "winreg", ] [[package]] name = "ipnet" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e70ee094dc02fd9c13fdad4940090f22dbd6ac7c9e7094a46cf0232a50bc7c" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itertools" @@ -3362,9 +3213,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "jobserver" @@ -3384,229 +3235,60 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jsonrpc-client-transports" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b99d4207e2a04fb4581746903c2bb7eb376f88de9c699d0f3e10feeac0cd3a" -dependencies = [ - "derive_more", - "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-pubsub", - "log", - "serde", - "serde_json", - "url 1.7.2", -] - -[[package]] -name = "jsonrpc-core" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" -dependencies = [ - "futures 0.3.21", - "futures-executor", - "futures-util", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "jsonrpc-core-client" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" -dependencies = [ - "futures 0.3.21", - "jsonrpc-client-transports", -] - -[[package]] -name = "jsonrpc-derive" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" -dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "jsonrpc-http-server" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" -dependencies = [ - "futures 0.3.21", - "hyper", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "net2", - "parking_lot 0.11.2", - "unicase", -] - -[[package]] -name = "jsonrpc-ipc-server" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382bb0206323ca7cda3dcd7e245cea86d37d02457a02a975e3378fb149a48845" -dependencies = [ - "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "parity-tokio-ipc", - "parking_lot 0.11.2", - "tower-service", -] - -[[package]] -name = "jsonrpc-pubsub" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240f87695e6c6f62fb37f05c02c04953cf68d6408b8c1c89de85c7a0125b1011" -dependencies = [ - "futures 0.3.21", - "jsonrpc-core", - "lazy_static", - "log", - "parking_lot 0.11.2", - "rand 0.7.3", - "serde", -] - -[[package]] -name = "jsonrpc-server-utils" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" -dependencies = [ - "bytes 1.1.0", - "futures 0.3.21", - "globset", - "jsonrpc-core", - "lazy_static", - "log", - "tokio", - "tokio-stream", - "tokio-util 0.6.9", - "unicase", -] - -[[package]] -name = "jsonrpc-ws-server" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f892c7d766369475ab7b0669f417906302d7c0fb521285c0a0c92e52e7c8e946" -dependencies = [ - "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "parity-ws", - "parking_lot 0.11.2", - "slab", -] - [[package]] name = "jsonrpsee" -version = "0.4.1" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373a33d987866ccfe1af4bc11b089dce941764313f9fd8b7cf13fcb51b72dc5" +checksum = "a1f2ab5a60e558e74ea93bcf5164ebc47939a7fff8938fa9b5233bbc63e16061" dependencies = [ - "jsonrpsee-types 0.4.1", - "jsonrpsee-utils", - "jsonrpsee-ws-client 0.4.1", -] - -[[package]] -name = "jsonrpsee" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05fd8cd6c6b1bbd06881d2cf88f1fc83cc36c98f2219090f839115fb4a956cb9" -dependencies = [ - "jsonrpsee-core 0.8.0", + "jsonrpsee-core", + "jsonrpsee-http-server", "jsonrpsee-proc-macros", - "jsonrpsee-types 0.8.0", - "jsonrpsee-ws-client 0.8.0", -] - -[[package]] -name = "jsonrpsee" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d0b8cc1959f8c05256ace093b2317482da9127f1d9227564f47e7e6bf9bda8" -dependencies = [ - "jsonrpsee-core 0.9.0", - "jsonrpsee-http-client", - "jsonrpsee-types 0.9.0", - "jsonrpsee-ws-client 0.9.0", -] - -[[package]] -name = "jsonrpsee-client-transport" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3303cdf246e6ab76e2866fb3d9acb6c76a068b1b28bd923a1b7a8122257ad7b5" -dependencies = [ - "futures 0.3.21", - "http", - "jsonrpsee-core 0.8.0", - "jsonrpsee-types 0.8.0", - "pin-project 1.0.10", - "rustls-native-certs 0.6.1", - "soketto", - "thiserror", - "tokio", - "tokio-rustls 0.23.3", - "tokio-util 0.6.9", + "jsonrpsee-types", + "jsonrpsee-ws-client", + "jsonrpsee-ws-server", "tracing", - "webpki-roots 0.22.3", ] [[package]] name = "jsonrpsee-client-transport" -version = "0.9.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa370c2c717d798c3c0a315ae3f0a707a388c6963c11f9da7dbbe1d3f7392f5f" +checksum = "26d682f4a55081a2be3e639280c640523070e4aeb8ee2fd8dd9168fdae57a9db" dependencies = [ - "futures 0.3.21", + "futures-util", "http", - "jsonrpsee-core 0.9.0", - "jsonrpsee-types 0.9.0", + "jsonrpsee-core", + "jsonrpsee-types", "pin-project 1.0.10", - "rustls-native-certs 0.6.1", + "rustls-native-certs", "soketto", "thiserror", "tokio", - "tokio-rustls 0.23.3", - "tokio-util 0.6.9", + "tokio-rustls", + "tokio-util", "tracing", - "webpki-roots 0.22.3", + "webpki-roots", ] [[package]] name = "jsonrpsee-core" -version = "0.8.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f220b5a238dc7992b90f1144fbf6eaa585872c9376afe6fe6863ffead6191bf3" +checksum = "6e27462b21279edf9a6a91f46ffbe125e9cdc58b901d2e08bf59b31a47d7d0ab" dependencies = [ "anyhow", "arrayvec 0.7.2", + "async-lock", "async-trait", "beef", "futures-channel", + "futures-timer", "futures-util", "hyper", - "jsonrpsee-types 0.8.0", + "jsonrpsee-types", + "parking_lot 0.12.1", + "rand 0.8.5", "rustc-hash", "serde", "serde_json", @@ -3617,54 +3299,31 @@ dependencies = [ ] [[package]] -name = "jsonrpsee-core" -version = "0.9.0" +name = "jsonrpsee-http-server" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22abc3274b265dcefe2e26c4beecf9fda4fffa48cf94930443a6c73678f020d5" +checksum = "7178f16eabd7154c094e24d295b9ee355ec1e5f24c328759c56255ff7bbd4548" dependencies = [ - "anyhow", - "arrayvec 0.7.2", - "async-trait", - "beef", "futures-channel", "futures-util", + "globset", "hyper", - "jsonrpsee-types 0.9.0", - "rustc-hash", - "serde", - "serde_json", - "soketto", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d31b837273d09dd80051eefa57d337769dff6c3266108c43a3544ac7ffed9d68" -dependencies = [ - "async-trait", - "hyper", - "hyper-rustls 0.23.0", - "jsonrpsee-core 0.9.0", - "jsonrpsee-types 0.9.0", - "rustc-hash", - "serde", + "jsonrpsee-core", + "jsonrpsee-types", + "lazy_static", "serde_json", - "thiserror", "tokio", "tracing", + "unicase", ] [[package]] name = "jsonrpsee-proc-macros" -version = "0.8.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4299ebf790ea9de1cb72e73ff2ae44c723ef264299e5e2d5ef46a371eb3ac3d8" +checksum = "8b8d7f449cab3b747f12c3efc27f5cad537f3b597c6a3838b0fac628f4bf730a" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -3672,28 +3331,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f778cf245158fbd8f5d50823a2e9e4c708a40be164766bd35e9fb1d86715b2" -dependencies = [ - "anyhow", - "async-trait", - "beef", - "futures-channel", - "futures-util", - "hyper", - "log", - "serde", - "serde_json", - "soketto", - "thiserror", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.8.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b3f601bbbe45cd63f5407b6f7d7950e08a7d4f82aa699ff41a4a5e9e54df58" +checksum = "8fd11763134104122ddeb0f97e4bbe393058017dfb077db63fbf44b4dd0dd86e" dependencies = [ "anyhow", "beef", @@ -3704,74 +3344,31 @@ dependencies = [ ] [[package]] -name = "jsonrpsee-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f4c45d2e2aa1db4c7d7d7dbaabc10a5b5258d99cd9d42fbfd5260b76f80c324" -dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "jsonrpsee-utils" -version = "0.4.1" +name = "jsonrpsee-ws-client" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0109c4f972058f3b1925b73a17210aff7b63b65967264d0045d15ee88fe84f0c" +checksum = "76f15180afb3761c7a3a32c0a8b680788176dcfdfe725b24c1758c90b1d1595b" dependencies = [ - "arrayvec 0.7.2", - "beef", - "jsonrpsee-types 0.4.1", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", ] [[package]] -name = "jsonrpsee-ws-client" -version = "0.4.1" +name = "jsonrpsee-ws-server" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559aa56fc402af206c00fc913dc2be1d9d788dcde045d14df141a535245d35ef" +checksum = "dfb6c21556c551582b56e4e8e6e6249b0bbdb69bb7fa39efe9b9a6b54af9f206" dependencies = [ - "arrayvec 0.7.2", - "async-trait", - "fnv", - "futures 0.3.21", - "http", - "jsonrpsee-types 0.4.1", - "log", - "pin-project 1.0.10", - "rustls-native-certs 0.5.0", - "serde", + "futures-channel", + "futures-util", + "jsonrpsee-core", + "jsonrpsee-types", "serde_json", "soketto", - "thiserror", "tokio", - "tokio-rustls 0.22.0", - "tokio-util 0.6.9", -] - -[[package]] -name = "jsonrpsee-ws-client" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff425cee7c779e33920913bc695447416078ee6d119f443f3060feffa4e86b5" -dependencies = [ - "jsonrpsee-client-transport 0.8.0", - "jsonrpsee-core 0.8.0", - "jsonrpsee-types 0.8.0", -] - -[[package]] -name = "jsonrpsee-ws-client" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b58983485b2b626c276f1eb367d62dae82132451b281072a7bfa536a33ddf3" -dependencies = [ - "jsonrpsee-client-transport 0.9.0", - "jsonrpsee-core 0.9.0", - "jsonrpsee-types 0.9.0", + "tokio-util", + "tracing", ] [[package]] @@ -3788,24 +3385,14 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" - -[[package]] -name = "kernel32-sys" -version = "0.2.2" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] +checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" [[package]] name = "kusama-runtime" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "beefy-primitives", "bitvec", @@ -3823,6 +3410,7 @@ dependencies = [ "pallet-bags-list", "pallet-balances", "pallet-bounties", + "pallet-child-bounties", "pallet-collective", "pallet-democracy", "pallet-election-provider-multi-phase", @@ -3833,9 +3421,9 @@ dependencies = [ "pallet-im-online", "pallet-indices", "pallet-membership", - "pallet-mmr-primitives", "pallet-multisig", "pallet-nicks", + "pallet-nomination-pools", "pallet-offences", "pallet-preimage", "pallet-proxy", @@ -3852,7 +3440,7 @@ dependencies = [ "pallet-treasury", "pallet-utility", "pallet-vesting", - "pallet-xcm", + "pallet-xcm 0.9.23 (git+https://github.com/paritytech/polkadot?branch=release-v0.9.23)", "parity-scale-codec", "polkadot-primitives", "polkadot-runtime-common", @@ -3870,6 +3458,7 @@ dependencies = [ "sp-core", "sp-inherents", "sp-io", + "sp-mmr-primitives", "sp-npos-elections", "sp-offchain", "sp-runtime", @@ -3887,8 +3476,8 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "frame-support", "polkadot-primitives", @@ -3924,7 +3513,7 @@ checksum = "ece7e668abd21387aeb6628130a6f4c802787f014fa46bc83221448322250357" dependencies = [ "kvdb", "parity-util-mem", - "parking_lot 0.12.0", + "parking_lot 0.12.1", ] [[package]] @@ -3939,7 +3528,7 @@ dependencies = [ "num_cpus", "owning_ref", "parity-util-mem", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "regex", "rocksdb", "smallvec", @@ -3959,9 +3548,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.122" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec647867e2bf0772e28c8bcde4f0d19a9216916e890543b5a03ed8ef27b8f259" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "libloading" @@ -3970,7 +3559,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" dependencies = [ "cc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -3980,7 +3569,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" dependencies = [ "cfg-if 1.0.0", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -3991,14 +3580,18 @@ checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" [[package]] name = "libp2p" -version = "0.40.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bec54343492ba5940a6c555e512c6721139835d28c59bc22febece72dfd0d9d" +checksum = "475ce2ac4a9727e53a519f6ee05b38abfcba8f0d39c4d24f103d184e36fd5b0f" dependencies = [ "atomic", - "bytes 1.1.0", + "bytes", "futures 0.3.21", + "futures-timer", + "getrandom 0.2.6", + "instant", "lazy_static", + "libp2p-autonat", "libp2p-core", "libp2p-deflate", "libp2p-dns", @@ -4024,17 +3617,36 @@ dependencies = [ "libp2p-websocket", "libp2p-yamux", "multiaddr", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "pin-project 1.0.10", + "rand 0.7.3", "smallvec", - "wasm-timer", +] + +[[package]] +name = "libp2p-autonat" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13b690e65046af6a09c0b27bd9508fa1cab0efce889de74b0b643b9d2a98f9a" +dependencies = [ + "async-trait", + "futures 0.3.21", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-request-response", + "libp2p-swarm", + "log", + "prost 0.9.0", + "prost-build", + "rand 0.8.5", ] [[package]] name = "libp2p-core" -version = "0.30.2" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86aad7d54df283db817becded03e611137698a6509d4237a96881976a162340c" +checksum = "db5b02602099fb75cb2d16f9ea860a320d6eb82ce41e95ab680912c454805cd5" dependencies = [ "asn1_der", "bs58", @@ -4048,28 +3660,28 @@ dependencies = [ "libsecp256k1", "log", "multiaddr", - "multihash 0.14.0", + "multihash", "multistream-select", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "pin-project 1.0.10", - "prost", + "prost 0.9.0", "prost-build", "rand 0.8.5", "ring", "rw-stream-sink", - "sha2 0.9.9", + "sha2 0.10.2", "smallvec", "thiserror", - "unsigned-varint 0.7.1", + "unsigned-varint", "void", "zeroize", ] [[package]] name = "libp2p-deflate" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51a800adb195f33de63f4b17b63fe64cfc23bf2c6a0d3d0d5321328664e65197" +checksum = "6b1d37f042f748e224f04785d0e987ae09a2aa518d6401d82d412dad83e360ed" dependencies = [ "flate2", "futures 0.3.21", @@ -4078,9 +3690,9 @@ dependencies = [ [[package]] name = "libp2p-dns" -version = "0.30.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb8f89d15cb6e3c5bc22afff7513b11bab7856f2872d3cfba86f7f63a06bc498" +checksum = "066e33e854e10b5c93fc650458bf2179c7e0d143db260b0963e44a94859817f1" dependencies = [ "async-std-resolver", "futures 0.3.21", @@ -4092,9 +3704,9 @@ dependencies = [ [[package]] name = "libp2p-floodsub" -version = "0.31.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aab3d7210901ea51b7bae2b581aa34521797af8c4ec738c980bda4a06434067f" +checksum = "733d3ea6ebe7a7a85df2bc86678b93f24b015fae5fe3b3acc4c400e795a55d2d" dependencies = [ "cuckoofilter", "fnv", @@ -4102,7 +3714,7 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "prost", + "prost 0.9.0", "prost-build", "rand 0.7.3", "smallvec", @@ -4110,78 +3722,82 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" -version = "0.33.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfeead619eb5dac46e65acc78c535a60aaec803d1428cca6407c3a4fc74d698d" +checksum = "a90c989a7c0969c2ab63e898da9bc735e3be53fb4f376e9c045ce516bcc9f928" dependencies = [ - "asynchronous-codec 0.6.0", + "asynchronous-codec", "base64", "byteorder", - "bytes 1.1.0", + "bytes", "fnv", "futures 0.3.21", "hex_fmt", + "instant", "libp2p-core", "libp2p-swarm", "log", - "prost", + "prometheus-client", + "prost 0.9.0", "prost-build", "rand 0.7.3", "regex", - "sha2 0.9.9", + "sha2 0.10.2", "smallvec", - "unsigned-varint 0.7.1", + "unsigned-varint", "wasm-timer", ] [[package]] name = "libp2p-identify" -version = "0.31.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca1275574183f288ff8b72d535d5ffa5ea9292ef7829af8b47dcb197c7b0dcd" +checksum = "c5ef5a5b57904c7c33d6713ef918d239dc6b7553458f3475d87f8a18e9c651c8" dependencies = [ "futures 0.3.21", + "futures-timer", "libp2p-core", "libp2p-swarm", "log", - "lru 0.6.6", - "prost", + "lru 0.7.6", + "prost 0.9.0", "prost-build", "smallvec", - "wasm-timer", ] [[package]] name = "libp2p-kad" -version = "0.32.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2297dc0ca285f3a09d1368bde02449e539b46f94d32d53233f53f6625bcd3ba" +checksum = "564e6bd64d177446399ed835b9451a8825b07929d6daa6a94e6405592974725e" dependencies = [ "arrayvec 0.5.2", - "asynchronous-codec 0.6.0", - "bytes 1.1.0", + "asynchronous-codec", + "bytes", "either", "fnv", "futures 0.3.21", + "futures-timer", + "instant", "libp2p-core", "libp2p-swarm", "log", - "prost", + "prost 0.9.0", "prost-build", "rand 0.7.3", - "sha2 0.9.9", + "sha2 0.10.2", "smallvec", + "thiserror", "uint", - "unsigned-varint 0.7.1", + "unsigned-varint", "void", - "wasm-timer", ] [[package]] name = "libp2p-mdns" -version = "0.32.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c864b64bdc8a84ff3910a0df88e6535f256191a450870f1e7e10cbf8e64d45" +checksum = "611ae873c8e280ccfab0d57c7a13cac5644f364529e233114ff07863946058b0" dependencies = [ "async-io", "data-encoding", @@ -4194,58 +3810,60 @@ dependencies = [ "log", "rand 0.8.5", "smallvec", - "socket2 0.4.4", + "socket2", "void", ] [[package]] name = "libp2p-metrics" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4af432fcdd2f8ba4579b846489f8f0812cfd738ced2c0af39df9b1c48bbb6ab2" +checksum = "985be799bb3796e0c136c768208c3c06604a38430571906a13dcfeda225a3b9d" dependencies = [ "libp2p-core", + "libp2p-gossipsub", "libp2p-identify", "libp2p-kad", "libp2p-ping", + "libp2p-relay", "libp2p-swarm", - "open-metrics-client", + "prometheus-client", ] [[package]] name = "libp2p-mplex" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2cd64ef597f40e14bfce0497f50ecb63dd6d201c61796daeb4227078834fbf" +checksum = "442eb0c9fff0bf22a34f015724b4143ce01877e079ed0963c722d94c07c72160" dependencies = [ - "asynchronous-codec 0.6.0", - "bytes 1.1.0", + "asynchronous-codec", + "bytes", "futures 0.3.21", "libp2p-core", "log", "nohash-hasher", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "rand 0.7.3", "smallvec", - "unsigned-varint 0.7.1", + "unsigned-varint", ] [[package]] name = "libp2p-noise" -version = "0.33.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8772c7a99088221bb7ca9c5c0574bf55046a7ab4c319f3619b275f28c8fb87a" +checksum = "9dd7e0c94051cda67123be68cf6b65211ba3dde7277be9068412de3e7ffd63ef" dependencies = [ - "bytes 1.1.0", + "bytes", "curve25519-dalek 3.2.0", "futures 0.3.21", "lazy_static", "libp2p-core", "log", - "prost", + "prost 0.9.0", "prost-build", "rand 0.8.5", - "sha2 0.9.9", + "sha2 0.10.2", "snow", "static_assertions", "x25519-dalek", @@ -4254,33 +3872,34 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.31.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80ef7b0ec5cf06530d9eb6cf59ae49d46a2c45663bde31c25a12f682664adbcf" +checksum = "bf57a3c2e821331dda9fe612d4654d676ab6e33d18d9434a18cced72630df6ad" dependencies = [ "futures 0.3.21", + "futures-timer", + "instant", "libp2p-core", "libp2p-swarm", "log", "rand 0.7.3", "void", - "wasm-timer", ] [[package]] name = "libp2p-plaintext" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fba1a6ff33e4a274c89a3b1d78b9f34f32af13265cc5c46c16938262d4e945a" +checksum = "962c0fb0e7212fb96a69b87f2d09bcefd317935239bdc79cda900e7a8897a3fe" dependencies = [ - "asynchronous-codec 0.6.0", - "bytes 1.1.0", + "asynchronous-codec", + "bytes", "futures 0.3.21", "libp2p-core", "log", - "prost", + "prost 0.9.0", "prost-build", - "unsigned-varint 0.7.1", + "unsigned-varint", "void", ] @@ -4300,89 +3919,96 @@ dependencies = [ [[package]] name = "libp2p-relay" -version = "0.4.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2852b61c90fa8ce3c8fcc2aba76e6cefc20d648f9df29157d6b3a916278ef3e3" +checksum = "3aa754cb7bccef51ebc3c458c6bbcef89d83b578a9925438389be841527d408f" dependencies = [ - "asynchronous-codec 0.6.0", - "bytes 1.1.0", + "asynchronous-codec", + "bytes", + "either", "futures 0.3.21", "futures-timer", + "instant", "libp2p-core", "libp2p-swarm", "log", "pin-project 1.0.10", - "prost", + "prost 0.9.0", "prost-build", - "rand 0.7.3", + "rand 0.8.5", "smallvec", - "unsigned-varint 0.7.1", + "static_assertions", + "thiserror", + "unsigned-varint", "void", - "wasm-timer", ] [[package]] name = "libp2p-rendezvous" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14a6d2b9e7677eff61dc3d2854876aaf3976d84a01ef6664b610c77a0c9407c5" +checksum = "bbd0baab894c5b84da510b915d53264d566c3c35889f09931fe9edbd2a773bee" dependencies = [ - "asynchronous-codec 0.6.0", + "asynchronous-codec", "bimap", "futures 0.3.21", + "futures-timer", + "instant", "libp2p-core", "libp2p-swarm", "log", - "prost", + "prost 0.9.0", "prost-build", "rand 0.8.5", - "sha2 0.9.9", + "sha2 0.10.2", "thiserror", - "unsigned-varint 0.7.1", + "unsigned-varint", "void", - "wasm-timer", ] [[package]] name = "libp2p-request-response" -version = "0.13.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a877a4ced6d46bf84677e1974e8cf61fb434af73b2e96fb48d6cb6223a4634d8" +checksum = "b5e6a6fc6c9ad95661f46989473b34bd2993d14a4de497ff3b2668a910d4b869" dependencies = [ "async-trait", - "bytes 1.1.0", + "bytes", "futures 0.3.21", + "instant", "libp2p-core", "libp2p-swarm", "log", - "lru 0.7.5", "rand 0.7.3", "smallvec", - "unsigned-varint 0.7.1", - "wasm-timer", + "unsigned-varint", ] [[package]] name = "libp2p-swarm" -version = "0.31.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f5184a508f223bc100a12665517773fb8730e9f36fc09eefb670bf01b107ae9" +checksum = "8f0c69ad9e8f7c5fc50ad5ad9c7c8b57f33716532a2b623197f69f93e374d14c" dependencies = [ "either", + "fnv", "futures 0.3.21", + "futures-timer", + "instant", "libp2p-core", "log", + "pin-project 1.0.10", "rand 0.7.3", "smallvec", + "thiserror", "void", - "wasm-timer", ] [[package]] name = "libp2p-swarm-derive" -version = "0.25.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "072c290f727d39bdc4e9d6d1c847978693d25a673bd757813681e33e5f6c00c2" +checksum = "4f693c8c68213034d472cbb93a379c63f4f307d97c06f1c41e4985de481687a5" dependencies = [ "quote", "syn", @@ -4390,9 +4016,9 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7399c5b6361ef525d41c11fcf51635724f832baf5819b30d3d873eabb4fbae4b" +checksum = "193447aa729c85aac2376828df76d171c1a589c9e6b58fcc7f9d9a020734122c" dependencies = [ "async-io", "futures 0.3.21", @@ -4402,14 +4028,14 @@ dependencies = [ "libc", "libp2p-core", "log", - "socket2 0.4.4", + "socket2", ] [[package]] name = "libp2p-uds" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b7563e46218165dfd60f64b96f7ce84590d75f53ecbdc74a7dd01450dc5973" +checksum = "24bdab114f7f2701757d6541266e1131b429bbae382008f207f2114ee4222dcb" dependencies = [ "async-std", "futures 0.3.21", @@ -4419,9 +4045,9 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1008a302b73c5020251f9708c653f5ed08368e530e247cc9cd2f109ff30042cf" +checksum = "4f6ea0f84a967ef59a16083f222c18115ae2e91db69809dce275df62e101b279" dependencies = [ "futures 0.3.21", "js-sys", @@ -4433,9 +4059,9 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.31.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e12df82d1ed64969371a9e65ea92b91064658604cc2576c2757f18ead9a1cf" +checksum = "c932834c3754501c368d1bf3d0fb458487a642b90fc25df082a3a2f3d3b32e37" dependencies = [ "either", "futures 0.3.21", @@ -4445,19 +4071,19 @@ dependencies = [ "quicksink", "rw-stream-sink", "soketto", - "url 2.2.2", - "webpki-roots 0.21.1", + "url", + "webpki-roots", ] [[package]] name = "libp2p-yamux" -version = "0.34.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7362abb8867d7187e7e93df17f460d554c997fc5c8ac57dc1259057f6889af" +checksum = "be902ebd89193cd020e89e89107726a38cfc0d16d18f613f4a37d046e92c7517" dependencies = [ "futures 0.3.21", "libp2p-core", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "thiserror", "yamux", ] @@ -4527,9 +4153,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.5" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f35facd4a5673cb5a48822be2be1d4236c1c99cb4113cab7061ac720d5bf859" +checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" dependencies = [ "cc", "pkg-config", @@ -4563,13 +4189,13 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.0.36" +version = "0.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a261afc61b7a5e323933b402ca6a1765183687c614789b1e4db7762ed4230bca" +checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7" [[package]] name = "local-runtime" -version = "1.9.0" +version = "2.0.0" dependencies = [ "frame-benchmarking", "frame-executive", @@ -4631,9 +4257,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", "value-bag", @@ -4650,9 +4276,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32613e41de4c47ab04970c348ca7ae7382cf116625755af070b008a15516a889" +checksum = "8015d95cb7b2ddd3c0d32ca38283ceb1eea09b4713ee380bceb942d85a244228" dependencies = [ "hashbrown 0.11.2", ] @@ -4697,16 +4323,19 @@ dependencies = [ [[package]] name = "main-runtime" -version = "1.9.9" +version = "2.0.0" dependencies = [ + "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", "cumulus-primitives-core", "cumulus-primitives-utility", "frame-executive", "frame-support", "frame-system", "frame-system-rpc-runtime-api", - "lazy_static", + "pallet-assets", "pallet-balances", "pallet-collective", "pallet-democracy", @@ -4728,8 +4357,11 @@ dependencies = [ "pallet-treasury", "pallet-utility", "pallet-vesting", + "pallet-xcm 0.9.23", "parachain-info", "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", "robonomics-primitives", "scale-info", "serde", @@ -4747,6 +4379,9 @@ dependencies = [ "sp-transaction-pool", "sp-version", "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -4787,9 +4422,18 @@ dependencies = [ [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memfd" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "f6627dc657574b49d6ad27105ed671822be56e0d2547d413bfbf3e8d8fa92e7a" +dependencies = [ + "libc", +] [[package]] name = "memmap2" @@ -4802,9 +4446,9 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057a3db23999c867821a7a59feb06a578fcb03685e983dff90daf9e7d24ac08f" +checksum = "d5172b50c23043ff43dd53e51392f36519d9b35a8f3a410d30ece5d1aedd58ae" dependencies = [ "libc", ] @@ -4825,7 +4469,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6566c70c1016f525ced45d7b7f97730a2bafb037c788211d0c186ef5b2189f0a" dependencies = [ "hash-db", - "hashbrown 0.12.0", + "hashbrown 0.12.1", "parity-util-mem", ] @@ -4856,18 +4500,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "metered-channel" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" -dependencies = [ - "derive_more", - "futures 0.3.21", - "futures-timer", - "thiserror", - "tracing", -] - [[package]] name = "mick-jaeger" version = "0.1.8" @@ -4887,78 +4519,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" dependencies = [ "adler", - "autocfg", ] [[package]] name = "mio" -version = "0.6.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" -dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", - "libc", - "log", - "miow 0.2.2", - "net2", - "slab", - "winapi 0.2.8", -] - -[[package]] -name = "mio" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" dependencies = [ "libc", "log", - "miow 0.3.7", - "ntapi", "wasi 0.11.0+wasi-snapshot-preview1", - "winapi 0.3.9", -] - -[[package]] -name = "mio-extras" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" -dependencies = [ - "lazycell", - "log", - "mio 0.6.23", - "slab", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", + "windows-sys", ] [[package]] @@ -4969,27 +4546,27 @@ checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" [[package]] name = "multiaddr" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ee4ea82141951ac6379f964f71b20876d43712bea8faf6dd1a375e08a46499" +checksum = "3c580bfdd8803cce319b047d239559a22f809094aaea4ac13902a1fdcfcd4261" dependencies = [ "arrayref", "bs58", "byteorder", "data-encoding", - "multihash 0.14.0", - "percent-encoding 2.1.0", + "multihash", + "percent-encoding", "serde", "static_assertions", - "unsigned-varint 0.7.1", - "url 2.2.2", + "unsigned-varint", + "url", ] [[package]] name = "multibase" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b78c60039650ff12e140ae867ef5299a58e19dded4d334c849dc7177083667e2" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" dependencies = [ "base-x", "data-encoding", @@ -4998,41 +4575,28 @@ dependencies = [ [[package]] name = "multihash" -version = "0.13.2" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dac63698b887d2d929306ea48b63760431ff8a24fac40ddb22f9c7f49fb7cab" +checksum = "e3db354f401db558759dfc1e568d010a5d4146f4d3f637be1275ec4a3cf09689" dependencies = [ "blake2b_simd", "blake2s_simd", - "blake3 0.3.8", - "digest 0.9.0", - "generic-array 0.14.5", - "multihash-derive", - "sha2 0.9.9", - "sha3 0.9.1", - "unsigned-varint 0.5.1", -] - -[[package]] -name = "multihash" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "752a61cd890ff691b4411423d23816d5866dd5621e4d1c5687a53b94b5a979d8" -dependencies = [ - "digest 0.9.0", - "generic-array 0.14.5", + "blake3", + "core2", + "digest 0.10.3", "multihash-derive", - "sha2 0.9.9", - "unsigned-varint 0.7.1", + "sha2 0.10.2", + "sha3 0.10.1", + "unsigned-varint", ] [[package]] name = "multihash-derive" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "424f6e86263cd5294cbd7f1e95746b95aca0e0d66bff31e5a40d6baa87b4aa99" +checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", @@ -5048,16 +4612,16 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "multistream-select" -version = "0.10.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56a336acba8bc87c8876f6425407dbbe6c417bf478b22015f8fb0994ef3bc0ab" +checksum = "363a84be6453a70e63513660f4894ef815daf88e3356bffcda9ca27d810ce83b" dependencies = [ - "bytes 1.1.0", + "bytes", "futures 0.3.21", "log", "pin-project 1.0.10", "smallvec", - "unsigned-varint 0.7.1", + "unsigned-varint", ] [[package]] @@ -5091,85 +4655,124 @@ dependencies = [ [[package]] name = "names" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a8690bf09abf659851e58cd666c3d37ac6af07c2bd7a9e332cfba471715775" +checksum = "e7d66043b25d4a6cccb23619d10c19c25304b355a7dccd4a8e11423dd2382146" dependencies = [ "rand 0.8.5", ] [[package]] -name = "net2" -version = "0.2.37" +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" + +[[package]] +name = "netlink-packet-core" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" dependencies = [ - "cfg-if 0.1.10", + "anyhow", + "byteorder", "libc", - "winapi 0.3.9", + "netlink-packet-utils", ] [[package]] -name = "nodrop" -version = "0.1.14" +name = "netlink-packet-route" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +checksum = "733ea73609acfd7fa7ddadfb7bf709b0471668c456ad9513685af543a06342b2" +dependencies = [ + "anyhow", + "bitflags", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] [[package]] -name = "nohash-hasher" -version = "0.2.0" +name = "netlink-packet-utils" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +checksum = "25af9cf0dc55498b7bd94a1508af7a78706aa0ab715a73c5169273e03c84845e" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] [[package]] -name = "nom" -version = "7.1.1" +name = "netlink-proto" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "ef8785b8141e8432aa45fceb922a7e876d7da3fad37fa7e7ec702ace3aa0826b" dependencies = [ - "memchr", - "minimal-lexical", + "bytes", + "futures 0.3.21", + "log", + "netlink-packet-core", + "netlink-sys", + "tokio", ] [[package]] -name = "ntapi" -version = "0.3.7" +name = "netlink-sys" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" +checksum = "3e4c9f9547a08241bee7b6558b9b98e1f290d187de8b7cfca2bbb4937bcaa8f8" dependencies = [ - "winapi 0.3.9", + "async-io", + "bytes", + "futures 0.3.21", + "libc", + "log", ] [[package]] -name = "num" -version = "0.4.0" +name = "nix" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" dependencies = [ - "num-bigint 0.4.3", - "num-complex", - "num-integer", - "num-iter", - "num-rational 0.4.0", - "num-traits", + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", ] [[package]] -name = "num-bigint" -version = "0.2.6" +name = "nodrop" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "memchr", + "minimal-lexical", ] [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ "autocfg", "num-integer", @@ -5178,9 +4781,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" +checksum = "97fbc387afefefd5e9e39493299f3069e14a140dd34dc19b4c1c1a8fddb6a790" dependencies = [ "num-traits", ] @@ -5197,25 +4800,14 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", ] -[[package]] -name = "num-iter" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-rational" version = "0.2.4" @@ -5223,7 +4815,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ "autocfg", - "num-bigint 0.2.6", + "num-bigint", "num-integer", "num-traits", ] @@ -5235,16 +4827,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a" dependencies = [ "autocfg", - "num-bigint 0.4.3", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", "libm", @@ -5271,11 +4862,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "object" +version = "0.28.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" [[package]] name = "opaque-debug" @@ -5290,34 +4890,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] -name = "open-metrics-client" -version = "0.12.0" +name = "openssl-probe" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7337d80c23c2d8b1349563981bc4fb531220733743ba8115454a67b181173f0d" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "orchestra" +version = "0.0.1" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ - "dtoa", - "itoa 0.4.8", - "open-metrics-client-derive-text-encode", - "owning_ref", + "async-trait", + "dyn-clonable", + "futures 0.3.21", + "futures-timer", + "orchestra-proc-macro", + "pin-project 1.0.10", + "prioritized-metered-channel", + "thiserror", + "tracing", ] [[package]] -name = "open-metrics-client-derive-text-encode" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c83b586f00268c619c1cb3340ec1a6f59dd9ba1d9833a273a68e6d5cd8ffc" +name = "orchestra-proc-macro" +version = "0.0.1" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ + "expander 0.0.6", + "petgraph", + "proc-macro-crate", "proc-macro2", "quote", "syn", ] -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - [[package]] name = "ordered-float" version = "1.1.1" @@ -5329,12 +4935,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.0.0" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" -dependencies = [ - "memchr", -] +checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa" [[package]] name = "owning_ref" @@ -5345,26 +4948,10 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "pallet-asset-tx-payment" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" -dependencies = [ - "frame-support", - "frame-system", - "pallet-transaction-payment", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - [[package]] name = "pallet-assets" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -5378,7 +4965,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5394,7 +4981,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5410,7 +4997,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5425,7 +5012,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -5449,7 +5036,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-election-provider-support", "frame-support", @@ -5464,7 +5051,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -5479,7 +5066,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "beefy-primitives", "frame-support", @@ -5495,18 +5082,16 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "beefy-merkle-tree", "beefy-primitives", "frame-support", "frame-system", "hex", - "k256", "log", "pallet-beefy", "pallet-mmr", - "pallet-mmr-primitives", "pallet-session", "parity-scale-codec", "scale-info", @@ -5520,7 +5105,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5534,10 +5119,28 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-child-bounties" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-bounties", + "pallet-treasury", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -5554,7 +5157,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -5570,7 +5173,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5593,7 +5196,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5610,7 +5213,7 @@ dependencies = [ [[package]] name = "pallet-gilt" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -5625,7 +5228,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -5648,7 +5251,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5664,7 +5267,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5683,7 +5286,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5699,7 +5302,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -5716,33 +5319,17 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "ckb-merkle-mountain-range", "frame-benchmarking", "frame-support", "frame-system", - "pallet-mmr-primitives", "parity-scale-codec", "scale-info", "sp-core", "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-mmr-primitives" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" -dependencies = [ - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "serde", - "sp-api", - "sp-core", + "sp-mmr-primitives", "sp-runtime", "sp-std", ] @@ -5750,24 +5337,22 @@ dependencies = [ [[package]] name = "pallet-mmr-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "pallet-mmr-primitives", + "jsonrpsee", "parity-scale-codec", "serde", "sp-api", "sp-blockchain", "sp-core", + "sp-mmr-primitives", "sp-runtime", ] [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5781,7 +5366,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5792,10 +5377,26 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-nomination-pools" +version = "1.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-staking", + "sp-std", +] + [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5812,7 +5413,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -5828,7 +5429,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -5842,8 +5443,9 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -5904,7 +5506,7 @@ dependencies = [ [[package]] name = "pallet-robonomics-liability" -version = "0.8.0" +version = "0.9.0" dependencies = [ "frame-support", "frame-system", @@ -5939,7 +5541,7 @@ dependencies = [ [[package]] name = "pallet-robonomics-rws" -version = "1.2.0" +version = "1.3.0" dependencies = [ "frame-support", "frame-system", @@ -5958,7 +5560,7 @@ dependencies = [ [[package]] name = "pallet-robonomics-staking" -version = "0.4.0" +version = "0.5.0" dependencies = [ "frame-support", "frame-system", @@ -5975,7 +5577,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -5991,7 +5593,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -6012,7 +5614,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -6026,7 +5628,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-election-provider-support", "frame-support", @@ -6047,9 +5649,9 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -6058,7 +5660,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "log", "sp-arithmetic", @@ -6067,7 +5669,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -6081,7 +5683,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-benchmarking", "frame-support", @@ -6099,7 +5701,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -6117,14 +5719,13 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", "scale-info", "serde", - "smallvec", "sp-core", "sp-io", "sp-runtime", @@ -6134,11 +5735,9 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", + "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", "sp-api", @@ -6151,7 +5750,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -6162,7 +5761,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -6178,7 +5777,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-support", "frame-system", @@ -6193,21 +5792,38 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-xcm" +version = "0.9.23" dependencies = [ "frame-support", "frame-system", "log", "parity-scale-codec", "scale-info", + "serde", + "sp-core", "sp-runtime", "sp-std", + "xcm", + "xcm-executor", ] [[package]] name = "pallet-xcm" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "frame-support", "frame-system", @@ -6225,7 +5841,7 @@ dependencies = [ [[package]] name = "parachain-info" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.18#b1e91afb7421309b203d7627b736d9bcf58260eb" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -6237,9 +5853,9 @@ dependencies = [ [[package]] name = "parity-db" -version = "0.3.11" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e7f385d61562f5834282b90aa50b41f38a35cf64d5209b8b05487b50553dbe" +checksum = "55a7901b85874402471e131de3332dde0e51f38432c69a3853627c8e25433048" dependencies = [ "blake2-rfc", "crc32fast", @@ -6274,7 +5890,7 @@ version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c45ed1f39709f5a89338fab50e59816b2e8815f5bb58276e7ddf9afd495f73f8" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -6286,20 +5902,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" -[[package]] -name = "parity-tokio-ipc" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9981e32fb75e004cc148f5fb70342f393830e0a4aa62e3cc93b50976218d42b6" -dependencies = [ - "futures 0.3.21", - "libc", - "log", - "rand 0.7.3", - "tokio", - "winapi 0.3.9", -] - [[package]] name = "parity-util-mem" version = "0.11.0" @@ -6307,15 +5909,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c32561d248d352148124f036cac253a644685a21dc9fea383eb4907d7bd35a8f" dependencies = [ "cfg-if 1.0.0", - "hashbrown 0.12.0", + "hashbrown 0.12.1", "impl-trait-for-tuples", "parity-util-mem-derive", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "primitive-types", "smallvec", "tikv-jemalloc-ctl", "tikv-jemallocator", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -6344,24 +5946,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" -[[package]] -name = "parity-ws" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5983d3929ad50f12c3eb9a6743f19d691866ecd44da74c0a3308c3f8a56df0c6" -dependencies = [ - "byteorder", - "bytes 0.4.12", - "httparse", - "log", - "mio 0.6.23", - "mio-extras", - "rand 0.7.3", - "sha-1 0.8.2", - "slab", - "url 2.2.2", -] - [[package]] name = "parking" version = "2.0.0" @@ -6381,12 +5965,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.2", + "parking_lot_core 0.9.3", ] [[package]] @@ -6400,14 +5984,14 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "winapi 0.3.9", + "winapi", ] [[package]] name = "parking_lot_core" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if 1.0.0", "libc", @@ -6446,12 +6030,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - [[package]] name = "percent-encoding" version = "2.1.0" @@ -6503,9 +6081,9 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" +checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" dependencies = [ "fixedbitset", "indexmap", @@ -6559,9 +6137,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -6569,17 +6147,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkcs8" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" -dependencies = [ - "der", - "spki", - "zeroize", -] - [[package]] name = "pkg-config" version = "0.3.25" @@ -6594,8 +6161,8 @@ checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" [[package]] name = "polkadot-approval-distribution" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", "polkadot-node-network-protocol", @@ -6603,31 +6170,33 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "tracing", + "rand 0.8.5", + "tracing-gum", ] [[package]] name = "polkadot-availability-bitfield-distribution" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "tracing", + "rand 0.8.5", + "tracing-gum", ] [[package]] name = "polkadot-availability-distribution" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "derive_more", "fatality", "futures 0.3.21", - "lru 0.7.5", + "lru 0.7.6", "parity-scale-codec", "polkadot-erasure-coding", "polkadot-node-network-protocol", @@ -6639,17 +6208,17 @@ dependencies = [ "sp-core", "sp-keystore", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-availability-recovery" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "fatality", "futures 0.3.21", - "lru 0.7.5", + "lru 0.7.6", "parity-scale-codec", "polkadot-erasure-coding", "polkadot-node-network-protocol", @@ -6660,24 +6229,26 @@ dependencies = [ "rand 0.8.5", "sc-network", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-cli" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "clap", "frame-benchmarking-cli", "futures 0.3.21", "log", + "polkadot-client", "polkadot-node-core-pvf", "polkadot-node-metrics", "polkadot-performance-test", "polkadot-service", "sc-cli", "sc-service", + "sc-sysinfo", "sc-tracing", "sp-core", "sp-trie", @@ -6688,16 +6259,21 @@ dependencies = [ [[package]] name = "polkadot-client" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "beefy-primitives", "frame-benchmarking", + "frame-benchmarking-cli", + "frame-system", "frame-system-rpc-runtime-api", - "pallet-mmr-primitives", + "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", + "polkadot-core-primitives", + "polkadot-node-core-parachains-inherent", "polkadot-primitives", "polkadot-runtime", + "polkadot-runtime-common", "sc-client-api", "sc-consensus", "sc-executor", @@ -6708,18 +6284,23 @@ dependencies = [ "sp-blockchain", "sp-consensus", "sp-consensus-babe", + "sp-core", "sp-finality-grandpa", + "sp-inherents", + "sp-keyring", + "sp-mmr-primitives", "sp-offchain", "sp-runtime", "sp-session", "sp-storage", + "sp-timestamp", "sp-transaction-pool", ] [[package]] name = "polkadot-collator-protocol" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "always-assert", "fatality", @@ -6734,13 +6315,13 @@ dependencies = [ "sp-keystore", "sp-runtime", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-core-primitives" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "parity-scale-codec", "parity-util-mem", @@ -6752,13 +6333,13 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "derive_more", "fatality", "futures 0.3.21", - "lru 0.7.5", + "lru 0.7.6", "parity-scale-codec", "polkadot-erasure-coding", "polkadot-node-network-protocol", @@ -6770,13 +6351,13 @@ dependencies = [ "sp-application-crypto", "sp-keystore", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-erasure-coding" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -6789,8 +6370,8 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", "futures-timer", @@ -6804,18 +6385,20 @@ dependencies = [ "sp-application-crypto", "sp-core", "sp-keystore", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-network-bridge" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ + "always-assert", "async-trait", + "bytes", "futures 0.3.21", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-util", @@ -6823,13 +6406,13 @@ dependencies = [ "polkadot-primitives", "sc-network", "sp-consensus", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-collation-generation" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", "parity-scale-codec", @@ -6841,20 +6424,20 @@ dependencies = [ "sp-core", "sp-maybe-compressed-blob", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-core-approval-voting" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "bitvec", "derive_more", "futures 0.3.21", "futures-timer", "kvdb", - "lru 0.7.5", + "lru 0.7.6", "merlin", "parity-scale-codec", "polkadot-node-jaeger", @@ -6869,13 +6452,14 @@ dependencies = [ "sp-consensus", "sp-consensus-slots", "sp-runtime", - "tracing", + "thiserror", + "tracing-gum", ] [[package]] name = "polkadot-node-core-av-store" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "bitvec", "futures 0.3.21", @@ -6889,15 +6473,16 @@ dependencies = [ "polkadot-overseer", "polkadot-primitives", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-core-backing" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "bitvec", + "fatality", "futures 0.3.21", "polkadot-erasure-coding", "polkadot-node-primitives", @@ -6907,13 +6492,13 @@ dependencies = [ "polkadot-statement-table", "sp-keystore", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-core-bitfield-signing" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", "polkadot-node-subsystem", @@ -6921,14 +6506,14 @@ dependencies = [ "polkadot-primitives", "sp-keystore", "thiserror", - "tracing", + "tracing-gum", "wasm-timer", ] [[package]] name = "polkadot-node-core-candidate-validation" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "async-trait", "futures 0.3.21", @@ -6940,13 +6525,13 @@ dependencies = [ "polkadot-parachain", "polkadot-primitives", "sp-maybe-compressed-blob", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-core-chain-api" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", "polkadot-node-subsystem", @@ -6955,13 +6540,13 @@ dependencies = [ "sc-client-api", "sc-consensus-babe", "sp-blockchain", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-core-chain-selection" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", "futures-timer", @@ -6972,18 +6557,18 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-core-dispute-coordinator" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "fatality", "futures 0.3.21", "kvdb", - "lru 0.7.5", + "lru 0.7.6", "parity-scale-codec", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -6991,13 +6576,13 @@ dependencies = [ "polkadot-primitives", "sc-keystore", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-core-parachains-inherent" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "async-trait", "futures 0.3.21", @@ -7008,15 +6593,16 @@ dependencies = [ "sp-inherents", "sp-runtime", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-core-provisioner" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "bitvec", + "fatality", "futures 0.3.21", "futures-timer", "polkadot-node-primitives", @@ -7025,13 +6611,13 @@ dependencies = [ "polkadot-primitives", "rand 0.8.5", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-core-pvf" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "always-assert", "assert_matches", @@ -7055,13 +6641,14 @@ dependencies = [ "sp-maybe-compressed-blob", "sp-tracing", "sp-wasm-interface", - "tracing", + "tempfile", + "tracing-gum", ] [[package]] name = "polkadot-node-core-pvf-checker" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", "polkadot-node-primitives", @@ -7071,13 +6658,13 @@ dependencies = [ "polkadot-primitives", "sp-keystore", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-core-runtime-api" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", "memory-lru", @@ -7088,21 +6675,20 @@ dependencies = [ "sp-api", "sp-authority-discovery", "sp-consensus-babe", - "sp-core", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-jaeger" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "async-std", "lazy_static", "log", "mick-jaeger", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "polkadot-node-primitives", "polkadot-primitives", "sc-network", @@ -7112,45 +6698,48 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "bs58", "futures 0.3.21", "futures-timer", "log", - "metered-channel", "parity-scale-codec", "polkadot-primitives", + "prioritized-metered-channel", "sc-cli", "sc-service", "sc-tracing", "substrate-prometheus-endpoint", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-node-network-protocol" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "async-trait", + "derive_more", "fatality", "futures 0.3.21", "parity-scale-codec", "polkadot-node-jaeger", "polkadot-node-primitives", "polkadot-primitives", + "rand 0.8.5", "sc-authority-discovery", "sc-network", "strum 0.24.0", "thiserror", + "tracing-gum", ] [[package]] name = "polkadot-node-primitives" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "bounded-vec", "futures 0.3.21", @@ -7171,8 +6760,8 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "polkadot-node-jaeger", "polkadot-node-subsystem-types", @@ -7181,15 +6770,15 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "derive_more", "futures 0.3.21", + "orchestra", "polkadot-node-jaeger", "polkadot-node-network-protocol", "polkadot-node-primitives", - "polkadot-overseer-gen", "polkadot-primitives", "polkadot-statement-table", "sc-network", @@ -7200,8 +6789,8 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "async-trait", "derive_more", @@ -7209,8 +6798,7 @@ dependencies = [ "futures 0.3.21", "itertools", "kvdb", - "lru 0.7.5", - "metered-channel", + "lru 0.7.6", "parity-db", "parity-scale-codec", "parity-util-mem", @@ -7223,68 +6811,41 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-overseer", "polkadot-primitives", + "prioritized-metered-channel", "rand 0.8.5", "sp-application-crypto", "sp-core", "sp-keystore", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-overseer" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", "futures-timer", - "lru 0.7.5", + "lru 0.7.6", + "orchestra", "parity-util-mem", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem-types", - "polkadot-overseer-gen", "polkadot-primitives", "sc-client-api", "sp-api", - "tracing", -] - -[[package]] -name = "polkadot-overseer-gen" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" -dependencies = [ - "async-trait", - "futures 0.3.21", - "futures-timer", - "metered-channel", - "pin-project 1.0.10", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-overseer-gen-proc-macro", - "thiserror", - "tracing", -] - -[[package]] -name = "polkadot-overseer-gen-proc-macro" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" -dependencies = [ - "expander 0.0.5", - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn", + "sp-core", + "tracing-gum", ] [[package]] name = "polkadot-parachain" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "derive_more", "frame-support", @@ -7300,8 +6861,8 @@ dependencies = [ [[package]] name = "polkadot-performance-test" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "env_logger", "kusama-runtime", @@ -7315,8 +6876,8 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "bitvec", "frame-system", @@ -7345,12 +6906,12 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "beefy-gadget", "beefy-gadget-rpc", - "jsonrpc-core", + "jsonrpsee", "pallet-mmr-rpc", "pallet-transaction-payment-rpc", "polkadot-primitives", @@ -7372,12 +6933,13 @@ dependencies = [ "sp-keystore", "sp-runtime", "substrate-frame-rpc-system", + "substrate-state-trie-migration-rpc", ] [[package]] name = "polkadot-runtime" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "beefy-primitives", "bitvec", @@ -7394,6 +6956,7 @@ dependencies = [ "pallet-bags-list", "pallet-balances", "pallet-bounties", + "pallet-child-bounties", "pallet-collective", "pallet-democracy", "pallet-election-provider-multi-phase", @@ -7403,7 +6966,6 @@ dependencies = [ "pallet-im-online", "pallet-indices", "pallet-membership", - "pallet-mmr-primitives", "pallet-multisig", "pallet-nicks", "pallet-offences", @@ -7420,7 +6982,7 @@ dependencies = [ "pallet-treasury", "pallet-utility", "pallet-vesting", - "pallet-xcm", + "pallet-xcm 0.9.23 (git+https://github.com/paritytech/polkadot?branch=release-v0.9.23)", "parity-scale-codec", "polkadot-primitives", "polkadot-runtime-common", @@ -7438,6 +7000,7 @@ dependencies = [ "sp-core", "sp-inherents", "sp-io", + "sp-mmr-primitives", "sp-npos-elections", "sp-offchain", "sp-runtime", @@ -7455,8 +7018,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "beefy-primitives", "bitvec", @@ -7500,8 +7063,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "frame-support", "polkadot-primitives", @@ -7512,8 +7075,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "bs58", "parity-scale-codec", @@ -7524,8 +7087,8 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "bitflags", "bitvec", @@ -7564,8 +7127,8 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "async-trait", "beefy-gadget", @@ -7575,10 +7138,9 @@ dependencies = [ "hex-literal 0.3.4", "kvdb", "kvdb-rocksdb", - "lru 0.7.5", + "lru 0.7.6", "pallet-babe", "pallet-im-online", - "pallet-mmr-primitives", "pallet-staking", "pallet-transaction-payment-rpc-runtime-api", "parity-db", @@ -7607,6 +7169,7 @@ dependencies = [ "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", + "polkadot-node-subsystem-types", "polkadot-node-subsystem-util", "polkadot-overseer", "polkadot-parachain", @@ -7633,9 +7196,11 @@ dependencies = [ "sc-offchain", "sc-service", "sc-sync-state-rpc", + "sc-sysinfo", "sc-telemetry", "sc-transaction-pool", "serde", + "serde_json", "sp-api", "sp-authority-discovery", "sp-block-builder", @@ -7657,13 +7222,13 @@ dependencies = [ "sp-trie", "substrate-prometheus-endpoint", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-statement-distribution" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "arrayvec 0.5.2", "fatality", @@ -7678,13 +7243,13 @@ dependencies = [ "sp-keystore", "sp-staking", "thiserror", - "tracing", + "tracing-gum", ] [[package]] name = "polkadot-statement-table" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -7701,7 +7266,7 @@ dependencies = [ "libc", "log", "wepoll-ffi", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -7710,7 +7275,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" dependencies = [ - "cpufeatures 0.2.2", + "cpufeatures", "opaque-debug 0.3.0", "universal-hash", ] @@ -7722,7 +7287,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" dependencies = [ "cfg-if 1.0.0", - "cpufeatures 0.2.2", + "cpufeatures", "opaque-debug 0.3.0", "universal-hash", ] @@ -7747,12 +7312,18 @@ dependencies = [ ] [[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +name = "prioritized-metered-channel" +version = "0.2.0" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ - "toml", + "coarsetime", + "crossbeam-queue", + "derive_more", + "futures 0.3.21", + "futures-timer", + "nanorand", + "thiserror", + "tracing", ] [[package]] @@ -7797,25 +7368,48 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cface98dfa6d645ea4c789839f176e4b072265d085bfcc48eaa8d137f58d3c39" +dependencies = [ + "cfg-if 1.0.0", + "fnv", + "lazy_static", + "memchr", + "parking_lot 0.12.1", + "thiserror", +] + +[[package]] +name = "prometheus-client" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "c9a896938cc6018c64f279888b8c7559d3725210d5db9a3a1ee6bc7188d51d34" dependencies = [ - "unicode-xid", + "dtoa", + "itoa 1.0.2", + "owning_ref", + "prometheus-client-derive-text-encode", ] [[package]] -name = "prometheus" -version = "0.13.0" +name = "prometheus-client-derive-text-encode" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f64969ffd5dd8f39bd57a68ac53c163a095ed9d0fb707146da1b27025a3504" +checksum = "e8e12d01b9d66ad9eb4529c57666b6263fc1993cb30261d83ead658fdd932652" dependencies = [ - "cfg-if 1.0.0", - "fnv", - "lazy_static", - "memchr", - "parking_lot 0.11.2", - "thiserror", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -7824,8 +7418,18 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" dependencies = [ - "bytes 1.1.0", - "prost-derive", + "bytes", + "prost-derive 0.9.0", +] + +[[package]] +name = "prost" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" +dependencies = [ + "bytes", + "prost-derive 0.10.1", ] [[package]] @@ -7834,14 +7438,14 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" dependencies = [ - "bytes 1.1.0", + "bytes", "heck 0.3.3", "itertools", "lazy_static", "log", "multimap", "petgraph", - "prost", + "prost 0.9.0", "prost-types", "regex", "tempfile", @@ -7861,14 +7465,27 @@ dependencies = [ "syn", ] +[[package]] +name = "prost-derive" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b670f45da57fb8542ebdbb6105a925fe571b67f9e7ed9f47a06a84e72b4e7cc" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "prost-types" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" dependencies = [ - "bytes 1.1.0", - "prost", + "bytes", + "prost 0.9.0", ] [[package]] @@ -7886,12 +7503,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - [[package]] name = "quicksink" version = "0.1.2" @@ -7929,7 +7540,7 @@ dependencies = [ "rand_chacha 0.2.2", "rand_core 0.5.1", "rand_hc", - "rand_pcg", + "rand_pcg 0.2.1", ] [[package]] @@ -8009,6 +7620,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_pcg" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +dependencies = [ + "rand_core 0.6.3", +] + [[package]] name = "rawpointer" version = "0.2.1" @@ -8017,9 +7637,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", "crossbeam-deque", @@ -8029,14 +7649,13 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "lazy_static", "num_cpus", ] @@ -8075,18 +7694,18 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300f2a835d808734ee295d45007adacb9ebb29dd3ae2424acfa17930cae541da" +checksum = "685d58625b6c2b83e4cc88a27c4bf65adb7b6b16dbdc413e515c9405b47432ab" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c38e3aecd2b21cb3959637b883bb3714bc7e43f0268b9a29d3743ee3e55cdd2" +checksum = "a043824e29c94169374ac5183ac0ed43f5724dc4556b19568007486bd840fa1f" dependencies = [ "proc-macro2", "quote", @@ -8095,9 +7714,9 @@ dependencies = [ [[package]] name = "regalloc" -version = "0.0.33" +version = "0.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d808cff91dfca7b239d40b972ba628add94892b1d9e19a842aedc5cfae8ab1a" +checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" dependencies = [ "log", "rustc-hash", @@ -8106,9 +7725,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.5" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" dependencies = [ "aho-corasick", "memchr", @@ -8126,9 +7745,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "region" @@ -8139,16 +7758,16 @@ dependencies = [ "bitflags", "libc", "mach", - "winapi 0.3.9", + "winapi", ] [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "env_logger", - "jsonrpsee 0.8.0", + "jsonrpsee", "log", "parity-scale-codec", "serde", @@ -8165,7 +7784,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -8175,14 +7794,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" dependencies = [ "hostname", - "quick-error 1.2.3", + "quick-error", ] [[package]] name = "retain_mut" -version = "0.1.7" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4389f1d5789befaf6029ebd9f7dac4af7f7e3d61b69d4f30e2ac02b57e7712b0" + +[[package]] +name = "rfc6979" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c31b5c4033f8fdde8700e4657be2c497e7288f01515be52168c631e2e4d4086" +checksum = "96ef608575f6392792f9ecf7890c00086591d29a83910939d430753f7c050525" +dependencies = [ + "crypto-bigint", + "hmac 0.11.0", + "zeroize", +] [[package]] name = "ring" @@ -8196,12 +7826,12 @@ dependencies = [ "spin", "untrusted", "web-sys", - "winapi 0.3.9", + "winapi", ] [[package]] name = "robonomics-node" -version = "1.9.9" +version = "2.0.0" dependencies = [ "parity-util-mem", "robonomics-service", @@ -8209,7 +7839,7 @@ dependencies = [ [[package]] name = "robonomics-primitives" -version = "1.9.9" +version = "2.0.0" dependencies = [ "frame-system", "parity-scale-codec", @@ -8220,49 +7850,15 @@ dependencies = [ "sp-std", ] -[[package]] -name = "robonomics-protocol" -version = "0.12.0" -dependencies = [ - "async-trait", - "bincode", - "chrono", - "derive_more", - "futures 0.3.21", - "futures-timer", - "hex", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-pubsub", - "libp2p", - "log", - "parity-scale-codec", - "rand 0.8.5", - "robonomics-primitives", - "rust-base58", - "rustc-hex", - "sc-rpc-api", - "serde", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "substrate-frame-rpc-system", -] - [[package]] name = "robonomics-rpc" -version = "1.9.9" +version = "2.0.0" dependencies = [ - "jsonrpc-core", - "jsonrpc-pubsub", + "jsonrpsee", "local-runtime", "pallet-transaction-payment-rpc", "parity-scale-codec", "robonomics-primitives", - "robonomics-protocol", "sc-chain-spec", "sc-client-api", "sc-keystore", @@ -8280,7 +7876,7 @@ dependencies = [ [[package]] name = "robonomics-service" -version = "1.9.9" +version = "2.0.0" dependencies = [ "alpha-runtime", "clap", @@ -8302,8 +7898,7 @@ dependencies = [ "frame-support", "frame-system-rpc-runtime-api", "hex-literal 0.3.4", - "ipci-runtime", - "jsonrpc-core", + "jsonrpsee", "local-runtime", "log", "main-runtime", @@ -8318,7 +7913,6 @@ dependencies = [ "polkadot-primitives", "polkadot-service", "robonomics-primitives", - "robonomics-protocol", "robonomics-rpc", "sc-basic-authorship", "sc-chain-spec", @@ -8351,7 +7945,6 @@ dependencies = [ "sp-blockchain", "sp-consensus", "sp-consensus-aura", - "sp-consensus-babe", "sp-core", "sp-externalities", "sp-finality-grandpa", @@ -8389,16 +7982,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffc936cf8a7ea60c58f030fd36a612a48f440610214dc54bc36431f9ea0c3efb" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] -name = "rust-base58" -version = "0.0.4" +name = "rtnetlink" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b313b91fcdc6719ad41fa2dad2b7e810b03833fae4bf911950e15529a5f04439" +checksum = "6f54290e54521dac3de4149d83ddf9f62a359b3cc93bcb494a794a41e6f4744b" dependencies = [ - "num", + "async-global-executor", + "futures 0.3.21", + "log", + "netlink-packet-route", + "netlink-proto", + "nix", + "thiserror", ] [[package]] @@ -8419,80 +8018,46 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.7", + "semver 1.0.9", ] [[package]] name = "rustix" -version = "0.31.3" +version = "0.33.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2dcfc2778a90e38f56a708bfc90572422e11d6c7ee233d053d1f782cf9df6d2" +checksum = "938a344304321a9da4973b9ff4f9f8db9caf4597dfd9dda6a60b523340a0fff0" dependencies = [ "bitflags", "errno", "io-lifetimes", "libc", "linux-raw-sys", - "winapi 0.3.9", -] - -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64", - "log", - "ring", - "sct 0.6.1", - "webpki 0.21.4", + "winapi", ] [[package]] name = "rustls" -version = "0.20.4" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921" +checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" dependencies = [ "log", "ring", - "sct 0.7.0", - "webpki 0.22.0", -] - -[[package]] -name = "rustls-native-certs" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" -dependencies = [ - "openssl-probe", - "rustls 0.19.1", - "schannel", - "security-framework", + "sct", + "webpki", ] [[package]] name = "rustls-native-certs" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca9ebdfa27d3fc180e42879037b5338ab1c040c06affd00d8338598e7800943" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" dependencies = [ "openssl-probe", "rustls-pemfile", @@ -8502,9 +8067,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "0.2.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" +checksum = "e7522c9de787ff061458fe9a829dc790a3f5b22dc571694fc5883f448b94d9a9" dependencies = [ "base64", ] @@ -8528,9 +8093,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "salsa20" @@ -8553,7 +8118,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "log", "sp-core", @@ -8564,7 +8129,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "futures 0.3.21", @@ -8573,7 +8138,7 @@ dependencies = [ "libp2p", "log", "parity-scale-codec", - "prost", + "prost 0.10.4", "prost-build", "rand 0.7.3", "sc-client-api", @@ -8591,7 +8156,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", "futures-timer", @@ -8614,7 +8179,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -8630,10 +8195,10 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "impl-trait-for-tuples", - "memmap2 0.5.3", + "memmap2 0.5.4", "parity-scale-codec", "sc-chain-spec-derive", "sc-network", @@ -8647,9 +8212,9 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -8658,7 +8223,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "chrono", "clap", @@ -8673,6 +8238,7 @@ dependencies = [ "regex", "rpassword", "sc-client-api", + "sc-client-db", "sc-keystore", "sc-network", "sc-service", @@ -8696,14 +8262,14 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "fnv", "futures 0.3.21", "hash-db", "log", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sc-executor", "sc-transaction-pool-api", "sc-utils", @@ -8724,7 +8290,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "hash-db", "kvdb", @@ -8734,7 +8300,7 @@ dependencies = [ "log", "parity-db", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sc-client-api", "sc-state-db", "sp-arithmetic", @@ -8749,14 +8315,14 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "futures 0.3.21", "futures-timer", "libp2p", "log", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sc-client-api", "sc-utils", "serde", @@ -8773,7 +8339,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "futures 0.3.21", @@ -8802,18 +8368,18 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "fork-tree", "futures 0.3.21", "log", "merlin", - "num-bigint 0.2.6", + "num-bigint", "num-rational 0.2.4", "num-traits", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "rand 0.7.3", "retain_mut", "sc-client-api", @@ -8845,12 +8411,10 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", + "jsonrpsee", "sc-consensus-babe", "sc-consensus-epochs", "sc-rpc-api", @@ -8869,7 +8433,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "fork-tree", "parity-scale-codec", @@ -8882,7 +8446,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "futures 0.3.21", @@ -8907,7 +8471,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "sc-client-api", "sp-authorship", @@ -8918,12 +8482,12 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "lazy_static", - "lru 0.6.6", + "lru 0.7.6", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sc-executor-common", "sc-executor-wasmi", "sc-executor-wasmtime", @@ -8945,13 +8509,13 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "environmental", "parity-scale-codec", "sc-allocator", - "sp-core", "sp-maybe-compressed-blob", + "sp-sandbox", "sp-serializer", "sp-wasm-interface", "thiserror", @@ -8962,15 +8526,14 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "log", "parity-scale-codec", "sc-allocator", "sc-executor-common", - "scoped-tls", - "sp-core", "sp-runtime-interface", + "sp-sandbox", "sp-wasm-interface", "wasmi", ] @@ -8978,7 +8541,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "cfg-if 1.0.0", "libc", @@ -8987,8 +8550,8 @@ dependencies = [ "parity-wasm 0.42.2", "sc-allocator", "sc-executor-common", - "sp-core", "sp-runtime-interface", + "sp-sandbox", "sp-wasm-interface", "wasmtime", ] @@ -8996,7 +8559,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "ahash", "async-trait", @@ -9008,7 +8571,7 @@ dependencies = [ "hex", "log", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "rand 0.8.5", "sc-block-builder", "sc-chain-spec", @@ -9036,14 +8599,11 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "finality-grandpa", "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-pubsub", + "jsonrpsee", "log", "parity-scale-codec", "sc-client-api", @@ -9060,7 +8620,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "ansi_term", "futures 0.3.21", @@ -9077,11 +8637,11 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "hex", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "serde_json", "sp-application-crypto", "sp-core", @@ -9092,12 +8652,12 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", - "asynchronous-codec 0.5.0", + "asynchronous-codec", "bitflags", - "bytes 1.1.0", + "bytes", "cid", "either", "fnv", @@ -9110,16 +8670,19 @@ dependencies = [ "linked-hash-map", "linked_hash_set", "log", - "lru 0.7.5", + "lru 0.7.6", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "pin-project 1.0.10", - "prost", + "prost 0.10.4", "prost-build", "rand 0.7.3", "sc-block-builder", "sc-client-api", "sc-consensus", + "sc-network-common", + "sc-network-light", + "sc-network-sync", "sc-peerset", "sc-utils", "serde", @@ -9133,44 +8696,106 @@ dependencies = [ "sp-runtime", "substrate-prometheus-endpoint", "thiserror", - "unsigned-varint 0.6.0", + "unsigned-varint", "void", "zeroize", ] +[[package]] +name = "sc-network-common" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +dependencies = [ + "futures 0.3.21", + "libp2p", + "parity-scale-codec", + "prost-build", + "sc-peerset", + "smallvec", +] + [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "ahash", "futures 0.3.21", "futures-timer", "libp2p", "log", - "lru 0.7.5", + "lru 0.7.6", "sc-network", "sp-runtime", "substrate-prometheus-endpoint", "tracing", ] +[[package]] +name = "sc-network-light" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +dependencies = [ + "futures 0.3.21", + "libp2p", + "log", + "parity-scale-codec", + "prost 0.10.4", + "prost-build", + "sc-client-api", + "sc-network-common", + "sc-peerset", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-network-sync" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +dependencies = [ + "bitflags", + "either", + "fork-tree", + "futures 0.3.21", + "libp2p", + "log", + "lru 0.7.6", + "parity-scale-codec", + "prost 0.10.4", + "prost-build", + "sc-client-api", + "sc-consensus", + "sc-network-common", + "sc-peerset", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-finality-grandpa", + "sp-runtime", + "thiserror", +] + [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ - "bytes 1.1.0", + "bytes", "fnv", "futures 0.3.21", "futures-timer", "hex", "hyper", - "hyper-rustls 0.22.1", + "hyper-rustls", "num_cpus", "once_cell", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "rand 0.7.3", "sc-client-api", "sc-network", @@ -9186,7 +8811,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", "libp2p", @@ -9199,7 +8824,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -9208,15 +8833,14 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", "hash-db", - "jsonrpc-core", - "jsonrpc-pubsub", + "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sc-block-builder", "sc-chain-spec", "sc-client-api", @@ -9239,18 +8863,16 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-pubsub", + "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sc-chain-spec", "sc-transaction-pool-api", + "scale-info", "serde", "serde_json", "sp-core", @@ -9264,14 +8886,10 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-http-server", - "jsonrpc-ipc-server", - "jsonrpc-pubsub", - "jsonrpc-ws-server", + "jsonrpsee", "log", "serde_json", "substrate-prometheus-endpoint", @@ -9281,7 +8899,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "directories", @@ -9289,12 +8907,11 @@ dependencies = [ "futures 0.3.21", "futures-timer", "hash-db", - "jsonrpc-core", - "jsonrpc-pubsub", + "jsonrpsee", "log", "parity-scale-codec", "parity-util-mem", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "pin-project 1.0.10", "rand 0.7.3", "sc-block-builder", @@ -9306,9 +8923,11 @@ dependencies = [ "sc-informant", "sc-keystore", "sc-network", + "sc-network-common", "sc-offchain", "sc-rpc", "sc-rpc-server", + "sc-sysinfo", "sc-telemetry", "sc-tracing", "sc-transaction-pool", @@ -9345,13 +8964,13 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "log", "parity-scale-codec", "parity-util-mem", "parity-util-mem-derive", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sc-client-api", "sp-core", ] @@ -9359,11 +8978,9 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", + "jsonrpsee", "parity-scale-codec", "sc-chain-spec", "sc-client-api", @@ -9377,16 +8994,35 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sc-sysinfo" +version = "6.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +dependencies = [ + "futures 0.3.21", + "libc", + "log", + "rand 0.7.3", + "rand_pcg 0.2.1", + "regex", + "sc-telemetry", + "serde", + "serde_json", + "sp-core", + "sp-io", + "sp-std", +] + [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "chrono", "futures 0.3.21", "libp2p", "log", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "pin-project 1.0.10", "rand 0.7.3", "serde", @@ -9398,7 +9034,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "ansi_term", "atty", @@ -9407,7 +9043,7 @@ dependencies = [ "libc", "log", "once_cell", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "regex", "rustc-hash", "sc-client-api", @@ -9429,9 +9065,9 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -9440,7 +9076,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", "futures-timer", @@ -9448,7 +9084,7 @@ dependencies = [ "log", "parity-scale-codec", "parity-util-mem", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "retain_mut", "sc-client-api", "sc-transaction-pool-api", @@ -9467,7 +9103,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", "log", @@ -9480,21 +9116,21 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", "futures-timer", "lazy_static", "log", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "prometheus", ] [[package]] name = "scale-info" -version = "2.1.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21fe4ca2b2295d5519b364579162b8e18f4902f6c9e8a975e7d05e7ef63622f5" +checksum = "c46be926081c9f4dd5dd9b6f1d3e3229f2360bc6502dd8836f84a93b7c75e99a" dependencies = [ "bitvec", "cfg-if 1.0.0", @@ -9506,11 +9142,11 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.1.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e767e52f2d5b2e71e86b1c82976bf4c3acdef88d72af7fa3498cef31cd9708cb" +checksum = "50e334bb10a245e28e5fd755cabcafd96cfcd167c99ae63a46924ca8d8703a3c" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -9518,12 +9154,12 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi 0.3.9", + "windows-sys", ] [[package]] @@ -9544,28 +9180,12 @@ dependencies = [ "zeroize", ] -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sct" version = "0.7.0" @@ -9584,7 +9204,6 @@ checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" dependencies = [ "der", "generic-array 0.14.5", - "pkcs8", "subtle", "zeroize", ] @@ -9645,23 +9264,14 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" dependencies = [ - "semver-parser 0.7.0", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser 0.10.2", + "semver-parser", ] [[package]] name = "semver" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4" +checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" dependencies = [ "serde", ] @@ -9672,29 +9282,20 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - [[package]] name = "serde" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -9703,11 +9304,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ - "itoa 1.0.1", + "itoa 1.0.2", "ryu", "serde", ] @@ -9741,7 +9342,7 @@ checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", - "cpufeatures 0.2.2", + "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", ] @@ -9766,7 +9367,7 @@ checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", - "cpufeatures 0.2.2", + "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", ] @@ -9778,7 +9379,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" dependencies = [ "cfg-if 1.0.0", - "cpufeatures 0.2.2", + "cpufeatures", "digest 0.10.3", ] @@ -9821,9 +9422,9 @@ checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "signal-hook" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d" +checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" dependencies = [ "libc", "signal-hook-registry", @@ -9844,6 +9445,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788" dependencies = [ + "digest 0.9.0", "rand_core 0.6.3", ] @@ -9867,8 +9469,8 @@ checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "slot-range-helper" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "enumn", "parity-scale-codec", @@ -9900,31 +9502,19 @@ checksum = "45456094d1983e2ee2a18fdfebce3189fa451699d0502cb8e3b49dba5ba41451" [[package]] name = "snow" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6142f7c25e94f6fd25a32c3348ec230df9109b463f59c8c7acc4bd34936babb7" +checksum = "774d05a3edae07ce6d68ea6984f3c05e9bba8927e3dd591e3b479e5b03213d0d" dependencies = [ "aes-gcm", - "blake2 0.9.2", - "chacha20poly1305", - "rand 0.8.5", - "rand_core 0.6.3", - "ring", - "rustc_version 0.3.3", - "sha2 0.9.9", - "subtle", - "x25519-dalek", -] - -[[package]] -name = "socket2" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "winapi 0.3.9", + "blake2", + "chacha20poly1305", + "curve25519-dalek 4.0.0-pre.1", + "rand_core 0.6.3", + "ring", + "rustc_version", + "sha2 0.10.2", + "subtle", ] [[package]] @@ -9934,7 +9524,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -9944,7 +9534,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" dependencies = [ "base64", - "bytes 1.1.0", + "bytes", "flate2", "futures 0.3.21", "httparse", @@ -9956,7 +9546,7 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "hash-db", "log", @@ -9973,10 +9563,10 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ - "blake2 0.10.4", - "proc-macro-crate 1.1.3", + "blake2", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -9985,7 +9575,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "scale-info", @@ -9998,7 +9588,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "integer-sqrt", "num-traits", @@ -10013,7 +9603,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "scale-info", @@ -10026,7 +9616,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "parity-scale-codec", @@ -10038,7 +9628,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "sp-api", @@ -10050,13 +9640,13 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", "log", - "lru 0.7.5", + "lru 0.7.6", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "sp-api", "sp-consensus", "sp-database", @@ -10068,7 +9658,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "futures 0.3.21", @@ -10087,7 +9677,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "parity-scale-codec", @@ -10105,7 +9695,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "merlin", @@ -10128,7 +9718,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "scale-info", @@ -10142,9 +9732,10 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", + "scale-info", "schnorrkel", "sp-core", "sp-runtime", @@ -10154,7 +9745,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "base58 0.2.0", "bitflags", @@ -10174,7 +9765,7 @@ dependencies = [ "num-traits", "parity-scale-codec", "parity-util-mem", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "primitive-types", "rand 0.7.3", "regex", @@ -10200,9 +9791,9 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ - "blake2 0.10.4", + "blake2", "byteorder", "digest 0.10.3", "sha2 0.10.2", @@ -10214,7 +9805,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "proc-macro2", "quote", @@ -10225,16 +9816,16 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "kvdb", - "parking_lot 0.12.0", + "parking_lot 0.12.1", ] [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "proc-macro2", "quote", @@ -10244,7 +9835,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "environmental", "parity-scale-codec", @@ -10255,7 +9846,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "finality-grandpa", "log", @@ -10273,7 +9864,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -10287,14 +9878,14 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures 0.3.21", "hash-db", "libsecp256k1", "log", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "secp256k1", "sp-core", "sp-externalities", @@ -10312,7 +9903,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "lazy_static", "sp-core", @@ -10323,13 +9914,13 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "futures 0.3.21", "merlin", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "schnorrkel", "serde", "sp-core", @@ -10340,42 +9931,45 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "thiserror", "zstd", ] [[package]] -name = "sp-npos-elections" +name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ + "log", "parity-scale-codec", - "scale-info", "serde", - "sp-arithmetic", + "sp-api", "sp-core", - "sp-npos-elections-solution-type", + "sp-debug-derive", "sp-runtime", "sp-std", ] [[package]] -name = "sp-npos-elections-solution-type" +name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn", + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "sp-api", "sp-core", @@ -10385,7 +9979,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "backtrace", "lazy_static", @@ -10395,7 +9989,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "rustc-hash", "serde", @@ -10405,7 +9999,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "either", "hash256-std-hasher", @@ -10427,7 +10021,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -10444,19 +10038,33 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "Inflector", - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", ] +[[package]] +name = "sp-sandbox" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +dependencies = [ + "log", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-std", + "sp-wasm-interface", + "wasmi", +] + [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "serde", "serde_json", @@ -10465,7 +10073,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "scale-info", @@ -10479,7 +10087,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "scale-info", @@ -10490,13 +10098,13 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "hash-db", "log", "num-traits", "parity-scale-codec", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "rand 0.7.3", "smallvec", "sp-core", @@ -10506,19 +10114,18 @@ dependencies = [ "sp-trie", "thiserror", "tracing", - "trie-db", "trie-root", ] [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "impl-serde", "parity-scale-codec", @@ -10531,7 +10138,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "log", "sp-core", @@ -10544,7 +10151,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "futures-timer", @@ -10560,7 +10167,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "sp-std", @@ -10572,7 +10179,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "sp-api", "sp-runtime", @@ -10581,7 +10188,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "async-trait", "log", @@ -10597,7 +10204,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "hash-db", "memory-db", @@ -10613,7 +10220,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "impl-serde", "parity-scale-codec", @@ -10630,7 +10237,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -10641,7 +10248,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "impl-trait-for-tuples", "log", @@ -10657,21 +10264,11 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" -[[package]] -name = "spki" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" -dependencies = [ - "base64ct", - "der", -] - [[package]] name = "ss58-registry" -version = "1.17.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b84a70894df7a73666e0694f44b41a9571625e9546fb58a0818a565d2c7e084" +checksum = "5d804c8d48aeab838be31570866fce1130d275b563d49af08b4927a0bd561e7c" dependencies = [ "Inflector", "num-format", @@ -10798,7 +10395,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "platforms", ] @@ -10806,18 +10403,17 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", + "jsonrpsee", "log", "parity-scale-codec", "sc-client-api", "sc-rpc-api", "sc-transaction-pool-api", + "serde_json", "sp-api", "sp-block-builder", "sp-blockchain", @@ -10828,7 +10424,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "futures-util", "hyper", @@ -10838,10 +10434,31 @@ dependencies = [ "tokio", ] +[[package]] +name = "substrate-state-trie-migration-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +dependencies = [ + "jsonrpsee", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-rpc-api", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "trie-db", +] + [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "ansi_term", "build-helper", @@ -10862,13 +10479,13 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.91" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -10883,6 +10500,27 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "system-configuration" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -10891,9 +10529,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fa7e55043acb85fca6b3c01485a2eeb6b69c5d21002e273c79e465f43b7ac1" +checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" [[package]] name = "tempfile" @@ -10906,7 +10544,7 @@ dependencies = [ "libc", "redox_syscall", "remove_dir_all", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -10926,24 +10564,30 @@ checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "thousands" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" + [[package]] name = "thread_local" version = "1.1.4" @@ -11015,7 +10659,7 @@ checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", "wasi 0.10.0+wasi-snapshot-preview1", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -11039,9 +10683,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -11054,29 +10698,29 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.17.0" +version = "1.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" dependencies = [ - "bytes 1.1.0", + "bytes", "libc", "memchr", - "mio 0.8.2", + "mio", "num_cpus", "once_cell", - "parking_lot 0.12.0", - "pin-project-lite 0.2.8", + "parking_lot 0.12.1", + "pin-project-lite 0.2.9", "signal-hook-registry", - "socket2 0.4.4", + "socket2", "tokio-macros", - "winapi 0.3.9", + "winapi", ] [[package]] name = "tokio-macros" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ "proc-macro2", "quote", @@ -11085,71 +10729,35 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" -dependencies = [ - "rustls 0.19.1", - "tokio", - "webpki 0.21.4", -] - -[[package]] -name = "tokio-rustls" -version = "0.23.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4151fda0cf2798550ad0b34bcfc9b9dcc2a9d2471c895c68f3a8818e54f2389e" -dependencies = [ - "rustls 0.20.4", - "tokio", - "webpki 0.22.0", -] - -[[package]] -name = "tokio-stream" -version = "0.1.8" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "futures-core", - "pin-project-lite 0.2.8", + "rustls", "tokio", + "webpki", ] [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ - "bytes 1.1.0", + "bytes", "futures-core", "futures-io", "futures-sink", - "log", - "pin-project-lite 0.2.8", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" -dependencies = [ - "bytes 1.1.0", - "futures-core", - "futures-sink", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "tokio", "tracing", ] [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] @@ -11162,21 +10770,21 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80b9fa4360528139bc96100c160b7ae879f5567f49f1782b0b02035b0358ebf3" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" dependencies = [ "cfg-if 1.0.0", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ "proc-macro2", "quote", @@ -11185,11 +10793,11 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee" +checksum = "7709595b8878a4965ce5e87ebf880a7d39c9afc6837721b21a5a816a8117d921" dependencies = [ - "lazy_static", + "once_cell", "valuable", ] @@ -11203,14 +10811,39 @@ dependencies = [ "tracing", ] +[[package]] +name = "tracing-gum" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" +dependencies = [ + "polkadot-node-jaeger", + "polkadot-primitives", + "tracing", + "tracing-gum-proc-macro", +] + +[[package]] +name = "tracing-gum-proc-macro" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" +dependencies = [ + "expander 0.0.6", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tracing-log" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ + "ahash", "lazy_static", "log", + "lru 0.7.6", "tracing-core", ] @@ -11254,7 +10887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d32d034c0d3db64b43c31de38e945f15b40cd4ca6d2dcfc26d4798ce8de4ab83" dependencies = [ "hash-db", - "hashbrown 0.12.0", + "hashbrown 0.12.1", "log", "rustc-hex", "smallvec", @@ -11271,9 +10904,9 @@ dependencies = [ [[package]] name = "trust-dns-proto" -version = "0.20.4" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca94d4e9feb6a181c690c4040d7a24ef34018d8313ac5044a61d21222ae24e31" +checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" dependencies = [ "async-trait", "cfg-if 1.0.0", @@ -11282,7 +10915,7 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna 0.2.3", + "idna", "ipnet", "lazy_static", "log", @@ -11290,14 +10923,14 @@ dependencies = [ "smallvec", "thiserror", "tinyvec", - "url 2.2.2", + "url", ] [[package]] name = "trust-dns-resolver" -version = "0.20.4" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecae383baad9995efaa34ce8e57d12c3f305e545887472a492b838f4b5cfb77a" +checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" dependencies = [ "cfg-if 1.0.0", "futures-util", @@ -11305,7 +10938,7 @@ dependencies = [ "lazy_static", "log", "lru-cache", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "resolv-conf", "smallvec", "thiserror", @@ -11321,10 +10954,10 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.18#fc3fd073d3a0acf9933c3994b660ebd7b5833f65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" dependencies = [ "clap", - "jsonrpsee 0.4.1", + "jsonrpsee", "log", "parity-scale-codec", "remote-externalities", @@ -11351,9 +10984,9 @@ checksum = "5e66dcbec4290c69dd03c57e76c2469ea5c7ce109c6dd4351c13055cf71ea055" [[package]] name = "twox-hash" -version = "1.6.2" +version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee73e6e4924fe940354b8d4d98cad5231175d615cd855b758adc658c0aac6a0" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if 1.0.0", "digest 0.10.3", @@ -11396,9 +11029,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" [[package]] name = "unicode-normalization" @@ -11415,11 +11054,17 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "universal-hash" @@ -11431,32 +11076,14 @@ dependencies = [ "subtle", ] -[[package]] -name = "unsigned-varint" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fdeedbf205afadfe39ae559b75c3240f24e257d0ca27e85f85cb82aa19ac35" - -[[package]] -name = "unsigned-varint" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35581ff83d4101e58b582e607120c7f5ffb17e632a980b1f38334d76b36908b2" -dependencies = [ - "asynchronous-codec 0.5.0", - "bytes 1.1.0", - "futures-io", - "futures-util", -] - [[package]] name = "unsigned-varint" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" dependencies = [ - "asynchronous-codec 0.6.0", - "bytes 1.1.0", + "asynchronous-codec", + "bytes", "futures-io", "futures-util", ] @@ -11467,17 +11094,6 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - [[package]] name = "url" version = "2.2.2" @@ -11485,9 +11101,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", - "idna 0.2.3", + "idna", "matches", - "percent-encoding 2.1.0", + "percent-encoding", ] [[package]] @@ -11498,9 +11114,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.0.0-alpha.8" +version = "1.0.0-alpha.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79923f7731dc61ebfba3633098bf3ac533bbd35ccd8c57e7088d9a5eebe0263f" +checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" dependencies = [ "ctor", "version_check", @@ -11520,7 +11136,7 @@ checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" dependencies = [ "bitflags", "chrono", - "rustc_version 0.4.0", + "rustc_version", ] [[package]] @@ -11548,7 +11164,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", - "winapi 0.3.9", + "winapi", "winapi-util", ] @@ -11689,6 +11305,7 @@ checksum = "ca00c5147c319a8ec91ec1a0edbec31e566ce2c9cc93b3f9bb86a9efd0eb795d" dependencies = [ "downcast-rs", "libc", + "libm", "memory_units", "num-rational 0.2.4", "num-traits", @@ -11707,31 +11324,30 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.81.0" +version = "0.83.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98930446519f63d00a836efdc22f67766ceae8dbcc1571379f2bcabc6b2b9abc" +checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" [[package]] name = "wasmtime" -version = "0.33.1" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c9c724da92e39a85d2231d4c2a942c8be295211441dbca581c6c3f3f45a9f00" +checksum = "21ffb4705016d5ca91e18a72ed6822dab50e6d5ddd7045461b17ef19071cdef1" dependencies = [ "anyhow", "backtrace", "bincode", "cfg-if 1.0.0", - "cpp_demangle", "indexmap", "lazy_static", "libc", "log", - "object", + "object 0.27.1", + "once_cell", "paste", "psm", "rayon", "region", - "rustc-demangle", "serde", "target-lexicon", "wasmparser", @@ -11740,14 +11356,14 @@ dependencies = [ "wasmtime-environ", "wasmtime-jit", "wasmtime-runtime", - "winapi 0.3.9", + "winapi", ] [[package]] name = "wasmtime-cache" -version = "0.33.1" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da4439d99100298344567c0eb6916ad5864e99e54760b8177c427e529077fb30" +checksum = "85c6ab24291fa7cb3a181f5669f6c72599b7ef781669759b45c7828c5999d0c0" dependencies = [ "anyhow", "base64", @@ -11759,15 +11375,15 @@ dependencies = [ "serde", "sha2 0.9.9", "toml", - "winapi 0.3.9", + "winapi", "zstd", ] [[package]] name = "wasmtime-cranelift" -version = "0.33.1" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1762765dd69245f00e5d9783b695039e449a7be0f9c5383e4c78465dd6131aeb" +checksum = "f04c810078a491b7bc4866ebe045f714d2b95e6b539e1f64009a4a7606be11de" dependencies = [ "anyhow", "cranelift-codegen", @@ -11778,7 +11394,7 @@ dependencies = [ "gimli", "log", "more-asserts", - "object", + "object 0.27.1", "target-lexicon", "thiserror", "wasmparser", @@ -11787,9 +11403,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "0.33.1" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4468301d95ec71710bb6261382efe27d1296447711645e3dbabaea6e4de3504" +checksum = "61448266ea164b1ac406363cdcfac81c7c44db4d94c7a81c8620ac6c5c6cdf59" dependencies = [ "anyhow", "cranelift-entity", @@ -11797,7 +11413,7 @@ dependencies = [ "indexmap", "log", "more-asserts", - "object", + "object 0.27.1", "serde", "target-lexicon", "thiserror", @@ -11807,41 +11423,56 @@ dependencies = [ [[package]] name = "wasmtime-jit" -version = "0.33.1" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0ae6e581ff014b470ec35847ea3c0b4c3ace89a55df5a04c802a11f4574e7d" +checksum = "156b4623c6b0d4b8c24afb846c20525922f538ef464cc024abab7ea8de2109a2" dependencies = [ "addr2line", "anyhow", "bincode", "cfg-if 1.0.0", + "cpp_demangle", "gimli", - "object", + "log", + "object 0.27.1", "region", + "rustc-demangle", "rustix", "serde", "target-lexicon", "thiserror", "wasmtime-environ", + "wasmtime-jit-debug", "wasmtime-runtime", - "winapi 0.3.9", + "winapi", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5dc31f811760a6c76b2672c404866fd19b75e5fb3b0075a3e377a6846490654" +dependencies = [ + "lazy_static", + "object 0.27.1", + "rustix", ] [[package]] name = "wasmtime-runtime" -version = "0.33.1" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9c28877ae37a367cda7b52b8887589816152e95dde9b7c80cc686f52761961" +checksum = "f907beaff69d4d920fa4688411ee4cc75c0f01859e424677f9e426e2ef749864" dependencies = [ "anyhow", "backtrace", "cc", "cfg-if 1.0.0", "indexmap", - "lazy_static", "libc", "log", "mach", + "memfd", "memoffset", "more-asserts", "rand 0.8.5", @@ -11849,14 +11480,15 @@ dependencies = [ "rustix", "thiserror", "wasmtime-environ", - "winapi 0.3.9", + "wasmtime-jit-debug", + "winapi", ] [[package]] name = "wasmtime-types" -version = "0.33.1" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395726e8f5dd8c57cb0db445627b842343f7e29ed7489467fdf7953ed9d3cd4f" +checksum = "514ef0e5fd197b9609dc9eb74beba0c84d5a12b2417cbae55534633329ba4852" dependencies = [ "cranelift-entity", "serde", @@ -11874,16 +11506,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki" version = "0.22.0" @@ -11894,22 +11516,13 @@ dependencies = [ "untrusted", ] -[[package]] -name = "webpki-roots" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" -dependencies = [ - "webpki 0.21.4", -] - [[package]] name = "webpki-roots" version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d8de8415c823c8abd270ad483c6feeac771fad964890779f9a8cb24fbbc1bf" dependencies = [ - "webpki 0.22.0", + "webpki", ] [[package]] @@ -11934,15 +11547,9 @@ dependencies = [ [[package]] name = "widestring" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" - -[[package]] -name = "winapi" -version = "0.2.8" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" [[package]] name = "winapi" @@ -11954,12 +11561,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -11972,7 +11573,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -11981,66 +11582,99 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac7fef12f4b59cd0a29339406cc9203ab44e440ddff6b3f5a41455349fa9cf3" +dependencies = [ + "windows_aarch64_msvc 0.29.0", + "windows_i686_gnu 0.29.0", + "windows_i686_msvc 0.29.0", + "windows_x86_64_gnu 0.29.0", + "windows_x86_64_msvc 0.29.0", +] + [[package]] name = "windows-sys" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", ] [[package]] name = "windows_aarch64_msvc" -version = "0.34.0" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d027175d00b01e0cbeb97d6ab6ebe03b12330a35786cbaca5252b1c4bf5d9b" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_i686_gnu" -version = "0.34.0" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8793f59f7b8e8b01eda1a652b2697d87b93097198ae85f823b969ca5b89bba58" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_msvc" -version = "0.34.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" +checksum = "8602f6c418b67024be2996c512f5f995de3ba417f4c75af68401ab8756796ae4" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_x86_64_gnu" -version = "0.34.0" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d615f419543e0bd7d2b3323af0d86ff19cbc4f816e6453f36a2c2ce889c354" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_msvc" -version = "0.34.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" +checksum = "11d95421d9ed3672c280884da53201a5c46b7b2765ca6faf34b0d71cf34a3561" [[package]] -name = "winreg" -version = "0.6.2" +name = "windows_x86_64_msvc" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" -dependencies = [ - "winapi 0.3.9", -] +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] -name = "ws2_32-sys" -version = "0.2.1" +name = "winreg" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "winapi", ] [[package]] @@ -12065,8 +11699,8 @@ dependencies = [ [[package]] name = "xcm" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "derivative", "impl-trait-for-tuples", @@ -12078,8 +11712,8 @@ dependencies = [ [[package]] name = "xcm-builder" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "frame-support", "frame-system", @@ -12098,8 +11732,8 @@ dependencies = [ [[package]] name = "xcm-executor" -version = "0.9.18" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +version = "0.9.23" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -12116,7 +11750,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.18#9ed0c98204d25eaad8a6b40248daee8e6a40d111" +source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "Inflector", "proc-macro2", @@ -12126,23 +11760,23 @@ dependencies = [ [[package]] name = "yamux" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d9028f208dd5e63c614be69f115c1b53cacc1111437d4c765185856666c107" +checksum = "0c0608f53c1dc0bad505d03a34bbd49fbf2ad7b51eb036123e896365532745a1" dependencies = [ "futures 0.3.21", "log", "nohash-hasher", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "rand 0.8.5", "static_assertions", ] [[package]] name = "zeroize" -version = "1.5.4" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb5728b8afd3f280a869ce1d4c554ffaed35f45c231fc41bfbd0381bef50317" +checksum = "d68d9dcec5f9b43a30d38c49f91dfedfaac384cb8f085faca366c26207dd1619" dependencies = [ "zeroize_derive", ] @@ -12161,18 +11795,18 @@ dependencies = [ [[package]] name = "zstd" -version = "0.9.2+zstd.1.5.1" +version = "0.10.2+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2390ea1bf6c038c39674f22d95f0564725fc06034a47129179810b2fc58caa54" +checksum = "5f4a6bd64f22b5e3e94b4e238669ff9f10815c27a5180108b849d24174a83847" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "4.1.3+zstd.1.5.1" +version = "4.1.6+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e99d81b99fb3c2c2c794e3fe56c305c63d5173a16a46b5850b07c935ffc7db79" +checksum = "94b61c51bb270702d6167b8ce67340d2754b088d0c091b06e593aa772c3ee9bb" dependencies = [ "libc", "zstd-sys", @@ -12180,9 +11814,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "1.6.2+zstd.1.5.1" +version = "1.6.3+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2daf2f248d9ea44454bfcb2516534e8b8ad2fc91bf818a1885495fc42bc8ac9f" +checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8" dependencies = [ "cc", "libc", diff --git a/Cargo.toml b/Cargo.toml index 87f593bee..a7adb7a5a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,6 @@ members = [ "runtime/local", "runtime/alpha", "runtime/main", - "runtime/ipci", ] exclude = [ diff --git a/bin/node/Cargo.toml b/bin/node/Cargo.toml index 3f9637f25..d30122c1f 100644 --- a/bin/node/Cargo.toml +++ b/bin/node/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "robonomics-node" -version = "1.9.9" +version = "2.0.0" authors = ["Airalab "] description = "Robonomics node implementation in Rust & Substrate." -edition = "2018" +edition = "2021" license = "Apache-2.0" homepage = "https://robonomics.network" repository = "https://github.com/airalab/robonomics" @@ -27,7 +27,6 @@ robonomics-service = { path = "service", default-features = false } [features] default = [ - "robonomics-service/ipci", "robonomics-service/kusama", "robonomics-service/wasmtime", ] diff --git a/bin/node/rpc/Cargo.toml b/bin/node/rpc/Cargo.toml index 420410c17..5999bfe73 100644 --- a/bin/node/rpc/Cargo.toml +++ b/bin/node/rpc/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "robonomics-rpc" -version = "1.9.9" +version = "2.0.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" license = "Apache-2.0" homepage = "https://robonomics.network" repository = "https://github.com/airalab/robonomics" @@ -12,22 +12,21 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.0" } -jsonrpc-core = "18.0.0" -jsonrpc-pubsub = "18.0.0" -sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +jsonrpsee = { version = "0.13.0", features = ["server"] } +sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } local-runtime = { path = "../../../runtime/local" } robonomics-primitives = { path = "../../../primitives" } -robonomics-protocol = { path = "../../../protocol" } +#robonomics-protocol = { path = "../../../protocol" } diff --git a/bin/node/rpc/src/lib.rs b/bin/node/rpc/src/lib.rs index c91a4e7cf..1aa161577 100644 --- a/bin/node/rpc/src/lib.rs +++ b/bin/node/rpc/src/lib.rs @@ -33,10 +33,14 @@ use std::sync::Arc; use robonomics_primitives::{AccountId, Balance, Block, Index}; +/* use robonomics_protocol::extrinsic::extrinsicapi::{ExtrinsicApi, ExtrinsicT}; use robonomics_protocol::pubsub::pubsubapi::{PubSubApi, PubSubT}; use robonomics_protocol::pubsub::Gossipsub; use robonomics_protocol::reqres::reqresapi::{ReqRespApi, ReqRespT}; +*/ + +use jsonrpsee::RpcModule; use sc_client_api::AuxStore; pub use sc_rpc_api::DenyUnsafe; use sc_transaction_pool_api::TransactionPool; @@ -44,9 +48,6 @@ use sp_api::ProvideRuntimeApi; use sp_block_builder::BlockBuilder; use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; -/// A IO handler that uses all Full RPC extensions. -pub type IoHandler = jsonrpc_core::IoHandler; - /// Full client dependencies. pub struct FullDeps { /// The client instance to use. @@ -55,14 +56,14 @@ pub struct FullDeps { pub pool: Arc

, /// Whether to deny unsafe calls. pub deny_unsafe: DenyUnsafe, - /// PubSub worker. - pub pubsub: Arc, + // PubSub worker. + //pub pubsub: Arc, } /// Instantiate all Full RPC extensions. pub fn create_full( deps: FullDeps, -) -> Result> +) -> Result, Box> where C: ProvideRuntimeApi + HeaderBackend @@ -76,32 +77,27 @@ where C::Api: BlockBuilder, P: TransactionPool + 'static, { - use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApi}; - use substrate_frame_rpc_system::{FullSystem, SystemApi}; + use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; + use substrate_frame_rpc_system::{System, SystemApiServer}; - let mut io = jsonrpc_core::IoHandler::default(); + let mut io = RpcModule::new(()); let FullDeps { client, pool, deny_unsafe, - pubsub, + //pubsub, } = deps; - io.extend_with(SystemApi::to_delegate(FullSystem::new( - client.clone(), - pool, - deny_unsafe, - ))); - - io.extend_with(TransactionPaymentApi::to_delegate(TransactionPayment::new( - client.clone(), - ))); + io.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; + io.merge(TransactionPayment::new(client.clone()).into_rpc())?; + /* io.extend_with(PubSubApi::to_delegate(PubSubApi::new(pubsub))); io.extend_with(ReqRespApi::to_delegate(ReqRespApi {})); io.extend_with(ExtrinsicApi::to_delegate(ExtrinsicApi::new(client.clone()))); + */ Ok(io) } diff --git a/bin/node/service/Cargo.toml b/bin/node/service/Cargo.toml index 0baae052e..5ce3c3b0b 100644 --- a/bin/node/service/Cargo.toml +++ b/bin/node/service/Cargo.toml @@ -1,10 +1,10 @@ [package] name = "robonomics-service" -version = "1.9.9" +version = "2.0.0" authors = ["Airalab "] description = "Robonomics node console line interface." build = "build.rs" -edition = "2018" +edition = "2021" license = "Apache-2.0" homepage = "https://robonomics.network" repository = "https://github.com/airalab/robonomics" @@ -14,114 +14,112 @@ repository = "https://github.com/airalab/robonomics" clap = { version = "3.0", features = ["derive"], optional = true } serde = { version = "1.0.130", features = ["derive"]} serde_json = "1.0" +jsonrpsee = { version = "0.13.0", features = ["server"], optional = true } codec = { package = "parity-scale-codec", version = "3.0" } -jsonrpc-core = { version = "18.0.0", optional = true } hex-literal = "0.3.1" log = "0.4" parking_lot = "0.11.1" # primitives robonomics-primitives = { path = "../../../primitives", default-features = false } -robonomics-protocol = { path = "../../../protocol", default-features = false } -sp-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-authorship = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-transaction-storage-proof = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-version = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-externalities = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-tasks = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +#robonomics-protocol = { path = "../../../protocol", default-features = false } +sp-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-authorship = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-transaction-storage-proof = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-externalities = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-tasks = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } # client dependencies -sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-client-db = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-consensus-slots = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-consensus-uncles = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-informant = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-network = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-service = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sc-tracing = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-executor-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-client-db = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-consensus-slots = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-consensus-uncles = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-informant = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-network = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-service = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sc-tracing = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-executor-common = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } # frame dependencies -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", optional = true } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", optional = true } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } pallet-robonomics-lighthouse = { path = "../../../frame/lighthouse", optional = true } pallet-robonomics-datalog = { path = "../../../frame/datalog", default-features = false } # cumulus dependencies -cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-primitives-parachain-inherent = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-client-consensus-aura = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-client-consensus-common = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-client-consensus-relay-chain = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-relay-chain-interface = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-relay-chain-rpc-interface = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-relay-chain-inprocess-interface = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-client-cli = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-client-collator = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-client-network = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -cumulus-client-service = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } +cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-primitives-parachain-inherent = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-client-consensus-aura = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-client-consensus-common = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-client-consensus-relay-chain = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-relay-chain-interface = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-relay-chain-rpc-interface = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-relay-chain-inprocess-interface = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-client-cli = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-client-collator = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-client-network = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +cumulus-client-service = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } # polkadot dependencies -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.18", optional = true } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.18", optional = true } -polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.18", optional = true } -polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.18", optional = true } +polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.23", optional = true } +polkadot-parachain = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.23", optional = true } +polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.23", optional = true } +polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.23", optional = true } # node-specific dependencies robonomics-rpc = { path = "../rpc", optional = true } local-runtime = { path = "../../../runtime/local", optional = true } alpha-runtime = { path = "../../../runtime/alpha", optional = true } main-runtime = { path = "../../../runtime/main", optional = true } -ipci-runtime = { path = "../../../runtime/ipci", optional = true } -sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } # CLI-specific dependencies -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", optional = true } -frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", optional = true } -substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", optional = true } +sc-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", optional = true } +frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", optional = true } +substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", optional = true } # Robonomics-specific dependencies #robonomics-cli = { path = "../../../cli", optional = true } [build-dependencies] local-runtime = { path = "../../../runtime/local", optional = true } -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", optional = true } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", optional = true } -polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.18", optional = true } -frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", optional = true } -cumulus-client-cli = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", optional = true } -substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sc-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", optional = true } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", optional = true } +polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.23", optional = true } +frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", optional = true } +cumulus-client-cli = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", optional = true } +substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } #robonomics-cli = { path = "../../../cli", optional = true } vergen = { version = "3.1.0", optional = true } clap = { version = "3.0", features = ["derive"], optional = true } @@ -165,18 +163,12 @@ kusama = [ "parachain", ] -## Enable IPCI parachain. -ipci = [ - "ipci-runtime", - "parachain", -] - ## Enable parachain collator. parachain = [ "alpha-runtime", "pallet-robonomics-lighthouse", "substrate-frame-rpc-system", - "jsonrpc-core", + "jsonrpsee", "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", "cumulus-client-consensus-aura", diff --git a/bin/node/service/res/ipci.raw.json b/bin/node/service/res/ipci.raw.json deleted file mode 100644 index 6432b7140..000000000 --- a/bin/node/service/res/ipci.raw.json +++ /dev/null @@ -1,947 +0,0 @@ -{ - "name": "IPCI", - "id": "ipci", - "chainType": "Live", - "bootNodes": [ - "/dns/0.venus.robonomics.network/tcp/30333/p2p/12D3KooWQpKqiDoNkWRN4sf9chetCxSJRddptBdceLZXxNPfSFDF", - "/dns/0.ipci.robonomics.network/tcp/30333/ws/p2p/12D3KooWC7ZhkTThBpqaadQjXpzPtHPSfQyU9b3XKacD3x7zAbuk", - "/dns/1.ipci.robonomics.network/tcp/30333/ws/p2p/12D3KooWCjpgPsBoV6XDXh28iygsTAbjuo7BSkP9oyH1iCW116EL" - ], - "telemetryEndpoints": [ - [ - "/dns4/telemetry.polkadot.io/tcp/443/x-parity-wss/%2Fsubmit%2F", - 0 - ] - ], - "protocolId": "mito", - "properties": { - "ss58Format": 32, - "tokenDecimals": 12, - "tokenSymbol": "MITO" - }, - "relayChain": "rococo_local_testnet", - "paraId": 3000, - "consensusEngine": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da940d9a2559220281b18fae769d2095336a00e8ff523b2352c882fb17b4c63b2187e785d1baf045c4e20b48ff234a56455": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da916890ea25ede2864ed5e9b4e1cd410beda2f9c38f534174934a0236bc6baaab081da655eecd27a030e5d91dc8801f57e": "0x00000000000000000100000000000000c0ceb18fb90200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90fa0ca5c539ab58542b7385d4fc39dd778f548960ef232d2c9ca9f6acb714a2314bae86e201341a4d8eab68cbcfbd573": "0x0000000000000000010000000000000085549f6d370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9106b794280287312ffadf343e3056894ce0029b0cfff481fd37af740666231c399298173a822aed71441e460a107255c": "0x000000000000000001000000000000008039a684ac0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da984c3d881dad8cbc2e6854492d9247f76d04879c662fa1771d6a522858c3133ba934ef47577c7be2e5d4f5d0be2895579": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da914cc9e849919fc59f7034520744763d7e1779f6506fbe5442dc68b9c7eb2971a88a6c554cf806ad6ba2e06d9a551b94a": "0x000000000000000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca0b6a45321efae92aea15e0740ec7afe7": "0x00000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91515b26e799ce78199db44745e69e37adac3ac2f47bbde3d9994d67e3f06dc7cc36e72d742f3fdb0ac7c3b7a57f30f66": "0x0000000000000000010000000000000043b3f268c20600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99aabebd27704cc633fcf91b08cc6c43878b5b70581114e4b069ef2e78fd39cde592b66b99e67a99b97984c6165f4c570": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9879eed4355dc92ab2ee503e55af35eaa08e0dffef0cc763e3ff514d25c364205efc8924048ad930a5bf2a378cf9b5b31": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da995d7af91f95ac8af5ae328fbc83076b1be6bcf74ee9ef7d2b25d99610a231f35f30043d641c1055a6630d2a8e3856f02": "0x0000000000000000010000000000000000b0b7e699af17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da998ecd0c0be21cbd7b77e97b6a4435d770c9ae39beac550c2aac65d2a65b3012eb796d3eeeb1edf65fbb741f7f4d1f03c": "0x00000000000000000100000000000000ed045001b10a03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99433b36fa6a3aaa4e11f088277ba6826b6bc26ada7024077684baf06e7b642feea50fc64cf12406f623d49966629772d": "0x000000000000000001000000000000000b81ca76d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ead6543ca4875b949eacc235bec724d39c4d4b153b8160427038d99696d5912f332bdc34c6566a4a1e3bcc3e5661bf67": "0x000000000000000001000000000000002a390829948b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c46ff57e6f86a65bb7d8e951fed644174e7dc5ba7b35162d404fce016ec5657753f2d8d0adf41614592ff98872cd005c": "0x0000000000000000010000000000000095f98ff3ca4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b865b8f35bd5b0092ef8b69f4ef59c05e6cc42ee72c56de333e7e4737b4d2b705d63eaf6813776677db0df32e2371b4c": "0x000000000000000001000000000000000acefa88950900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95884114a7028d6ba7e0d13d766063aa4f41ba46e6fe490945136d9776bbc90f9d30f0b5d43e860b6266bde00725df840": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da982f55a0fbe887dcd802398874d2a5c9efa6d56e79c85f4a9a755c985a2bf4356e920235473a93873ef7fd2d7aaaba553": "0x00000000000000000100000000000000c4f84967b20200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da998b40a1c8e891c62871cec4b658b0115b8d6b0e3dfdce73941817b6ea50ae003e81fcf7126d2db5290bf98c135c1fb10": "0x000000000000000001000000000000008921dce8c60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da917614d9f2f4ea6522c04ab4917a1b67b8afc0390f3ec61fb6802f01bb3d14d75a9a20712eb467e3c4f536a081fbb316e": "0x00000000000000000100000000000000a2c34696a60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ebff5204a8d0f075202a521f130683a05ec5cc472f2a80ac0c38a2afd3747b635b4bbecfdad6915042b451a5631dab15": "0x00000000000000000100000000000000de18a7a9b10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95f3ef0432d3b11521e337905f22ea9f6a6a52d9674e4da0e1c5eda24673868d5691bfd09de8a3c3e0e7e34ba08bb2d43": "0x0000000000000000010000000000000083779b48593500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da981333e708d1a82fd9986638ed9155ba17d0c4d401c2188ee02ef42b18663fb6450b9f174a8a74cdccb267442b0d3e5ca": "0x0000000000000000010000000000000000602d4e1d949a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9af9864429bfcf165eff1430732d7e6104cedb728cd271b33b8bedaecc38b504a4c87671e03611ec94a434c2969bc7174": "0x000000000000000001000000000000000080ca39612400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xede8e4fdc3c8b556f0ce2f77fc2575e3878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da900b33f21e4bb89566eb853869024725d16b9f6e6fb3786f1dc43d9e9c19928d1cf8efa4419e5af85fac7205fe88cc335": "0x0000000000000000010000000000000000008e5a639d02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f7bc08102aba88155110f860eb303c4ab4640007573ba85f8b5f2f798bf42f11a3dc6fabd23c42c8df2ac92bb04faba4": "0x0000000000000000010000000000000000b078568c363b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f36044b70921a2ea32b29e54df7f1e564fb15efe9fa189bf05525a0a64b2c46ab7c5aa6fee6e42764b0a1c4731a90009": "0x0000000000000000010000000000000000407de5b9fc0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92d51d819b54a8ff885802b93ffabb9a090af581f3d8319807c0f45f40850d5eeb73e091284b71623a306062f60d9b277": "0x00000000000000000100000000000000affdfd6b293e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ac50ea7f487ade00988dabd26ffcd4595e192a224097324437b57175e2da5a90d7349f28419c71343cc37173729faa5f": "0x0000000000000000010000000000000000113a99160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99c1ceed81bdb0b45e089d020ce2d7be83a7b785cbef373840fb24665b88b5bd918e27e17897c902dff45f56dc7ee8063": "0x000000000000000001000000000000000040c21f55b90b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91fcd916e435a03abe2dfffbbef0f6fb202d52516d79f149a981d93ec443435140f234726a474adf1194191e6f64e0735": "0x0000000000000000010000000000000000a0bef25cfe07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95111d4cfa5498ea7fc37815c95f341f3c4bf88bc96d8761229efa935ebcfe2a75bfb587bd26fad7fb76e30e71a3ce12b": "0x00000000000000000100000000000000df324405b30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91ffa597861bb4338fe100ab0a52a33a924b8d513699fdfeaef63aabd6b0347012e88ced8badebf5cd6cb020bfbd7ce2b": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca666fdcbb473985b3ac933d13f4acff8d": "0x00000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98fc9bc442b22885f9ea2f65d083d10a58aa2cc57611acca1c16bc2013c264223e8d452e1ca84740bbc6fad12191edb26": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93236315c950164cd32bee4cebf8080bebc2c009e6a28239713757962764d43b2c47393b977d3e65be30cc1736c0a1f4b": "0x00000000000000000100000000000000d67d64a8140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9696e2c0bd315eda27efbb3b6b1663c66dcc922704d7cd5ae88ec95345abb8c69cabb1391e2cfe176267675cf9bf3bb50": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da980a001f34e69040c8d859776b4f27b8346553aa41387453db71bae4662d191acfd65163c91ed5ec0df5159920e5da56f": "0x0000000000000000010000000000000040e4a9b6e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da973817b97d1eaf8147553a7d4078e35d7625a9297fbbafb298767414a89cb83b21801821910b1200d7232b0e1a0d389c4": "0x00000000000000000100000000000000002026ca459901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a3d492e6e401a210dd63f90943a4de39bc6c79f3170bdb6f0a023606cd46ace3e40dae0c5d115cab1d4aedcefb109053": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da971b90335c66d171a6a515a12431430ae867072a804f4b2aedf6edac42ced89603d6629e524e266bcb1c48ecf655cab1d": "0x0000000000000000010000000000000000e0fe76f6de06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98a63197adf4db3bc99da5178a8f046c16e0d32fc2c07414f339e6fe2e4a61bf1cdde29b3406402947fd96c5ad0531071": "0x00000000000000000100000000000000285fc80d570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90392ef075a31619dc750097216dc249ce8e5969ab8c6f6f4d63b090863923fc834b24583c0f2363e00edbd7b7b296011": "0x00000000000000000100000000000000c0ababfae70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ba4b2533e19b2176ddf347a297d8bbb5563f9e23175276d288673c93f9396de9da91f18ed7f25d5405bfedc1b152cb43": "0x000000000000000001000000000000000030ef7dba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cb99398756f4caf7539c482965bf26746a610f2daac7994e9dd3d95732890454057348489c84fd976be384fea4d5812c": "0x0000000000000000010000000000000022ef8387410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c51c8396b44065f38e3009eda802f72a4aa33b789615db5e1451a95348ffc2274c5b20a6eae6df773b90a4ee14f6c855": "0x00000000000000000100000000000000d412be0dc86603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f7b9f67eb3c3be6504ad15a99d07a97f0a84c9c1f7630532290db44c08094cd5a2869558e684d9657d88407b193e467d": "0x00000000000000000100000000000000d77af884120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da948dab4808d15c2a4b651dc67ceff0420421629ee30049d2a1b18d145681d3c9602217d2074421b04857d0ef1d0bb825a": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dc569a2e23db5105bd297b850ce02782721441ae0f75207588c47d1758a64475aca9cd2bdadc0f00a9b53100fe109546": "0x0000000000000000010000000000000056f56d87ca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9917b0a6592729728f6203e3d6511db47eae64b6b6ce067988f1303e734c72f89a11ffc478a472ce6ede2bf4f0eb3df5b": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de030a288ff43f5d6e77d26a84fc832679905f8ce05a47419990805723c1ec1d13ae55a5e8ba96f0cc17df2cc138c47a": "0x00000000000000000100000000000000569241f5a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97bb4435e8e22543b824686b3a65a3c5306681ec61f5670005cc073b31c16f5dabaacb295e1d9aa01c7d13222c4439a17": "0x00000000000000000100000000000000d622c779230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9162fea315abae427058dd54096c634c0ca7b8730bf697c833aa19a8e8844236c592603a96e92b442d24de702e870cda9": "0x000000000000000001000000000000000060b7986c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92ccb06944329b14b40a093392ab6cdc33aeabc6a57f01b9ded7227b3ae347f84228105c629d30a6e70c067aeef3ff0d4": "0x0000000000000000010000000000000000b01723010a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95d4bd1d13482bd9d9a2bac31d58de236e8d1406d7b3eb1d11f4647a57af70248aec652ad8b6af5dd7daa5cf6b002155a": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c746ff72b0290f37f3b81649f5e7b62f7a336f21bc31ea223d1bbf8851153db8f560a9ea378b8a74e02cbca39eefa33b": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e1c369b549a9b6f6a2ed12260f53e890e2c398ec8fb2212ed8c914459643f17cba34f38ba51caa419253d483c51dba21": "0x0000000000000000010000000000000040890996d10100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0000e8890423c78a0000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94c6b6905ade2572f72eb0f60bd232c9fb0df943805ececa2db6723dd755e1c7ac12adf673dd496e1fc6ef6331cbea215": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d3cbe43f3f44a9d16938511007dd93314cc9833d5f41edcb1e5db22bfd8b3c05397a32f69e8a5ac3495901acff3f1208": "0x0000000000000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fb8dcc712cf827a7e5a06c2222b3b96c10e83083534576a773df8da9eb8acab684da2c523740454dd8f042eef5b80921": "0x000000000000000001000000000000008cf22225110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da984519c2c289164a87353b9bdc17e00687607b7c853f1e82861a48ca391b7980ed1f43cbd6c485fbed8eb31505b11a907": "0x00000000000000000100000000000000907970855d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da942fc4d513e7f843e6d8fe0301b9faf7098e5b717b78688610bde6a15a46389b6292cdfa5dc738fe99ec6394f842fad1e": "0x000000000000000001000000000000009e76b579269c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91412fe04178fa45fc13dc5d2f00c905812784bd67e8fe7459bd7fe5631da8914a242070a1eedb52fac67642fe561ad37": "0x000000000000000001000000000000002388fdec970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93cea8927d680106527d74352fe7c5114608ee98e0f3165cbf22ad45f44b356237fb945066c4efeed47d7051c1b8a6550": "0x0000000000000000010000000000000080812ef4ba0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9424a4d6b35fa9514fb86fbde96d4642c2ab19e6d2b1422bcd6cdac410b93cc4bfbedfdbe38c4a33a272a17fcd53710bb": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da943d907057193568decfc90f2d7d07513c06181a1d85ffcf7b530ae9e56fbe83114b3137629553a1c9d72fd85dcf263f1": "0x000000000000000001000000000000000090a4f45a8609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da965a5aec765a18c15929ba8b8007d465968615c11fb26f867ae2ad7a2e22fd26cb707c4a7e4f2bb0a131f2af96d414628": "0x00000000000000000100000000000000a3aae67e262300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93f2263b044d7dc67f2e8e0c4ee9081a2f1661b645c5d6a0b3b7f3a87201016873a0253afcce5052be82fe23bbf0e5441": "0x00000000000000000100000000000000572d0cf84d2c26000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c9dc8fba3213791773b6bcab5e463cd3a24ee1494ff5742e8f89834b073139efcd0f334ea5b5b14fb6f4cf5518fdde5b": "0x0000000000000000010000000000000010d26281c91600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c960b4dbc2b939560d788bc76d7b40ab94df77e624affbab1906833d4da99a534c78a34d2cc76c4c58e0038dc4f07ec2": "0x0000000000000000010000000000000000a0032df8ba03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cc257fea078d7c6a80ac98741006b61190c834711905ae4de81a08309bac5fa55ddf696969a5dd6a18638067db4aa346": "0x0000000000000000010000000000000059ed7591310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x041069706369", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da992ebd2248df75903dd33c6138a4922bfb847e3070e1fe616f9b1db64736465134038288dd3d5d6b5bd9bf07da7d20244": "0x000000000000000001000000000000002c83faea053903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ce7cef373c73b25d366d5984b787db8aacc0fab8c09eac2501723765f7029b2ade7881d33161c031ae70d3901bfa777c": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da933ea10101e3a8e17d7637f9880d7b6ea944e39b8e868cb7b92c0dc7557c55fbaccce16e771c41d96e029629b16817026": "0x00000000000000000100000000000000db7483d7c28900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95c1a1b4a22dd8a45c92a566c657a781614f42675a640fd24630793184c95d3709412afdd554d30063562abeaacb80b50": "0x000000000000000001000000000000000080e03779c311000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bf7fcd5474add9346b177196a2abe493107b84f6f2916251fffac9608719a392dd42982d8c3f98906cd2ec672044036f": "0x00000000000000000100000000000000fadf756d820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da905740e7cbf1dd930eeddabb560b8bc2a0ebcae51372b599d69272ef1aaa648414ff6f87d0f382db9af5fa9373c05b876": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91cde41805396221f68f0d40f333ca98a248eb88154299fc80d221525b99fe9a7a7f33795785bd9b5a13adb46bbbabc2a": "0x00000000000000000100000000000000477f80c6490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9123e403925ba10b5853535c7877cc2ce1430498aab97c5fa011eee353eaf1e0dbc9fc106cd78dad32b5d60c3b592e962": "0x00000000000000000100000000000000f2555a62f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95f9f9b5e329e43ee2f646ab2ba46d4d16b788350da54136221767164469c44f7e20f2e1fd714015621131c3bab11e649": "0x0000000000000000010000000000000060a19a718f0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9446afd32580110dfba5903c890cac0027e2cb2ac175bd3ffcb0b0ba24f8e1b012f4afad14bdaee58227a512438a2d322": "0x00000000000000000100000000000000542af80a957907000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9938f60aaf3e82a295a51d85ede4788fbac9eadc1a995707bff47efc0d34e9fde3a238c54325695369b130bee6e93b935": "0x00000000000000000100000000000000bc23ebd37f8900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f87e537738cdabdd53c9e00f63a811314a1e89e67d69de09d0c8145f52bc5c6fca2c64846b42d11e9630ac1860bf25db": "0x000000000000000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xbb684ba487cd9039ad57a7f9bf04c054878d434d6125b40443fe11fd292d13a4": "0x00000101", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9053abeb51bb5617154fd3e70b954767ef8500c9c9af366870d436f026ee156c82aa9a036a3ad7450cd6f6479677b4256": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93ca7f92df59e2efed7da111501fd89419e9d9ceb3b0d157850bf88642a3760a14451082c5da7690cbbe3139a627e6a75": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dcdef8d9ea33031d24b53b060776c90aec62f505d9ce7ba0dfa88c94ecb121f259e9941532282a7cf3512a67da24c35b": "0x00000000000000000100000000000000baeb646edaff06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ec1760ffb6949f4be13de593d19fab2198cf17bf8924c8768688512e790f9b5edcf76db143d5d44b964423b5b2e103ea": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f983e8e769761e33a00ebd4f137700569c531a445f2e30f4c1e90317384a19bccc923ca41d94a8a3c9c717fea7ff36f1": "0x0000000000000000010000000000000000c06e31d91001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da989e2df09942cbbd888eb7a6afd2c8c071c12a6b0188c37686fe95037fb33bb2a134f26e833093fba9bc44d232d7b0659": "0x0000000000000000010000000000000080ba9bb28bbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f4f357c415e7ede621683e5b9601da69ec6c4ffe2998d14ea2c2f4f3f7e7b2b3a570926b85f470f37b512686d4e59961": "0x0000000000000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f27ed29c1aa890cfbff8caee3cb5f7d48c5a6016b1a05574678fd71d47766337e34ca2c3428dd33e2f670acc438fa710": "0x0000000000000000010000000000000033c700228d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98b5b582acb2ee2a3c011d3340d368a47724bb7b3033010f73f2df9121939ee9f076b53b51d8110fdadfda908e7fbe6b9": "0x0000000000000000010000000000000000a02488070f01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da982f983c047566c8311b7f995ba82066d765196d54d1f9e375e7e5ad18e746e8e536428eaa0bd6ca3fb9590a6c5d4f27f": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98e970a3712b957b4e2f777c80560321d568de7bcab3b48976f1c01a4ce08819fb13b957d49dfa0b673431e9c77418722": "0x00000000000000000100000000000000006e718aff0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a3f6c4f50166be49164d7b5d88d955f122c4b4f6179c2b72310bb06688df19bd9edc8c611736f979d812d8a4919a4028": "0x0000000000000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b426e60543c752df830220612491661094dd912cacdb1a6a68ed8c77faa045fa8571122daf3bf8a82cf92698bd735723": "0x0000000000000000010000000000000000404c948b3203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da909bb60df11644e1c593e2037f26cd8f81c12a74bae0b6673b738623a2c01f6d4ba88cf953c732a9d1a775ccbf967b92c": "0x000000000000000001000000000000000d3cacd8810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92a26309f0150766546cf783b8cd8146cece20541ff15205184931862662d2596d4f7926156f5d38c946d2008038f1b73": "0x00000000000000000100000000000000719c025c590e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c8590b3d287e31771e0416b6e01077c42eb1c85e0ae92db8bd7f55396c3b82d8cd686382ad18f5e34556ce41a2d75b75": "0x0000000000000000010000000000000025e4fe8b1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a16486d51390bdaf6ccd1f5bb5a4b794344efcba6b004227a33807e50c11fe7c5aa3471df5c63c510d74daf98e7ad40b": "0x0000000000000000010000000000000000e82e60150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fb7974906a82c1befe7274060aa233209442f067b0391bc2639be8bfb28703b11f08fe04a730ad3fda012f780946bc52": "0x00000000000000000100000000000000c75559836f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96695ba00e610e7ee0f8493ec8a1ad47270d41ad939a8d0e66d4d0737a6f705cd0f12a91d92dd2e7bf2c054cfbadfe228": "0x000000000000000001000000000000006d65b8b1980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cf4f42697aa79c280ad6d859673fecd2267cc5968cc15cd4ae307f3b7f0491876ae35f10d1c3ef3d0d27a8b3356cc02e": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a211e42a41c7a473099884ca89405bfbfa4bbe870bf64657880a4bdcef7aefcc631a07959b3c609d96ece148113bc862": "0x0000000000000000010000000000000000400838414300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b59a84bc73f76679be41ed9a537ee10cf6afa442be3d127a71fa809725c68aaf18fc1411adc3aa7c30b25ffaf2464a5c": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3db7a24cfdc9de785974746c14a99df9878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b45ce48b37a4499e2fa22c57afc3b0df8c54365de3c4b3a3f09fd5addf38bbff015602e9d99493fdec3373c9aac5184c": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaed441ceb81326c56263efbb60c95c2e4": "0x00000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99d5945b6bd5100280345420037d22d08b4d2d8b3b02821d76dfe34e69a58ba96ac9ada2f7c982d8104c95933c9eda245": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cb652d12256f822d9997b3e780952cb52961226b96e2c0b4e660164e2fc9688b8609b918bb5622c8cbed08d5bb5afe72": "0x0000000000000000010000000000000000d0b81e594302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9701dea65dc76341dbf75f87ecab0a3f3d8fe70d6e5a5b927ba8a1854f69f4edc2f4b48aa1b126c337868c3b4a4008d19": "0x000000000000000001000000000000008d8d4253680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9171b5bc147ca6fafdc8055fffc80031019034820fd0fe4999a89be6903a34e8bb4b537bc12ad071bbaacd0a3aa3b877c": "0x00000000000000000100000000000000004034163ca917000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da956ae8736b66ecdb9f4148d6ba9829ada3a715cda458f0c43b115bc9721259ba37b516b88bc865ba72bb58dba4e29b132": "0x00000000000000000100000000000000ff8190f9880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d04f6f9adaf7c457735ce7cb0b6732e28b69d2b9b17e2d69fc5df1126804e5e2ded822844cb65b7610ce093b98c3acbf": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cf855e153b0987a9d730bfb2bbcad010d25c2e6a67f06d58dc59e407375c4c9b93057f97635774fa30785778f5f69250": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cb3bb1c5075d788c59a5cdc55fdef1702c83d0b6fd9991e16c5d4ba081a6f20d07d624cf7ca65c8e57a32b9737b195f7": "0x000000000000000001000000000000000080c6a47e8d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93dc5f454cd6b91c65054c16bcd5d69d91b6c657e889d55628317d0752f7a394ad4d05da6a33d09e98c18ab4fb8b04c63": "0x0000000000000000010000000000000000c0e4bca29709000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dd02727971cff8e8eed022cd058d45dc203ea01f79d6fc740644b08c690c4cee25cf42def1a9371f3df1dffc6a50f563": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da901d4ea590983e252d1ce5beee25f1d04f9817d823ca1975fd667023a12a1d19c3266c350ff26e62ef929832e99d4da9c": "0x000000000000000001000000000000000070adb7e29700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e447ec209346bf413792716e336f0484c568bcb2b30f98414465a19b3d496d6634c013fc6630182071ea1b58ac1343e3": "0x0000000000000000010000000000000000a0b6774d4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93d5b38e5658d9a60830b268ef896783e7689779462406549e8867561adbde2a73ba0ba4e38a0627d625d9de696884746": "0x000000000000000001000000000000003e2e78f8780400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9116a55666a6592ae7608abfd50b6774d8607bdd6700e287d989debea1c35435d184ce92d7e12e63718f584feff8b9724": "0x000000000000000001000000000000000000204aa9d101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95977fdf2d5c34444349adbaeec65f47f28dccd4164e6fa1a26daf2ee0a2ad42fa172b6f29d85d8a807a3e3fb36395067": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cf3fb537d656032f1e2c0fad0cb5ca7dd037682b12d438fd1b767e1d58c79198a00cc81213d04e68f22e393d732d7e49": "0x00000000000000000100000000000000c4f84967b20200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da914329ba3da78e480a5d92bdb3978d802fcd26b33bc077045604e73032db9b39beed33905df2e983785ae9fe339b58403": "0x000000000000000001000000000000007584ce7b210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9408c2769275479452ac9720ac30fc388ec732449d1a0272c4815a3546ea92bffa92ebf453a29b2875a0f058534f3b23c": "0x00000000000000000100000000000000001bfd7cd20b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e687eced599488fe739c02868b3c0222bc5829f254c52aa085c4c480de51d0ab4dc4dd15d32e8cd727e592c656073d6e": "0x0000000000000000010000000000000000c0e4bca29709000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ec95704480d953f78c22c2bd2f36b79a24a4e8404c528415ba251a37ece61e04e2d7f02ad6f69c6f441513e0d0fd8944": "0x00000000000000000100000000000000009d9765ae0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bbae0b25f8ecec09d1e2783e75d92bda08f8b96b99686499ac1ea69195fd8e927308389ed5f0af847299c18c67ba367b": "0x0000000000000000010000000000000000a0724e180900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97bdcd660f61c75b4e3151d7b5f4bbdbda76096d84f70060e3dfb50bd97818aad9db7d0f30dc08b21b19129f3f4e385df": "0x0000000000000000010000000000000000e006a1bb0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d6fc92759508d952177780d5e79a6716f0181096a400d28982fda75ebb27d05a5179fc5b05d110c8b18ed76ec429e548": "0x000000000000000001000000000000008171e0bd570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e622546120e3aff84257abcdb8b0e89a928bd8ae18dbe31618d25a76953226bbe50b992cd725591c8da82ca30811e94d": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xd5c41b52a371aa36c9254ce34324f2a5878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97af4ac9b05bef9f926bdb69de5555d8edeccb2b7bdd39800bef54c29da0eb85c4dcebcea606869de9fb3e643f4529913": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97788e096e6506334e85cee392d4ab281c662c8505839e39b6e33c260c0b26471d9a2bfe947b2018b9c12fe370175410d": "0x00000000000000000100000000000000e392ac6b782a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9876c64dd526ef2bfbbc87c5b448bc8161a84dfd9e4e30b0d48c4110bf7c509d5f27a68d4fade696dff3274e0afa09062": "0x0000000000000000010000000000000037733dc5180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c0d625ed74ef39a53dc34222499e7dc694dfa2f5a29ab113011dafc8575f31761cafd62a192dad4bf63d0734e5cade27": "0x00000000000000000100000000000000a85c43580a0727000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91b70c02fa85ae3c8ccb52941ae52b92edcd91f67799aaa8eb79cc3e9fa5db96f7c70ff24ac0a2e1edb5316b43c5b7c0b": "0x000000000000000001000000000000000030ef7dba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da921891d9fc318cde11fc92d50a063791144bcca8f5ba2d1928caced0587dbf8e6694394525ee7fac8b8da373828764474": "0x000000000000000001000000000000000030052b881403000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93e882ff393e31a537a629daabd004d6707a3f1c58870b8534ea74f1a294cf4a68ce6589c81b8f5a7b7f00fdefd78d920": "0x0000000000000000010000000000000000b05b4c364400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da952111f6923697b29af830949925af95c80b98e5a1e11695e21aa5f31137b50f178a3673b724e4bc3d6800d339d791f73": "0x0000000000000000010000000000000033527ffbc24a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91269c11082e8c0607de9732b902b822cec6cc8598ac6cf6944c8552ea6a830cbcb8024197396daf9bdadd97352fa1d53": "0x000000000000000001000000000000003e2e78f8780400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bc1b645540fb2bc49e9ece0bfe62cab3ee1a2eb92f9caf7c8b03b7fd816291bec78d19f030cb01bb9b232d21d3688956": "0x00000000000000000100000000000000c01e0d1a8c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da981faf7a553c7e0b5592ef1b1b293f5624e97c57aed25d5d558fbd7376d742acfc7b020c0ad8b46e84137f46abfe93a1c": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da994d1e45bc0dc972c74d1c97674204db48cd4badcc83e1c6346a87791b62357abc1549d384182d54a4f9abaf5e3e70075": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90f0e2053483c00a15bb0d6f9e44e68fd9afbc551b1032f6c87a3d04ace47d3a049cfb335bbd4a866d8fde52561b56552": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9722b037a0f1c3604666107c4381807aa7aecbb97a2bb7c434e892a9800b2afaebad33a252444b86ad31026563d74466b": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c0acb33185662b79db274501e9743c48428b09fa035c1553d8e975692383e2a29fd3d90c5bc504488a23543796276d5d": "0x000000000000000001000000000000007226fe247b3e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9170e73792a8d3f9e3b7bb65b7fe17e277075ad030476560a6281ba459e0379f888ad43ae84b369ca34a206e092bb8d7b": "0x0000000000000000010000000000000000da8aef2e0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da910e096ca042e86c535d06a5f65e014d7ae1298eb2ff33b4882b8d05addfb438fe3919974b6df261e4ad62ad93e7e3b63": "0x000000000000000001000000000000000020bec184f602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91448182d2c059edcf316f62e6c742bcfd09b701c249370c93219b0d76e5882fd1ca088f21e0a96ad3724a7e534862274": "0x000000000000000001000000000000008039db5ba00500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c0d97e24410220db2e1e43456ed1863e4df8d3281e5b10ec8b8005317ed4ecb819b7152a7e44aa3c6dbe40ed02e45ad8": "0x000000000000000001000000000000000060211444bd04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90a20e9634fde382a405c8c141a48a49b1aed13e48d4537cbcb0b432e5be1d4ca9f56845423d2c920f4ce98def2f02d72": "0x00000000000000000100000000000000842eaa735a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94354237467e2ec4cd656579196cd35c9188714d6fff0e28594dfccd1e0ecf90cf223b9382c9c75f03618c01eb6eb6758": "0x00000000000000000100000000000000162ea39e580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9df1c65ebe7820735e00b5dcd2c7bf9e49081797a6b7b154530af026427bcee01e919cc7f546f6df3022cc407490d075b": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93c67dd484c3ca8ebc2803142c14c9ada454d0bb8108a00ec4be7ec03db19c187e88bfe4deaf15930b63774c81bb0cb4b": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x2aeddc77fe58c98d50bd37f1b90840f9878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98385e72a7d7e47adebb326bb0af036347e3fb15161a42714d49fad7d3c40a0984c27b1964ead8aaf87bab9c92523f8ce": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da962106b0f01b05738b5bcb9c7c80ad481e25f8a3ba88a01f0a605d4e4c9acf6ebd1bacb302a13d09a68f61621f77b5979": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ba98ba3b24f8475d6508f2df6bb38f5a481a64b235c232627015199aa778b9d4ca837c7d1b617e9ffce38e30aa51a49d": "0x000000000000000001000000000000000050702f696a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93182c8e8a93b52e52523800687aa26608eb19b8b7aceca81bcc33f00c3ffd6ed78d87bbc243287a9e133408c7936c22f": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97a230904012259420ece17c120f3c11bcccd311806cf63616bc066b10a8c0a88648689e20489d2d2ed6cfcb35050f1fa": "0x0000000000000000010000000000000000b09d539f7909000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99aea64179a3b4c6db787718cf55a5b8d901a20bc4f19509231767981afc1506316a1742bb18a69318cf37f6d7c1cef36": "0x00000000000000000100000000000000fbd98ec1360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d234182621569eb3c55e8a4ecfa94bbdfe3ce82968599718f665a9c3e1dc186d3fee5cab1e7217b0c3cab8cede11915a": "0x0000000000000000010000000000000024a2946f430803000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da902165e34618ccfa922bea9c7f2c137cd3c2c760da066ffb6a9afb3a230703a24ca351368e7c550201daed4cb2f2d0143": "0x0000000000000000010000000000000014dc198e810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9aa4425b98cf03db5c73b96c798da6509f8688734b859078ecc5a59ac93357046cbf4f95f92d7675410cce7e0bdf8835e": "0x000000000000000001000000000000008f6b68687d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91cb60da6542153157872f11f69a4c69e9edb617cac24a47a6c3b157d3acf81beecae3ee01e81a8a5621354d4cd475a4a": "0x000000000000000001000000000000000bc00e812c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da916814b2b6aeddbb48ef43e7c9851011d5847d222bf853058ceeb1809ab9416054e8dbc4404247c4013bfe2ebe765861e": "0x00000000000000000100000000000000fd9c956bd54700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9446a9e131541977902fc543d481e65b901a75017b4e58b98c5c3bdc71e9d8e3c43f6299b47c87808e32a433e2729806a": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94fab7b0ec891a1069a708c1e6d007d82a2f07f8aaddc90b03ca03cb4ecce565cebcea731b6d129028b9996146f4ffcc6": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da969bd2607dee0568501178602462639fcecbfdeb1b51367c4ae7622832c4eb77c1c1eeaf4a2c1abfcfa46952ef549e329": "0x00000000000000000100000000000000f51a7d34360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da999d0407a5530db7401b978fc3b42529baa09e13913e98ba96085c5e481a29ffbd2c73b6f026cd24e8a93fc3b54dfb17c": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98794a78c6dd29f9792b780a8f5ce2a32cc3952c5b8ec4fafab211666aceace1422df62e8e4405987e904d141a5aba634": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b37812eca7f6395910fdf0f1903041d054cc8eb3f9d732fc7b156b6157dcdc30e15a2ab4d4758d62ff287aa2f3675664": "0x000000000000000001000000000000000530e648e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cadba1e722bf9b7d4fa78aa19fa4638354618b15b8d7fcd00c257f3c15070e39a398435f3e0b1216dcb0c85192c0ef5f": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9762f39d21c4c239c93c178740b27412cf0ab3c6385dbc4e7e5345150a8a6500468eb9c5b8a18528b85f06822a26b89e5": "0x00000000000000000100000000000000a95c024bad0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de440e1347a2a268a6b554b68dce03256a017322a5e2ad4e0ac5e6d357f46114cea10b634453571a6bbeddb14b033b57": "0x00000000000000000100000000000000403b5680180900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d28ad2b92c9c167fdce1b35324793b24542b935f96a821a51fcf39baefd123bc875d9651b76d43858ffd0b950baf641d": "0x000000000000000001000000000000008e7cc70d930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98357fd3d3a34daa5d1b1f20c57692b1d9a761039431fccefa86756e9f760f9a4f315c9162baf8cf9ff8010f5cde0eb46": "0x00000000000000000100000000000000973041a3b28800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da989690105b8017ea15577e8445dac80b3be0247efe9c9d3cb4a866fe20d9fe149c9b23ad6bc9d60e5d641c25285d75b5a": "0x00000000000000000100000000000000a16234ffa50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e69c6855a5a1649c6b8615ad8fe6f4ada283dca5f54ae228f06ef29c48b3a6f72e9863fa7e720b72127f11d241dce539": "0x00000000000000000100000000000000b11236ca7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da936961ccafb183f5393eb59770b72e2d92ac347eab2b9ccd03e9c2ff9c647074483dc27aeb8fcb68d87b802c8556ccf71": "0x0000000000000000010000000000000080b61077ca0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9428c35f27782b06ef9521b2909066452e29f68c2a3960c669d4c40960a3b43648590f4ae83de04c0016cfaac740f5745": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96630ce28d3765e89beb54f46b24d21e4437049652c847e3f675186fd90670b9f6c1e585cb987f535b15cadb0d53993b4": "0x0000000000000000010000000000000000c0dc4193dc01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93020dc12d34ff8c71d6a031ae1344f2048b09973c96a79582ef5dd02c9568c9ab86f9d76bcbbf590bf9322e1971e5c18": "0x00000000000000000100000000000000c4f84967b20200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a35bf99fa81baff274b6366fe6bb259a8a47202041c67d6613eeeef33b4ba031a7e727109c6b021f061d4778006c0e5e": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c097b9ea1f2d3ad309a0d06f3630230f3c83d45440ba0fb8672b8e4ce2e5ffba2fd368d7516429fd964edc2c039b9367": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a2861c1ea66ae558cab9ef975869e341a4f8c518cdaa4efe6cc9cbfecf669c5ce3bd065f58a06b600571aee56b51b6b5": "0x0000000000000000010000000000000000b078568c363b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98be54e9b7076341d25dac9640a9d199a60ae015a81090c76516ef03c9d7673d26041c996ee4c2bf2df16fc7d432aad3d": "0x00000000000000000100000000000000f3d30357e5d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b7edf922a9336d2c63669875accc90fa42ed713e13ab29174ffabb7d2dd2e37c8dfce2b725bc4cc15273288bfa9bc86a": "0x000000000000000001000000000000009a2a5c861db007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9787d5328bafefe17b2c6158d1dada37dc099d8682c48e5e4d230fa8f7e7160346c69d0cf2670c175ba307a61e4484508": "0x00000000000000000100000000000000883069b6aaac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a57d20b6469427896135c9b9cb2028d94c9c50752b352681f6340eb39db586d7f2072a1c6c4d0e557efcd728fc3e944d": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da908f5e4bc617a3b2e3dc0c4d53528887eaea356cdf6a661082c11acab6b65b2f1fd105b0c70e355fb4fadcfc7590e0b4b": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9075ff3d32e2e6da97ab4a01b2cff8c7d463f24167e3fabfe460caaf108a0f2870ca93b038b285562fba954447a7b791e": "0x000000000000000001000000000000000000e941cc6b01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f7ae030e42adea7d3c6de61c74f27e74424f6b9eef91d2ab1814c0dec25b7eba78f2dac87541e21f18b56cbc242eb41": "0x00000000000000000100000000000000bc1050305f0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e0d0b8ebeb8e44b64590d118eb2030e2004cdb8cc2eaf1ad62b9a35dea88d2bd9dc54e2ec0defa8ea07836cfef801c79": "0x0000000000000000010000000000000084323606320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f15773ce0a6ce405fa7fa966cc76b48cf6a4df5da66b066df8161ff7b3fc5182ed9c397b42d5ad6eab37c9076f4d1e2d": "0x000000000000000001000000000000008096e8b2e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b23f88cf6ef19048ff34d0972bb5154db28ab9b4633c355e94d8240fe494b3c0633076d3d0b709ed3a9daaf219e55b18": "0x00000000000000000100000000000000009d9765ae0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90487e2e71b49f76fa0a02ad85fd1a45446c96849e80958c7fd3db20f97f243d53524ab111bbc44465c47c0f505d40b2b": "0x00000000000000000100000000000000402da5e2a20800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9baf4542f9f7aeb270cc6e85b917774722cf30ce176251fa2d173c2acef99bb371627c029d1776abce754e3092c2ade5f": "0x00000000000000000100000000000000c06afdc5160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f4ccfd5ff289b6a77d54009966296ddf5098d12a11921e5e0b00a0fa4c4733fd092221822dcf2d27559c3e82cda9aba0": "0x0000000000000000010000000000000000b0b7e699af17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da924b4cf0fb53e4580e04fb173dfb392ab50cef5a40622fa8c2e43d7d5178533fa6e963683902b5be5f05c9d33318620ba": "0x000000000000000001000000000000000030d7ae20ec05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f822f3babd38321605733cd0b2090418b243ac3aa5ad4e7603ae0f24dad3587c536b9cabc812272e54dc7f904838b131": "0x000000000000000001000000000000000d2ed73b4e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91c9cf4c14e694c03b3e83fff4122fc94c7f9013ac7c4727d709f35fffc3dcdc7d81a7b074b4d3d7c4304039b597b17bc": "0x000000000000000001000000000000000040f8c5810f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dce9e72a7cd1d2f04d429f6e8bff211d4ed31ac4bece335370c40c15bc277ccff27e6187855a3f2be1c2cb57eb873fec": "0x0000000000000000010000000000000000c029f73d5405000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaac0a2cbf8e355f5ea6cb2de8727bfb0c": "0x54000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9061f54215d6c73de5374da6becfc21de7627d96f9dff1650fc3643d129818097ce1a8241dd1d82fee10c4aa7002c4050": "0x0000000000000000010000000000000040844cae580100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90eae88c33ce586533d707b97c39090e9b66ab8f0dc3270f3f1a44d634e0967279ebee4d7e20843c9b90b2d2736fda84f": "0x00000000000000000100000000000000403b5680180900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c15cfd4d90ad4a49603518624795b3e43aeadb6f5958a678a46d7fade6641c2e206bd10232db06f5188815b290cdfa28": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98b353871a2f13152d446d18e09b3c6a79a838c6d78b32c74eac6b1e561cc60ebbc1b8b4dff562ba4bb2affb233a06400": "0x0000000000000000010000000000000036cf93360e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93035eb685bef23f3ea063235a221e9c80ca5b07f46fd7afc1698d9d8cce5bec2cfcfa7abe5394a40b352b1550d6ee329": "0x00000000000000000100000000000000b77ac634b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99b05a3151a2ba3bcaa81d3bf5c2bc194e653f18d61232e611588c5c492d4a65cf5074014386c31075da6f81835eb8c22": "0x000000000000000001000000000000000074fc13fe8623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9013fa4787fc412c61aaa537aeb5c97e05228c15c88218a8bd7ae77352d963dd54b7792361d9745ba750cead44c402f3a": "0x0000000000000000010000000000000062c464e9e30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93c6cb12fa02d1a028fd9fc60c5d54e96d70c8a9cc2f1bafd08c3977a02c9be600a22e24cc1f7c1f2370b0b4e914766aa": "0x0000000000000000010000000000000000e05a6fc52f01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99316f19d672ee079b6c96bbfc16603fbc803a981d967c9f2a00ef63b28bd86f6460fbdac8fd0a9e862e415adb282da2f": "0x0000000000000000010000000000000094ab429f6e0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d3471a8e30bf5001a17b03e830474360f4270924df7ea19634a1a4330c36f22de8ca54dec007f423e404aed92107a23e": "0x000000000000000001000000000000008c6543d2d30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91553b93954b2aad250eb1c1b00cadd9bbca2f6cc991a99070373baeffd8da1c71f70643bf02a688b061a75a23d229b64": "0x00000000000000000100000000000000b589cdd1d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9347493d51d1f3c433d947c485322fd25b2ac4e71f10d4e8f9f069fadf6b1bbfc1cb6428c0b3159815e6242982e47cc71": "0x00000000000000000100000000000000c6bf97c9590200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a8b285abb72e3e33eb8bf249bd704cb1688af407a6c8f7ef0b384fe0b06e2359d4ca9a7231f5ce3fc595c33f97cc4f1c": "0x00000000000000000100000000000000a5c27d981c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90a22e39f95612806f5f0f13ea389e9cf76ecbe8d327ccbd1c4c384b2f702e478e6858fce582353683d276b7268db1c5b": "0x00000000000000000100000000000000809dd15a150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca487df464e44a534ba6b0cbb32407b587": "0x0000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d2e2c3fdcf5cf24d145a20426edb4d6d5202b39b6d494f16d18b4d7a40b42f991352ed085e4e1743254d0378f5183f3b": "0x00000000000000000100000000000000002cf199160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93b22b2042f200052f1f743d2bbc5e483aaa7746469b7874f13a23559286e3d645f37b6f2138c0bd7347c78a3a850042d": "0x000000000000000001000000000000002d86f716990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e87082221f6bd88242bc63bfe9fbc8c37145488147f477b40bdafd57fad7f2192225bfe7a708386c2631e4eaefe194c2": "0x000000000000000001000000000000000080faca73f91f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cf9cb02c2e251127e8169fe073f5743254ef870ea011f34a370a705e9971e62e84691f2661bb57932cd2e6d64fca4213": "0x00000000000000000100000000000000a9083f42850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90361686a0a4c954a9e650cc22c1106fee8cc44ff0f5db4a7f936ad75ba58ff51883873754d584286b739fe92c17d7845": "0x000000000000000001000000000000004d187e8b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9efad214ab167439fbde3fcebf757479c2820fdcfc993ca2caf59723b21ff6bac2e2b06d9f1cc455e05c3a61c1a5f4461": "0x00000000000000000100000000000000b98d70193d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9366c7fcd7bc101ddfd2c31027ec8f89d7642d339f3d3fb51d328e49d9251e706f07505f62b6b13da661a4cfb69bb5357": "0x0000000000000000010000000000000090e900058daf01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94b2b91dd9ff769c6768142c8853b6d055a8c2af89cbb260199d809a35210ddfc15174baefb171939a1fb7b3705ab7bab": "0x0000000000000000010000000000000000a075d2941d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96e40110b0cf0c55a904b45b4a4d38555ae7cbacce28d96d8abae27b0a0dbdf921db916c7f3e6594924f349555400c632": "0x00000000000000000100000000000000c004eb2edf0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f674b61616ed65b47e47fe1d5d101f0910ab838594bb8a17760501c7a7844f916a1f9d0dcb91e21c4f543aab9044e76c": "0x000000000000000001000000000000000050b7dc1ab901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c4a48bb379cc67fa0893cb03482a901b5af98e6b1019c7ae9aeda406ab2afaa69fc1d809428ca1748a0cc52b1defeb38": "0x000000000000000001000000000000004f61ab8dc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98982c8cf846aec5283005a1d3f498064f43c40e87cddb5d933309dabd513361ab0e5768cfbe2df10f75d30bce503fb4a": "0x0000000000000000010000000000000001115b23260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da922fe55d5a32915f57b0c80a572067e2c8495ed1c27128399aaf38e75836fed42ca03b40689b18875eeb3fd5715480d36": "0x0000000000000000010000000000000000c8391d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9252f5f9d303d66b622cad927c06079e89ed7c006a3388b6a79c6059514368c35668fe29bfd3d402b32e8ba35b51f302a": "0x000000000000000001000000000000008072aad6230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90b262a9cef27344e95715145bf48d22e56ad3ded3c950e61e78d678beeb80d4f852f6d9c86244c673bbdcb1b7a10de66": "0x000000000000000001000000000000003cf2d49cb70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ac742c817fa6cbce164d143f640331bf068b174df69debccede0e149aa156fa0430a397c67c05148770b180ce5e14b33": "0x0000000000000000010000000000000055fb1edecf3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98b8c75e424418ccc2a18813c7b8eea0cd2d47d3bfbc60b2f9cdd93f7a2d49a9242b3f63516684ebd8248d782d225d354": "0x0000000000000000010000000000000000b0f6c7f1b502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x0416eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91f6a29a567df2803bc155c4f7146407316eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58": "0x0000000003000000010000000000000031c5a43415dab70200000000000000000000000000000000000000000000000000407a10f35a0000000000000000000000407a10f35a00000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cf62f46856b2d716955e85b9f23bc4ab3a53a5631be50b9e33a343f6f559d8b2ac52c2545f991799cded4690cbbd4906": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93fc961e5490e4889b74881439d5685f6ca9baa3780d5880c9d8a73263ac20b0f45826222d524e27242c06af3ace28307": "0x0000000000000000010000000000000000f0829264a626000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5c0d1176a568c1f92944340dbfed9e9c878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91a9b0abf62efdd7256e9bb8ed7bec4ef37735a93f2a4572f32a174cc25e8a95d6ed74988b9bd30e3a132b76758c00fe5": "0x000000000000000001000000000000000000869eae29d5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b17ef5a54d776fe1c74546a944d3aa735a465504c21c6820067fff245da73532c1c2c1e51defdb90350713fc70ba801b": "0x0000000000000000010000000000000000a039246f9e08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da955a6c53cac2fec717d210b09ebc4f7ec14362eb440af78a6eb36b98ff652d4f8a684753a0e0d4bbb7f856f5820313922": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9194a30d5215aa9f7c8c4de77019f0d85ae3e4c1e762726728e7159dedaecb8ea1037acb6c18e1a2773a1e1d3fe031b30": "0x0000000000000000010000000000000036f1f258ea8900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99ea71b4d002b382b9bbf640637d336261a279421e2779869a9a794e204bb5e107c56f1901f422a878d4b8a41b5367750": "0x000000000000000001000000000000000070ca7d0f5501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97d8e4c5861394a0175f13dc7f7967bbdc840f5a7175e955e98ea23fc60e77e2fffcfb4888e371aa85ba00a68eacb7b41": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f4bc15fdc1ee38a044739d98ba2ba3d61ae0bb66baa5a4d7f98aa17a76cc66228432d778bb56bba5027fdea0a8bfba3c": "0x0000000000000000010000000000000000b0b7e699af17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97a96703641a40f8dbda1157d8b9576a4331ceb3197bd8b2f9380fa5703084ed31f212f38bbd08743f9d32855e6fd61da": "0x0000000000000000010000000000000000b0925413aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cc705cc21e42debedf5fc6505caaa3715eecba98ca3c33330cf6334fae29d3e968667f0af9a9473b11782ce0e6406614": "0x0000000000000000010000000000000094210c49458600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97a4bf72b32478466cafba770158bb014ea50d4cf79b528ca6b224be197add6b71a5ffd06412550a2751e829500162c22": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f2ee35933e6ceb48290444b69c28aa41aa7c0c443d26f678d969b33ab9dd5fbcc5408b3cf38b7f830aec54912f65bb3d": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96bb36bb5b1921782b558f13ed7db10f8e48888563312c6ae01fb5bca9a685ae1a4399131b88887fb63df9c39ff8c9c4b": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a71cf691d1c0b71d5ea51373c82a6bc538ecda0e69daa15fb9a39bab396b1befa19f5755245e28764b69bdc2bfa91227": "0x00000000000000000100000000000000c056265d740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a82a1765a67d5f7baf3e8a950a26524d2294eff7cf2d05f8f323d56cfe8cd214e10be23fdaccca0963d4181a838f9a71": "0x0000000000000000010000000000000000d092a5450700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91e9e8d5ec372d6e8a5df908a86de00b61c12ac45afe43f719133ed03cc183114d2c44144dd4915b9de9adeb6dd8fa557": "0x000000000000000001000000000000006e0257853dec03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90adb27acb110b4bacc2951967c4ed767c87a729c1519bfdfbba78ffd0e56234b1bb98f60b62ed94e618e295dcf1df0d2": "0x0000000000000000010000000000000077ae3e13dd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaea07de2b8f010516dca3f7ef52f7ac5a": "0x040000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c34f5c20c64693f4febcc80c73ba7a773ab89a10a759ceac899b9b2b2e6a032f33c6deda169cbd2921b53e877d36fe1d": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95cfcf7286630f0a8163fbbb1bf9f61b0f25cd5e1c0e3a41a3ed51084c707a64955ac5137d1f98823913b3e924d0fe729": "0x00000000000000000100000000000000c6496e3bbf8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99d238e38905b01b858dce709f3589a271c9dcc38cdb32fc5ca06c7558aba9b06107be5bd363c85c1e8b63865d2823554": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da995be2a18e5444de6539af673b802cd58597873b69b90948aebcee6afd48523f9c78e6265511a9dbb63399ec8cb79d4c0": "0x000000000000000001000000000000000020d2fb3b7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9949622978b783a606904ea0ce15cc0315274ff15aa7deaf3b9b7582e69d5ce27fa93c599ff7a4c3e8710e75da4597348": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da921cc35adf9a260ffdc77002405681f37c6c5d3351b322e4cefca036fab76d7c1d48a73374b22ecb26f60b7d88ce72d3e": "0x00000000000000000100000000000000634ea238260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5f32413b88c5b4dca048d31b39c22340a00a7bab459d508bbec56ce847e28e224118b3915118ffe76a29a1840fd687e": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3c0ee8a0cfd6b1e25a09a26254dd89d84b5c0e3034b6b73e1e88736c1d774e242f84ee8490641b7c58088823a6cb041": "0x00000000000000000100000000000000347ab2d9c90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95288f9cc32b41ff58ce4bfcd1d7610cd58ec2c0ee16b19612dfb29e46935f055be71c49c5a644788e84d4f107afd6854": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c8714eab65ec6678512a412fbf012cd49ed1f1c1ef6a281cca9a9289486ddc2162ed764858d60eaee1f39a75d046bb54": "0x00000000000000000100000000000000e688a15af40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91ef69d3d70e73951245c99a50c719f7577e40ef21928ed24324fe6642e6366e1ada47aa9b898d5ea20feb144f4f45cb5": "0x0000000000000000010000000000000000e05a6fc52f01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x89d139e01a5eb2256f222e5fc5dbe6b3878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91e49e55f8e6d9675af29b51c06d997697814b7f8a9a3dce2d505fc15f11b8655752e76268d8149b52b5c166b2db6f540": "0x000000000000000001000000000000000090cd792f0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca308ce9615de0775a82f8a94dc3d285a1": "0x05", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94fb44e42187527135f7c2e49ffef4a003c5d93f0db2614915c56e1e3d1039911f9d1bb7a27382251864416e702be9d65": "0x0000000000000000010000000000000048f6e38d250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9053ad0e083823a2ed5fbf74250a3150b50a89abc8fd934840a63d5bf942e8374e1a2ce65787ccd2a2acde5d623005c69": "0x000000000000000001000000000000003880cb8404b504000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c231ba82ec05f06307319a1aaa77bd1ea677f30fb44599c775dcfbd1292a3290818a77708ec8d888ea9d9fa47b633668": "0x0000000000000000010000000000000000e31c75ba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d3f24cdc8fc7f3c4a27e5a9184a67afb2857223c91f26dfe94a09ba1fcae9812eee5bbbd7468e9d72e3c36ed1423f50a": "0x00000000000000000100000000000000d78ca685b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da942d8b4bff6a54a6b224910d42b87df4e0e9f7d3f8605ac195722f26653999c2a6bc4280d3c0210e5042c67d6a027d723": "0x000000000000000001000000000000007245377f878800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93e2456f0476cad2baf5808ceb32fae1de2807781ebc6b52843f8becd4bdeda334cb6ee54f1de6da6510e1fc75d8ca451": "0x000000000000000001000000000000009cd35678f28800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9576edfaffe7f0cc691e068010696ffe87ad3131401e00654cbf2e41d38046c7ecca5fed4ff9ebf2e56f3e059d2a56b4c": "0x0000000000000000010000000000000000fce7b4170900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97c1abdfdd26eb8c579d8e4407d2f1c863e4576a1fc806da5a60058d9ca5b328cc3ff6cfc4643105332658a19645b673c": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d9d2009d256db141d425bf1b42b40cb0af138d90c1d9f898506ccf8d86d097539d700c85d4660f2814a30802ea4a58b6": "0x00000000000000000100000000000000008079efd31500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da949d3d44678746055112c1f73aadead49106b05ac1514bf7f578ef8a3359f44bc4671c5555e7628a67d7e4506922aab27": "0x00000000000000000100000000000000a5a7262cfc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9924e03fb3dd2896b5595497f0179de4074676fef4569c382f5c06f09dcd215f8807111836b1d6deb9466179fafbad433": "0x00000000000000000100000000000000713fa205960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de245f0828f100526cde097f73c1793bb6bc1e2690447644ca0fc19118adb54754b482b5ab1ad728e6daaf10a6d93643": "0x00000000000000000100000000000000484f943492210b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99a68d65391f4fd4b7a79618c4154d20e6086ca01acfe2d6c84a1b316a82a77c31a07e4d02e0bd634507ecd22557cc537": "0x0000000000000000010000000000000000f0e27d817300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x0416eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9860dfe9fc751968e962357523e7f9f20ba7293652855728c5c785cda9b09eec19731ef78ceabad607e2cc48faf115aad": "0x000000000000000001000000000000000030d7ae20ec05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95e46d5ea7b628a421d9fa7ff29ccb52248f41946eba4a7ec1053e68eb7a7c77eb3107019de743b0a7277371c8b0bee2e": "0x0000000000000000010000000000000098775afc4f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9abe1158b02d1696f8b0075f987edfc9c40f662c4efbcc0b2d846b8cb48dc835500c2f557b91ff25b246228231e94416c": "0x000000000000000001000000000000002fd7970d8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da988ed527b8bcde9a1e543e9f2050eb1b947c2c4bb869502a54d2f87d6abf8f478004189434613db602be08beb6d390c42": "0x0000000000000000010000000000000000b08422555305000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92e5c4627790807c5553906862df69157ba8246592c1c9889f05a80a2e860df80c42c1ce220d6aac9be53218b97d68b6c": "0x000000000000000001000000000000000080acfac52361010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cd04ae30a824ea75850931558c961546482f955f3d1322eff797ebee46efbef19c8ad70beb36c504b2bec26f56b3fce6": "0x0000000000000000010000000000000000201a0b9ed40b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9deecb864a9b3371e2439c3d7d4add0679a2c2c4a32ad6ec76970394b047a44e1a50a8b0a73421b549aeeef0b2eb8bd61": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91e5e22e7ed3170846f65e2fc628ad3bb04752ecbc1bd0615f17422d42f979f3098a47501d992db9d313410ef6152df4f": "0x000000000000000001000000000000000d1ec88c5ba00a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f5afe15f83890b47ec04f92cd98782ba74530893762bb8fa13137d93b68980ba683cdbdaa398f1c6e1bcfdd3c82a8058": "0x00000000000000000100000000000000287fc1018cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9413f556dfe469d15cdee25908b44b162b2ab397cb598156fd087c476a144f0212231dcc8b34f62d2da915be1946d9a6c": "0x0000000000000000010000000000000070f10fc722fb0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da970141b255f502d53e8f46a1ad039864402d57f2d51365b54939c710598c852b286cfcaff709a8f2d65a0b31c276ca207": "0x0000000000000000010000000000000000f000a65e400b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da993d0f727287500ac96b26be339501e3c96f474fea197c6d14fb03fb3ee89eb68b540fbce438030c7b797078d59aa1765": "0x0000000000000000010000000000000089dc21fbef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9af249354e6ccad17302f66c5bfb3d2269efc7a312088d5f8ce94282194bd6c1cb2f38371da5e0fd7d683538e8cf12a47": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da901a028e108b4a9ed1a6f79460bd8f5cab6d5eb1f9b739bb45438c5737fa0980dd6edff5439f23482002e94b99715fd13": "0x00000000000000000100000000000000ceb76ba5d28c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da981f1b9373667f5caeb65deb9bcbc058f3c800fb3545dbff66660b7ec6eebdc2020807429bdcac5891f4d67747bcbd42b": "0x00000000000000000100000000000000f70373bdb78a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96c2a016c2e1d20ab4ab639813f6f523bf25080db44e3777e7ca0bcfc4c8c766528eb4be89cf813292a48757d87376173": "0x0000000000000000010000000000000040414b7e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da964537382c7ef8294655547e5c70bfcf7b8f60e829e9ac1d7bfdd5ebff80c92e6b17aa9d9b28b28cf3b1b39e57b918c07": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da986dd73959fa534250af9182415f0beec3f7c381f53fcc171301050e0578149517ba473ad281c4d833a96d7c5245145b4": "0x0000000000000000010000000000000000406352bfc601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c81ac68d7a0e21df6b4c881b6fedf3d96348d76f94cdf00f3fa2cc91391d9bb2463edb58e89a6669612da697bd100195": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9105265930bcc322c8af3317877e021b39151e226d6d8b82ded2735b3145f41ebc0378b7520ef72928f7be2c6a57e0640": "0x00000000000000000100000000000000009048db3026bb020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bcf983be4f0903200444abff37347bfaa97776b346283c6ef2fb7a7bda8af251a53d96011bf47ef7d91437fd0e990688": "0x0000000000000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da933d0326f65847cb4e984d1af9c0ec4060578ec441c397a9a353bf0d630413b292ab6211614b196da44a85ae684796a30": "0x00000000000000000100000000000000676a819b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98256c65cfa094a7fef893d9fce68cf73f0eb3d30db91896962447aa3a490052a7e85c099247c5325cbb55ff8ff433e20": "0x00000000000000000100000000000000403b5680180900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95037d1cdd6b764cefe86a01180fd51274a9b0978fb9fda905c7665deaaf2753c3076e9416f3877e0d24ff7f1a1498011": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c7a883bed7892b0ae1ab360bcd56fde8d875a9f180a3430561fe5ed37f7b85b467093f4a11c788fcd17aa12dc5570921": "0x0000000000000000010000000000000070f50c8a276f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95523570ebcbb8288f97e1c9c8818810d3aaf27f8873a8b113200becb5a2fd85101fe563893fa79f8cc8d020f19c9d10c": "0x0000000000000000010000000000000054a8f4638f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b122d0d3337be743f28d98b11c795a42146dce5d9b224d16ee1c5e5c5aadde54dd0533d94fa7544650b10728d3f2411d": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da973fa63985ccf3fe679daaccb38842831fe716d66c58668f3fae6a6188260c01a90af934b96b3328ed9c9f2763a29797d": "0x000000000000000001000000000000003c0a20240e0703000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98f0d1c61cf4fd91abb349fd114152e3d5d7659aa9593a6b9805b6baf0d1cb2e4cff400669f16d704ccb204f06aa2aaba": "0x0000000000000000010000000000000000c08c59b6dd0b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da948e52e989d458cbd541a2bb634aa7466c5d9ae229697ec9fc6f2dfd76d50e56f139d3ff4c93df9e68e40138b096b0d96": "0x00000000000000000100000000000000003039afe86502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a32effdcf1afedc7d6e953e6168ff21ccdbcf9394a241f34f09cfdd3ba6a10a9662fc588db453d26c8c62f29da2cb880": "0x0000000000000000010000000000000000906b79678e03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d05719c4aec71ebd3e187ad7e17788a60a82bebe852c266ee666aae2e5f66859ee97abb5a05f94a5f40bbf739ae8480d": "0x00000000000000000100000000000000f96d75044e0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9377ec075cdcc6b72fa62bf3e9f4d236c2aa47217b87626a2950701f5f5423595e786ecd9a88f807a2708b35292094d6e": "0x00000000000000000100000000000000b213d9f50f0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9abe2c87f3507b001346d9c3d2f60a8c828d6ba7df24332ec57297843ff9237e55c0b73f4ff521a3a4b8597d064f3db1f": "0x0000000000000000010000000000000078db9584e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da988563baea9a30b3a14c9adace2dc1a40a6bbeaec460d69f8cca665e6dc563f0dad3c17dabd87c92cf1b97eb100f4a504": "0x00000000000000000100000000000000d1f5f9e5e90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b5f9c535dcda55e07b3c9afa706041835c48a258139e0372b113d5631c334248bd9abb4c511b3449572572f6b60f4569": "0x0000000000000000010000000000000000a7aecd392000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e17e7a650cf7ddfe4a94203b6dec29b956f605be9db9ebf6eda5479db115951a1bd9061dbecbbd1f042dc949014179b2": "0x0000000000000000010000000000000000b0100aa25e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b71c885070b02796eb2613671fba4e575e83c40227ef53ef4486f8a5aba4af0a32b28968c50d46048a878f466e6b5145": "0x000000000000000001000000000000003e2e78f8780400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95d5c3ca75b5e3931d9446072f5512b0c6c7f4f6a5cf66186a4f8a94ab0d72517b89059b0e0c64d3b2107916b28e0140a": "0x00000000000000000100000000000000409267fb4a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e24301d37c72f4fdae1edfb9c6e236a0063f31e93961bb8ccffc2bc459f7b23c6241b8fbe6e79ebece4c04a662578e24": "0x00000000000000000100000000000000c0cc03b6d90700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da992cd7ab30753183b405230b5ec5b2673b25a461c0e2d1b8704d4b4a8fa4e97f8e77704ddf5d6444d941ee4629e01795c": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ad479b767b93a7acd12bd577af0141ca41388d4ab8178e2c6b8b90f5163758f5dffc3e10bf0c001c92d0c2df1fc4658": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91a5249452097f300dfb65f9c826b735c86f5712a2dbe3cca14d5f0ac575df513d939cc4dfcb508fe0ad627ec678abe71": "0x000000000000000001000000000000000060b7986c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a01e11741d617b33d05a727f9e7343438842e90e8f6ffaff4ee1618ebd0a140eca756e431d16cce90dec54e78c8fd705": "0x000000000000000001000000000000002f4ddac3110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9742c2838a639bb6b5de719498de248bea7502b53ccf1726f8f76968d835f5b1bd01c2646fc927f8f5d61195b34b3a4a5": "0x0000000000000000010000000000000000704f4cfdb400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c625c8c2f893a6fa64d1351b69f505ee89eec9895090865b627ef2b9e6ab0be109ab9185375c65e4f150f762019e5f77": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98515358202df232f047c2815e83179079e5d6655714486aab4c5f825ad9369e6aa97070524c1c63eda22ec9796842940": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da988407ebc78ce0418ad14bceac1a002b69c52e6a5dd875d715062c1b4762dc7845c8278f556b93adb8c254ae082917f1d": "0x0000000000000000010000000000000024acc599450400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f956e7c9054a1c07e57adb02e47188361c78ed068ac63bc42957ecd799d4c669e0324ace1ee61e13d10849142ae0510e": "0x0000000000000000010000000000000000406352bfc601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f5700e44bdadb65c39d0d7d4a7ddeb84b8e36c8ecad5849535f743033f2b555736d958b43ae74c133781ddcf8ad5ca93": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93ce7dcc40de13c4c5b1fd9aae0b71f319ac69abf00e435ef8224446a4511dfd69ba291b7946cdb2cc11ddfd2cfe84202": "0x00000000000000000100000000000000a59efa9e410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b5c5b9b51346e0b952fae7d15c87103157817034546a402990da8c92bf57f9cf0cb00139c459e9015c50d464c6baac72": "0x000000000000000001000000000000000060b7986c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d32381e22b8b7e5f02fdf1568f67e4eb21ede6eb3b64eaf2940fb7dab0be2e7e8fe06c7d315ca21c480395161fe6e0fc": "0x0000000000000000010000000000000000903dfdff6506000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ad268aad25058577063e31ae5fee1d8174691966bd8c50bea138f5696f8283bc8dc6b7c862ba4019b314d5da66266a6e": "0x0000000000000000010000000000000040bca222ec0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96d3034819259bd9c23de8a33912471eeb54777c1d596a1073bf492edd8b53986385b3a831c7fadf75feaaef52ccbb55a": "0x000000000000000001000000000000000050dbbba62100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da926f6910b13ebc511ee070c74a8a01457db2696f4c42dde307527e4f943cdcfb73dac6b3fe97b6dfba82ec53d36f14a82": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da943a557ccfa9d04c88ab385a915b72aa12af7777a79e0d59a6e7c0ab6d267e36cf7a67e0adeb9ec81149827c88ba73745": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da902d7f46fce0a0caad5fe3a20affac3ee3af8e97d15595b3c3a1c65930f2382ce58991d45ca5cd28356d0517fc236945c": "0x0000000000000000010000000000000061771b44d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b4b03889149866a2ec0630c1e3600dcc38d83ccc0ca294f7b77f69998532830b7231a2894e87870ae642301abbd8053d": "0x000000000000000001000000000000001adbeacbc80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d4de33d6b2dbc65285654a3d82664fa630993080a6661575e5ce9ccc41555945783226d926c2d0ec5c1ba5f23b76fe64": "0x0000000000000000010000000000000040c34ff6b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9749a45fbe1e0b4bc9d2b2ab7c2f423d70e4a11b9d6c2615268203b89f68b93bceb5e59c9a599c503e18a9b9f0f96d652": "0x00000000000000000100000000000000231f2129cd2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da942cd364fca5b005b7477f2025cc5ba3aa6dfc395bcae13cfb655e24e389fe5c8c8ff6746c7beae824c5d92d69fba1d5e": "0x000000000000000001000000000000003f6a2ed791f201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da977e29d7dcf5f1e5706c6cb6e9de6e3f0a66da9df4df7adf7bc5d752598d71a8e9c9aaa7b6fd8276761c76ea5dec5a965": "0x00000000000000000100000000000000548f7944950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a2d88a1261db92cb96c9ba911b2faa12a4d028ca1fe9d2dd488dac711e961b378f6dda9dc6e7c6c732f2bc3c8370ac56": "0x000000000000000001000000000000002062ffe4568800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91c195b00a024c3c0fb17611bde2417e43c9cc725e278b83fc007626f8c64531e5dfd3a80b8bda65f7ecd98f3a17f9034": "0x00000000000000000100000000000000f79667315a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a95c1e5ab037dc9f7d7a4ac1842eeaa88682733a2953491c9bd8e037e9b5cd9b25593b87514b78eed323efd5fa87fc69": "0x0000000000000000010000000000000000004eb9efa12a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xed25f63942de25ac5253ba64b5eb64d1878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96994e37a0cc740783ecec53660184c8882f24c19998406c001c4a71c41d8103cb005be40923d9fb5d28b371a56d3d576": "0x00000000000000000100000000000000b32331541f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9630778442a06509dd42558d2e9e9afb3f8ea973aa8e932d19512939750300dd36df43c960c37e963eed8d922b3e9353f": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99907fc0cb4d6062cc98bcb5b1f0bdb3168c71888795c68db4a1580fa273e2714a926bc52fe1309705848251dd2266e47": "0x0000000000000000010000000000000000407de5b9fc0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92cffd8afb0f00e1c1c15d16e32ea88ea7930809ff18d79d26595bc8663489db31fe6f9c0f7f3b5e42a4adae189ea59c8": "0x000000000000000001000000000000000070adb7e29700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da980b17a8d863cf8ecac3618743f4da4084c9e80ac85deae418cbea6f520eb1653f9b632d615ba59df01831091e0042858": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90c54ee32d3ad819fe8e9af551627ae10a241d90d73efc3c1e6725922ecbfbe309c650e172f52f34da35602222484506e": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9adb81f2aae1111de98157d79ebe3448a8c6d4441c42fc9509a110db519516c9e2fee91d181c4d9383ad4739995239847": "0x000000000000000001000000000000006ba73d054f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da914c6b26f37cdfe25bc8fc2a7bc2b44c6c0564f960c60bc918c80ce81e7af64483acc525839bb0edd285969d86442d362": "0x000000000000000001000000000000006a9e05482a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97148c6ac3fcb5deb38f7805c7a4b233ba4266ae67f459bca88ee77e654f71e78da02bf00c40ef522ded7fd040cefef63": "0x0000000000000000010000000000000024acc599450400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e0c2f60ad34b071598033c0efac9d49cc88458f3a4741de2e9e2475474aa5a6216358fe74a8f98cb02fa2909bc7c1d01": "0x00000000000000000100000000000000800ced97460700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da991a6b6cde121986df50fb1fda132be79b2b2e44d0f7074e5b33ea26d0e9f82b34e8c085b4ed348c2a7d076a9616fd87d": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9aba25c0e724eb0cf995656d29aa6450436e683741ae70361feaf5e1ca6326fe9d6c795693cf94fa3b0863dd07cf41947": "0x0000000000000000010000000000000072e75f05a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da933a064ed5e8ccda6e55b40162dd330002e4a472ac29e1e2622c86afd8ee5e62a94b07401f3b43f3ae3f6de1aa8d3934e": "0x00000000000000000100000000000000e3106259ab8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c5d14f13ace82ac25e12b19c448ee5c4109674c394c8a59f8035020c66042f43d442269780a1bfc717793238185fce10": "0x00000000000000000100000000000000184a97d0e20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dadf696ddbda2adaa9da892e134d41c0309ad1802f6e2ded5be73a6daee4d0e2a4a6c14cab7b1af86333a147b0285c56": "0x0000000000000000010000000000000068b3b9b4ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ab8ad883ae6baed0f4968273ac2a85d5eeef169d08dac1614516b3f188a3fd58061dd592fb5f09357466159f56d23e2b": "0x00000000000000000100000000000000c0e60570ae0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x2b06af9719ac64d755623cda8ddd9b94878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da915465c9144a0e47281bd3602553c0787468e3641c12c67778a0d815e75327a1ab68cc042fbda3230e18f01e78bc47631": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923f5d31aec5044b0ce67d642d85914fe2767fbbfbb7e6f4061ffd9dfb6b5e10206d0afa4eca936485f0391a355ac9589": "0x000000000000000001000000000000000000dc20749701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e02bc1e5ddd9b56eec36bb0908430fa3ee9be730832af7c3de6c77fd5e1a180639e1aed13cd939c5903ab6d5cb739021": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e9a91c45c7225fd0051dccc81aec497b0a3f5f45b69105149fcf322e6914fd3b2c883b83267805eb3ab06dbb9545033c": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a7a2a5638f066a0d8e33b927381513a94468ebb7dbdc05fa9c062583fffe942179dcd8b0dff095b265f35fb3c936305d": "0x0000000000000000010000000000000080fd0870aa1049000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e15807aa4aa98f5444497b81bfc7280ca08a8ef1ee2f9fea6801e4d2368462d0a3825e4c2bcaf0cc9f230c074b7bb030": "0x000000000000000001000000000000001a2dfe8f4a2b05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f682b76ee54c4b3a661daca31604eb8d54f386e46a479e758959dccbc253a1d96f855afe8d177938bbaee42cc4fcf3a7": "0x000000000000000001000000000000000080d5cd60b651000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9801a8e3abdb38a5a208943012a68c282f8784a1e31e5b84f650ffcf1f98e4039a2add7311d28bd0bbcc48c4a48dba920": "0x0000000000000000010000000000000040208dd3fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93c2b51cedd1be516145f3832c63bb438f0ec2f4af15ce58a14c396e1cfd6d1cbca88e88915bb694c78eba099ffe25365": "0x000000000000000001000000000000009a6e2338470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da979461f22ee1fd213763451a835ef13e4c5552dd5540a1018587bad86bea2cdab146dcd58f8774e971c67d7451af22b5f": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9390b9d27f005663532aa5e97e7c391625c26511f3023282e44466ca9c5a8a65fd0c107fd6b7badca62ea655bbb1b0f68": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da979dad37d8f63d8b24fb13ecd4fae93569e45009d95dabe484bb57b51bc66a27bc4c990cbc095728dbec98bd616338814": "0x00000000000000000100000000000000912d8da5d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da964281136e5355c523d6413c2c2b5fa3f96734f7a29dd02c7dd800a8a7dc371067aca3d23f786a852f664803b31634b59": "0x000000000000000001000000000000001f298b02ff8900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a92e959d5f5f6e95d903c897c092ecb3ea606d62ed029b400ad519dabb4618807243b7bca13c03af5532484e3a52c75c": "0x00000000000000000100000000000000804b98e12e0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x492a52699edf49c972c21db794cfcf57ba7fb8745735dc3be2a2c61a72c39e78": "0x00", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x04d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9681a050ca19dc08d78eaf67c6043904e3ed6a283a837eb65fadcab83781011fabb000fc00b7e27ef9d12ea0840ff021d": "0x00000000000000000100000000000000137c1d74289a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9aa71e00a286b04f743be89e3ecfe87da0c59155a3aa107e57cc6461ba08ef77febfd7578b52e946d17e86a7bc8d52645": "0x00000000000000000100000000000000a96ef4a746bc03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da900541c34d6d5db604877dc5dd8bfaf599ce0033ab3ffd86dd5fd3a21a4dbd28ee263bffb12e10480f43f17751cba6dd2": "0x0000000000000000010000000000000000f03a76e1ef46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ea398948b07d95a02ce671bd6303257c2a1ea58b33fef64e7e9f0de028ca53fe3f08a9ae8c7e00a666516f24bf4a5bb4": "0x0000000000000000010000000000000000400f84b5a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99259d1159a8cf93c74330efb980c7206b8e2069b1a9ee88ca8381d467eaddfeec6a6f377e3a617cb706e664280dd2952": "0x0000000000000000010000000000000000041fd9ba0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a2e1a2c05be42fb1c7669604d921711d96be84364a913ae2891e801bcfea87c2a03bd53e11ad921e6b734122883e7b90": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96ac9d55ca3f1ece0f41542cf614c1cc730b28230e153fe766e5db8912fbbea18c9f0a58dfd9993b49b1f6a776200f71e": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9afdb80177c35295629a2e9222f1b009f1490749e8cca5c22514f289343c49e602a02a137c828b00830f41fef678a2208": "0x0000000000000000010000000000000000e05a6fc52f01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da934c22bea7cb62fbd2de07e4cd797ad8772822ccc07d65bff16c0b385fa31519bdabb5db2cede1f7a046f84da38d47231": "0x000000000000000001000000000000001ea50d5d790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca138e71612491192d68deab7e6f563fe1": "0x0a000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ee5deddcbc6d80ce9c7bb9809fe36bf40036f83687cb2fdc3bbccc8975a58b1f77f6f718609f49db0c111505eac2eb77": "0x000000000000000001000000000000008011fb266b0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9efd44cb37a71439a90926d6f3c34790854e7e252e9f9c9cc1d431808b0d6cd7464ccd6fb31b4480e3cba882ec8fdea21": "0x0000000000000000010000000000000018d887d0960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91afcf874c9e3c0c1a3fce92682b1c200c3025a8ad4d02be41ef95dfc7c01c8757ae1dba7f752a0ea5a4a2bf055f86990": "0x000000000000000001000000000000000080e03779c311000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92c201e90e55e647a9779284f35a5e2eb0eff50719759dbef1037fb5a2d192a53412774564b7d1b7ed7b41a75bc25256d": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da900f6e5f9bb916d025ea93b2d1c77edb37d96e0c9eb7211aa4b12af3c5bf9d87a3716f9d209b7962f77fd97fe1084fe10": "0x00000000000000000100000000000000003039afe86502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93cabac6af291c59814c186c8490a999b34aed0fc61202433881f1c0377c07dd6397268996d15fa754ebb94864f78fa03": "0x000000000000000001000000000000000030b542ab150d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe704122c727f4e493c016eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58": "0x16eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97262be1e855d03ef87e73e7dddd54b654bab4526de7ede5c66b7d3cb5dd65a67d133d6519c4f88bab9316cac71477cc0": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99fd1077baf7121560ec2e5eba719af3c3364a1c66bae4d262e6633a808e1881e5f9a4a0d69f35ff6a71938e56231d402": "0x0000000000000000010000000000000000e02cf35d0704000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9be08b4e9c8fb1497c753548158ee15e42c02ecf1159ea0e2f3bce671672d362ecf9037de97db1381557422fd7d389255": "0x000000000000000001000000000000009047a142be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9254244e21d7c7cb1e29ca7cb0b1818f11787efc41593337157b72ac11f8a10e1cba668b93c4c25b87f079d3dd3f6cfd4": "0x0000000000000000010000000000000000504cd82f6c76000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da921bf55659fae6a08e5d0044c266d10a4584052049e5ad16b6b53dac2431981c91341fb02f9be6fb7ade06cb1a2b2d33a": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9621864ef839e51bc487a3644aef682cdc4305fb88b6ccb43d6552dc11d18e7b0ee3185247adcc6e885eb284adf6c563d": "0x0000000000000000010000000000000023ff35c614ec05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9631fca45f1e5d0c210270f26bd2d4da974da07941df0a76e0663ff960b6610221dd76e1fcc8b65432bf531c28110046e": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c4125437319e6e1865c037d2499fe5afa6fedf6c8e36837718d60ed1da11c72924662f0427119b4f4bc7fa96b27cf509": "0x0000000000000000010000000000000080fef83d720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91e274eb50a1310931238e7ae7e0bc81b7b1f71e47d0a934f434213105733fb0e822624d40f5a75958139299bec32cd5a": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97eba39cd9b31523620fc742732cf7c4af23b34158dfd62104f584087292a0063b3dc5dd18f97676e239ad0c74db3936e": "0x00000000000000000100000000000000fec0a0230c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99da8c7489766843ed330acad51ba54b76276d0420e27f3a4516ca498acd0189ca028f4844915cb2915d332bc956e6c6a": "0x00000000000000000100000000000000a6a46495680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9990e8929e98dc757fc7f0b1d771da5a71409005567f859484d50c0601e0f8f7394193c7cc6d7c29ab63c73ed865ee94d": "0x0000000000000000010000000000000000b0b7e699af17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9847bc1b903426a26cd0501bdb533f6bf6c30400d0f747f5e30450863c521ec6efab9c72482f5e4932fb948dc2f989832": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc61f6a29a567df2803bc155c4f7146407316eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58": "0x047374616b696e672000407a10f35a0000000000000000000002", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f0ff98e209d1fe028d4e887b563afd0e388ec067b0656c91d36c79777f01553d32f3247136dfc1d1cf0ad263302fff7c": "0x0000000000000000010000000000000040ef1148180900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcac0d39ff577af2cc6b67ac3641fa9c4e7": "0x01000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d5a59b90169bd64bc6c7bb905ba0200d54a25339db3d55c362e47ef2ab873950d5733974e7ae4732a5e97aa5590d8e75": "0x00000000000000000100000000000000c1de4f2a0f7e03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96231ab02e6ff89557e70d06e2561e1d726076576ffb7e8f94ac505b04cc00188766b375977f89a4b915e5f6cc90d6459": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91ffdf436192f87ec6cbe2b3a2d107656f22c1c723c273ba29745b8f990773cf1ae627831bad8348791db400406eccc35": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92691aa46e6519c3c14e0b6fa2238282d42341ccf5be85e3d071eebde7423635d9a428c7891a49fca6848e29a9e61012f": "0x00000000000000000100000000000000c07e33d1d10800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92fa5fe89c318dfb9bff35a53389cf026d096a8e69f47f67abd48c73034d16d12d6aadd0ed9ae846912994356ef3c1571": "0x00000000000000000100000000000000c09fd8621f0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97a6bebe30ab859c8e3cf442e84c3443cf884e88b139c990cade831e58f39f568bd1de57175b6334e2c20b7dcbf6c5d25": "0x0000000000000000010000000000000071e3232c810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9250be8407a563f40f5d71966ef33f67072e5b3fef21844d74eaa57d1d03404bfc5830fc6f83dd1c2d061659a03b0cb4a": "0x00000000000000000100000000000000ad595341ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9779fd4bfbb7def7de80ca1a36ee377c5e49171226115e2a9c863025abfd903dd6ed4781ccbb07c4bd6e934ecf5c91e20": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f354b972413c6f55d26b76dfe376ce3c7e6319abc74215356ba3a738aa2ed9ecb74d4f9cd1bcfda4b7c6d170bb822901": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x16eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93d14534f24768f99f554f4fd01bf191feeb1d33f3b4058abba293605aeb1ac0c144b2ce37fd75d86ebf2b858f681a750": "0x000000000000000001000000000000009258db4dad0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fefb52c484779f78b6c2fb9fae7bbdfd8263199f62734a17caac987a70f55e6f910196f66e688482495182e1ab32533b": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97157405594b28030d0e145b12749c170ee3bdcd91f6525012f02c0ea3966ac37bb063b7512f84f7a8b32e463929e1350": "0x00000000000000000100000000000000fba27895896500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d4fc4ed737478f91328815ef3e913caf2e4d59601d4afefdd6e2596c91fbb5af3e3625e7ba3774bcc513fdf0c5e52867": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9277db5e1e2c176ea3ff4a7e405ac29997e959c0572adff68fbea5c41acf1473838a7403807fa2828fda000feb29be435": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xd57bce545fb382c34570e5dfbf338f5e878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xcec5070d609dd3497f72bde07fc96ba0ff3ae12770bea2e48d9bde7385e7a25f": "0x0000000002000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da935378506529509f8984b7451eac2ca46309ae938aec87bc56f3125a43549615ed2b431a40f383e1fa6ebcb6852a85b03": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94c72122dabfee473c7d35037eb87a8a6463048dc047e3823dad400dcf2823fd1751826759e929711e73db31dc7376705": "0x00000000000000000100000000000000fb7ea5da0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da989ec5ba1ccc0f2fab2853655dbcdfca3d8eae57011e8b73681d8a602fc36dd040fdef1fe0b4bc2519ab485c4c91e3728": "0x000000000000000001000000000000008f2fe229fe8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da963ea6fc5a023ce9577eb9be1087a194a5f655695813b37e985f9fede5bcca79912aff08b37ff657e44e81bc2b545ecb1": "0x0000000000000000010000000000000000d07171a7f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcac29a0310e1bb45d20cace77ccb62c97d": "0x00e1f505", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93270c7cb0a5b2fc2f367e7789b1d747410e8b715bee0bf53713d37ead1caa8762511ce077ba55bf9f688c4d1944df219": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99bb8bd1c871864b28582ff9fd5cda691d850d5f987127cbf4be112f79248458bab9170c6ceffdbe2fb29c5d50f0a5a75": "0x000000000000000001000000000000004f3f0bcd2e1600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b62ed5425e3b3ca80d18f1314e056b3b825425286784de34f76225370205a67df8670ec883de55918279161e5fa75d10": "0x000000000000000001000000000000000e9874a5130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9005b08da6f2860ccddeb1e17798bec82b293230e6d68adf1fb25ef363a38543771c1319f63b0d8a2d107d577c3fe6e7f": "0x0000000000000000010000000000000089677efc970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90686512bb97c2e3c4b52fd944e2d6f94a2294900ad66d018bf7258a0bc01b441091a85c883a0a5943e64805b0b29a913": "0x0000000000000000010000000000000080ccfef0c70a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ef503e9f34231ca9f89c97f4c509f11cfaf1af46ce3e3d70cfc37c00c6c055dee77589547daa01c13ec8ffa1cfecdd04": "0x0000000000000000010000000000000001972baa3dd009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da955ad83d89c46eb4395ec9e188f35e6ae6cca7c2cf9a391b59210cf4c257fc7ca7a32177d95077c980f8600c0fa63043b": "0x0000000000000000010000000000000040950282d10100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98ac9552e24cb0062f90a2f74339105b67a70d7ba968ba780bbe2f0048670d67def10221bcaa08c9888551bbaa44bd977": "0x00000000000000000100000000000000f573a09f370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9432b5386b14d6297dc21e2a902780bc843b80d213236685e4ecf7db900a183cf4fabb04ccd5f2bbd05623f27872d4a1f": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99367a47f89e0466f2c887adfc1cfeb9bbe5b12996200eec76995a7cb32066765c70887a7eb0441fdbcdd4da6e5f9ca39": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da910edf066363dce4fa05bdccba2252c331f8eab892c06a5e1ffdbbdc297d3ac8ab6efc4ac1bd7f01bb40e7df0cad560c7": "0x00000000000000000100000000000000004029c6654c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da976ac8b132915b3ca6d6ce528a79cd3bec0d8c6a230674e1bd6fd11ff3297b4cc53a3421bc0192fc6391aac5197ac1d6f": "0x000000000000000001000000000000008d4d587fcf5a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x2f85f1e1378cb2d7b83adbaf0b5869c2878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9317d8941b4d3f60ac64b8121c32f826196761b601618beb66b16cbce580f9351f831e5690e12fe710de244f3c603ac36": "0x0000000000000000010000000000000055052ed0340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90302be4a72b0d8aa919fa85c2f84f6b2f21dfd3994fb312d7d078864e38379887837639ba2674cce9b040b508eff9415": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dc39a0e0c67f60b07e6688ce0c1cd767f8dd3c82b7455362f4ebb29689c107d27042ae93cb6d4d3d8f4b649fd89688c1": "0x000000000000000001000000000000000080ab7b4fe799000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a69c2405b60f06603fe938b255b1cd1f6ecd89beccfa89d63d4ac7e6cc4143a49115957a94a30e223650e126a33dd71c": "0x00000000000000000100000000000000c0e0b613170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da936f1aa28f8e7b115c2dcbcb2fc5f08480ab47f99db540a11c3d5c4286ead385fe86174ecd7326592a75e27f3eb85f01e": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da944d2bfcb2aa22f8eaae2c331adafabd1e2e021eba3178e830db86473e930c476d5dac10b5b5d2f36f6558d85f092fa67": "0x0000000000000000010000000000000074d77cd73b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a36cb65cbabc11f7c3037b5e964672209293ba4afcea94733de899d732985b95763735f49f2cf45744446756bb0fc642": "0x0000000000000000010000000000000008ea1e3cf00b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cc8d084a2b5bb8b7e341452f4fdff7690ad6790ea838499e1e8918ea2dc27f909a01f5df6bd2ff8f58190d1976433105": "0x000000000000000001000000000000007ac0557f850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ad17a3210cce203af65b03502094da93e7e47005ef3cc06a0129ba102ccd0d1e347bcffde8f501321679ca473aad4720": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96cfcd9f1b7cfe03d5fe5e43a62db21d620b85c4a4d4fc9608eb463ead91cb6f67753d89f85ccba14d84037763aa9695e": "0x000000000000000001000000000000007ef421afbe8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9def68c90ede369219289adf013c691bea2ff121849b99b3be0a3238f591a7a6377bd54c92f3cee1b6bd4ab2d7cffce18": "0x00000000000000000100000000000000c2710cfd710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e169034122c727f4e493c016eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c531bcd7686140bb31491f9da7d209515872d14193a401c1de2c6111869aeb1c95d88bb2de57bdddcf68da7955e8a70f": "0x00000000000000000100000000000000078b664e003600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da937e1176baf4ddb57cc5c6e7fe27916f2474ad6a32ae8bfa93a3b9c2e5d69829f3acf1539de7ca9cd224475d0d1f4e9a8": "0x000000000000000001000000000000000060211444bd04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e9138bbf70168cc723ac288cb1468599bd9274d5bfac1f27fe84ef58942233ab5d215444a6cf650683db920f8e2566ff": "0x0000000000000000010000000000000000a01aeb2b4f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9741d027e6503368c5f712e201d256e9e969a4d44995fd783330d18edc271f1e79a06979822f6cbf0b931e5bcac5b1037": "0x00000000000000000100000000000000a709d2c97e2300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95d39c17395b97865cad28ef94388d49963e7109c8cf3a9f3dc126b995dcb82f29ddedf0ec9f1e746d92f59ca4a9a7eea": "0x000000000000000001000000000000000000a7dcf75015000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99300c7bb5891b6eb50ed4bbc70e319cb7a0f3c9119d626877b05d562dfade8b0d5ac2cca50c79696cb1f32c17bf4b30a": "0x00000000000000000100000000000000406b63f7bb0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da945bf01deecbabb6ee48f2e33a27ff959507b596482efc2b27eec8604cd30331c4db6b1510e1559aaab01fd427f64ea76": "0x000000000000000001000000000000003e2e78f8780400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96ea6ae4b1d04a2048d910931a312b7079430a91f084a30177dcb9299641e05849a2a4befd261e79db76a1d4347420182": "0x000000000000000001000000000000000060e17ff11901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97479ea4568e8c76053cb2b216f707ffd00d5a95541db9e039311d966433d72bfb814862583384e8e45277c3a1c135966": "0x00000000000000000100000000000000eb11e506189401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d508dfb6d6c1557842756507d521646aa8f9f48ef603e41a9230cc9718ae976cc53d78e24ec482564a92c1e7598c3638": "0x000000000000000001000000000000000000434fd7946a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90efb91f991376a4c2ef3bae7547dc1ff4420f91fc5ba45797a99690863b752ed47218a6a80f4ffbf5fb68c8e023fea21": "0x00000000000000000100000000000000f96bd158d45401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91b13a9c8d0e92f16ae862203a7b4f49ee7c3b7645df069affb86918f4213d54f3b780837d3a11238cffa45b336d1cb1d": "0x0000000000000000010000000000000000c06e31d91001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc41f6a29a567df2803bc155c4f7146407316eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58": "0x16eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a580b00407a10f35a0b00407a10f35a0000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9adc7128f3f36d30810d610dd5101ce701ff16f234137bf20cc1fd7f11b319d8eb5f520f1697bf8da3871286feb7aeb03": "0x000000000000000001000000000000000080a1a76b4a35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0445e3e01e64682888222d5179d593b5e75f48ed7c93af932d7a6f4c4f7cde0741b9c6faf6b9f783bfe85ccfbad4349": "0x00000000000000000100000000000000fc6351ee6c340c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c643f566cffd1d882065b87675f3269efa333ef3e010f3779b2d5c35172bdf077f9a996b6799dd8892a7f7017c224701": "0x0000000000000000010000000000000074697357c78900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3f1467a096bcd71a5b6a0c8155e20810878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da989924af13629824c4c7fa72d44343d90749f345e7cb809a199be1cd07782a3a71dcdb2defd822d7652b15946103cbfea": "0x0000000000000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb34122c727f4e493c016eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x682a59d51ab9e48a8c8cc418ff9708d2878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90ce04470cc391c86a888a14723c9a438cee9685ea7cfdae5cbdd4126d3376c7332c43e325f1e21448d17316508824932": "0x0000000000000000010000000000000000a0d33d7a0001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de78c1875935513243ba07b15dc1c23b4adafe2ed1365412a5afb73e06a4509b9c41c16be70b856cb0b1c629268c5643": "0x00000000000000000100000000000000405fee4eb00400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92374160a0c6bf4be76093d6bd8e0b11e7a218fca4124cde921a36d2b8a96076a018f9dd0c8f8773dd803cd6498255d21": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97b414a92f340e54d1045b7905a873e7aeec47aa507a2fa2937f12e225dd2bddf96a1e9ec5f3bca1b225120aeedf6190b": "0x00000000000000000100000000000000b09de09ebe4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d7b474291ad933818d6f444adb86cd36342d6009193d2dc739902125904c811f59f507c129b0a4e08e71461d453be925": "0x00000000000000000100000000000000781eb37a200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91f27cbfdcbc60a1ac138b20200025f620aa094d3c88867350b5329a2e59168978c57cb2153edda7e5d628f5af8b20962": "0x00000000000000000100000000000000f77f4264e8b101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bc2462741130871167a25dcd2c030e08d09a93ee0d7b9345c63718309f1a64c2f9b380051ca69ce217aba07c4e615f47": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c861a288e403b13a7e571224a5d46244643a6f33a3aac65beb50cf6cffeb04ea1619fccca4ad7cf2171cb72eb86a125b": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bd677f891ddd2b971651a595ea1f8c7830b198314cc9f741f6d8c1056de8316d47f3347c8bd861a2596f98e86fbf3541": "0x00000000000000000100000000000000c301e8ad320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fd4b772b9bba778115832b6c3b923099ba435c37bd1b194e31dccea24e05b1baa742a205fb33c0126ff9ab5afed0a42c": "0x00000000000000000100000000000000808c1b99160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99e716737dfbd0ffd8344ccd1aebd7635666de5a0c16bd70868bd05d168727d49a85d043e63aa533cd5c7757aaaf55a73": "0x00000000000000000100000000000000a26cf244d2ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96d3c0c34593db96450d63fde66b3ad4ece4564a4de8b68abaadbc1f1d93f429f105f46e413722c8c4a70ff9b77bf746b": "0x0000000000000000010000000000000020dc9468958800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95692bcfdbc83d1b02a3a57fd4c971bb77e54924c41815dd69bfd0f5486f454d79ec8ca8c251643a74111e04454833f54": "0x00000000000000000100000000000000e8aa9913fb3404000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90b77fbf3ff3753e5034aebfbb9edf339aacd32b3a5c6745c55b573c540707bc18721a8b77694bf3fd8379033289b9216": "0x0000000000000000010000000000000058a562146e8473000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da955aa3d2963e506ffa94f8894bedb9f87ea33c7e3ef8587c8c1255ed5f5ae542ae4a3094e5964f3bfda9c37472ec13206": "0x000000000000000001000000000000009977c228c08a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9330d1b94a69bfc477c1ff18f7182c37a90d5f6c1483b9056ea948957428435dc37286f82f4df50435042679f6a47697e": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade984122c727f4e493c016eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58": "0x00", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d54d99b250db52002621e8d24bf25cf79eb5b98e0107027959f250ad3044e50cbd9b9433b56cae36a1a780dbef33f63d": "0x00000000000000000100000000000000bfa26ad43b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e961dc01b70aca5f64ce6300b36ee5353a9d24c6d22c2b6caae31b2173544c9b43c2d82a96753720336e8286f90cc5fb": "0x000000000000000001000000000000000090cd792f0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9eca257d9e98e6892c01d94b351b08800843a8944460d4d30bee352ac202f61900b60f2fcc274b5ca006b1856c6fb791f": "0x00000000000000000100000000000000c5e8e02b7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92923950fc84cea87a911b12addd1eda891a7a9416bba982dc4dbf83123a1b3c0ca908be57c8eb253728d0d0c5aa234ab": "0x0000000000000000010000000000000000c06e31d91001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a73c00919c780c31d213b3a2e35a01d162bc9f0c6f643b1176d648a7fc3ca982afb71174200a3e3361c0f83074b9de33": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da946ae1365818495a98adc4dfdc8ed54e51c45e3efc160e07441780e80968d3aef839121ce0a4b6f880fa451044f627b5d": "0x0000000000000000010000000000000059e458d3be9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fae7102b0257229434e668238f4682aba4e5c306bb763ac3c4460a66ec93e6a269886824b3948698cb53210989fd751d": "0x00000000000000000100000000000000bc1639c2990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ad73c3c45cc69198a9835823e2931ee47ae4c942dca42b8baa3e612de337bd4a95e9527d9a4b9dbea374caee8cc29e79": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bef88f755eadc568ee954b0578b96298b6e57db3bfbe7fd0ffa2d8ddb6cdec9bc34a96ce8619f34f99889ad48b3f344a": "0x00000000000000000100000000000000559a3190710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90f3216fcc3e1cbff6dd353e2f0cf19683c6b061ef0b72405d9553dc79ae72a48b127522525e1e45ad953f7f5f898db77": "0x00000000000000000100000000000000b4a9b95db40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcab49a2738eeb30896aacb8b3fb46471bd": "0x01000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5d7d8edf2671bfb7a98e0686ac7edb0ee4702218be4d39e6f7e5f8121c751ed2e153a616cf04359d303daf77458bd3b": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000": "0x000000000000000001000000000000001e0346037761506a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da959af897efacb82f1398bdfd94654e57a637d0bcb27adfa57075f22cf7bf3f7651a0ec4652cd346653950bc33c79ccdfe": "0x0000000000000000010000000000000000282e8cd10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c87e2906400e25c068f8b4f2215250866e7682a0a875465dec71a88a236d59df2875f900db6bdfe9d84d3e2263e62098": "0x0000000000000000010000000000000000204aa9d10100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99170b4ed5afc9614372fe096199a4daf18c720c39b565ef95eb7196669a6b8324b42d903353d155a36ad4365a0620314": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93516cc9d07094d39a04fb18ad48effed20e5160df3b208c75ef0b8464e53d133c1fe7d56546bb02f04815f074905d462": "0x0000000000000000010000000000000006bc46cb4fe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3c311d57d4daf52904616cf69648081e878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da931b33e0c19dfdfbcb3b3273d87505771328f2b3e00a9a074c41f8bf58e8ebed39cb72fe12f6edb803c1d5e815d1ca24e": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da935a3b6faafcf00844a26698c68fb50befc60627985461515484ca6f033d4eb5cc3c612a4e19e4b96e02f2b73019c9737": "0x000000000000000001000000000000009496641a700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cfe2a5568ec978ab99fe690037db021fd9a6e5d55ed713d4cbaecc82c5bd78d942c78dd0a42b61376306863e3fa74a5a": "0x00000000000000000100000000000000001013e5a2cc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92fd31a25d6bf9336a4df525519748a826ad9b0111790e92f732a86fd07ba142b05fa8d4046c5f638597c2582a68d86f4": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dccc14d1ed1cd6c101ed531a56ce141f56ba8b198cd228c737a3105d9acdb4bc94d0bee0c192b89e293e3d672e731e0c": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da997b90bfef181cb8bfa3b71e6d6463bb5ca3b4ad227b82f8b9d8d73e2b900d44e9aa8f796cdea4c44adb2df0de2b5e375": "0x00000000000000000100000000000000c0f7b5645d0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93a2b14b321ad8cd6445089c22f5658fc706ae5a43fbc54f1e37971b5e8233f27ba5c6fa0585b6bd39408877052debe43": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96dd6953bae1c7778e933f5acf3c63f7c28d8a310529cf95c814007275fd995473e1f886e15932caa1016839b39087409": "0x00000000000000000100000000000000a28885cd690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da990b07e4d2dd0f0eaa954a48adf3e9ffa3eb75224d06af58ede148a0a79cf14e88eb933109626175173a62f8d90bdb534": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950391c80dfcd87103c6175726180d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x16eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98d2522d33a07ee07ca5504e7383494e8426b8d1a352a9d1bf5380e3b154ec2fd4d1a89ab1e30c570a79008036acc1643": "0x00000000000000000100000000000000f0a525af730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9250bab6bdbbc80872f7a54208838419e5c7c7c16c42c9af6155a017eae8fb379482375bc855ab244ceb43ee9c9b1261a": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da953a392e2892ea21d9714857407b644571ef214800cfe73094fef232e13673ba7469c60bba4f775b120690f6c70d2dd14": "0x000000000000000001000000000000001283d70d868a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97cad79f1a2ecec857e95e01a306b5d591eb2e6595047769567dc8e9a21894fe2834433ff672c90498189eaf17b9e5a10": "0x000000000000000001000000000000008082d32c150100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c2ba659f5481f0b3b19fff052fc79376a2d376f9cd0353232ebd538102a3330a000f1c200c7d3ae1c307d19d68f89e73": "0x00000000000000000100000000000000c4f84967b20200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d8d26b965e82ffab631c4c52383d22cef6b8d8b7e328651ae4e3ba3ef57db170739ecd1945acbe336d357ee30388d32b": "0x0000000000000000010000000000000080e18916180900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da962ecbe9726d040e72fe05a3db9f220f0f46ec4886654d1b80ffd1f85a567a993588c83c7fe452bc5175cbe4317c34f25": "0x0000000000000000010000000000000080ad4cbae80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da986711c973abcecf295adf908ee8f6ce6643869018db7ae587bedd00a4df6cde8f88b5f581eec7ea31d6f031091e02972": "0x0000000000000000010000000000000023d7804cc47800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000000000000000000000000088526a74000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b48372d39ed417ba10875433faa28b7300954855332de2ab44eea79725a4d3c440714ee207f8b0ba5fc087c04e99a810": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da949c1db4a70fba8ff0bf38333e86fc0b044bc1eb498afbcbff1f8fb134cc2dc1415aa96636746a7679bc18c54cc80a746": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9eab18f9493b4eb6333fcb763f7c7e859f41ad435ce161d1f2a61057e6a18c011024443362e4fed1dbbff1d0400756e41": "0x000000000000000001000000000000006673690ca50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d63221e82726f347de9a906a85771d69248c2be10779741c0e3e3efb46d0de993fe8ed87c6202de4f2f0a66a66bb745c": "0x000000000000000001000000000000000060b7986c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96ade9b9d7133cc84d2485e856ede8ac612cd536928bff451f71b8b3e1feb0ebd1698428aa81eaf6321d8a9948a245b3c": "0x000000000000000001000000000000001da96a26d9ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da999afe7331bf4b4f023e894fac9d5de6214ea15edbcc6291351d5a95dbd949e2f4ea7f9a9cd1f307b82a04d3f3484dc6d": "0x00000000000000000100000000000000444979d1e41900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97e3f8576cf9c2a00ed6593e9d0932e99e2c9cb1393f1817cf7f2ae1c42b837dd1c98d2f2f251382ae20aa29ca9464162": "0x0000000000000000010000000000000040414b7e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91a27238f791c40760bbf86f62b2d16e642f041958dffd285c785a2417177ed83774d3113c6a068ea05c1326ece356572": "0x000000000000000001000000000000003e2e78f8780400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9993d26e7f46cf9a10119a21a21615cc3d6566156687ac71326320d58710152521f212e886d4e7a6a56e728801b72bb12": "0x000000000000000001000000000000000030d7ae20ec05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f07f27b760268691cede851b1950d0b60d0243726f899402e9f462a8c4fc6dcde06713838eaac4f48af9eb24676f4ed1": "0x000000000000000001000000000000000020fc0ca88c92000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f863b55c5f41bf9431ee0f4c1bd78fa9e4d18efbd0a805ec1fb262dddeba5d0b556843ed7c0f91ab0c89e6ca043da93f": "0x000000000000000001000000000000009258db4dad0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93bb429e93434a24d5b71019b7981b12f1b8ce94d547126741ab5a3a52345ce03a4192e4eacf73b793a8f05667cb2d35f": "0x0000000000000000010000000000000000c0d0d335a51a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f87ca8aa56f257e0fda5e080cee06a90286f31e57be9f9eb0c2053a8d876ee98ef926b79aee7c004b1bcb2b625443008": "0x00000000000000000100000000000000656e9083600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cc9bd680742f5e70a7d3f8f3c6149e1176f486d2e6da43eb961a6dfec5437198983e431cf5db9c39dd8ebf70a465767f": "0x000000000000000001000000000000002a6b0d5d730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9310f6453ca4604fee11968c90bbac6551473075d703c24b19d6981a2b3f38426aab8eb707fc029a44f8262d4d16f167e": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da970ed23c1129dd50cdda2b1a4ad99ec9ab0a44c917a775a05a01ba0fe442cadb8f111421732f33b1913e0c7543d289833": "0x00000000000000000100000000000000c006ca84130e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da971bad1ece59709d5ce712f54328400e52e440ce5923a775b2fb564d6f0163c99720661671dae2b4ac131445ff8935338": "0x000000000000000001000000000000009d937294820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da987230a829570b673c0ad55ac7a440d0f23225e8cc15fee80656a4e92edde06a67f4a0b45cf04299754dbe377905f372f": "0x00000000000000000100000000000000b52f5104d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98b9b1a4943db27ee8b49a10101997a17612bce16b8d73129ec3cf3562b4c339cf743dc5df6dead6b7e5caa42d80ef3a5": "0x00000000000000000100000000000000007081e599de6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da954cfcdbba2993f1dba6b652962b62bef6c39bf22683587bf2bf3e8587c5d3526cfa67e40a2bb2059e3d0b61e8d69a97d": "0x00000000000000000100000000000000ac3258be670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da951da08747dd48afc8cfb96faaffe44473e56c0bbf67018f21870db3adf9d594fbf1697ace85e10058b4fd1409c27754b": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xd5e1a2fa16732ce6906189438c0a82c6878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da921f44339f3e6efe69f64cf3a367a9d4c449703664774a2eed9e8f1afc0b98c999db4eb36754a82290b02201197696618": "0x0000000000000000010000000000000085d94eeaa80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da907147fd8d41d743ad2e67c8e64703b8a7842cd4dde1c771a9bcaaa8d4c06c09e5d39929edf995db5093e61a1b9722632": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96e5660424c9f1a2da2a3b90d1c979ea32491927303f28952a25d0f5570b09b8011e6afbbd859ff57603608e0bcb4c843": "0x00000000000000000100000000000000aad36b91386824000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90eb1a59425e32349fe0ea5e34f6ffadf16a5a83daf2ba7a43f51644102cc8730faaedcd1b8cddc41359d53daa4165b19": "0x00000000000000000100000000000000403b5680180900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ba3d0da43c8981db7c94c42105b3e0e8dc9422d3fc47289fcab2cbc8fa991aed21c6dacb34565f38e733df4eb72aab2f": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923502376be2ed49bae5522dcb5b5e83977153d616daf369e78e9032fdb8fe16c5167a31bff136c7bd3c9b26f7160f547": "0x00000000000000000100000000000000323d4aecdc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90813ac7f23954c0fc05467c3fa061dd0947cc71485bcc0c262a02182e04918219bcf245e459471d3bd4286f08522c757": "0x00000000000000000100000000000000bed03175a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cbc2a74b6319b7678e5e6403ef5d6da8c00d2ec238a9813e1391bdcbd54bed128cfcde66105d8add45e57433562b6b23": "0x000000000000000001000000000000009bb57c6ccdd200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e900dddd96625dad6d9331e4e83dc7e9aead75f3b47986680d98f480b3c03b9f483331b4318243d79a01bbd1d8fad11c": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da901921640c9413c865e30c07e87a3e4b08cd3a8d694f7d40e83e50667627c4cde1ea1e7eb95692f379e242545a06f5d22": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da930f342238df2ce8d155f0167398cdaf7cef6a215c63fb1e4c040c3a5f15ced4062ccb15dbce99f0a5123edc89cadca46": "0x00000000000000000100000000000000be442427a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaad811cd65a470ddc5f1d628ff0550982b4def25cfda6ef3a00000000": "0x00000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f21e01baee261b2c49cffb20ba3cd68718ca84feafe34d7204e5acc9319c03d60a9ead8e3b8563066e8ea0a72dce067b": "0x0000000000000000010000000000000048e14af7890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d176d80fcb99ff0523f667049e43b139d8f2524d76ed6aad6d69a83cc8ff1c836f12758fdb20bc3e15f6211f5fec4535": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca5579297f4dfb9609e7e4c2ebab9ce40a": "0x00", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9323bf0a48f1efe38b4baa4958cbe804f202a04f003638c34e5fd0828d44ba622a36bb087fa99def4721dc0cce7ef084c": "0x000000000000000001000000000000000ab1e2af8f1922000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a0a4155d5c2f2d1f327ce431ac9041ab494fbde026a4da2c28e3d2a58d75a4a2f63b09bf0af91537c44279bbb878294c": "0x0000000000000000010000000000000000f0e774141a07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92a4f77774052dc6b2d04e59398c0377b3c6adf5d65444cd2e3cc3b7df2f1ce45dea653cd177f7b7ee05342fa5b7a501c": "0x0000000000000000010000000000000044deb5e9590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da990136e08ef2e7ada7e7cad87d867d9f0669d2d29eca07cea451ca744a16317bb6bf7ec8ca50261c94015c1fd13cc3b56": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d1a09a498d7e7f7bc052e8789ec37ce2d3f72c4900dc8dcdd6391c5165092878f036d607cee3059537a728915b526023": "0x0000000000000000010000000000000000c06e31d91001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da939c3c9b2b5c49e074078b08b73411ee64bb19de3864a7172854efdd3b0c7efe2ddab51dc370ad54221a9df093a9265da": "0x0000000000000000010000000000000000d00361ed2800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a2cc2619367e98c64aa8c6f6b205b4b59c9042e7ed376d44e16ec5f502e5002434c91cfe28028efee23850e84c33117c": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a84f3575f9689a2ce9e7230231c9d304dad9c2ea9ec38a3c3ad47478624a8c94838b11adbd0a50a3f3470cfb74db2cb9": "0x0000000000000000010000000000000000303c2644222f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9368be92be0ee96f44d0f0a614d2344a8438257dfd6e9bad36064209e46e9dd46a2cc82ccdae7670e271cd1c0f705bc6b": "0x000000000000000001000000000000000060b7986c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9721fd1a4ea53db7752fcf17318cc7c6642e180a35f19549c22671a3a26f1ea29e27b0c06ab94ef7b625dc46a515d2a78": "0x00000000000000000100000000000000c4f84967b20200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dcb9aee49d9b86f357059c4e8be62440d5f47583d91fe335e8618663c8f99f59cd55ed5f0c792c8d28347c717a806fce": "0x000000000000000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f1f85fab37eb0f501633a00545f50aaede5e00bfee131897ff67c9119d21165ad20d9ff9263fe09d7ece9219cb452f0a": "0x000000000000000001000000000000003e2e78f8780400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f7fe0362f246a032d1c0180d53b08252c79f26513919f1d4737965011a3cd9e1713cab1db6aad474b58ef8b6d377a929": "0x000000000000000001000000000000000060defb740500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de0aba8155495459efdbe95c5e36e79add08352172abfc97713e1f799780383d171dddb93959292dd1f6200dc86c12fc": "0x000000000000000001000000000000000040804ff46068000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fdb44e3f0bfd57a5d56f9fa30a27d17b5871046f3a420a9918e3db67e09ec8bc9957d1ea861b4eea50479ad80d8fd3a8": "0x0000000000000000010000000000000000207261693635000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9aba9ca0c142b9edc6772e87d0dd86811acc9c0a26b528f05c633de42e71dc5fbd06c13fcca39afa237fdbe78bc8a0973": "0x00000000000000000100000000000000c87e5fba1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92e22daa1e877f31a0c2625d51a5a73f42fe6de19777da23d8f591255706b59a634361a3fbc0b3f88762068a2f0fe436e": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93d99282785ea928776d5387665dedea8f879d6c736e06d26664f21ddc6f021549a9f540124a5ce1947cc3f1411da586b": "0x00000000000000000100000000000000b890ed4787b104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da961d2672a0d1b13758b676217d51636b8b640c2b83a21f1184448ce8b2f5a5129418fee959cafcb782e794ef58532b569": "0x00000000000000000100000000000000734aa79b476f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b421f640e89dd639b4c28e834f80b5eabc882bee8d20195509433190256a328772b8b196fda80508772dc65020b0ac6d": "0x00000000000000000100000000000000a53e33a4250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96b1ed5541d945cc4f38d3da598085949ba918281413356af69ae0345db217ace533e69671de57890679ed5cb3ed55a40": "0x0000000000000000010000000000000040afab9bd80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da954c4516acd4d5ad41bd609ad092a496e10d8bdf31f9cfef5db42c7d9cc4da8ce9e593b36fe5446d337a53b14ff97f522": "0x00000000000000000100000000000000d79c4724200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9954bda383aff5088fcf773900e6e1e3db9b706f767af679efcf737441c88a0fe33121d60283c9a3be34e59818d4f3548": "0x00000000000000000100000000000000e5785d61e3790c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da956b064a7789a7d5e6582a9deb15b908bca131efe1367d51f1544a115ed7468e3bb165d27c8cac3b9e394d40871870c67": "0x000000000000000001000000000000009ceb70e499dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91739e72f890a21f14a03b3e4b2926b42a8c35f69ccd92fe55d12231ef81f36fd0f114ad4730f382ed9db1a818dd7f064": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98f68b47451aee4434cc47dee86ace7e7c4293d060a5656cc7214353e506547ff50946d062a212eb371d5d437f7e76c78": "0x00000000000000000100000000000000ed860d27e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95b48677a54d7d8b9a6faf5f597863389e6d037b71ad881e50dfcfa03bf960493c88031d1257c919f78095abeb3ee4279": "0x00000000000000000100000000000000005b49c2e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93d345da8cd98e01701956397497305148a089d0b07b59abfe10ee2321de9acd667764be02afad368eab5e7be88ddf144": "0x00000000000000000100000000000000d0885cb5d68900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9995d57daddbe61a093ac87e50ce392bb9ab2192570eb7f300e666170c01ffc804bf24ad8d1ea7747da2719878cdb3368": "0x00000000000000000100000000000000c0c8d9b02e3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92298b256554c91ceaef83e90baca023dd38501630996b6cc7e30a6786f2dc1e7181be217105e9f6daf24266fa6e6a173": "0x000000000000000001000000000000000060b7986c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92de0515fd9f0f47ee2c6ce513efa358c344a8b40e0ad523434493b0cd4a03071809d6b597b21279ddc5a8b4380b191ea": "0x0000000000000000010000000000000000e05a6fc52f01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94ca484438fdb5251adfeae904496b2bd2ca0c3a4fcb41a6ccabe40f8421c19273cb087cbe174cc94e1d5a983ce85ed68": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f112cf571292137f528c67f02d6aca0bae3bb2fc72595c2e60f8564605df9b702579b8c661f08a6fa5cef0ac7d9c563": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96dc5c1fdcbf468b0a20c91c5051a61e1c40ed3ada709335cb6309d804c5a93056555a065365db4a26807fba6fc5ade53": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a0a4032022093fd1c197a6f516161f8c60850e029173b0c183bd07391dec38829020f845be8979d335a2294ad3449c1a": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaf7dad0317324aecae8744b87fc95f2f3": "0x02", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9607ef5dc503698fd10d8ae5cad348ddcb614782b1634699ccffd67d43a8fcf464b4af586da856586557b2ffe88299c33": "0x00000000000000000100000000000000b6834210264302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98d1896cc22044d1a36b861652e9b6005f0512c1bf0f6c35c560e5909d6493c0fe624075f5b420d77ad991eaf80ca3fe4": "0x000000000000000001000000000000000000480f625e0b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9142b4d9b58b5187fd82743d9ee48790292d312eac94d584b98a37251fe86a7787a921f2fccd2909c5bdcba212a7d5164": "0x00000000000000000100000000000000067b1d14158800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99bf46c9a6153248a8b4aa18e50797874c6234e506406cb56312f622fb55b5188f98cfa45dde9a0d86e7d4fa89b095901": "0x0000000000000000010000000000000000ddc6d72b3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93d4818947f61da78a31251bc9270c69d1569d86fe3633289a46daf89ad2610d7515eda1ebe573b354c7e00f78d5db261": "0x00000000000000000100000000000000009073c0f2e8b9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94bfd17108228d53bd2865f7c3728128d6c728c019393e6e29a4f9d54a91c9c0f9884d5d75880a1a6cbafb9798dfcc220": "0x0000000000000000010000000000000000802565f32739000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9afb468123e4a1c07d1b154f56bace73eec617612b321c7e201c0943a630d3446d4ffd8602bdb6e109a9dd8b8d375f318": "0x00000000000000000100000000000000ef114bfa160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95be73b9c8c9b1d632e9ecabcf8d086c4e02c7a143a80802b9f8145be20ac4b42d132734a43fe63f54023f8d3e62f7e1c": "0x0000000000000000010000000000000000b01723010a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9306a8d291d598bc3521be07a2db9cdbb5c3ed673e1e180325b58c2695cceccd3fdaa41a341ddba2f683123f706e6baa8": "0x000000000000000001000000000000000080e36aab4a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99e439d5adc7ff571fc4af72695d8927e5dc932d0f42c857439428fb6f9695553b87a8d179b62c75a6a13dc3056e9bae4": "0x000000000000000001000000000000000030e25c622e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a53209f33cc73c127049fe3ef13f4595d0ae3c1127d2a6592570978f0b34f8edafd522f85a3a100dd04b1971b6aac93d": "0x00000000000000000100000000000000f1487ed205c607000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9378fd6dc705a4418bff352728749890821c47892c29368542b718a86748e8e6332b493f1f2a2ed2dd42689cd995602f2": "0x0000000000000000010000000000000000c098185ea201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da908ccd28b6787e905c41576bb8027784c840c2e510904b4971c2264dad7cb9c29910f634bf5c8ab0744acaf4e21c6e26d": "0x000000000000000001000000000000000060a3f328cb4b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x0d715f2646c8f85767b5d2764bb27826878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9453d3dd582801dddadb8e3d66d48741c582bfb76201b1fdc68a2312efa98696b6fb903a087318a3e6ec38b7344dea97d": "0x00000000000000000100000000000000008028a5460700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92ff178fe11da48342e32bd9e59574fa94a00c51944aaa4aa574a375495e26426cd1fa5128a988f43b7452757aa177225": "0x00000000000000000100000000000000df4c9e4b2c3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96c0b292152018a1ade8659ce621bd646b85ad7f05d1b0704796b361d5bdaf593aca0e0a8b5bf95ba1ca056967edefa79": "0x000000000000000001000000000000004f3489eb519d21000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da998af4909ffe0d34a136bf6c13b21a2ec54bf60e12a41fac3a79dd18a8e817dbebe52714a3f060c6d1756f88762eefc78": "0x0000000000000000010000000000000040d3c6c3e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9367e52abe693814fc790ddd274d5e76c347f84d076ee531f8a37424f64a9cb4761d2fff9c19367be793023145b3d210a": "0x000000000000000001000000000000004dc499f7c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c27b2e16bfd0f42bd455d1d968d73d79dc6d18b8ecbf0804d5039c6b84230feacd36d69ffa92fe52c58a5bab657e2478": "0x000000000000000001000000000000004be97a0e118800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9089d7cd475575df659a421f3a2049ccb80435b0bd879be8ffb13fc388b12d96cb4168c66309cc4166bb969f352410f4a": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dfc78ecdabf3bdd03ac8f0a808bc3b6ee14d815c7a6bf21c42f4af29680371d0cb6d6d38b57756cc7c28ca9f0171fde4": "0x0000000000000000010000000000000000203d88792d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f8f3c2f4d2f375c7e91e24283decd68ad87d86154c1490de28925a0f3a84c7935a6f8818dcba85d6314f98735ad93134": "0x000000000000000001000000000000004bd3d83aef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97131cac1ed79898b2d7f787e1274286e6b44e6916639cb410d435b7a1f4c6af6985347dc41161b60bc61b6773638549e": "0x0000000000000000010000000000000000008d49fd1a07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96b99c6c39d9363bd7abc475d0cc361ebacfe268b8276a4ed8924aef1441eb05334522f6c6c7487c12d71b0fb2ab28d37": "0x0000000000000000010000000000000052a53d8d110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da977502b391f6dbafbe96e60f4a8f241ab82bc03b440fac9f2216cb142e145199848d800ae09fc96e76a84d86e258d2e4a": "0x0000000000000000010000000000000006a2dde5c71400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91d642ad18e9393cdc24dbf9ede69fecb0548de2d4fe336fac2a9cec69a862908aaa4840416b45c8db24820eaf944409e": "0x000000000000000001000000000000000020ec3dec1e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90d8219aabc56c472f31d810d5e55e3621e38c9abaaaeb4d5f8f5102af62d1b98242f9334a2f7c399a58a4692b9366e9e": "0x000000000000000001000000000000000020af713fc537000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9300a1f4a9a51c4a6b8c7e87abb7a3ccd9c320aa5943b70044970f649eefb0c9e164a8fb6adcb5788626eea8634fa1563": "0x000000000000000001000000000000000090f8c264a90a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99b15edc2b6b4a15894f1fc0f79a9cda7e095e505b9def54684a4bacaa80c23fd23144851f61215be48f16186712e9b4a": "0x0000000000000000010000000000000005dfc15fbc1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b437722a8572920cb49ae90024a5f9cc3239b756402a702f4f890c60c0142bec20b70c6ee834c93c38393947227258ad": "0x000000000000000001000000000000000080e03779c311000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bd1f9dfffa9d047e2170122bda984c644c6448d7b02f5234626235833426fe59a1f4a2f1cfd571bb1e2c7e397b2c172a": "0x00000000000000000100000000000000941b2845220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b127f9e9e29d21a1bdbb8a440cd9f5af3c37f6ecea030526b9d98e3274e25a89711d6f0bdf8450055e04a24a97bc85dd": "0x000000000000000001000000000000000030bbf959b100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dec502fdb0a0c2d12bdeeb877d45ab2d61eb5860d10d7e5bfc446a3447f7e58f20a7ee8f0bbcb2a1d4abae47dc1eb471": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f644488aac7905bade780a34fac715296fa52b547a9e4c8805986382768dd3710114c4ee3046cef771ce7c861897d7f": "0x000000000000000001000000000000003fa0df3a69be00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da928ffff9349928cac6e61a46b82828755a02aef1c87b2f0697b38fa4fac06ef43c54f26552454c3600048307f945625ad": "0x000000000000000001000000000000000060b7986c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5b27ad890d70339746342c30dcd3641571f4e1825a771b13cc7f77c624b54bf8c939f0bf6f301e8f8767e3fe53975e3": "0x00000000000000000100000000000000b2a662bcc6ff12000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96dc272d4db60fbe4b0b948148856f7d1701a3258e3fc5de9f604f0dea221fcccd6d9b52aa609426a374718baf2751da8": "0x0000000000000000010000000000000000906f0e4a2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94e2b30a8753a6fcfdb1d0da0cc65235b9ecebb5cdeca58107cfcf404cb9915a03804a3f290771a2459cd397120ae3c45": "0x000000000000000001000000000000000010321ee61b07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e24cea30545a28de4cecd083e77d581cfdf9360848e1de31d41a9e536d69c7c9fc7e37844adb803710406541a6733d6e": "0x000000000000000001000000000000000030a747f59b77000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da945391b892b8dc5030323037c04f8926508aa2e95e86626cb8de0bb05c6e05a241939e1a40ac392f1ca0e4b955c716410": "0x0000000000000000010000000000000040b17630440500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da967d5e5092ce2f2a48ff35e4398f74a38877d4bda24e0ac1dcb22b4f2de2ea9f2221da7e44bb5815c582a7eaa7e1fa2c9": "0x00000000000000000100000000000000005039278c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c0b85029c12c71144848882a63c0d788eceea93b1cb44a3e81ddbf0dd3b36b7960982041c678373723283afd3d405178": "0x000000000000000001000000000000003be5041d990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97d6e98ded6b009de597c2a5628a89ff3b49f88a80914fcb07f6b2de7879f5264b249cd73c55e0f8d540162535b17b8b5": "0x0000000000000000010000000000000000e057eb481b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e944fa10b7cba5520c245b80537b3157ac24080ee236d778541cf8bb08145fdfff6c54ab07fa0cc1f7c9dbdd43f57f4c": "0x0000000000000000010000000000000002d1b4410b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c398eea82ee74773f7b49f1f3c393616f4fb109d511e457f8e17d68b5dcfe7308c21b3f96e0637a0a2ebf67039ac1510": "0x000000000000000001000000000000002f81763fab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c4580c822fc9053b09be7a1ef6cbef083c85900cab0a75645425f8e480a3f7352e0066a40dd37a77d8f4e485ae131c9c": "0x0000000000000000010000000000000000003708dd6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x57f8dc2f5ab09467896f47300f042438878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bb31793d112cd927a6f989dab00c3a372c65517d1de6bde710d2e620d9d86b3568bea78b869ef314d2660fbb7ad47d40": "0x00000000000000000100000000000000fd9752b64d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b6fc704e0b1c67aea1aafd9375878f04ccab198c2ce24be8e78d8035f4a8c4822a14d13a24eb8f83e98cd7acfe033f0a": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94aaae266e7dd61719e9e7b3f8f3625fe00d81108c7a37f6c927d2e7cea38fb8443b4b20a22bab59d9d96593bededd22c": "0x00000000000000000100000000000000385065a03f2e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97f5c495ca0c27122fe7231641db70cd6228e655750d5999b290ba6b7f5bf76e7dca3e15e4a09bd8644128e898da0ccd6": "0x0000000000000000010000000000000000201a0b9ed40b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98341ad65d83b8e99f8c0adc5a0ebab1b950030d9ce8d5bc145f9d33067f4363fa98c231b662ebe7747ee837538dbb755": "0x0000000000000000010000000000000000e08e95ba9b1d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d1ade1f1e8c54dce305fce3338460814ee7c3f0fca337e790ddaa67c486eca09b458a2c4b31140c51b5c7705b676497c": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9364f8f9afe19ce6de33eb78a70d2f7d158019e931fe4b6af1c59e0f7edce4f5d5c2ac41ea037ea26c5a23b7fe8ce9d31": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ec05dad79337a186a48ee14165505af31c44b615454a53652f671269ec20bc092ee9b313ef87e4070577da480a182058": "0x000000000000000001000000000000003d054bd6680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95498fe4b73a1b1dd220775d89e13b0e136ab6fd345f74a14871227f7f39315d32036df2dcb5edc4920d7c9a4f0084160": "0x00000000000000000100000000000000c048a8f7450200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cef359663c15cd19dd3f0384680255c98fb45d1e3b510e37659d636a05498980519b1393c6b9d487af3b71eeecb26621": "0x000000000000000001000000000000000040e820ad2601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c860ad73f58523acf11ad1f03a799e87ae962067ac6a75c5dd16f2936883abf51aa4ec774636c512209e821cc0255644": "0x00000000000000000100000000000000403b5680180900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xb80b0000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cde68e12b49a2ec6907e62ab8e91dd30e84ffbedd0c0f91469c476df368e6919527e7dcf0870a7f93f0311ba452ea95b": "0x000000000000000001000000000000005bd48429650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ece1d19ab372e702ac281ab5935027a2a2e73d8749bbf77f5fa6bb33969aab437da288cb1eca5183be4fc19a5bccb14a": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f171d63ce0d491c4960b15afb2e88b6a506cddeee22f38a5c6490fd0383e1a85c81e7104a32b479fa8b5ea5b37d7e7e5": "0x000000000000000001000000000000000020ed3410f152000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bae80b2ba7b1111e1d70569a06c6eaef321e5f99ba62607b144f7d796d41aa79cb85562be959f35697ce306660e00f47": "0x00000000000000000100000000000000c093e40a170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ed43a85541921049696d6f6e80d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x16eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f506407f22f3d427138ed48a890c4a5ab0723e561212a8972fcf9fc3990fafcf7fb4c26a9d9f440525ea0595c6ae6317": "0x0000000000000000010000000000000040c532865e2400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93108b2f55a96aa6be4a63c94580081c3e034d7bf17d81244623e3c480220dd431cb3ad1dbbf596eb942e37611a4d3850": "0x00000000000000000100000000000000b27d3dd2900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da949e318593bab42c0f286f29beb2cbd336fb993f8ecc6ce042a6907aefbe0cb5beb469bb3444c03512e3f94cc4b9ee8c4": "0x000000000000000001000000000000000040158caecc02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b6ab073a210dda6c31ef3e17048c4db83088886defcecd925a0f1ef0193d187a2304ec7b741edc2f73d192a240000327": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d0b9f6a4dc12569fa69a6e78ba15ef88f679924176331dfc1f60cf1b804c65f5674c9688487d1c85381a3fb69849700c": "0x00000000000000000100000000000000200b9799859d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9abdb76597ebb68c9d3fdd7f3ac5fe898cdb22a1149ac44aa978ff81a375437984dda7074890f645413de333e889bc690": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95f124c78e913e4a3a72fbca48311a5a6a9b9fac23d7faee4ff7ecaf77808bd29bdcc991f339c765987fc691361ff894f": "0x000000000000000001000000000000000080998ac77410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98ed9ad12d132c9613627673429f2d8a3a22fefcbb10071067356318db07b3cb26e58938d804a236a5f06c21273a8d95b": "0x0000000000000000010000000000000040414b7e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fc0dc02539641ee0b514f57f9e82f0abee292c1ccf99b8f04d26f9d4e09d4a8bc04517b9ac36638368ef4bcc65ef25de": "0x000000000000000001000000000000000030b2b10da937000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca28dccb559b95c40168a1b2696581b5a7": "0x00000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93755be040eb62bc04bd10ee703882fcfd8accc919de4e839e3deb937561d17cad998de3a87fd0441373c1e25396e6014": "0x00000000000000000100000000000000d9fb957b4e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9837ba96f89825b2ec5bdfe0ad009db2fbfe259158332e17ab6071d72a223c5328f01ab213582dbfec9d6f59e4f588ced": "0x0000000000000000010000000000000000703d545ce3cb010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9205249f5a832ff145172b78b4e3c2dc69aa3565e450af5b47c2514da90f3da052e3a26fbbc9b9107e854e85d4309da74": "0x0000000000000000010000000000000080af2377ba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97a578bbca7a01c987d4b0e550765f584e8978a9ff934d756ab61b51e2a9c374192812b82be4bd4d776a1665c73aa1116": "0x0000000000000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9585b1dcb7ca0374f14d73a24e76f970be7e95de435674e7a8630889a8e5a8050d7ccef63168010a3c9a7e4b9f860402c": "0x000000000000000001000000000000000080b37b2d9001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98db0c070e030ecba46bff44400acefb426b99108a83fa9cd8cb5a677b68280fee5ac277cd630a45ed5b2511b7462343c": "0x00000000000000000100000000000000950b97a32ab900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98e60dc0f2b85604cd373a7efa238911e16e52d636c29f823d7a6af134abaa1645d39cc624effcd73daa3bb6ca87da578": "0x00000000000000000100000000000000a832e57ae52200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9baeca00fb9740847f423808d2ff16b90fa6ab9699be0218627702f94ee0f4f42ebf6b6c924c36ac71dab21242e854877": "0x000000000000000001000000000000001f22512bad0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fe11152478b9389ff684709a86010f5f1c12b050a5c7f5f9d14bb6cd5c6b9dc3cad928571c336499671da8205daf5606": "0x0000000000000000010000000000000030b1c1e54c1704000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9074b6a579e6ce0847263d7ce26859f8754452754185dbfccbc62666b0f7d1aacf5eb97e40847f30912a9f245f5997834": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da997b43d0f320a780c6e915864397effad60995086f12a663793989063d93cd6d65ddfd1a45a5391e8542e290638a7cb14": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ed220da15f8854981e981f1d9deaeab0adbdcf74bc574a836a28716fb47d2841f4b75a05fd196ff8ad68c2f6e826daaf": "0x0000000000000000010000000000000000b0b7e699af17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d8cd8daf79fdb8c709fe6a0dd2497f0bdb140d832031a9d90c521a66db3b60bf50bb383d572007c97475b1c69c64cc00": "0x000000000000000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93f63e84894238be49eec60c2bcba042af84b9073cff29e892f033224238c64493c5540c4cff3f86d151b264c4d1b0347": "0x00000000000000000100000000000000403293f3510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bddb66585c6387cfd5c9e43b2bf5b07968ca6cff73a7031291d0210ae58207560084427f4afaab91f65f90b698b2a835": "0x00000000000000000100000000000000893f843e148a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e69597c75f1a0d2abaf330e825d5a9eefa6986104680022c2dbc1e69c8e4f8cc9c8de175c7fb1049693ab7067159e550": "0x000000000000000001000000000000001a12ba6ccfddaa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xf0c365c3cf59d671eb72da0e7a4113c4878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9868530169785e3d6cd51bc04656ac4b2c01718a1a8b395dd159e7cb6c337f9ed66a07d731cb3fd9ae1c6877a2df49f62": "0x00000000000000000100000000000000c6891514670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da909759fe7c6aa3bc7b5e035e72f1adacf8aacb61df22ac9f1a59680a96201d0fd46860b8940256f9f5acb3b5af79c1d09": "0x000000000000000001000000000000000088526a740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9120e0b46f537113b2efc27fd792a614998b6f3761e8cf8173b786b2cf307de6b1918804e26aad1224d67fd7c6d95c02a": "0x0000000000000000010000000000000062d35a508b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94094201a58c76c323b10ed0ffde6be73f2f4ee27b8647f274540cd202d48aaf822dce386e183eeab8487499dcbb69522": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f5d356c89995ec2eab775cf0518503d25f5a18380dcfe3fb5a77193051581fff75a533b88e8d1f5e809c69bd74c3953f": "0x0000000000000000010000000000000000504cd82f6c76000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058540f057e2ec61d134f108056950e98ed5ffc5f57b4ed5f64192edaab7a3e39e16ae4807d5f718f289df7768b2d1fd278d15d9767809aa4045d00ebb9ac4bc12ff00eb67fdd4a98ba9916a41142362172efbdf79652ca245373133a12e212fcb2010f7e05c3315bc8cc30098ee1a96b9654f1a34cba742afda9f40478d36f649e12dda24e44b7e453a700d153c740d3c81b1a9f3ce5264f6f3c75ae362dc5154f1da65bfd9452ea5db762e8a7c349fd459222a02ff8021ebf80a03cfcf9e89c899d632efcb191c63fb23dc2d361e7bff0a79fb938831b8c8024f8f85df8f3ec1cd7f81991ef7a76661c2f3bb6977e590b2f9dc7c6cb6fc7f4d12f4ff9cbde6e13d9f247cbde43f833046e8707105dd8e26f912d04e1d977dc7022e919fe807178fc5a8117ef80aee2a9738c018f5f5084f1d4a773583582fbcb440bb8f8fe32a14515bf254df13b3c65ca1d4a7f7bc4f08515157f7b9650b18313c3df9e1488e139890bb6242e0862030b5e2c787dfb568d80444f5d5b011853a63ceb280213c0cf9f4e53bfcdd393fd0e4f79e958cdc1af158ce1a9cb8f89d5f7acbee1b4300a1f3cdb1d8e631dfc82a20e2f1d5ae96da977e5111d3a373bae3a76e0143bbd2bce749b08ede5170aa2f876ac1ad13878eab4ee68871ff30cbcf3833c03bd5ddadb0fa391ecd9f905c50e9e2b8f3865cabb28a45a8041949ff190c9cf2c3e7a0daef8193bf0dbb9b6d339ae3afabbf09b0774f95de699cb2f1848f99aa3a5e59ff6ba5e7ab42f3c66163a33c785df9f115574e936cd4dbbc353a64c811eab11331e3a94d6882a29878cef99c547dbd32fe3dbede5bae3caa35d7ab43aedd1bbe6e8f9f570cfcdbafc4af2c5f7f4c7efb61bb16969677cb433be2d3fb43ddcb3bb26ec2fb8764e722f13c393f41f3efa8c1d5bb6c3532b3b6a9138b10475274c475c1db5483cb697fd65c7f6fced98dec80eccf7f4c36f88fa74d6c2db786ed6c169c796e1f0d422b1e1c40f164c993265ca0d756e52861d272dedc0293f04e437d49b276c59c21cb265288f59e8369183f139873815f0d86d1a091f6151047b23fd1de0814f018fa13094e762f7c373b19b96d7f0dcecdcf05c6cc952423aa3743ff0dc3f2d83f1fc79cdfae1e367d36de1bba00f74c928abe0e073260b78d039ba043a8237ed2b96365ae85c2de04167b7690701f7004f36cbe31887271d8867275434e13d86f5438928f306a35ffca4d1ad8bb9e6d3599a7dd9217fe447af3f73cdc28fe956f6f164ed3df4a17359d67d3b4c82d4d939861ea1e69c599e1efaedd4b91ab133a31ddadb3934bf105aedbb5d4cb7a6734d00f77731e7d730db5947811f46f246b6173f3d01ddbaac2328d0adbbb2e9d665a31eddea9f6e83e8a70bd134f186bb906cf42a7f6dfc0be6d15b765c71326f8b796673b46b2e6b0ef8ed98e56465406bf6c287de3507f4f6ae38edceb58dbd8076e8d061e5117940ece3011da65b984fe730cbbfead6744f65feaa5bfc3a010f38f3e91ca7396633d7ecc59c629ed9db5d6631e7dac39504ee9fa756073a3fd71d4d828759b73a263df3e09a3033e276508fce454ba353c6a6639ef98c71624e69cc30c7f86d3afb74329f1cac1c173b23e6d739c715c33cc6ac3dc3710eda97e8d0a3b77d89de8e39076b026c9e99c6c51c3aac46b4631e73b463ce1507f399790fd59c83ddd49c273af5cc2651ea1ad5ec744a77e094cf9c8bb6877e746a6f4f8f177ecc3e661ad16d9a6b8ee9917ed7f5d4317ba3eb648e3917793ae7e9a1cf39cf0e27fdfc7c0fea35efe97e73aeebbcebba2ee935e699e89dbdf06367a7735c7740a4d79cdbec8e011ef24ce6d1defecca76f3aa647cdeec029af395705b85efb9869d80b3ff3ae39a6675f749b8851f6db0e9d8bde0e73c08f2ebd0d6636304114e99cb42b133fd7ae0c4f1e7469e1b30b4208709b73a6c9393b679a6f9bdd31bdbbcd4ee7aa63f368d39b86e5809a678e39b4694c6adc66359f968dc0bfd0087ccdb966d8b1b413ff2547fcccb30ffeb4dab7597ece049fe38ac3f0e4352b731baf79579cedbbaedfdc266a76657530cfbc9d71c0e7acf30cbbec960d89b393f1c03cfb3a1337ebc23cbb64b1c3da00eaec5b0ef859b398da17eadce4e7e781780eb317f3cc398eabf65dd76bbed90b7ff3cc5e1df0e777e0eb996736cfdc266e16ba66db6d3aebe08ec4ec954ebf1df8f3736150c281534013b8e004166c50c5115e37dc71cc5a11bc55b3a07bcd826e00ef3aec1e3abcf1d0a113d1adf9d0bd5bec0409d1438f691a7803ff0ae1d039067e3afc8aedd11ee1e944ffe1ef43e766c78ce3daf8e95280f6939bd26ffcaecf47bf5a0f1ec3cf6f48bab3953ead046a684109536ed8a3bd473e5eea425c523ce6d7e7a733d730d7b8fc7a628aef818f7d43d88bdf8953a63cfd868eb0fbb8b248ba91dfcf3df2f3bbd1aff6ed3631da1f9e839db4ec5c2dc05308bae11f3efa4057c7b602c771e78a2e5c915881240a27a23871e444923098015e3bb74b28df9e759e10dc023ce8dc43b033c771023c7e95c00aef567b3bab5bdd5d8228bee34d7737110e3ab4ce318d04c7cf31d7fb760e7a847ebb6f2e428fced07522b4fdaf37426b77cc38a0df0b3fd678f0a3b373d511bf4c7e4d7a232813173b68e35723b4437a235d8971f0c09fdf31c0436fe76a84fc817587f7f3d0bb6ef1b773dd017f1e327bcf3cb822ec3370fcdcaddbce2edba15f768e2d374b7a8dd7ce1e9dab11ed3afc71b3e4f7d9b4ab6103384e8027dd46b76e76a35bd76375ebdaf8e9d385e896fce9c405497e3a4cd3f4cd74ee56fc4bc4cff6e92add8a3e7d7ad72de8d339667e3afcf2e138019e77eb4a56b7a2475f75eb7a4cb7fae30b89938fde354ddfd0e8bf301f9d2114c24de7986be3a373d3c2e760372d3f07ab6cd69cd2a97b5d8074cc6d9ae39a9da7bdd94f677b67276de65cfbbbae6f8627e6ef4e976e13db663e2d3f94d6cba64f158e8b1d579c98664587ee167adb2b9f7ddaeb3f9d8b9db49a73cdbeebfacc6d3a5686a79bb1fabb3df1b959d3375f754b7a741809e177a16f0e3befa77b2add6a8fce410b9fe366710eab0ef8b259dc7739df1c5a7ecef6c46fe760338ca5c9cdbaab9f9e451a28fc865be6ca9fce3c73617e7a749b9859cd37ebd99b3df5aecca7ae59d065b3a8b3c38aa37d2f3c30cf3cfbb859b7fb768c5aae38f3cb9ad5ee758bffa34bcbefdd628f9e451af9f3f3f3f373139dc53822f41b63e399079706a7138e6f3c7e9140c9f38b044003787efd74f11cd378fc1ebf7eae787efef6586dbcd70f93bff2db33e859c691865be67a0ffd7a7fb3676f97dd9aeeec59b7f8d9b95871e457000ff36931e76087b94d77ede17acc39587750c7be4b9d3ad715273a571ea6a76ed3d2c29f96bf2b8e740e7698a5ce959b75551e725ce7779bf8e998bdd9634eeda5cecdc2dc2652cb8fd92ba9e5e73abf9ef8cd82ce314d6123712e2f1e3b538ebb15fd66cfced0f2cb6eb5b373d1f2b785cf75b4f065b7a0b373dd450b9d2bc28beea281e1498fde0e2b4e77b0f657000f3a272b0e7458e5279bd5cecd0e56e85ce3c7cd6ab7690e76d0c2e7ca007ee8366dd3d1f2bb1ac21d704c008f3371ccf5f72b9f9dbb259b159d9d631a0f561ce85c75c0e76645b76968b95937fbe84478d7fbe8edd139af5bdc2cf6e82add821e9dbb05ff667fbd8fcec1ceeb167f74aed06ddaa6dbbef0c8be3dfbfe5e78b44b6f975f0f7cf871b3ae7c76ae3ba0f777dba1db34c7c44fc79f7970358444e038015e7b74eed65d7df4e8ab6eb14787e916f4e8b269e04d74af5becc405567c74ee16ff55f9e81c133f1d7fe6c105a10e8e7178fcfaf9f9d3b3131e203d9f3866ad08def7cc851de4f0d8331776487af8ccc2f1101e4f8e6f783c396e793c352708b902d0a67541f3820645e382f644d3824604ad487b82e604ad095a138d09da123425682f2d099a918605ad0bed0a9a15b42a68471a15b4296852d09c685c6851d0a0a001410b8276855685668576034d48a342eb8156036d0b1a0da4136414b418c828920a5a149a0ab415682cd0823414684f6473c8e890d5210b23b343760729061906094592416e01b3025605f906a9859e92d920ab413645c6443e419a2193423a915d904590469044983c98459844985c984a985166192619269419863986f9858985c96436995bcc2a48374c2ee615930a330b1309d30ad308720e320e520eb20d53089309338b89867985ac05d90bb224990ab22732136427c8806419e417a417a415b02b604ec09e8035c19a207d2087e415d206728a6c0d1a0c3417682fd0926047d80a30166041d917d9930c0b5916b21c6430c85690b1804a8122812681be341b6829d05aa001695068435911b02e3026d8113024646ac8ae9075d12f683934180d878e4344d26a6834741afa0b4d0a6d895602cd09da04ba84088538868814c310c5903d2113423684ac881e214bd264a029d16690e920439291202b41e644164586822c051814da0eb228645c6853645232386471c8e4808d0113031606e804e605ec0b18148c0ad81430277305330a4c0af304d80d32282416b42da21aa81368132905a90409052d0bed0b6d0d1a1b260c6692f982e982c982a982998209c57c62c62023c274220b42b645a64506842c8b89828c482e913b903c9042f206b20a89036985cc81d441a605fa048924b320b968293d87a683e442afa1d920bbe8a46e830483f44243229bc82792097209990be48b324136414e210b92479a09a45146030d075a1620121a05203f342d7a78746e10253a906344111c041c4052814412b48b6c07d950a6044e016d00a5803580348033804aa00c600c200c6012f802e802d8021804590057005500a3802980288050402078026c0a221407b40a398378877682cd809a209620a32213824be209a2131a0fe24f8f01f6a0a9d052682e3a09f4098aa471d054b40d9a053e2620016d0811d0808e1e51051c7c861448eb985304c8067c2c012447091f3e3818931892e3c3c7c63047c80680f40c6182033e7a90c8e10992c490203e7cb4605828c52630110e0c09e203091f44383064871021440ed083448e1021440e0044640217c909d213848788123d4c0049c525f01022417a80f03091848f1e22428af808b2c403e161e255f195041124729298119970912220c8e1318448902245721e6063117f20c812cf93a3c343640246d87805e7e43091c344032090444e073a00040240441e70111d24729440420a2ed233248727478921413c2a191284032fd1058c4490224382f0f43491e3030442965802880f9e9c24840461e246070922426e60220bd8033e80f4004902484fce024e51052108220448909e204382a82214ac830411211bf091d3c30412394de4a0e213cc43e4005d4a4a8139018214cf2e8e5f3f3f0f5db185c615c415c025202671e0200033330e1c049071ce1921845bec4d93126e734a09314d7e1896c538a78b0b16279c53d209218410f684dd0db9bb67df98736258945362536a416810ce2cf68c5b697a5bf78cd15246d91d3b46894529278d6c61129bb021cb9e936243d049658c536e73420851dd1c7b4e96724e38618cec6e21a48c52ca9e18c47a4a48678c39a73733dab221947342d9d39bb2db9b1c843d67373780e92205d001981c8470ced93460dc3a76a494d2297b625bcf89615162596c0cce38a7c4b619b52825cf89311667e4383138e536bb7bdb60103c25739c734a19238631c31863777747296940186394d86c29bb6dc45883060d6cca39e7c482883392c69c726234e494534e2aa78c7276c3d853ce6cce182062b69670023101d072366aa2501335e544759ca829bb65583fc8391b2551b327aab7898a71f6444d896a54cf899ad043358413c23961953de7943e48e95139e79c3dc0191b8b71ce9e12ca2979901d1303a58cb2bb279cd8444d6c6253cae6397b764ccc845d9a3dbbbb637890b2e5ec39b729b736c9a633ca39a744c939a59cb3e79413ce09a594724a39e58c988c1916b50fdbb64d4a397b4219b538219cd8c464947242193942082543cb0c2143e80ca18410424d4a48298410639939d733e09c73c209216392675329e5b66ddba63941338adb0fa596182e9b0e1240362044081100c87059c958b574309b0788b0ea575f8ae4746008102590f84a4372965802084c8c253c00a4a7488e0782f4780f12408a0c01c2d3e3a327880736c04411192fa7880f0f10496208109e2f464f111f3a3c443ed0933324c6548405c37a496208101f393c4096f00011215c840041828810007849041102c4888f223c782048cf102678beca811e2662d4267294f0d1332408cf123e902812c403d403323a8787033e7888f400418288102140608468c56882c8077a64b486108077370410800e0c09a24411204af8008404d1b1d1f2c38ac5022487672547c7474f13394368ac74e007554f91204de400a0d444100ee4f02c61a394d301203c447a8af8484248102590f0d1238409201cc8494266ebe101d253e40701f0a032a403418a58ae080872747c201144c80698588295cae901c2933324a7033c457a40259153a4480ecf121e2082840f9e1c234490c8e1f101a4481248e4f808804e6b08012c81444e111a4f09247a806cc0871245820c09c201d609041c08c29363c407010230c410024822c707919e2540c083040f9e901c2339427c3401c403334c1d2022c447078604e9400788086929e514f1ca03244708123e9ac8496248101f4382005102090e7080888f9e26723e23437262c701f031844890223c39467cf41021c2e323891c9e9c247888f8680d21001f02c8d1012264033e7282f0f4f8e8692207004686e444156e10f010f1408e07a8912139b1750a43f3fcc112a33fd867fbc12eed870bba5cec9a3e3e2e17f6835d2e1f1fe8923f5cd0875daeec07bb5c3ef1870bbad8e5e3923fd8c7d53fd8c7c727fef0f1f1f1913f7c5cd0c7a77ff8401f978fab7ff8f8b8e20f17e41fece3e38a3fd8c7a77fb00ffce1823ef0870fff6017fde182aef9c3055df007bb5cfd83d9e572b9e40f76c1fee1822e972bfea889439099a1078a00e190210e5a001b360b1d3a765cf122ca28372ec82927ed62d2495b1ed10edaeef9554593e7b00e5af8ec042680e1cb1809bfb29079863f9e69aceec0ac839665b36cc633ed2e5bc06edd2c5a211ebfaab0e26ff71ae3e0ef8c7154a1e457cd828cd12963c3acc43cc35e57c031e330b550bf31ee4aaedcd30d13e617f577fb9a0cd668bf99f4cbd574b0463b8e12cfb4dfc8ad4cc21ae61a10886fdfbedb7f03d630ac715131dfae7db7ffdef8f6ccb230ab3dda1a66b54bcb90756530b36e0f9f416e8567dadb3b58a3026bb4b7d7d0b8d12d6616fc6ecb778c6f9fdf6d7f6abd6e61f34e8f8e41ea32c77449adeba7e4917fbdef4f875f510c423f9dbbb10a802773ed6d798e99dfeed97b5669bf2bc992aed9cd7a39fafb53e11915cb481762c6ccaa87977ebd8ff112d640d971a4614599e937e3fc7a3fe3cef8e915871569281065a667dd77338ffbaef79166355db27e3a478148030296994e0224287e4ed8829fd321cf4c6f0b1f96c0bb7cf4b3a4c233d0f98fe8d6553df4e910e8d6d579e9d337eb310bba663b6641cf6cc62ce89895cc6266a9785d8e4c7e7f3b475ecaefe32873e1cf91664d6f020a41178c940646fabbbff0a27b2addeae997deabf7640ee8f2a1cb87df0b0f28e37721c402c731dddcace618d6740c19473fc39a26c1f395341c74281d561cf875c5c12837633637bf58c3e998e51f2fca66cdcd32b39ab35cbb85f9dc7c6ed1e573dd6a0fd7c7afa77ffb5e78681e3d7e46faa16bceb5bd5304da0799451dd61d51c6ba009e1eef9f3ae41ad4bbee880f9deb9d38258cd7bcededa70eedf5f9e8b2eee89fd73e1ecd7bb2679e69e762a75923fd9a73dc906369f30b73c4dfbe9d48af8b7eb25936cd8417bddd6b1fe88a72aa818b2bcbb178e63763f1eb55bf2b7f1616bfac7f69d95aba5b38ca44e72813238ab3ef66cfe21e8ba7be27505de7f5bbab67f9ee11afc4caf94bee75be8a329d73b4a315873a774b73971693dd9cb33babd59cd34d76fbae7c934f5b2a39ac469cdc54575eb230ded9158c9fecc51cc64df6ca87f95e5c6ccbf496cf458b83d7e277f395c78ab3fa0ae0adbceb8ecd57df6dd9be2115ef3a04e4372a9f8f8d1b2ca673463a705d3f04fb9ef8d35ddf55c7f41d3865ca94293ffd6587fce9d9cb9f2e96bfe5b5248a171e9bc3cfb8e082938779e6820b446f2ffce99b853c581dec708729bff94e11d71bc17efbb8599bcb2eeb968ef4cc21f5ce27e63e3d65bd65b2c7589e979c9b46c557ce4d93729373d3a0fcb4396af394f7ab6f7315cb2db37d9ee596e1ba2bf9c96f66f2ebadbee47785f975d697fcb27e4ee7e7e094af537ee52db365f395659ed9be3b5d9b9aef50bf4770cccf48cb0fa978dda15e4467f3ce75b66f87c5a94f6d7e3bd4efaac5b59695afbe1dea9bcfcf266e96e51b52f9a0f0fc091b5126daf8e8d91c1165a2ca555cc5f946c5579c6f9e4079ca99654cbef23da16a576993a7da5751a6fdf2d147cf62f6fa97dc64aff7a5cef939e7aa03fe3cf34cfd6ef74dd7bced3de235cc5d343878986b7ee56b7e31d7beeec07cf36937e7ba63faf6ddf8b31a81f9dcf837e8b0f230023ffb5e76644f5d08f646e2637487f4f9c11f9f59a7890a1cc7dc3e7a59d42cc8a4084f67c8c7c60d162a971d5cf20c94053d2b79be4d24f41c254b6229f0e719e92f047a79b22abec4a77a3ef519899f72fee927abe229abc4c9b994abd89d935fd79fbe221cd71c278f36f5f9bc7e3a568d40f9e954c4f5287b55dffce015b25359ae700b59714e1f5cc238f85901fc5db340e0dd26026a22ee26c289423a1cdae4a5731ce7d14ee78af0b8fbe836916b8ee89cc9a73599bc6b0ece4dce15e175ce1567285bf1bc5b139572ee6451a9eff6a0ec5d4201fca77be48ff8f8f1e09faba4ec4ecaafeb53ee363a0f5689d416708b6649972b7e97e8f1fc36f1473e7e7e59dc53ce340d1465a4cfef46c0fa3de2ef749433e398e117021fbf3b3f21365e273a3f4afe45f98e8adf23321c12754b47e52797ce457b8ac11527c6c7ac7b8a56feb43b303edeed2b5e7a3d7d367db29068c6cf487c25b8592847cd8f99c68ddf8e8a5f951b89afc4745417c3aaf87494477be5475739acf38b21bfafe8d68540336c6fc133d21ba8e4ccaccbf225ffbecb5272ffae57f25403fd67a39f4eee278faee2a99417717dea2b32a3a37c86739d298fe19f55b9b5439bbbdd51f12b5fe5272b3f15e35764868ccf48cbc3780cd5b703f30d41c1e24f64195cd22ce9a80f5ed12cc9b28a3272f592e5e3e29a6bce379adfcc375ff95d3df1f23de1f241a00f2a8932d2599c6f9e68f99e8041514646bae697f5d29b28d26c1f8c1265a4af3e9573a461f938caa03ce51c69b4efe439d79595186194a8fa6e96faae878a72faeeea278cf2d28fdc262ac29bce15c7739be6a2c5d1e4e0790e8b9a25dd73f88a9dc7182590df649f6c99e9261b312f599ef9b789e092efbe686ff718e69cbd42ba9f8e390cf228f04449a48102c86f363ff284125184220d1440366e363fa2f91309008a34506cdf1195127c810d6c30c21425a0c2cd13376ebcf4234f34116564e6d2e1926ef14b8745dd8a2e1d36699a266299d79228fec22b6e2e247ae97c21932672f2eaa28d5efa85505efa110f3e43e18a247f9b48f3ccef0d2366c212e4f00514ee00842f9a70a3f9e52899e49b27782032825015ee3003235871a37d58b0932c82feb29422b20f0a7b73048bdb442fbd4716413d043f7fb4326b56eccc67ba3a9fe89273e509a669a691ce2cbf9bc5ef7acf37fddd158b87040be826f01b2cda5d0d79bef0e04326a623de8d1c7d7e9895d165741de9d8c7497bbb86fac5b07e7ef8d26d9a0732e3b8b215fd4af932be8e74d92cf8d2fb4a9b591178f0f9fb39c9dce2e9ef692877c09f9f8fde7507bf1e4a6fcfa8f42b3f7ad108dc8b3f731c7ff788bf426cbccece3512dfe49a67ce8f39f4ceee747e5ddf79b5ec26ab44c75eb2577ec9abddb9f26fc9d9b3ce8bb8befb8ab063cef5c0df7ceb6ac9caaf7627f32b5ff3ce16e13e2119921290e08db43cfbf631b3aef6edf0370445f427d89f1dfb387e4f7850b0dc3c7164a3e2064198010c92c085d0cd91273ccab4fbf093257678a20b2fb070072c6ea6df48a7ce374f44d7dee0f1cd131ecb40a7df13f3e328c32e3f2fcab0f3cd13f17b228b32ecab28c37efd7da40bc6788526085df199774e8f3e3a330e8d7164ce9985efe4dbb126083179d969961f9ac0ebe8d5af8d2ff915c2e4f74613f198777e59cff9ed1f59f2e8f2c2d45857dd6cf9afbff1f5d1fbedeb3e736e02754b7ad4e18ff2935ff99973b732f95dd477fa2650cde01bd931fde69e67337b675090144bb6783979e245d20c032889d01545b409572dfc09d42d9347a795c744d2ace8a6efaa342b7ae99b40cd8a9e59f8b37acd8a0e9ff0eefcf9e8d73bc289feb9a16ed3d5f26f5ce3760e1dab46f87c97f168cfbedbdfb9ac994fa06e751e5dd6ece3d1de7dd7087ccc395a79983087f2db81bfb94d734d21b72c21a13e1dbe66e16f7608c86d4378432d92feb93181df609139d7b2c3b0acc368966d5b87d92ec167364e99f24e3cf65d1f127ce65cd7655627f329afb9fe6240b11ad17e5d8ffd63b67f561d06f8ecdb31c067ce551dfc7aede735f87aeddb81afcf7c66dfcd04ea16fce8186d8f37f367229940f4e8990757e7d3ae8e9c0e7a3a3b171b42f881c093b35db66cd97e57d363c5995f01bc863fdb4643e8dd34decfcf0f096e587281630278261dfcd039862bc2c3911c577bb81800bff207022f3a3bf4c80cfdae5cb2c387d26d9aad8d66b1cfdac3f5f2c6b313c138f02b80079fab2607cf3ff61438a6f162d24be7d88bf030e7621e73667d111ee6b0e260ddb2c43c8339370d12eb3cf8cd9ead756209eb5c11de90759b76d1c0f03cc7a6e7d51eaef7be211e3e20bfb13c58beb1966fb862319cb3692e8685cfad5a2ce3a0f1319f100a3c239deb2e86e5e758587c95b1b0d41eae6789f1e25cecb85873cc70ea1c37bb7671598d88b11aa1d2e2364d676454c563ec20e9a3bf38c77ff4620778ec8407441f9d3a97ea562dded3ab3dcb50c7b022bc9473c55179330ee9915b984b6758138d600de92e7e57d7fb2efbce9969e2922823bdf354d5e1bfe27149a48146d108d64427b08674e95cdde5bbab96ef7ad355967cd128d2c4a3169fce2e7ebd17af1e8f220d0f2e3d3a8135d455fce5bbabbff1c8bacb773dd3b3784b3c7ae93c588c65581cb391592c6e2db3cc65791657b1cc3377c6b338f7b3f8edbfd109730d168746b08671f0dffe0b8d326d8be11675cc5934b8b5221f73176a3530a8732f15877e05f056684bede1fa15e79ac37fc561a7b2e22c8eb3729bf6ec95e19ea3ec45c19761e1af586e168b952a3264f8072343864bede17a19fef94af62ace6265b3549ccab017fe8aab6a0e159592ca7757dc7316b7694ed571cdb152aa2bcee22c2b1d46b7605c7afce9d68b4b8f484a0e8d9c1c511b95344bfa67a314cd922ec346a166598bc4ba09fcc67e58bcbc388c63cec5787979a93d5cffe2a68a03e39cd775d5d1bfba42ba7fd981efb911f9d4774c4fbfcf087ccfb9e6f09c739baeeea2d2ad16970ebbe8d6caa5c327dd6271e9104ab7565c3a173b6a6538aaea90e1d4396a67d06f86c3aae36507bebb1119c35dfc65073e8c1b91bf0393fec5774cfff231cfdc176fafd508158ff11981efdfa5dee25d3522facb67043ecc77a97b6e13e98cef85870c7ff1974fc773ce657c3a2dde035fc56d9a9f7369c8289759a2ce1fc3f2c3d818d42ce92f362669d69237510b9d344bba8b8547cd92ae626117cd92de62e19366495f5908a559d2592c446a96f4150bbd88277be19f1c5573c087463c23bd098fd52ce92957d9986649e7563aeab7c5f37ba2e128a3e2577bcc9971e8e03f39e69069a05194918e794bc58146d255be9b79dff5fe42a3287357ab9afafc039e74e8d7abc03876601275f8d26735223a35ea56bb74e8a45bd4a5c323c6c12f5d561e71073e0ae5361165f94f96dfb3fc267bbd646f57ed5d7d6779b097ced99e48f38365a04779e8db77b3a487ae7dd77bc93297a53cf4ecbbab97cead3a58b1af009e8de76ac4a3df65a4870e1d1a451a9b253f2dc32f9dbb65b304a859fcf3bbd95f68f4d239467e3a31e999071f1843ae40c1021cc47ce6220a92053c4ee88a4845d243c7dcf4c1d81ca7d9cd397b3bd7d19c738ee36e3ae6f239cf22e1d7e56af5ae6ed38d5993b71d3ccff39c9b9d6791785cdb31acbf21cf4db40e8e75986538bce7951c3e66194ac9b6db44a19fe71c73e870ba0ee69c5f8ce338e78ac3790f57123023a063987326d8996cf5b6f1bd5a01af3a570a78d5ab73b133d9ef39d9994c2ea5fb81afde6fb20cc6739bedaa8efaf174c9b9cd765ff7e636ddd9cd6bc963bbc939d396b9a9e4b1bf1d38a5d4cec5ad7fcb3c66b5fb63a6b1393bc69e590c3ac313fdbc667d2fbf55b31abe0f74d5ce94c03dc09bcfaf2948f0d039d3033c1bd8e12115480ff3fca24209cf997c4cd26f74f869bf13a7c8e9c5cb6f274e999249ed1b927d377321ae2c927e7e438ebc74e899472b9dab113c85a0cfbe21eaf317fa9dda90022079fd1cc25308fae937049f69f33b6209126a68610959131fa96597363a570bd8b41437d8cfca17b270e20c3fd2e1d04f0c15e42089104f0f423f30fae95982bdf8a19f1a5a58c28f910220793511829f3e5402f6e206fb7ed88b1bfe8eb0fb0c99e2065b2041183f3f37f4fb811ebfbbc443e014862fe8e00e487e7e6eb8f648b54fbb62a44c8852dad91262d99c1e3d9b8ecd49259d3009d3a5a453ca6e2d44978c633a3b3763b7fae8d06d641e358fd423f5e81af58c468fd423e63146cc72b3a665d85d5fa4c3ef7f91ce2f2a8c103bcae457cda2de553af671b3e8c7cd92f065c633ec31b1d780041db81caf2b15423fbc9c8e71347c03c7af9f2e190775f6c938a8cd3c3a4cb3b217cce3f7bf601fbfa608e3f935c514219a35bd9f5f5448f1369a351d568f0f6b4ee69166f3e9ac48c3f974986ec966653efd06e3709eb15ecb64bed9ac6532f7ba7559b248b36a99cca7afbaa5f97c5181e4af103f9d8571c09f9c66b9599977cd3c3ebfa820c1af9a9539dd81531ec3d991af7ddcac0cb39367d8b94a9e61b7696ae1fbb46b76d4428a6f9fc2c99bfad3a14ebd8753872ee1c38a13a5730c018f5f5344f1d4f9bb2ac0958467a6c11fd705506feacc38d8a773d4b6335723a8b7635687b20ec8cedfd51cb2e5cfecbdd435878e591d0dab3c30d716b0b9f6ddec358775a709242520c1cff3b01771eddc0fd4c10e53be081f2d498282e7bc88ebb9efbb9a679c66f9377b9b78acf2d8bedbc463ae39a7b97ce181393b3bf6e964be73e46ffccce577e1b363de35c7f69e551cccb9f2c01eb3973a749b68d34e9f5f5398e0a573c5619e99d366d1a54179071507a18490835cef5934ba253fba175d25c67cf4acbb402908dc0758a67d3c5095150d21fe068ee8ec1bd770ce2e63e547eb21f14c3b67bd30700d53519b98b4e9154d46d174c4b04bf229cdae6856cb9a2d59f2ed2628b06909b065046ed1f9a586109b6072021492c0a622988a3c317061f4d7a484efd861e14de764578487b9ac383b06983265ca6ff4a73d39c1aca6f674023eb1c05433e7ac91eca39f7e90740b06354d09a869b2c8a2f3379b6dd143311eed90e7959b4444ffa275282b2aca9cd09a19197d7b8c29c368cde1bf39b59b4bb96d72cb30b7893262e151e7a8cda4c894644abe332bb29a096542304b52b3a0a06fd7b495434759e62164dd217ff52b0e08cc6aa7d51ae1dbb3247cbbf6846f3751865d6a89abefba5ab8e26051d40c08e8db398e96a8f310d371b7bce7279c9414c01b62e6b3cc6fa70283721caea9445ca39dbd07a639fd4cca351885f35b7ec9f20d4eccc2cbbac88e8ebe3dfee927d2a4b260997622642928482c2b99a4d44262990945b5a0d8c7c424dea40e2b4eff0efcc1869f26122ca8e9aba52ccb3e4f7e2582546211b3f1ab444d8a724cda857e6a87328f964219faf18eece3c718cee430ea3df8d071d364a8e7306cce88316a0fd78ef865509a953d7902b94bd47df8a1ab449e5f7ed1c4f865236ee597bb78bf0cc6b3019ebd865bddab59ed259837f97519c6b1395f1bcf7ee3d909c0359d572798d51ab7ea4fb3da53cf00804564ceceb000407e93f90de2f9f443d4ad0ea9eb4fb73c25ed04b7bc1a70921785e5ed5e9c9427cfce69d6bfc5f6e0d3f274de937d0b47d41c10a474b729c943728357866f87359e17b0068dcccbcbcbf552e0835fcf896f67a6f9c1afa90eef03cba189fb8175689362b9289a03e280bedd0719d60f2f313efcf0f2830f31524eceeff42ab9a855cb233925439e6f9eb7d0212e880b9ad633591473006017e7c711714080331eb3433e788c35358165da371fbc25c651160916d14de0371e520fd19e5920efc607e75e1c8875d3839b8c224d0fdeded921242658dd640ec4ba8971cf2231c1eac67320d60dca4daf48e399dec0ac765352b38a40318ea13070cd10507633066e0d01ad6e624c4c7806e5ed3ed8edc9d191175d3724a46fefc17a54f092c032ed2f9e169ef0ed5e1562bcdd7b79469106e5f9f58e623c54fc3aba867d39a24bd7471ef95b521cdaa24431bda16518c53ab4bd5edf5e64841843c24ccdbe50cdba6058a7d9965752834cb32b22ad0e6d4b9630d1ea5654a4699d6659946c75680b0afacd8aad6e429bd0a6d9950d88ab43dbcff6c3719d6655afa4065dd76956258c5a3529526aed349bd2bca81a92869454aa435a9428a552a759d43f31d521ede8c864ea347beac133257f557e526108010ea03db3292da0c4783665449445d14b095ca39db3dc2c2426a4a40045f97982a7197975487b692fcfeb4ede9f4e9d664d2814aad36ce94d16b39b12be1dd5c2700037e5846f6738c44d2d8167a6688a287ea954a7d9fa99456202bfc9bc87a0bf2a40df7e4f3f2a3dd85411e010ed2b9bb229a4661d45cca68a78a67db32922f04c3bcaa65e51a6bdc5a68c78a6bdb32928708df6cc321c408c7df251a20c52b7525c30ab5de527484a2ae99b0adf7e3b2fbe5da5e6e85705f14c3b96030ffa8c4a13543acd76af52759ae58a56ea904644b4b2d269767b8ea5d3acf625ab2d59d5214d68d565dfd2d26916d394b8d4212d28e8dbc5a5d32c7deea5d3ecfc92d580a24c3b4c1dd27eb41f984eb3524a8c3a942525c58811a3d36c7cafa83d23a06c1625cab4cba843195286f40da16f322a0ef58a8c204346a7d97ecc1ea58cbe7da65e7f53454aba95ca825935e0566a0b9e212306cc8b4bcb8a6545a592429d3c53a976dc36c34bd4e1ffc0eab85b2acf2d5c43fd2506e577c6b3df1f684a7e6b1091f9a579f618cb2c33ddb3732ef1330b9ed102d64065a923ef27d48225a333592458cce83d582426ea31160916a7cdb928b0c68405c60217e5db3ba14873fac95242dfde3181351e1252c7e40b58e34991f24512acf1c248fa760e0c58634282359038305e91a612bd5e50608db7c51650bebd438a345e515187d4217d7b1706ac31418135a074617c7bfd89493ff5e7dbab14b0c6f404d6a8429c942ac5b757db2fc449e1a4705238295d111e0f9f0c679be66146454a7da71ff99d7edcca50026bb487046b34ac39fdc01aed4aa484712a815bf89f4d0dc1a690c0d3e3d5b82a4f496a099f32420918474a083c036b522a9d3a824a4725e5041521295413521e409d9aa0869c3c269c8878a625784b984a4a30ed94eaabc453bb24d4221d8784ae87db8ec031b1694c36235a6604ed03195684ac098c12e13110d089f94d153d0dc11cc24f11c8280479247610e208da3d4594da827160dedefe5d1fcc429e91fe559c19cec9c8541c213215077ef0bb6cf4d0593418f24c8c31b0bb24c3ddf2f38cefbabe3a7419967946c6549cfac580b1dcac4a545f5f893c217c7b0f2a1516af088a3b946ff7a1e6a0bff2b9b4586e16664a8aeda627b0269505d76867f96eca8929a9a680c0336d7af2ed3fd41cf4bb8f9e36eb596e26dfbeb2dc2c56cd9122ea92e52853bfed7bb11c65b0efa68cbe87a05f967a7dbb4ccd81b2262f5aa61d00158773ce14a59bb5f2cb4d88f849e30a614a8af194743f6130875ce36d016bb4cfb8e2573e8bdfece7778570ce4d6b8a6242a26df0a65f1392c98b66b52929d278454a228d87b405acf1a4b4f8eabbbef2eebbabfa5dafbaf62569be29c194bccb16dfdeee15459a4a8414694c459e1458e385016bb4b77cd757abefaebaa25af4ad7948482fe5db39168bf98adddc54a4e2ed5e182a6faf449126451465da3def9a8abe555e1859e6a5882ad1f5bf95e89b3e5784b7c1aa837e8a8867da6592b7d913921350b3e8c7eff4c3339de441bfa71f95e5812af676262fba35848d4c48dde2bcdd1465561cee2b8017b93823ce6023ca464fbf249ad5fe43fdd1cecde8aa859fb2439e97ec49062cd38eb2a713b04c7b76a2e265ee8905df7eb24340d98de79c1d025add787e9a81144e3f91c6f3f61350a4c9bcfd1414694a4498fc9e947ca78ebefdc2fc3dfd7cbb67b2cc01b830a526df3237c5447a8aa85bf26bea5c7c7931cdcaef529f2e537350df46f0292215d50acbaac5e50526860c9f01d954a25eadfced070000d171a4c9fc6699a5401d3a22cab4cb1a1c35101c8d8e610df54be19c36768fae0930faeec7dae04179a4c6f45877f463b2e2402c3c0434abdda60afca2ced160ca1cb49b0f313344ccd41b5c105d11dee641549ca83db3a47374a91337f943c5a1b48720ea8ef809d1ac0ea2dab0f19dd5a838f4a35ef02066a3e250e75245dd4a15751ffd7a1d756eb3a9a2e9056f8bcec56ab9ead1b901744578d107507184ac1efa002a0efc525b34ab5d899f0eed5d3dec3c68a34f2b64f59b73c5d9524445785cf5588d88d1f9abd7a838f52b80176b9c89f183c156cd6a6f2ece541c8e038263b87a15bc769b4e6dd1ad21ab1451aa4846fef00d65fe43f559dd60f1c2431bb2fa761b95c57afa994d6dd132ed01a839fae99722ba8207fda688de4e206404a02280ea491a00184037809ac5df8c7c6c96992e44dd913dd69f5924999bc06fb20f8b89e94c8fd439172d0ede747eea41d018a2ee985ffc86a85c056feba085dfaa46442869484282a74e6f089a59d35b75078d966d25eaed0379663a107252896552dbb84eca5a3249e99d5032a522554594ae91a70ebfeba21f5bd5ab907c68165dd307ba28d73c400326f4b19be8477004893ce93651761665bc6e79df15d2442fad97fdc0933aba66c5db4dbae6503dbde233bfdde4937ce041bf32e965d2c7214df4d4a3671ecd9e2ba5dfd0749e9f4f13dd60f122bf214df412138a3ee038e64aa2671f4a7a7ee9c08abf48cfafa1a06fc6019f67470298473f22662e01cd333f826747029b533f823ae7dc3782cd29d739ed62108d4ab648148ba2d0b77371c9f645a02893f9e6db3702cdb38cf38d8b465b3cd2629498c4489f4524edf5ed53022f128823c03c7e2fd0a3bb6ef8e6e5881bae3b0ee01bede7db8fc83ea0c7fce508a16f3fe2ba59f2ed3e375c21f002bf2382be3d4a25d4b952e00816a5b49428d34ebff813656e4b318a3474faeda38737d3be4880faf4f9fa764a9d22d1274641ad04e83be8fb49a4991efd42a4ef9b68e15194699fdf8b04e608a8cf1bbec139a201f0e6c9f7112c2400d7108428fcdcbc48807e3ed14b5023052d9230c527fa4f849286243f37947a3bd2134a7df69216faa6763a07ab04a6d32fc901f026ca43a328d3450ffdc2172c1ae242260f5d123df3e093b9a00f7441a9116939801fbde30b8feca167d0a5c3f8115d9de8d4db3b7ac3ab339d1b730eb3d4421e789a33e434299a96416688592edc10055623a8c3efea446fa730ea4c971fbc6187353ad7ccba32188f4ccf5cdc61069f94524aca0e394aa55f4a296d69574d9874ce39279d734e38840d61198d2d70d0b36e213cc3495648fed12c762b94f881811b74d911d90d28c054a878361e1509b02182081dc0acfa6463a5031a349ac542342bfb2e23714578475d38797113221ec6b0208cddc3ef668e654218e9e177035681f90d1bcd82d646b3a2d3609dbc66b15fafc26bcf1c3acc4a65c5b035a143f74c477f073d7317cc336f9d6c52f8654c6712bf4a309874ce39a7670e67363d9bae934d3ae79c6c2fcc4f180cca28388e4e191b9ab89bc3e8c44a10463740e0080a1cd12cdaa35994911090001b226e08016f0861a35994a9659ec9dc26c28a43c39b4563b8950a6b8e69bef9c530cd31cd75306dbb9aa6691f8c8a6783860d1aac2ef10cf5188f7198958a0771e0b5579ea10ee34a85e352c733d061e6ed8f019ea18cb4b2038e63a4b3731cdbd83ca39452ec52cf1c561cfaf5c4a74e3f21324b83d52cea989da7ae59de2cea30cda29ac31898958a47a943e76ee69aa669dacc289d426e3c740fc301275b3276d74c873a3cf0a75f76b622f07aba5b5742bf73dae9707a94d3fbe36979ea985fdc217f7e203bb38471061cc7718cb31c86c64fe73856d11c63ea30f3cd2fa599d3cc75e866b3af277ee6d9b7f23aee629e614efd666e45e0619e61ae937d0c85bc76eccb9a25b32b84c643675706e9151c37c74d448c31c618232bca4456b328d02c0f932c29a7ecd9365810ce19638c52ca48863913f0e229a59472ba94929999a7e5ec2404bc190bd22690ce39e7dc815fc4f5d0318c67e6b4c128cd269cf49b73524a7b522fa694524a29e59c949de52e52424aa194b2e19c734e19c44e29a59436841c4f47342b73168d6e4da7365ece39dd5db0683be818844eeb02e063100742c89052feee118e338e8c39c428a510c3300c52275996655906330d52870e3f1de8edd42ffc5e7660ad7d349a95699a96659aa66959d69aa66999675996699e65996b9aa6659f0ebf62635eb8f1b35953889f345a66b6c34a29c54e303cb29bd2ee9eb467dbf809bf6e4a9b4a56a459dd6cf5b3b36ed1766a1b7341170f80e797154b8458a1e4693cbf70f00556e949093a25cf37c46766666e08fb9444376c9c861f738c1046e80d99b9217721c2b44c747638e3e9068f7c29a59c59c4186394529e30d02ccd338c7a74efd6f4e85ed42a8e9499ed6a0f17ed5917005f767777d67de4336fabb9a6c918a3b41183d40d349b1806f383523a278d31462508a03dc100218410569c55b36047ceda799e20d00ebba1c7d8ddddb1bb1b4229bd7bce283b428710c2864866eceeee8e3152bfab55c7cca9f564d64698d1f9bbbb3b7a4b79b2d12caf595db3a49451d28a23a59c52caf875cff95d499d7ed715678cddddb1e718628c31c68cb18a83c1efbafebb12429866459f0eb5597bb87ed5ac28a3f429a99d534a39a59432c6234f1dc3a88c1e638cf2bb303e79c9524a39b94e9fcef2d4a3599963be82995603635af8744e97107acda28ed9ae59d421f549e702e04f4a3dab3894528cceefc2a7521e79cce99c9f4dc4a6d329a5a436a81c8c9080e1451746deb3932029de094fd8e2f97583a2bfaca7be7ae6220e573c67a2ec32e37848d75cfb74b4ab7d2f3ba6633e1de3be987d30cda290ebae080f7358b32bb32cc39ce3c96b96c7e37acc65cd9a85798f2c9af0063c7ee100cac73cbf7050745ddfe439665879c0cfbe7be46f4f7f8f2c9ac4eceb91459366f163cecfc57ecc7b64c1a447164cfc9b34cd2aca50e7ef91c5ebb922bc1e59386916ff11ae08af6edb7733aca73f73ccf6c8c2a859fc3db238c2e99105936eb99ebfeb2ad26451863a3df5c8a2a859fc3db278358b9f7b64c1a459fcf4d3b1319b86c1b103a2cf307e3a766113ea171a61de4ead0ee613cbba297d10c54fe76ec1a36796b78b9dd9ae3c76d0efa3d4331a7d4af9e9743a85121dfbe23107449f5840f9e9d4b95377429d4e30a9f9ddee27a594a3aed99b551e4ca9a9eec89cca66614eedf7b239757eaedb97a37f3ad76f132777ab181b442400023f84348124488a25708b6ef54be754ba6df5cc2ebbca83af88f27101d167dd417d7ad46658dd9161aa8ebba5437d6a99b75fefaab4b363954774cc69dd917ddfac3ca24f977507e5646cc87296e00b76567052c5171fddf538407a532b7376aeed0ed6119e1f8dec903f3fd0996bc0cf88114c8f5f436f1ecc7b32e9d465cde17ae959b7a2c7eff6c7b6fc19967d3bf1b16f7af405cc4f360bba30184dc0512d2616261c0c416e189b1584d3c1d003d0cec0a04c88d5ecc993d7a66b6e2b8e46e7a473ce4927e5268bcb628cd2b1ba234ae95917d9d1513fd5348a42e234e79c878ac36d1a0a29083c328ee3b8244a5edb668c1b47637a501911614308160d8f59c164af0a6a997655921682460c4c9f3e8e3228241492f7c25048de0b7b1412cfc8c1837e513d7825a39211d768c7c13525a0e997955000cd6feb3988dffcd678ee8468784bf881c362a25fecd907c035a61f58e3bd608d7659139da3093b9538fad1849d4a1c07b9f9d1849d4a5c47cb2fb92dcc08d48312904a06ac22baaa2b720059de12608d2a09acd16e85e947939a94b63f9ab05389339566e4b09a83468e665362980f318917a743194cc6d909792fa197907cefe5c54cc6f8a992bc3ca3d885c47c62139b72d28a133fec0d3f6032b01ae111c22ffb62ca2c4a16253ecb7b319fe199c3c0e297b7f0cc5550f965285c56024d29552773b6719a9ffcdab881617e83782e0165a8ef669eeabbde4ae5bb2b67f9ae0395804a40b687625cb35be7396681bc9b186799f62cf3bcd5cabd1332fdd8b07169fe9a869846a5840673f85d1abf1d15ba277cfb8cbf9dd0aa1bc27bb713f281f55715e4b764847d1c6dfc2d81210025a352184a4f4a46f42b19f99f4c9a53ab3967afeb39ea9de699cb6e655e2df38cf641ceba9e5afe2deb78c69bac4a4994b9c149b5e4db3b950e5455646124032510a101f046150728e34d1d23c2c89759ad0badb6e5b1d52bab435b519193cdc828637993dd96086d5b106d44daca6fd5aa9eab56e537bb45b1016d405dea37ab8191a425fdd43aa4499152bdae5ad49bac160509292b557bf21c7315520ce000da31ab72011c22a8054a8478e6064faa0085254a102282922c82760004872353b5dec94ba14e439e9f6c890a26d68d09fce66472cc0265379e679667c57bb21f3279a90a46a523c6014d4b600de5012c022b61a100a7af8a9269885b2a3db50c6b40afe31c5a2e83d02b75d92dea5b2ab32e4da5847906a5c230f75451be9d06700855905529e19976cdaa66c033ed27ab128a324b5453a876c0328d34842d10556109148494a08408dfaecaa27f250983430ba455b9806772c0c7c08025932a48c5d255cb19a9ea90f67aadd496ae166944442ed30e61255832994ab025722f5db5d86776c88b1817e327ab2d69a9439a90d0c77449e87ef0ed1d11b0aea81372a931baaa240e694141d5ca3f590d082686d44e3693628730df4e2e318f58c97643dc0d81657ec038f2eb843a22c4f8ab0aea8a1847f4f68e28d29cbcbd5b5293c5b7df187fbb780510a2a531ba9c5ccd113d737db4fc99d4bce69831c37a897ab5f05906004500ad6e30bf2f59e9e477064d0df80d617e5d9e656220fc74a437e32fea665ec4f512439d5048d849458a28a95fe8db749939e79acfc6f99c1c00e88b4b8b733fb006f5043f1114695033fc663c047da35eaf2b90c01ad493274880600d0a0a14a028600d2a28288af75e442f2227b006c58489936fe78e224d976547a828a28834a6a42e0a5883028235baa01250a45145d18f14f45d022a0195804a4032fcab3830fec57096615549b2170a0985c4c5f884608d46bd608d20588342127ac27d5050624005a964a09ae2dba54409a9aa7858530331300e550c7806d6a892a88250422a1ba05e319c5349e92085ca01ea64c5c9c38167aac254ba41a90ad58e8a8e9b82db6cb0695268590d328c06189d410c55904a490ce760a60ca408a68c413c22230c7a0431862a09e3e818a82452da1e3ac6700ec6b9185f0f1507e693cde2525695a4592cefc5e48a231412bedd07952a899014a828608daa051ec5b7ffb0a24a227f80608daa05aa2b7eac30a95e8002d23e55902a49cb77555254a4965105a99268df8afbae6a89fcae4a25f4ed00a8398040a194744ba29474b24ab9c91f89128279a9f2d221d7a098c01acde237aab84a7ed251a820e91715a40395a4596dfa89349d9050a441bd98c01ad49315ff6bfaf9d97eb69fef4ce859984ceff58a341529ca3c8135a895effaca7b0921a15e15f5fa27367315cb794542793b0a4a4a1584aa48a88a9442415105792f5590f75205792f5590f79adc7455101b2cca0b5494f9a190d8e0414fa1906ec703950485b23366b0116523fa0951220a67e14f941c4e1665060c3505c5866f8fa839a8b04021a1a2441accdb514928292a2214d2b77baa209515df8ea9a498aaa06ecdcc2f74ce656a0ee8d4f55015c459f93fd098c130fb23ca50e00b19b999894969230d08d0a847f04cd7157ed81bbc483dd6c876f4d37e1844c5819f2a680baf47b3da83a809e01a0008226292b3d115e119c1f221007507fc10306500aa8d003a58a5f6543acfcc25fb187231fe20002204506fdcc8065071681830212a4e747156aa94744b532991139b53b32a25aaa0e9054ff3ab0a5225d128e7d4ebf6559f34152746871042283d5a21abd7bc557134975615b4c9490350716aadc15177cea7ec2cf75197cebf6d5f013cb9c98fc627594710a2935615b480ac595095a45b4356aa2095929e40549c28653097c1b221ab4c886ac3067dccaa92b44cfb1035477ffc54416ef0a05f55d0f79c3340b4605a75b59234081a342a34d5f33689c91b48303781df601f16d0a94be8d325ac3ba04fe7a695d0f9a3db801f0401ea0ef84902c4237438a24fc99a383e593353715a317ecc227d3217e7035dd4474e2d92200947318c3a6685541ce9746216a314c382d09547d65129cb10e7c718618c3307f41d03406f87d261155872bb94603075d1336cb5fa6ecf7ce994422078f05791e646f645f814e099e837228df6dd55f65d6f3af6dd8c07fee5271fe9943df3e76764462e709c097637cfd22d52719863ec6286b363804e87ec28d69063b7da78524a552a8e900ea73f18597184304e372b72d2c70cc2ee4e5ad9ac183f99249bd56936aff809f1a246613cfb5671846cfd3363ca94290f861744447972038a13218e5e369a6c41a36809eb0a296284924024305256617cf12a495e3c811c7769db623a956ec7005ead4262bebd848198ce86c99b9ee779d2f3a2e7799ed79e073dcff398a59dab385cc5e94f765d15024747337b5eada592c9e479a75318cfce3133a3605c45e5061142a8542b2b2c2c2bf615c7dcd2e2e2f2f20203e3c588e1c99031a39bc16dda8c19193603f20acf94b223ef7217096816b39325bcec8d7ae41111cde23e413ec9d275bdc9e4098173e2983d1c54974a551dfdcc33107a7777dbcb7ad80dc6b3aba43cbb2ae9d98fba707205d1120804a38048bc88c244f0aa9bebeeeeee16c246dfca0ae45aba3ecf3ce3799997a170fa8390c86b6fa2ccbbae97b0069f50a9f6544fa7527184ac70fa83d0bbbbbb85ac542ba6223c968a43a78cab862b5e69a5eb7a0e8582ac52e266b1cb68410a69a287191c9a1e6d4f7c9ce8f2a3f4e812422e701c73559cd1104a669c4f7b85b84d0f95e03c6d90bab4c450f9d6f50eb886b32208bfdd03cc6febe07bc9b3370eb8865b32e3b773f059bf4dc5b3370cb886bb8286df9681fbed24300908bf500a00fcf6cfc61dc4c30cbfb00b29700df7e4422a5c01e317123db3c31d700d0705d668bfb0072a2c7e6114f009aee1e0099e790ccf0e846b382f608d7617bfec459415bf1049963a7947c3c68dc7d1f96524af88cc2f2bc6e3ac80355c9420acf8766e09ace1be8035663e6e490d97d4523c274df1ecdc15b0860383c615400080232222127a22842414e509ace9984081351d14fae4db6bf262f2fcdae23942f966a8844382355d18b006e705aca952c01a617048df5e185e08d59f2faa50175ac511c24d1eba6602c3c5e46793234d5c16579cea361de3a3ac098c0dc63b3749e95695d22ccc2fbf56fc1220003f657eba651aaf88faed9fa69f0c6ba84f8fdc5af974778c69329fcec234a6265fab354949d2c2ab7e4d49d56d9a7a62e09976ecbb3356bebb7269f94caf4853621c2c2aab683463b5ba9eedc14dd6072fd918cfec8bb3d821159651b94aa5f2a9721abf930cf87402a6df9df1f7f413f3e23df83cfdc477bff163b8c7f0179b6ad232d6632cb7ccb7691bec6c6267f9adbd292737c52486bda7197cbbcaf24007a3c9cf242935ce09276c02d3e4613e214af47c946d62094e8a020201d1e7b8ba43fee65cecaac51e65a1922803858660100cba022e59526d467d5aead2eff4cd734cc75c3f7924dc0212c16ab547655eaa128053e28c1632d991fdfc648545b0a8daed51160916d36472ceeb3caf074b6fb8ee7ab0f3868b5d0f56de70b2ebc1c61b6e763dd8bee168d783853731167ada4b3f1179ccbdafce61a5cd7bb07c53bf1ea23484854d2a7cbdaae5bcd3e9a4755df72714aafe8b4d11adeccb515c9ca86a4b8f625273ccafd6f41ccbca49c3387da2bcee021e1d0d957cd29229c9e41dbfef7a969bc232edb508b01ee1dbf4794960991fc8a6f999fea6883a27bebd049d6c5b0e8a3586514ae9fca01368048da293bf2926b18a550785e012af08029dfcc2201efc4225ee17fec4f00b913cfb08b8c634c32f4f51f9e53088a28cf5cb4932fcb2148e321f1bada8b0c0b8f8cd240ee87ebd8dd35a6e9cb8067323de637e53cfa78f87ef7a9d10ac11693829333e19dff5ec47f45f8714592d74eb5837972a2c2bce15e1b973c589e1aaba79c6f21368fecc9ff9934d29a692a924ab9b6b2b2d1d12e6bc6ae93419869422c5c5aa36306452d25637e76a279fc82379248f54acca9fb82faa8c22a3b8d8d457222158d3bd600d5352fd8932429fbb501916f28c75597166501956862d59596492b20e49228fe1a79fee056b9a742fd517e3bb190c9355e7a622ec5b759d93ae4a23a3d215a8af552e914b4edd0adbe0cab10df3ade26c9bcbe0ea0eed93499ad55ea50c721925298512252fad9042524846e1bda94a2009548457ddab3834d555abf966a9bb5853f54d6a9a6392d378d038cd6ada17c1c0624cfaf60ddbbe8a33a7d71eaea7eed51df48b6178354a89522412f9237fbcbaf949a573b1a567b143265fb143258751313a7d11a3b8d88a8a5ed48884a402a5fb548d4fe293686317967b951a8fe2918bdd544ea291918bd5be435a69b252e3ebd5add4cd59aa8efe16ee9c73e958ec50c957ec90c961543ca44873fa49cade646329aeb84b8c442be9a71f272b2edd27bf54932316262c3516c52296baf9caa573b158048a3ff127feaca214ab1a9544252dddaa6ede6269142424a496305a6a4b69292d757397aaa35dec347abd5ed2a55d6af74be752377fa93afaa7949db550e7580b09c917262fb58b8abe6d7ccc1ac97efa661bc9cf4f4701d4409d24a8835a0a98da4a5a898b6d1825aebcc55fea104492313ad9b5ac5e628411a34229504a8cbab98caaa33b170bbfc50e95584622757e33291d6a5e13f96d5d8ef9f36b9751e1136e064b897ab7304308613a6e1a4c66ade9b7e3a31efc7a26bf2b086932bf2c1a1ffc321285f339b8b94dcb0d4629a5a4411488fed01f5984a7f9ac389b4f8c769b8ddf83458285f662a70f364a946f8f5b488b3a329ab40b538bdfdc86501eedd08bcb17cfce574c51d17c1265da51f3e8db671d9a4714c3b0d96d439e473b8472e94da26fc7e69228d3de83e53a3485e6a4d1244bd4e5e5b9d5e2979d3cb73467a4d725c0009e392d04f0ec0c6b382258a33d1cd5afd7f93da5588ae01a0f09e2e0d6e6ec345c632a8235da5d9c9df32c12efc362baa704d67052600d5312ace115c11a9c168ca36ac13344b0a612c11aed9c142545d4c5391757a9382e5f01bce93251737e548a489528f9764e4a639be6e4c8ab5a54a22e9a3372334e6d739b58ed90e75cb7daecedd78977f3c96fca50a5ad46ec52e7ee083e3a6775a2f7bf743c3b70ca6fde93fd8a8b5fafae903861e2fcb2b2ce6ddce8e1e5d9b50dd674cecec1708b6df9cd0e95bcda21936b1de6ad94dc6505b916bb7a170b7f8ae02964968c737ac42cfca1023c306b32ec92c643063e9e991e63512597ff34b0fd440d897587f72ccec1aec5b2c8958f33762d56f598154298107605b6045bd2625530255810568730200c28e58d8159ed9d9605204e535194698c62198d99162d16f52ecdd22acef6a588a4681c767aaeebaa1d2a79678d64bf834db9c3cf6b1f4f8ff7d1a9c93deb049c728392598bf59ee3b468b1a6efb08afdfc7c3bb7959ee3ea735ef7a66a0493e135d74c950bc3ab540a95b23d662918a74a9368528bd5bedaa192634d4adfe704556ab1d9a34c259469a585c611cc4c4f551c16e74e5d8ba5efa25271302eac304b6f73d2d9cf63aa2a4edca25b5455298db2597eba5277c867f1162b9f53e95a6c447ac25287e8113d6ab1fdd50e65beb2d428fb86b28fbea24c17d1a2182ca67bd689b8628d64bf39279feb4e1bf2c1373b14e31d960d60e5c3e7f2a586d05ce464c4863c6749facaf2d777c1e0cb1e2c5df2425775880ad1a296d54b4b89fa0af62c3031ba28b4e7063afd74181b8c38f0206d191d778b7b5ef9cd3a4f0586f3eb312c21888042932a38d942176180923a831797c6b37750c7136ecfcf8c59b20ae97068b7e21133a931b3561cac9d731dc761f3bb9d735887217958a555732e428f3dd4a715d23d466135826a2ea3e2681a0cb60511d1373fe7364dbf215de75271ba6eb5eab8ee3f8c49b38ab0a2ef15b6aa3894ae604d9ad58ebd5edf4e37c66640b71dcb575e9db014f39dbc2c437d9ee9e328032df60516058b02a1c5bca81812d2162d7352720afa7606fa76891d4519ecc9106605cca86db7b04da5f4da66a9739aa530dd31ca6e19e325664862cd7eb29f1943ca39a994b1db2c75cdcae71867c498616052302911429f5171e0dcb65971b492d7df8a94aca67d60f2109b536ccedf44207966f35971e6e6d0e511d6e6b3eea0f1d3a13e25469d5219b5878b7e1818b462495852530cbe25faace6503d4c11f9a0c299ea59c581a61d4e3281316bba5677c8d79cdb187689db6cfd2e06828f9467a653fa05a738a8e4a956ab73a118748c293433330309000563150030301c120b4603325556a50f14001384a05c5e4c1b0ab31c455114320819830c100000000300333322010898c38f6be94b44ba0319a74f6d60443eb53e3bfc8f4636beb8b4161c3ad14020ffd289576da0f324c8d4f3b643bd73bf39474d2517b05d4f47d079d3d1e55949eb7ba4279220507b64e8c70fcb25fcc25026f7bb7ff3e541dc0be2d9b8876bf51ce287f12e80809097639886fce1a8a1e09c95d44de773b79f3f9ded6ea8f1e32a749938aa5c10f480db46a7c786904c473d4a8f92c09f73d86a4ffe41f863e638bd2303c0a3a0383f00a1de64352c3459b24be2be6f32bdedb9662af92cfd883450f95d5802af5800ec989ef190a6ac1b2c72ffa9a3a6c0196d742b66221c0c37edd89970eb1d7c12ad016e8c19ce72e499d5b9188ebf058c35e1971885e7041f2defefdbf53243b33c5595f5c5261e0196079a310596f65229989ab04f175cd0965257eb0271b5d28331ee475dad9d0b94ea7a5476d5b2673749602f08fd15f8b6ad25826ed0cfe42c1622e9cca628a131b931c78aea0d2714b18ee1d36c11f5dc4cb8b185bd6fcd24a064178293c8a2aeaf8242db3f3f88cc73bcb091be85c12d6dae54e6967e082834d81ddec1a278e2a3aa41f6c27347a1a465a4d8c53966cc116df5950935327ce5355029073488f7259b593c0f54e45de9d0eeee94fd1e2a3d589e58e6fdb7170fa2cf34bc7f8b406fd3949645d3b569b9b4381cba15d0bfe05695a85b82255bbeb7f5b84be41255ec725e8f3251682c73ff16117eaf72a453e89789f6a70201c7c0f628bab8ac44771ddf4ac3745d150bde612b0d0432f2cc7dcfe4a878ca6a0d498a135ad92fbeb4626c014ec4a54fc6a5a6253014870c0437ba80d53de4330ccf0a7968e38a2a446bd6dbf7198428abc0205061c6c05eddf7e3f072df7aec90000fa0193f7b87e18eb149de70038bd5df332bbe40ad78866232a6d6348da6834a995f3753c53216040d38a227e336c49d52619910e3f68c8c1b29d1114979f30351aeb43e561f62e7b6bf38daa60e0363af4ba9a489491659d7ff105e462b806d7d31acfcf7f874da8d85ac8535600184f820ecdf4e4c8c92e2f24c2d71e8d72216053753321e387143658fba509a3a91f07ac2908530d4038d8b249bbca34a72aa26703e882b1cd29067a6c213cec6768673fa15df34200e1b19110c8cbd4155cdf41d74a97c08294098421268d111e02237a8a11e9016fadbb6ee8c597e76f5c3d60df7fd810432438b79a237f9b5dbca9caed22e18ee8a8977231c28ace5fcc3b482d382cc82ec78908baacd02d0f4207b15b7344e4880bfa1b67ce368959b3157d4a892ed4e623745d999b356ace3e21a79555588b508bb4c4bc36b30b45f98e08d580ced2b3818d17ab85fa8e76edf845576602db8cbc33dbcec197ab5da51039ac430506f30df7a5f6251f5f0c9a00e3fb49e28eccfe0ab89cf1304707f549e3f6421d7217013f2d99f860012bacb9ac0e51291ebbf834ec5f4a5f296f76a9ba3d01a5fa9fb8f3afb1ccc8ee1d98d2ec4863970c8a1149566c5983e8c8a8dfd202b96f82815a6a2b9aac2a8aac59838a628dc6df79e7b0370031bc54434b9d9841fd94739ccd26750505da648314e8557cdae1c1798da2ede68e752c1e92226df02c995ec83ed1e0f3b66615ca302b1bb9c54f73f2a8c2bbc4133309d8fcebfb317448bea06461b47c97d46e721ef4fd79fdcd31a5db30e416f71b147e5ff547db2dd43bcca6c926b1bb9d1c5a429f9a0e0aa0f527dd993a3e78ada861d76b5888c3945641e3fcb8cfec980f622061e8695b4c5e90900ddf61fdc6cc051976057ef8c63f9f1f3d170a48408b96c00e721c511cb3449f491ace3048bbcc076de16a6bd98a69770963aeb16ef6c1df39930967743453659cdd022fe4080a2533ce755777d69e6c57fb030c29d9fb13f54e14b17ce66dcecc4481e098fc5b36767db49b43d6db346ef9d33e0ec69c9a8be139f9ea1b0a7c4960ff18523c54a01c9a42ab0954703a276131521303248ddb5a7413a6e0415fd462ce9ec2cbefa12d3e2d97b6a0804eeb4faac006881530418abad89add6109ae538fa855c5bbe192f1973ae8d11c7472d49a1f9907b9b26683aad36407f0502d5d2fb09a28696d2630bfab006b637e47df5bc465209d58bbd8f6230c9712c7b7d35c547d34e8a6763447f50373d70185497c53b101bd9046311f06326d2be9dc1cfb8f1526d0c21f6e380ba5cb1fa75b3e108a2d7839436a3adef3dce4f8a3504d1207bfae6c4ff954ba01085204720a2aff4b08451c69eb6422fa2578556fa2baebfd4a83cafa016a48b606d4361e557fbdc86ce17d39800dc00a59ebb792c5dec3ae78486dd17278e43251b8a8ee090461734c699d1dd3cdd8fb02d5950e9dd19388a51e99691daa47da29bbb35dc8e71d588d6488172d7d5e3a31012983f7995b19669d5ec3fe94ab267dc9ea367f35092a042213a1442281d80478d59dab511dbc2ef399034d76033f411ea78060ef612e51ea42fe9b0195067515cf453adc752e974f1923556be12eb66da97b3d5240b839378e4a6d759347b8e7d0a9c619d97359e221a7e2703029a9411c6b18446e0f8a0f56794c31dd614d805cdd1d64f752b4551499dade05914cdac8061350546550786ca41128acfa4c7f7d28457699eb5351bf253fe13a279b883bc1f73744fe8a04a6988a8e8e398aa118c6879824aa4e8e17587519c511001510f7585eec17b886832086ab0d362c9374fcbb2a86424dc1fa56360c7347ee28f70227c217eff6547596b40b59f2728edcc497228c2ac524608b44c4f3e3192a2f19b5766506d246cb4ffb6c6d611d58bbf2f024bc002c60934980ec7986a9b0a311c3b546ef85dac2682faa8a0e756e01af46b43437132d4c05019142e907a4f442cb874b59b5e72ae606f2d88e19a4f549ec296495868101d52b62c8349fc41d05c22d5744825917337a48d35103ea79d909d02c92381da50099c90c256854c5a2085475d96313c029a4b3c07655574a7456602166e2a748bbc8f3f2f1c9e2ab60496b2c7b2ec9e9908b3ca424cb6233ff0b7dd71232652e602a303c6602c1c9caab13eae3a7f2303c66244495901c00d2e6c4bf50e5edaf1604b92c21029a1312a269ce15b99385ee35d0615f722038c63c4125902c42d7c6893f24ebcb2b0c196248121594a37524c9cc5b578f15ec1fb0cbd52aca0e9f70bc7afb35d9635e78e92d6f72242628674b642505e79d05d967905b73d2cf35e2d3ba99429a10560b8bf8fcd5996555dd7f2191bf3f21f9b654bef711d7c1140a15c6faff4d5dff9ddf0c7920a127ab628b7b04ea8dfacf8b4843ef3bff6023977ad3b8f68480fcd2a8ebe958dc97f33b20c748b7c9710e03840b08156c57dc8d92e265bdab7ec0ac2d2a1892c93788355738e146ae2521c55b0387232138c208b76504d82cc3e1e59a69a434a10e8d3908b4397185b6f8ec9f836d78a60396b3cf2fb3cb24cadaedc62a39eb94af85c906573fe207f4274ab286f677932c97088b94c81369be6092734daa8732349f756e6883d2c327b1e5162860831a4808b362a206c189db96aff6f016cc90e969cb26fb3710f6e65679a4dcc6368485f4f9ff1769579f20141591651d77b2b83f87d089a38eaa021e534d2dc2e987497cd361319e28794a95eb2e0feffddc195319573aef44145597e8c5db92a1fe3d6181135f9169cc86a2093f1adccd7b8cb56a2e154a3a980d186d83c93aeb313425f55d23db5ef782e66d9bf1e7f1e86c6668d04bc7170453a8e985d32ecc022be952db009d848531232194b26a720a18b894e473339e75696c37bf6aa510fd9c66d252fd9df6b87a38541611fb33d95e114a4e00651c6eabdcaaadf53ea8f3365b98a4cde2f91dc949d3a53c6cb35082eb950645ca82c2b836970f47f70f2e6a065e50f7de884865a85803aae59289de5e735e28d2c7eab377ac2421e5bf55873c5d0edfc1c62ca58a2a1b22ff3a3aed716658bff9840ce56859f6b2d2beccb422a5f57dce7a86bfc955499af2b43998955dbbd1bbbf50043dc526f23e836b5464ce5c509117284eca13e4f31be06e9fcb0dba22a43d4e7276391bea888eef23a59beba9dd99cb44315b54dc6886980eb5a6d23b192adfc0c6f3a74d416c62cb6c4f8a12219c4c279100d61fea6bcbff45e9305170717534c9aca3ea1a1b854763cc8bc1fbc295a08902c72b7480ec64643a86d30f44a33a1a5699bccc53516b2b16e46576b3182bdda87d6738f99a3c86cf922d2cfe3d33e82a5e36569a0c8c2f01aa207384943c9ef13283ae2e4e4bc1275a98a512d0ec97de66ef8b96c5b00803cf58884260e921132da741b7bc827786464121af8cac0f8041fa6a9e76046c2fdee758e69c03123a48eaf88dd2d08aa238c941a61bce28420952b8d52d8d85e625301bd15d979d88084b79c9e9cd6acb2285670c10195e6bceb4b1daa530f0bca3a551f8d50dea5932510076e2c5921dabc7b2023ae514714697a76796d03355ed0aeb2d94d039827bba99f7ecc873364cb949913033a19034aecfb2db16dc83cfae28fc7c5b34cca0600f2e4023ec9ca9ce285385d67d69f31c1ca80482baecb5e4551c738bb02e517b5692bbc87979017bab1090c33148818468ddcd899b484034563acf1be161b532cd568f4d7b2aa31afc85c890b3e8294195b42d4e2f2ca585e35d06e73115e75193325cf98c5283d959d198b6507c6c5c3a0d34f29a631941c92d9d1845051c10e658c10e00a7e98af562c63562d1121a18e95186365ceb828a3ed3e94ca2c8c65c65fb16116bc283066848769696d5f08d4291d092c8cefe11cb79e0b0f643b33c2cad93055086e310fbc299308e55c16f3edc7088eee82314f1d4c14440e53ed0ed88d771dc1b9bbdc22f404a7984b5cfa78d24367181734552a30c5d61b940c07e2fddda764b45d627b58728e70ae42ebb82d775a22de7553c7cbba6e6b1fa6bf4da627284f719f59d7133c616cd232e55a967d48929641d1eb9a2ba7a3dca0f374ae6bd88f95ce6bc6b2c785ad94a03d2bc021326ba905ad38c2a4c57441106af0c35cdbc8e7493340c0c2ccf710faa4ba0b69aad71dd362969cccada965a9a5a97dd0acaad12c2225f273e055a78969d5fadf6072056451dc05f8b675a4d09209e58832a3f5344659f8d2c3911179a06960de842b4c97c2a274aff3064185310a1aa774e89a0d5177f25a68f0a11fd452acb1c450192ceedac1e8e0b44170a17d870f6c7314f6ea552946973bdd10166427e13802f738594cd5ca40eb66feac9131203a2a7fdb8fbb66b33d32207c8c9d370359ff307adcc2631192c023e4fcf0fc8ae33f4f0f3e2b5c056265b18a6a7b43ce0e4354d9295c3879d4158433972d8fd2c4b233264f5d6bcd9666904bf776de04b9c568f7217d0cee59fd2c9541188b095f0e8c77b3a6cc9559cd9787509d76a76c78f5e155d68b9783094f9736d2f8b09a1a4b9474c367eb82021db3a3bceb416f94e4a1702f10a16aa2c3f07846908e24b6c12ce3d3d983293d9cca8dab6573e2ca9ae4580d53c458416383889e23804600bb3439a1d06cf2fe8a3c6d97690c0ebfe3e8e1d7901470dca069567826b579b7ad05139a1bdbb1ba3a7011fb3f86b689e23d5d17da40b08f27a56a9b1b8dcc15fc10e4483b43f362900bf6073c819978b4c7b25efd3f5a398648eccc668c693092db6da95ab5168e229aa7e5d3c75103911d52e422c1839ef7edbd60bfcb77ab728ebb2c3f9d28f2168f6c2dcc0418c5d1a800d6803e27e636c1440afc147b396c16ae6c1b17677ccdee90cb9447fb7fdda67d0bab50bd7963e3d218511d40012cbee5782e8d917f24845ec8a2ffc026a6eb414356fbde79d47d1aea1f49041486033fa16d3b46c8e242f68cdac08621b9bdf3f2b1b9fa3bd24e5139a7d7eeeafc1ed83ac212fe09e42aa7aabacdb11c18dad638cf1b94950487522a81effb8d447da6ba0ea220cff1ea9555445416c467ac1567c5124d59567d0402abd07dd1ca83c2d01f942690c99d190dea55923d2e1938ef3940175267550e6e082e0247080ad3e616c7bbbe0e6b5d974f059bcadf04adc763d262e20d58582c8fe81ba671db52ae95e904e3dc9efec3eb7da0d5a1fb054c86d27e5b52c425e57fd81b24399747411e0bfaa959ef5d48cff941047abd607b1a6194bc9babaa18baa5b57bb76be7ce0591a105b9e70e7626a908e9836ed37044484a95bb533a7652adeb88f1090981f52dcb57765981ca4c7fc86703c29e6811d58a1661dab9cc2f2986c2d850a34d28f8762c3d4e3998f9287899f672ec503324a662b081d5f72d8d98998a472e4e8df86321edffb1c47aa9bc9bb2459bf5ba2851dd381343433735617d5e6b84206737952dc2763929175898602e12d62341971d0215de623a4af93ffdd4d5ff7a32d7d8eb824eab904070e73c3984c728d61f8416318ba27e5fe277e3973910bc4b0a0071c35c8f1d518b39eb6eb61f5473a1e3565f25de7ad081a1dca5b8764d4a762d173fce2b2549c57dc371549263e31cac4e201b293fef0623f83951a3c1040c83e262ecda938e474b04a7075a943b87d6bc65872c83b22f8369e51a7bc129e8b981586dbfd0a833edb954ae50cb9dff126601725172fea55cab461afe4538c4b5325c49037a25da651f2195d07de7e130df571199cfcbb49508557b187abb19a1a95dc84f64e0252322285c5ca7938680d601668b9bdaaddfe556fdc6e430a07825e239dd347880944055c4a2bef6cd5bf155e60f7814ff0b9fb8e524e5ea5548152e4b6737de03ca6b445670767fa27b56f83d3c26fb52fa76d62a1ec99925e07f22549c7c42b7e143adecf95ecaf69851a4d10c5a41c538a13c35e77b11a2b2795c7241a779fc7ffacaa1f4e4a0e0d95a43d0e5d6462bba820d5e7c8714726379f5d3db71dc7d72836ac83ac8324ac1f9d9547aaff2b3243dc8db4a2e6a22a610910051d63bceea2aa0754c3af48d5fc52296a8dbc991eb0ee29f810ec1617623328f6cb03d229807a3a0f4e60053aff629bbf6727a3c50750ad173a6f0c0f885b11a0304d8d52969b2d12304e8715762c90590d400161d5e9fae79fa3dd78c13ab0efc0cdaaaafef8498f289404c0d50dbbd0f43825c00346a4e556de4d7757785e8a4724caeca5299ba0a618c1a21565481a441ab58905805e6d56f02ec50b08d0286c31f703dc629303ba0110e773dce7f4dc005017fbf590501221bdc98a01f5e1d45b82eea3ef728368552015c7a9bd50592542cc9401411a849bb29473420f622435cc6a423457ab25c9b28923f82ae8b00f39340d1f6f48434391c07383ecffc367ba85ff2e8bb2851b442b0bd81d34f5877092c4934cc4fa201810d2c76c0d8dc2309419f9295fbe24c3b79be8d80ca8916723e43023ebcf0d7ee43c167170acd18df850e3edc2ba889690340103b1ee3bdcdafa468230906ddadf2cbac441071c8ace73a1afe5d24361a3085d5639c5e28e51d3ec1473d78107ba1d0863ddf6a11d245204c8d99e548fb7ed483c7d4b03d3af673b171583838e409bc56107e259ac0903fcbf5d9899cfeb393c53c292aaf9056386e40a0d3ea60bae09090d448b149204fa81839f8cebf264033fc60b671496f0cbdad7f5632a3855cb8f0f1870777304223bcf61fa2d5af3926e9489ce8e8d5890b600a81eea96f3ddcbd1afab1158020151f9c62edb59e59360d7a0d058b19a52f09af85d135b057e6f6c9842bd5a6cab151c646ebf06b341938132a366f5af0a82e2e519816af430a2104db86946a145896c6c362bb5088e956b8a7a2baa5d38029b2bf5ffbd12f177fcb95d37da6e2670195537922f61a53af4569f12ddc965aab4c299b0bf6f928fb7c6bf4326acf62ac2cb9b5a400acc765339ecf55766b8f23a19b1bda6dd1ff34669e879e66aaa038f8af3b08a283c85345a81039a1a8f3ff824dcd39d620cddc78572391387a39b248b3c24072a9fea19ca9155d2b5cc55f957e50863a218c67294068957a373948d808a0f393e698dcce7589036de1af6645b6b242d62cfbf087ea1b978e99cf429b1ae2ca40e1f8ff8cfcd9cc451e350e2957ed61cd3a844df9773da6efa89206e5255ae8d0fec8914909efc0834e1d9f6768e005fa3ffa181f8b24f48701f6a4e2e77d9250ba8c41e36d279f2d5ac90957a43deffca180ba74439c4ac2f60e7c0e1c855fcc839b7c0fdfd7099940955a1c6d904759ad926479c9b1357cee54f4b6d2d807bd78ffe12c19b330b514fecb175d92714eba9f7c4124fb6989bd49a8d1f804a2ebe47243e5d69edca3f2aeb9fe1ab3771cd5037568a2f8f10488cd8beb83c7da16c9fa2e7b57c7f1c7a43d15a4be19e772c7285741fbc7f8893db87788443c4d885c6a3f0c1b4568e347386c88c9b8a81c621e661d3fe83d3edcbd0111424b6838ac51d34a901e9f44d4b669e51bdf23c5fedc86acb327543ed4e441af3abec116b252900950307ca82843810e651e6c0b0d9fbd8b8e074515df1c65770d2ddeb35bd8d81537b0961506b5d278fd44e471aaf0f58b4345bac2ea8b84010b56582e2a23938b6963219b408f82b5dd6ae2b87de3aff340da5957c221f028dd1090278f9d36a5ebb54fbd2d7798aa9d512ef0cb3b53e1c0b3dfbb7d75c61da6b8f7ae55046f92b4e32d22b8a58c3712a297ffa573a63afcc63ed9d627f1afd8ee56a500f01e8a3eb62d30f180f4bc0cfcd7566868c316f2e00382fba6814e5441d5eb59bdfe63500d9a8004a882b72dbc09a804004116ee8784f90372d418aecb4c395dfe095498be17b04aed4a019dd9ff46e2da73931b9fb75b56cbd6e8db8e494e43a1bf661c60f54f499219d320e604349fb3674ea1d00b4fc648ab666210790c80dbb3046a40ad8329813a40f9b40801e81eb672e7e5b17d9620bccd93954acacb8875084eb70fab075b71d1ffbdc8b10018d466ed9b32c71fd92fa2dd384977e043ab2413de4241fd8e604612e27dacc4c94ecf56533d00af660dfe1c6edd47127f10ad87341b623eda30adf031fc6469ca49e2edc7c751051a13075d5d57aa4f5a33cefdd030f6f2f9b917af33ea75a45d36434e87a2591e5c0c527539ef167ec93209bd2ce0f7ff2cc73409a1f33d97822f53c18771edbc2f7b6acb53060ff6a1701ece26bc5d51e19dcc7c59143ea50bd07be77f660be61ea601a3c24ba252e40c022c41800c90568b42c446f9569404502f2d6a4759c03ebadee7ece229ba4f3f7443670b0c27566e4ec159f996021490b9668ab92e7087250458772dd09b70ab22cd99c7566b72d608ba1ec06c5c225ebeb3b12726e12b6c250e6c535ab83f14462a317004aaab1b98666c7845017c6496413173386b8e4527937590f4278b9058a2d8cbe98a5975b86f680d75db458895b3ce6bef66db914c2606f3e4d85ccfd02a23d6725f150a6f164bb77c7a1f3e33337d3c04aa73aa6da4b26bb636e27e0acd304e4c281f54af7e615bdc276389502fc34db91a0f458f8dd5d4df019c9448a9a4db0efc38bdffcb78b7716cba84a1a8d74dfc751a10df87bbe3f80505fdff5d578bdbddd6cb654abee2b9225d0b39910d2963fa722f839eb92af9d3b3802b695e48a35f0e2430a590234938f37501e60cd426bb61f91ef90cb7066a6ee5c4a431ade24a5a3081de200f5e4a2b7b59b56bdb119445ff73c04636f69fe43f71ed101b662c59117f6a8fd26265ae6e2ca9bb8edb40d67b056ab852862e16a33fb91fbc2f43ecceac9c0c8bc4b5454bed52f5be05362cc67a644f04aa5097289b6b092c0fdb28977a8221882750887a3c77e4bf6ca2c0bedb9911272938b0d2cbcdd39a6af4b8fb52caea1a634b0e013d38c2ea7f492afcfd912fb52dbd91f41cbda2df20ef278b5538b1f22aa4a1baae1f83786e70bda63d1b6069f4b29248a56053ec78c0cb3415bc835c11d00ff4d2bf6b91a0703dd4a96522906f808e4bf89f68930cb69b56a3409734302b144338280c2e8a88d5bf297ccde7b786c98bbf7720e060fb3e74d0e69648cfac2da7cd36d31bf7de2599ec2704579e0b334cedbac5e3da944c808a9f57df1074ed18062b2bff02f24569af1cd1989312d820d699857c117a1a879299658f7d7cdc1d5bad4d7f15c87fc16b6c73de0b87d2970e96de6248ae4dea7e75483bc6ebb072c34f4f15432916668cac2efd3fc52680477ca2c80d358222e8172d18da2575fa5d532764ee5da7300ad8af7059a1837a922531d3d86cd20b92908c29d3805c1d15023442c71008831334442833de322c013b6b2093082406881ec6acbe8c2659ffc88701414f199802ed05dd98222ee0f85303efa784d5e4b6296226b50e73383a1338a313ed1f357d3fbca7c733e0c3ccea42bd8ba4cfb6609eb0b2f98c57a9b8c3188ef501b4f766706caf6134de27739c185ce7b0514a58e21c4b471d593188b8bd73b54457f72e6c60b7f8dd4ce33a0836759dab01751b6e278459f16526e982af8c602a2858223b41386631699d48e07b6f242db050db991503e011258d443b81a37a3792c41d1184a5252a8590889559bcaa74c136119ce689af6086bfbff40acc68f15c77261e485b28b4358e460409402c1dc663a96a785d1cffad08d3c55d6091b110104a6caf8f32511d9d098f7dfee4c14b439f64349474548ad6c628e8bfc8c93db4f518557a31ac226e5a73f39dadcb39580f68d89f6f924b4561085d86aea6762c2076ab678424a2e95426e652f990d219a7b25b72df849eb27b5ae8c22489306502fc8389edb56011eef3f58d1a08471161935bef05e1f301b36ee307fac37ed37a4b207e2b5e8a7facd6825436a24c788bfd9299a56af8287579cbfd847d2fce9b1e2d3f6d69732108751e17e119e9f05c1bbdaa3ed38f126e823911b518f9da1657bd91513925faa2b35773e1aaa39945542bce61031104950eab3daf5d77b00a5895a789360887f47d06ce93aab9c28c390ebe613454622b55d7b72033939c42898c62bf687d3d0e7aa43dc22893ca5c344282829ea5081f890a88f407e010d12606335d9681e47734770ed3a41d2436c3650ab644f59c4a9634cdc0886fda3dc2b0a9a759838934266d73077b28836cffae035c13a39f46e23cd7d777427f1cb954165fd21b11b4d2e9a32e77e33fc40c55d5d0a9426adc41f8c450ca7df638281f9739d3dd06ddc6f7ce6c9cac3d497ea7386d5a45dacec72d1b2254702787c613d2e5ec6cd3408a157c03d41b4bd503f7c52483c5f8a7bc2966f1c5020749922584d5a2a1db59ac077494def15d00fea4e69c3ef4c2c47e80d98ec125d4513090f02bc9f681cd7b29fedc94d14d58b7f18a8a75a79082ac3f026dd27e7a34f9b9c66140142874098958213b43c595721fb332150c99c0686564e79596693d31ecf687409fd0502a9c7dbaad5faa83afe8863c24138bca6a924e79fe45521d66b0218767469eb9b8d0db6014053ae92f6282fed46ae0f2fc4d6f9c3bde56bbdc9a3b7bc69f523aeaf8002d197fb5a5517f634e3ce12b6598393744621ae5e5424b75d7d012033d67259aba79b76ec8c3551153d2910f73edb88de52436f12428b4669dae86bdd2143209d41e9b7200c4275f5751c93a9c893eecb0d20b6fb95deedf0be6ce71031650c32577db0c929b24ce96c213e326b4e5ca4f49c4142382f6f508cd8bf1062826c008cc76a5089aeb967c8bf1de38c9e4919242890e5a3d2dfd86d4c21c7723166c89f6aa09f5eb0558d0c9e9c324e77c3910eb2e82dee89fc1b816fc5ee611a70c47ada430e89a70d3389ed97186ee1faf6ffd1871874adc25f964de562dcff07619c8959c24f176600409f2ed8477ca20f8d524cc0ce0b91f3edfd16544b251347f7546e1e678c0738d06927e04960c7f3625081c34fd1ff22c60a27317dcc9676034ef0da180443a7a84e7f37aa340dd1fa313ce095172877811e5db9fba605e87f4cffa935700aef0c519566c18353967804ad81b204b1a400091d54bba96465038704eada77b324eeb9ca2887915e7d7c259946ef7713a661a03884b2dcf8b16168e4a96dbfbe247a227c9bc8ef99d8857dff5d602c4587451fd315ec3a8189e691b8bd7837b8620865454a29a49255870f011fd74171e633e1ab1bf1b528d6b08a88b903a20a6c8c916320020218d1b986c425431c3e3e93fd32d97f637236ab6bc31bd35965a80ad0c794203d9bfac9a4c1c4faeb47262afd81c6a746e533fa1e08deb5a60bbe664435f906d5011d48b75d1d3fd186a526e5d098f3bcd8a84285977536a0dbfe01240432ae6d51db35d3ca61356c3fed975dcf8d11672dab620fa98f331ed9f5eef5bdad7bce15db89cdc3c3f5a27440bd12de4a6a888a923ce573c845be46daa5c65009f4bbefd73c051280ac54c50fc9b105eab992eaec60f161b000a89b539d21d10c9baf01b222f449e5fa74f73a92a6979b8a62e4d206f5e410398a9c68070bccc9d14924c24e83ed91d25f814d14f1fc3183a469ef57ae8491b903cbd7a93e7aa64e180dd5d37387ac27065da30f221f1cb15ea5fa0f00cc5ff12c451558a535f9c01e602b4e106a596f32a3c7f45fbba5bd51698aa8c6035c8e61c99ec4830d9278e73cb4f3b130bac26733b72ffc463cb6afbd8dd9c3d25da3b310d6266be42af0de2dd03341e89958357ad7ef4a9c5c8d63448d307707b5a5a64553ffda38b5e213423aa613f9a1d4a010ea28b20bc42da2f52efd9d1a84a8a4c45469d18d7dd08b72185f0e7a06c76e83e93a5b8b0e85ed8671a14fc922d6525e85129a11a8f22742ce7cd306a096c4103fc1850b12060a6ceb5e9869a968024598dcd1e1681ba92830aa0ba2778fbf2c601e9e4b8e81c2075d72c14bf341e0f4aef39297081bf27779ab2560725f104f59afeaf295f9473ea7de69ff5cfa532a561f643da9c472b512c80938974899fc9f5fab6c56555b8f8f87d87f2300f488689ff2e0858074395431d039965948744a8a4575ef6778b50fac26ca82f2e642015d9540ed6c6741ec84142814d1ef2f99adfa5fdcb5770a0711628230570a253ce9ef8e3ae1b161b39e53f8a1bb73b80fb8454669503535da3a482c560fe280ce2b810735a7c5481c2f8056dd3f267eaf8e077fbc17ff6c6dfe737426617ae30e01e6cf0cb5400b77dff02eda8fc327338f418111f9b7c64540a7d9cc7f7ef1a8605c13135bfd35194e0c1ff60ecbf74558e04ebe9d813c019b84592d1ad73f1521483250039e7daba5fa672e3d4d146c0278341f8e192a28ce0241e50a10813d8a5f90f7211560d5bbbb6171c7d48324bc7155839cfd2069c275fe6cd905920be4c84a9da1c998f65b9fdfa54c692da7c04a416f5fa73b4a88a6f8aa105cae59ca3d44da817608ec9d0dea3f36e206882fb61db5b71573fcaf065d0410e198d831f84f6185dc5cde439e9a228b616bd74e9b96017a177dbc2900e332bf8ba209f24812e1235dbade1529693b9df66c79347457757d42acf99b62aaa053e4d312f0eec79432e13102966d40d664ae570abde9614e741e3db595fb91cbc0c044d5e2b57c606daf17d6de9158dab7225a8ae6a450593860dd2961919e6716d248be5c61b73ebeeb9b0ba2c99097939fd88c06e417f04eed9d72ebc52f302a18539c0b67b47a9cb3b965d77f99d3adad1e256505b1433e5704131d433c838842606abe3d76fb3d1d169dbd0c307816c275c755bc3d9626b8cc79712e3a56a6d10b63ad5323edff138306f21b63a1532c5811758be707cfbd36398cfb6f30cae6693780dfd571c66152778e060f77e581129b0a6844e743b6dd193c2cf5024623f6ab5318aa3909dcb04e87aedfc370780b70cbeda991a440fa8b239e6b57cdcb97c9039164ccde716248907241ccaf969474631dd70db0c3549e44a5a9308ed4ec2d2e177beca2ae0ca2eb7f483baa808b73b087d04c26a031ac99433e437849e265e7a8438f64e6a88c21fa9e118c644c2e7f8c3cc1ede87b6de4b83e61f45b89f4e1a5b80e3ecbf9850209389905de331c2fee49b3930c6e9538be87dc27b3998d456b4938abe794c6f7bc14f7324856d320802d15d16c8aa1822497ec21e150afbb3e47e2ea8890c30dd8efac52b08a836ff031befaa5284367a12a3179190d8df3ce271a652627670893947fac95aae1e63396114a5bcd58f1574601ddbc6f88157f67de08d912c726ac4793900c140930c5e2d39efaca5cd322cc640b613fafc07ca9ac3d4f42962db912947ac74b2b616918704ad93290061180f4ff352625456842f033a06c0262452f954dab349824b22a0fb539b15316c362bea08f9abcc8295090820c9272a993a700e55dfff190b01b7a44a8bf2e3dd876ca613b3383fa9c9453caceaff4fd63bde99c7b2a1c805b88e1bb25d9009362cac60b5320881589147f6c27007c7550e3842c8476a3f18b9104abf351c3b3dc6fee33a2bf9d3db36b6f969acdf5baceef4a8bcfded93d91f4ff86b56e5a2210e2549d0c8d1b6cda5174d73678b545265425f21400cfce2b89b4eab89b2f8b8a48f34a7ac1a9fb0e4a0731a69d314329369c9f173ec8287442b54917d2eedce504811931c907c1eb0b8fca063987c92507056811199004c75a530f6ec3420bce751b56f3be7011724644bcb77653ab803c19e62a3f2c46ba12de1d7e06f911ac5ba1fb8e2a3999630f79bdfa14d12181cdb4a5da037efa10b2502c51d078ad1609ef58b3ed0940900821271c65936a05b53c39a96b16377f7089679b62f14f6b94a78cddf0c89492500dcddd33f360bbf42d52afeab9ac2b59d4d96191ffba17b4a98777a15e11d0f4fd772ca085e619e9b564f6bf69b1c15bb95741ba75bdb961940c53d0fbabd65748863c23f5262d42d28e50873f0fa8753db0d2430d4bb775dbf40048b0334e8a6e529da36193350ec5e94d91df15bf047f22f4f9763f964ce04964d04894c2e611ad6cbe8313dd5265315b3ff0ea5187046f34ec6603261285e0aaa5d2ee6c457a4718fbfc898de0b088ee0d3340a47f5d99718280e96ce99a5232b011af613efc934bfc5ccdf4f0ca60a2cc3d89e2502f34d54649cd6347b28b0aeef62406303740bb415217d81d4fd4b52cf441f6a316bab3843643f69b9543af462ce15b2aed8f320adc439198ba9cdc53c962c344c3b985bcef56debdca316618e37527d8f285d35ce5a35fd87db1a1682fa2d8dc3475c746adc6cfc3254beadf8b0b45eeb647b0a4ff91947e064f117e24887a048f57e024b2827687f52710861b3fe718616ab25876f3c50396a61f1de08462bab858db79c681d0ae8b197885397d0cc075aae745d7a68a22f90ab476b66360e03d1b4774ec488949b828f4c7b08041c9bcf1be071026b05724ac66e12bc0266a659afe5644a289f9021b88bdb7b2925a8aa7f95e88eb862c40d7d6ba6ece55e65132d74365e33ac0c3c86dc430213ec85225b6c17b31339f8fb057feab6d3e905fe9c856fbdcdcd3d2876ff1322bc27a2f07ad44e0ae94360122c9fa5f58808446def86a598bf679fd4e9773bcc015a3cd5532ba8aa9add08a8604cb24ecf9c209dc6ad40415e3afc9629bb2226dbca1ff3aa33f3a2e7d85b9f4b746c5aa4eb4d74e1336533ed98195fc49a02f5503a1e90c951fdd635d8b3f5124baf57a05b895a8fa2da401b0c908a3f41bf735014087b67c2dd161321901091317e148d5fa202653cb5603d62ac6762aa1128aee8f46a2e312264931455824cc93a6d5e1d34369bc330c3525038880d05f7071832ab4d24af6ae19bec54f00f495393496b7a94f94f556d3b26dadd61f9d823b481e6ffbf55d05b572dd08c71b2be278f1de507b1783392232210ea1dad7bfe58652f04b47f814c3c091f0e82c87f54bb3763dc781bd19ccdafc48f698219b0a425d4a1fe059107e022878651525017ceaf8190372072ae4b825d7930cda4dd6c6c763533afc7ff1377c7428a454f256227545b022642b837a626accc2d167752714965827ba84fcdcb9145e315176b2b90c2bbe88b7edb812e8d1788a838aebe603eb5f0b3d1add2b1a195ae0a5462a45215c2c3a33f50b9632a57fd09359ff37a9fa8cda7b2a16767fc634453003e67283d8082c3c9c282eb1c7e907e1f15a0de41f4ed9020571243dca907dc54323af587636adc9f5d66d7e46bf314da7431a076cd0cf6525ae2727316765706f2af7febc70957dc03c7734a191d7f7282dea4c2616132ee02fd3a3da0b597a73cae306837949b865ad0b36813955c0d83df9b6453ebdba62cdc3549f53a5e1a0676253e1a15b5b86905abb420edbde6edccccd75dda1c673b2894587fd188a1bd08b462eb18c91710dff82a378d550a2e2cdb0a2a8adb684a99dcf87d005c5bbcc3034b7b996ca771b1b4e180aa065db071f18e4b47af0416ff86a8ad9e6d3c5f4b651839ab367a321bcf945a6c911562a8928222038c01306dfc73fc60ae9a13bd1b8540c1d6213bff721b7050f64c6a7c43747bf14f814ee6fc95b34f1187c28486fa623e4e6d55a0d45e48418b2c353b2686adc72e52aacb906e615c457b348239df78756a11396bc5edad1d34b1034d4eb837e68aa08e09756406362687820977cc6eedc16d245e3000ac08f381b75bc01848f581a5841aed26e68013e38656a5149518d3e6c1720961e340bba2b0f6c58a6e120580db4deb60407c131fb31bea1d0953f809cff746633073ee4ea117bed2c5171824a719a22f9ec8cd452925c825a490fd7e5dc1e483e210dfb4116b0b600bc72d4ed8801be1da5fc7ee76d899b020de8fbfab3f71099ef4f941b765c896bcadec90dc1dbf754a99b62f3fce4aea7b3fdd0d43a829687313e364d1ab855dbb16e24c64f9708d629084ac514e1b919b017827994293fc2a8d671e9718f7d1665634d77077e84a9426c4e90e76100a85bb871621ca8c5eea47a0aa0f58750835eb29b89a891b1d2832dac9f035c414a15ff730d3756ca9c2bfb81123ab4d4fe38b28031f7b5d3c044e504eaf056274803651068d5891985640c1b3a47e4b1002b902876e3a98c8be4304891538568bdedd221d7e982d5392cff3ea1251eafee56c5386b7a85c60b9ca995747eb4b2b2f1e2b08f8a67219c9dc94e053ae3bc6e946ce25b44a548c748a8cad6ed2ff319a9de79ae2a99b3f18ac58f35d18db27ceb4490ee742aec784b40929f182afc97b637ec4e9b7bcce065f3ffd3b9576f7d9c9602e22d4850200329206cdeea070c07119cbe809f03039f217c52ea27c697412da8f30242a431182912119f14422d67de96bb03cec8a6421fbeaa4d08f7c40e15e1f18f739ca30aefa715eadf9c070760ec2ff03e5ff38130ab5d00b8104b02f10cc84d141bd66304b5c8d38e17990a93b398eb8200decbf272701f13c739545942858be1e0f3c393ef3c7ffd91374e9a0f6d1efc52c72b3dd96688defade41c82dfc65e56a8c69e2bd06a9b377773ab8b5114fb12a6b8e1462782c80c53c41cc6e68f9253a07b8a9dbf44a472cd44b2e3d9bd3ed3451bdc14cf05e1689993ad3c4e3583b8a47e19172c23e223be8bee6b7aa6a4189349042bbc6944aa60aa8b975ccfdf2fe3b258e95985f6438d7c6788e9a738c42a271e86e3b3080db5cc2eeb672890d44b681cdff985ab4bf8be492a57140a04180710e157646ba8d11dfb0e1d333748a0d67105716fa527ca74e25dbbdb4191c60325479c13c99d2224e82fc45ea1845e5d281a19013990ec22a952a780e959ad6db2c4b0360abf8e4c6647d02276156ad4970fcaad7bd742078b2671d718a98f49a8888aa5db25f55c2f3ac7e5fbdd395ba14305926ac512731919c78e61bd164f7bc87f31f84e78e999f4b3ad8b1f0e4690da84b820b553f42e8c4c70e9df91e97fa42b9e59a488042d6c17acdce060a5394d30c2c62a35eb755d6dd66815a47e5685f0143a730b4809321828a126b526a2ea5406f70f2718a75b04f534125248a9bf9d25469bc697e1ba022148ba9e471454ab66a654b40248bac3201831be7c01d1b777b104afa7db863ae8af26ccb3d0270e7e00169de59386491636ad4c23609784322dcfe96d7d52be1ffb292c8de5f6033f355e538de5e0504a6e2d7a072c109235531f40538e7e4d6b1ca78187def813ebf402218c98aff6adc58ab3513138a2a2abc17ddb0613a1dcd4cbc2a975e6312d36741b08d669b5425d56f911aa9f90159d3bbe8259612bda95f62b8de2f1ed9444d342af4091621f139af8be51cefacee608a4a8908cdf652e77f28e0167901b9196a5a2ff127a4a88d9a56fde945e3ec5548b1f8a678319b936dd8d6706bf7710111fe45b1db95b26d286b4f877269e83c9709d7adc37dd63e5ed1baded2e1466be9f0bba5d381d31d839f751018298f177034102af4d54aba2870841264e16de4391bdb4eca2ae05e2cea36dc29cd935adba7f48024a102601ad17c843313f5f71fbf51b3c474a05295e8888968fe33ad6ddd50abfbef24d324f8e921d382fea472d038b6832f23c351f79294200602216a452c2518365cdb5eb4d58bac79e308c4665446766029514969d30331422b623336c0409997a7b29ea574855173c5d22538fa78d588f49de4c637e504642f499ef772ee901003ea2b4e117ad0acf502345c20aebf7150535ce33d1c5a64f67a6f94059e86a2f8e6f5c1c0e4bcb71ffc5fe3cbf3caefd12bf6d35ba04c96a9a30a56f290149534ba53909368647eaef83b3103601316635340956f5f8895a668e5d269e7abf7f8613caaf2c0bd210f3049383aef0b0c5f031d074bdd058c3bea631ee19d2fffa2c4e2ffe01f51a3e711d52681bf761d486f48df1592c038b12b3596546378ea43515a45cc3c1714486a8e81e98791b2f625aca9f6ca2a3dde11159d498349c850b2568ade344d81b64424719995e37eb271ac62a48c450ed3b534fe71a91d131b50b97150c3ca12f7614c92c7c6ea6cb62205389241eae61f7bd40c738d2da27355c3a75f00de89c7ca52c7d6ab7b6672b9c2d817d3c7ce8d3b5865600b5a882fe6d01cdbc4742a4de45bd0ebdf2b4b379cb15043e9ea35f9415c6dc2a137c013c84b8401cc8cb480f31b783d04e4c7421d57547341096220e24fc4f0e0c7367e744aae962de28dd7aa69f905126f4682ecf337961867316cbfab1f253b7db6ba2d642fb68aa6e72d79c49d849908bdac126638c455a8696f0f8dc231c6cb0fff7e1fc98755993143bbf7b8828059e1c23d7565b1e4b0a34625f3ba83f9a5d900f6843067541c74ac1f39ad765b76f767f7d28310f8454bd01a29466c989e8cda5f1fe622243ada3a11c10a82ccaff06a4c5d6a9497647ab696e3db4a1a51425efbb9cb5dcde2f8f492a54cede59ef8cb67bf009a229689d7e09f7376840ef0044026de9327fe559c642a2b164cd8856ae04e9be732a8447fae8d9c5b430d348b8c0a73f45a65097e80b97efc15624d3902322fa1afae0cb29b56dd9d1db0d7094b81caa4834486956444db4dcc1acf8aeec6c476ddfd748bae83bea97c6c65686079c0a7ce2765b9cd8811f8c512e3e16f3e47fe8e8f22aa698ce870dc829f5300e751cc07ec01857fcb1498a3649c28d262f6305a487e40bafce540a929d3866e079a1bb8bd4e7db456b6ef61362fdc05b276cc481767b6dd656a2ef42d6dbfc7b8912bfed3fc1b9c67322acb78c2a63b833c277d68a9bde0431cc1979d0866eb08aabebca029bca5da813aac80da68a7cd793d6cb1ebdb17e22a410ea04912a1f1411132ac68a3a58eff5949bbcd95de7bf398898c0eaa0f8fc25bfa4e637f5c1f3e855b0fbcb5813979bbf0cb68f9b69c4416de31ca6b25f34738a269d91f30b27cf6cc9262b617124ad8c2b4f85cc95c17016afcb7227467ee399fa391241543c5d89fe1f0944ca3ca53cc6b770f41222adce98efa656e936989df390715e398a79e500696b7b7a98340c9409b79643b4798a1e38f1e6dd684a22cf4369bcc84714117aaf3cd93f2bae4ad4da2517eae4e64545f3b90f4bdd6bc831d54f6214f1c92d2e2f90fe688111a74a1146d67ad7e53dc506af2ea9647ff39324a0f01d8a2435406bfaf7ca15f9ba2046055050fb0ec0e272521e7bfd5bd712c4c0d3037759248b2e8547e155d0b3ed8d4af61ec4eb81a21f1b9f30e241a4e50a41ffcb387f3974a927737251c73c1b71e22541d46f1aefefd2df4b1cfa79a5134ac06aa48dd026424a0ae14b844074b0edc961d24503b030e7336ad53b208f81cb92f1c9514e9e9d794925833affa1633f5ba32827d01a8c4faf97a0d5f151a2ec2e2ba5ad613912151f1452c154a40f20fc52625816bab6ff37a70497aa5ce96ced515e27a9598e104c413f8c86e8044b7b343b576eaa6215ec571e35706c1841ec45bc5da3d1ab9711eb5ef4bc43c115e88f4b81f4359885e5800f407778620a9f7fbb8c3a1ba247fc74a651d8c57392c163c4a74108851845f9bf513dd000ba52c4e209faac0958e874badce0f2552682d65604f279ec7b62465be8c224eca5384fe00874108b47c7bf031907cc9d5f2ce8383614a73252fa927f2e40128995d277e787a2f82918160b1ab8795df5cb3016dcb60ed41dd18c39db33b7842f4833f15535da40e6e100514c0431324aec9c91918f29377a27fe2d5c0f2ed76fae1de4067b9f77c121224d019ce3e5f79f79222367b5f408ce8da8c1ce4afa07b72505d26f9fecfbe198bee2cbba27cb4572b33ce9b2fcfa24993faf7cdf7b25a99bc5be4c48e902709d4232033213d414e8c14432d024dce88d680ce643444e6ce4f6a6b7df9880f51667aa35d61033e96b915e1eadfd7c2b13283bbe1a5b52c1112706a2ed0dbcda6b74f452d8cbb29b7542ba8c6f885b4ae691420361fb6f16172944cd5a711cc8e05650bb17d8ba7bbc5f27417ff945011d402c8121b4a75a6c9b81af2a212d75aa4e29fca5804db41dda770db0e67f9b4849eb88f6057a1744cbb95427c9de4284b5c4f0bb8184093d67eca41f52e54e0829a245048d43897ba0927b4fc6d71a9245801eb6107cd3e72f220ff07391cbd4a10013608e979ce628d992d6c489b40693a7ae5b1b8788458614ad4a68551c1e887560c30202f73fa257526dd339196923a036d95d3b75cadb8c5c8c0881e8a0dca7ee0ce89d723f044ae7aa866c2beab167fb974d263e1643c9abce906aa3093f70415f2bb05e3500ec8d98755a569ec06411eab8dd70dac85ffdd7dcf6c519e8bd07e8f534c0b3077f10a8f5cbdf338f590ef0d6f920fc414491b1b3f3968bc213d11a542b46059172c4432f2327d210ef141add1bf3b505287db9cb56b19af676b64f024a955d0cda33f9205e203c3d054274c46fb651c5f5bdde0bd11d345683cf01d37baaef09b8806105aca7cca8f3916fb67e90839adb1e2871d8f92a2ef3bd68dbffb10b31c089db81d705cb84c041a98fb6682957f3f4e6cfa11535ec31e535db87f18b7742bbf88913357575824290a40d1c13d78574fdfeaff6c71708390f389e9045354f4de4236bb743854255191a64554c2cbd4021e2004efd96375b7e2b45b2bae88fc364ab5f256c6ceafd77035d5f0d4a3788bb9a581da65a94ca51a40c781ab981773fdb2baeb7c162ab0fcac4f3972c3774f4a143599657845962e6a5808ee0d8525ec9af2800a36c51781819f42905150f3208509e955fb71ce681e93708501dbcfb3883b01a424896f5a42c49ef0947e97bf95d40edca1f7b278430e0605ee28f68e3720eb7df76247ff4e55cec2fdff5e8b828875bf128932b2baefb3adbe04a787acc888c650be195b04a1bf481b2f409eb429e1cab24af8ce40016ced45065584ceafa2d9ecd521fbe161a60bd5817969dd8bc9905ceb182ade56553833cb86049d3634e9d80cc2189c794623fb215d1b0dbca72f8760e6f40996770aea3770666d043cc7109fda6bb39ca43eb89fc6f8175eca39e7250ec1980ba420c748343d842753704fe32da4c3d8091b6d760de22ca175b4a050261a6e64295222cfb15965e3682b36d9ca0bcb1e021e1a099b69e7ea6fb5cfbe5ba31a54141c05ba6214b17a6f1145107b24c2ee29d9f60ef69e01b250ad40f1d342c041be272204f90d20d88c8b32ed71adf3b4ea795965b25386d1fb65aa9ec5df319377951ef29795be48437aabb6c654c8e139018f1de9d11080b50255d40d5a3b2648949c16ec96f0c070be4a510722b6f16949206608aa66471c4cc0e5abd25db769d02e3c0a18b33b34ec098c765f49cae3be990818c9017f51107d3e124cd1da32cbac707449ddb06e16b83eacf6b07cca81baa3327851647f76c2cb0dc79a89fdf0ac3bd1e085cde28dcfcd5551459c0f1e38344e5e4f09257dd0312e2a45055af9ecbdc3b0ba79f2962797f82f1a07d8853b875cc2b62cf0cd5e70d4b6e17bd79f1091e17c0ba495b5180158db144421bf6f8b1aa7a30fddd8e1b67abd6373f2d36bcf0eb22d8141b2f8dfcf09181df5c55633d01f8077a0bbbeeb40a120fbaeb85ee5805890f3cf56d775801c4079f4536afddb10e500f67a6ef7f939741b533a61a01a730f547f5ef83c5871a97abc3054b1bfa5547c76772be7161512a771b7ad98afd2433683a7d9755145628fa113d57c1035577a0d610620e21c626751751740169c1d8aeb68fbe8fb3ef105b142638dc0b8fcebdd26cb72731f8070adb88d362bef35e02d4163666b7c1737aa272450b46ea68d20ecca45cea720c57e31211668a30a17107d027a68abe9a9889dddfea6d6c947046a27c900b502dd55fdacd8b47e2141006b21e3aeb58c292cb1fd68dde49c01e81601fe3c20d19e39f4a489116ac416842ae362681ca2d570576f63eed605a2e6566c3ddcdee2cbe84ed74a1cf32447f3fc966a8e60a1e801503dd612cf0866c44cc0a6798be4f8f51ddc4ea7d384cbc0203c04fa6807e08d6672d4a03e922b603639c9d68e06be92f16c110e7720562a82f607f6caa1420b5ce173458d1969bb9f027638fd804580ab53a275c3a4d2488c2961a97bf1658a91a2db9dcbe11a2625fef6000c86d978f589fa9c5aedee71f4fe3de2766200b42b3854b9779de203d00f9072d374e4d295371c4d9e0d788139123c856b0150bae0dea7488e96e82db20c09b572e9ce471d2fc3fc1706465a88c6292796bfbd6fe118d4fc0012ad207cf1ba75edf6791e5e992b7907cd66ee4ac469ae6a32a8d8998dc40489aeaf8686f349dd6afde11ec281a18f2cb7882e974703ac90811c1249edb6555005a77bed246959f6b3729571eaebf6a71c0a581b1d974f7e15a69dd96ed8dbf85995e0ab74883bbe934cd1d5e28f9726bb7d653145a74657abae66ebcddfce4dc84d31012a149764262043af800d68113239ff84be018da502bef5f8f47d34662c0f81fa7b2baf220e741f4bbcf7df9ba849d949f2f5798e4b4a75f5e933bb3f319eef3d9eb0787f9f52cd959507818a6fd76b965cca646f90b2c4a48b875cd10003f9ae8cc3a3a6801494b04906e52450a16ca275cadac70a4ea386953687f75560d7775ba75a0fd9ac52d3476005364b8cefcdf2cfdc92d5061e58c0ccc6cd524c75134f9141caa15502e4ada7dbeae3e45dec5458c3c04d7946f74297a05970c04fe032e07103323d179531242f2983637320070828543c66826a130378d4cc17feb24f412c8de694e82331aea319972d02e4bf798f16b104f3be4ce047da13447358bf58a7dd644b256520ed135ebdfb5ab198fa322258c49e5abd034594b6384a5f3c374a45037202ff461567ed66e7552894e16d11cf59fb474b49ba0f70518617107a2b5a80e5feb56e45ccc2d16a359be931147b2459f622548d98fb735fbe49ef306dc5a1912d8311c7a0ad61e697c2ec6be3e70ec745b460d395e2e2efcbc241c4341f02b8d838474ddf0acdce1e0d340e1737d0f31ca6bfe1acc785bfdc3dd5ac7b73a975688e0a1bd7ae52c74c5684a2739103710de1b265624796f772d1644f6f1ee5d074554c7fcbb7916e04fd6895310fdabde008c45a9a0e976aca6b38daa87a8fd20ac8056ff387d527925cd35da5ae15f2a2419611b8195becab38895be515be1f1932b48f51d7c57c2d766df44510753055bbedd5c1e8b2a2a08ab3fd74d15281b8472d7927cc6f8a580387eada588348c7ef70b122eb98b5ad23bc143e06705c0597de4cf994073b5b5eb6edb2dc88c45da5ea3a2f74dcd3236eea3ab65f5ecb55aadb3f934f1f1b2bf8c17566432b9da2b0c661e043e6114792b18bf15f9313dca5a234ce7c9ee8e97a9271011d456c06ff99c5fbc0966b10ae9151ddd4b034a89c64a959ac2956e39abca89fc321d469a412b7152af764c5601e52064dec4fcc3ef8738192095debc565c20e81bf818505938a2a89c08d7dcecb76a75e78278cb0fe7b844e191588bf599bca736295210a3c79d83c6fdcf6c9774c211136d7819792f5929984ab3f40a8453453661000f3b21e46daea3fd99732f5e8d88d974253b0de409466e742675044419249183fd5f331e3faec4ff5d824838593868e843649930aa8123e11b798ff32d8ec02824489f9aa5dda914cff7326e04395e7ad0ddb2706f6ac62d75450d7eedfa8e1be8fc6314dd1d46bf3f52c9f96a6046b11d8dbae32b23204fa86379d1b37e7af2141fde6b3c41cfadb457a72c11f41849748e5a859088ee1b2ad6a4d12f58e041b2210272b795f0a0b64ca986ff53904bc578802e8b4e64b7ef1380d8eb49e1bcd58b67c25bc5961a091b2bffaba9ab6169d8afc874819186db506f8a04c198a5eaaa0bccebde2d37fe0b56a6c9907516876505c2071b3b4fbe1a137aa507ba369f826ce8562ba53e1e2fdd5cede98d723ac30e4f4efe161596e47fd98fc671441b13a225acb041d518b9144cbfeb1a53e6e491380499873307d08a557d39c45987f89e6efa76952d43cd05eba993e4a15ccab24cbc444e4e0369a0c944975e8d8b119072a0501f4b2c3b0838b754ca2f70d9e4888e163c0f08f020ed467eea473ec200f2c94eeab5d301f5e534012354c11ce63b64dc866e442d19cbb1edb3ba74ba853080fca4c7c71421c194cb1f8185955e60ff30fd0c446bf27a337dfee6a7db9a2c005ec12486e98804d404687ca4fe891afb68efe9ae0fb3c2f41fdc0a8972229c902c3e1e0bca6cd9eb5c0c90de2d0a8a14966518d62350b085cb571648f43f6debbf84e0b93b0a0fd1dd449f66f31727f794d1ebfcf1f1a00df51ee842b4d0ab14fa88422d9a8f3f1d40b254304260a8c2010b8c6ddae2ba5935416d2cccea1f3ac020f6850484918dc786260417d2173bdfcca908740ca015653d3df5f8bfc5390906e4216ac6728917dc46bf1aae9b6cba5f2f63a18da1490f32c2437d96a1a1db3dbbfc6c3c9894e03428483e4925137cfe73196f87e0daed8e610497bfba90b83d08f093ba75fd6704dde3e74a6a7e5565a7a91156e7156ef6b67108e3b20cda1371d4a05c517da381aeaaf4617ef740284dc989e3cd88157a5cc388d3a47c315632c2ace54631929f8edcd30622083d0c6ceeece2a6facdaebc69740da5e0b7d360feba9bd0083e95814a0e2448f54720553e20c816027ebe3428443f61c9b6c04e75031a31492fe31fcb4528c9acc8a509f523ec596317e87dd4ee0e4e9933f6869c6049a2bc81a743c7e604cdb10904a2709fdad8cbaa956cedbcf7eb525114518b92e5fd54497f8a0162d7ea28da2c834729e2c034f3028c6dada15445af42419395a6cccaee0786034ac260df43d529df397665b63bf900bec8ee62ac388894c75cb562aeac6ec8a05b91035b8a7016515502482d53ba1d529084d6b70a182950addf23365f80a8f5158bb07653eb1ff7490ca65209ca783696412061959234b495b875fbbc9909dddbef30a3d1a4e67f5626fa67c3d2db9612b3f6c4298811de30386e8640492dc16063dd8661f66d3ad05d7d2efea2fc6e3e1bc49ff81452e560a927528fa17e831c34e47a3a6417974575715da6cdc01353104057845b676b320f9bca14f99f7ce826e55698acd162cbe014b5bda62e380200b8d66b1b566b0e42c751a31c2b9dae47e5a08589bc19e29dfad7ef5abf8491fb1ba576ab89ae2fc3ff6a9e8b50e5e51aebfefb45fad90b119b9166e2c4027121db0e099824c6c7572496884667d941c21712158e0d978a33f0f160a773ef9083baa284eb58066c81559d672aadbe5414da36c338d192d4df90cd424025dd7001e2a7d6549aa16f56c8910652f06512797aa3400138c17bfd9b769a69f9c2c2e91aa13069f33f1a6e783b201879cbf5c5e92c9a28b5e2f39818e123e4e839c5a96e54a48695e203fba73bb69e0356497fd3dd33fb39457d1eb270f9637457bd0fdc7d9e1d831527d3d54df7a462d73911a1c6273d6c62f99fbfa5fd6cc677607bc548950f9aa68008e53c06aa509f1f35a797c2c0bd5eaf9850da74f6d73d0df5f4d17919a316d7b1a39a7b61a555fb7e76d6655c8d7f43f56415082b0e940df1e33a725ceaa958b91e42fbb71da2b9493c47238de91a46d494dc1f3111c4f8d5412e71dd98eb1c277bb9e8e1eb02065b71c6c0cedae2b238df820bd74cc4c9596d93c8aafc0abf55856c4b325ac8435b8055959b4c7915d06b446c654d8d6a11e00f95bf4c967cec3dc094eac3d524c1c1ff399f421c418efc671bf8700ff9540d59739f6bd40329a511e36e2939e9a52b0dbea554a3c0b48df6a5aa7a56c42f795be76feb4306e0b42dfc64d81cadc296909ef14d0f0996e0075297f08044f9907b9e522f8aef65709e40145f906ce61c682695e19c5d57265f558592461c9992ec63928f0433ace81654e70f5ff0a3ad043065a2ae4703527d404e27ba5cd468890bc5091a1ed313dd75cb8cea97cd66b88399d3d97f4c980797a1272ebb25140b6586bed5df72adfcef72993168f16548f8d4d4e2cc0b1f212a23f5677f024203c69296abeeb04e667ed49a0fb80ef6eb1e1414ce24925d442b5a49ffc205ca8488e8fe818809b13749cce04297c40d0ac3236c10b0e2060608e90e2c709dcc6864ff1107fb0e46a39d4385c79c04145bd8b313fe2f173a7f6443950e5977bc0f23c73828e1061ba1f3aec4ef993bbe27e0e33ed9f97300b688a6257201914afa1330a49286f7ba68bd5d436b1030774a37c0a50a0e53569a40afc01b1e36a988e8e2575408adec52faa11e6d377c242f33259ae0eb73b011e30aec871cfa1c9387ced2b0df807f50c183ccce0d4f0718096df8722266ffa0041b610460fa8b3d2cc471885b08c6559953b29beadc60b29f85dcf16f775c5b862b95196c9f5068d290b0c426d91b41dbed922303be3d79a0d352410354220361154160f720343be5841f0c14c5ff6db3e0c4e841e0e2e980669113356e0b6a9e9cba1545c5a91ff6fdc8c454e1de453f1332105753f49dc2eb3d81519b821d47840cbad7e1086e5ea45c517a45bc86acf3be9788921132575c65b6d32f8140bcf2c3c560397f41d72a6e73003630ad325bf5f5c3989a3184d4194b0c6bb1e2794daecc87b5c9ccecb091bc7d9d5ddd5403fb2ead1177d87fe7af1a31f7c387fd08d7b9ebcbd579de84ebfd97d21cd3dc7e069e9118a704640bc803b0b8699cc30c0e626d9add3209c7bdaad71531203c74cd71df29c038debd27da37ef2d5db470a5e354b770cba38debeb0f1d7b7b252d5a0edc2722e8006285f7251b735dfe6cda4348365e7ad8f3a989385590dd4fdf8eb284d43225f8e0e40179a354bc27c2247ad5f4af6ec5595a0bc2a1e855d01cf481a051e65f9a79b1dbd0c5f0d0fce70b618da34ff852aa677e4326445a666c80d15c2917adec65c884454009162b05653f140e2a0498e4522d9b01add60d6cb31aec75eb454bf7c6c4468fc5346ce823c6fd6de30edab6244ec0f57070c7eb0dd3bf78ba4ff23cc65752a8c1d575ecde78dc4eba49ba76ef1e571496d1f65619f73e52b21c489bf9b344147a46298da34ba8e9ccbf72d8105b1efb822b6f8f3a24694e0a8c75a5bc0dc6be43772b039348181d386c088cc933ac563270741282dd39b6c1b48c3a3f2d090941883b023135e0a9aea6bd53bfdd93b2d4365027fbf878aa1392fac60ea21560cc8869ad5768d1fef678b6282fc23c08dc45379f60172ffcf7e1b242a432573ff5a9415fbab8170baad43a3397bfa254bf4d272f7f3a755a74d4edd19232be05b082a18d854ae1efe0c4791a2ee63e573ec850095542deaa76b32f1fdc1463edfdd277cc37cededfc5ba826128ab6f860bee38e046d7dbc0d9f9828e448c4a1cf4a3018b441aaa1a4b932313048b3eab8e7c958fbdeec9f39269d8edc0192ae78d8dc9a4ef96a9d82624dbc67fca599fb29f760168fcc1850316b3eea3579f9c6ed8e881bc4f74e744486ab248af0b96c882e4d21944232fab3fea3508fe10728a948d975ba8af84b7b64f8ce03f400b14c0acbfed17cb5497e6fcec38d79a6c55fcc2f227a8b588f75d54d918d3cdf9a6e38cda71566e1ec4d73e4d195c45d385ca30c53c90016e9a30b4958d8ac20f3c54dfb0421603141580607066da99b351a5e90ccf87132dcd7d3fbef3c7b1a007b48efb84c3a342dc94c2edb6986ce804b0b2270be8169a9778bdf6b5b264b80c9933065f93f0671d4be0cb9a63cc250a79a8cccfae299b7dc1b1554bcf06c578812a42400d3cb469c5f61e3e37a356da75c25d2ab27dc249ba95281fac9451b996bad466286f56b280b002bde9886fa9bca745a289092fae033db1a326035e2c7aa8032ddebd13533493e35d54e105740b2074c0d8b039e1e1206ae28f050207a6af68d07943158f04b7a4b9bc37ffe1b83ba99a047f7206a69e2b628aa43eccdeec625f30240d731d48df0abd10ac3513d940bc670ce4303876494fc4fad0151b4c49e5ba3e7f8d1b6bc289961686afb5738f0c788d3355339334dbd6e7567d54f68b5fa0c2cbf436f3b5f8d488913ba423d8e98ce15ab221380e342dcf76e14dac7194bf0acc4dc99c3786fa011363fef0382440e7e8be64ac0437872205fc6afb33ada7d6b0549b12b6e4ab1b13a0b9802152307ed70c49265673759bb6cd7e81c35e7e51dc80b290b946c847ac8a11135b6973441fe37d3f6f021712fda3fd4170d5e3a02320de601af2346949d34068ec2440470d3349b4ece6c14ab96148f4fd064474c73fa2cbfb1fe5b7c79f345239ce7bd31581de3c8ffcda745c23e5f1e211752d2cdf9c300f6008d5ef8e47f999e305d84d3ff66e0fafa3f9d772ab11479c49d0d4ce3220d9d60d7f1962af1057f7054f258d16623f779e570d81951b936c0c69e74e4eebb66186212ebce8edf8a7ee2949f9f4ecbeb4ceaac4874c2bc4995021061692c1200dd851fd3041b7fd31fb5e502aae7c8c2d224b78339e68d8780930849321af30507922f7ba7c9a3c2744d0cb45a7592d4d2678c35c4d4ffc6b5ed903c50d5edfef90ad82c635d1b7ad020b321c288f27438a847e9337aaeeaa22f4a0ee5d6379495e7519f68219eb583d93a213801d39745e10d9c7ba800ec9a610d018ec9aa23193cbb53b4a9862441fc608ae4f9992c847e6377e88199d2c893cb2586be4a8df4a718998be9c5be29fb1e9ab6bd8d15bd66edabeedcb17165d2dd73051c4254c7e6736c126b6e2c70c167137309dff9473ecc11cdbd2ad0ac90f4bbc7dc8d2b528af6dd813f9fcc7188100c66dde955781dcae033a941667250156b3c6d543341c67bd70bea6fec5dbf8a9a438242be48970b70019fdb8a1baffc99ad17ffcc1faa3effe524cd2bc306a3f449c51cb42ce271251fb8870bd850e482f1ccfbab921237ab4b2400860c5866a65e6a91dafd2ef40274578c561454b12b3d18c9895fea23aaf004c2ffc85e1a0c89f4265b8647c22d6acef761f412327e04bef9a41d829b4f27e8eb5030ffac700b1b08dbdba37c90df95c8aa5dd45ce271eeb68ce22f1bbe8e1198b9ab0d949599989df61e64157cc84045e182cfea05735bb0d9d78146bace8184e4dc20b0ccc106e23b1fbd8cffc39e49a3609cc28fcdd6751366f168d5a64629fcdf8bd62a4c6523c7be6e94128b7dabaa9c821b695e37f7bdc5acbc8f4c828d03c54a4c5fa2e8b0c94f566799ef994b38212fbce3dd2635ff8f3ffd0d86bb5dfb63deddd8ef21416ce51fec2af65412d8d19463ae5d9c0c020fccd5e0408834b2b6c8402f90a5faa168864fe8e8c9ac5900b7fc0c421cae019a093792cf3ecb008feb426db9c024338ecd99964bcba69024b65a9c2758e903df39915bd870198a0eda8977e92f25a6c34fd49c7bcf72f26c51db0c644ac4ec7fc27c9cd980a8f76558691e5bde178f074cf0492e7413f742174f8c35320b57a59cb0dbcd1bad131a645585bdd4679bf25a4ed0363d52781c236d18dc9add9d46216ff65fad992b051c6d2eb33fb481895f70308514cb3aafa73e420d4d5fd2a6ca3cf8b5917240a1f2dc1910cb40d3f9456c502de4a38a45e1b78cbb318825522e34b8481202cd04e48e12008c746cca27f2856b7d06b710a31c7a953424ce49280e3a6b9da8e4fa300f8b596a9878dbc568485e9bb56b35d8151ade0de60ff2fc87cb6341b1b01ac129028643886da6a0a09f812a6223d75440c996e070bf0ecd944a33a580d552b8d9f3a37217c20e5d5170dfa7d0831ee9091ddbd334f039e78633f3716828d7ece253aff84cdd3801f75268764bc01b3810fa023e94393edea08ba15ba8e3434d160534ef827b06f11cb8c880f7a01fcd3049e4184160d54206211a703b9fb4311ac967075454888ec59490864a88c6f024fc249380927e120dd3ec9c23aa758a20220885328071bf808bf9f47b7dee3a6a6755b93cecfa32395d201351a8964a485b4bdf7de724b29654a32280de50cf80c6edf4bbd1ba3c61479fd5474cfe820d477c2289dfc1c04867f82ab9e42f59737fbc787fe97fbc7f870ab5036ebe1083dba4808e7a0bd55859f4f99faaa86d5359fb0f70f34ed0af83d4722a3eb78f7fe413f7285c04fe9e9e4107616f8c587458673dc887711c377081dc2c7c1afdd0aefde196abffb4023b5bf85dffb8d777e1bfef3ce6fbc7bf625b636056d0a19ffc1efb5c66929a515d87fb01434ecb39417d621b16e2931fb20a594de2ce3bce2bdd36117b4a88ad0dda368fcdc9ffb8beefef035e8eefe6ea1bb8cd0fd07da8b31a8ef8a213af88a2139d8af188273c238e06b0fae9e954fed11efe5855686b2e04fec35ccce7fde5df0ca5260f9e0caffd1f8d88d3446aaa3044fab43de0f401c9f62ada32a42776719f2e2c72b6d0fc743e015436eb00abf2b80f08321e7002070bc434200dfb91c1106a6b91cfdb81c0f87056fb4433fa1fa07817242c26dc50aec8e42e7509dfa766287df5bb96ebe9e5e1f2f795d3ff309f77bdf37f77badfbbd9b6736dc41e8c58a67645ef39ad2e68b9fcc96883a3fd3ec73c53e9fa4ecf9efadde4f117e13bbf09b76cff972fe65e3fc1dcf08d6d28aee7eefbd7eaf5fbff7de7bafbbfd6695ece9d3b7c2def77b7fcfa953a7efaf2bdff7fb696d7eef3b54f0fb77e9bbe74083d88d35549bc88f1bc3a494f2460cfbe7ddec215b15132288255457c5c79ebe553f7d8dda37825a71bfebe8bf32fb60eab1c4fe3d0cbb593e1d417d2cbf07ac43feb582dfbf1d2afce5f2f803139c788250044553460cd4c66125a32d4b921263d63380ac8b1a41f8d0830c1a27994f8c92d18cec0b54f6333330360ed25386892e2c4bd22c1a4c4a9604fb673dcda2c50c20eb9191c9ba6816ed478d2e8298d999e199e9f169168dc817cda21d89e183fde606f505761d9deca759b42e32309a65fb31b31fcde7470686e6b3cd7049dc05723c9ac6258931dad3a907eeb7e77a5c65727363aec73bd71e01381200c7148e6fdf6aab81298f291283c6e7108e3da04e667cfc7f36a4a81ac1260f5f33b15c8f733c269f3923b824de790c941d723d8d9319a77fecd23bef56f3da7d29d3f7307fb8a6cf15e59adef4f39a3ededc830cd5209482fb2198904c68e64b9f2126959e5432a21f2dfd39698c9fbdc4a86cf1f882b51e6e08e66473894829082e12b24114cd3d97c4555c0f8417f7f021777bf09058641b46468af70364666a1716d9aeb1a1699a2a6e9c565008d340b0ad68b5348b61d1d5461a0747b31916d9982251ca886198c685829c6a3acad0919c9c4bab229108dba47d32ce0d8b46230e9f6c6926b3352f927724415844351bc2d0f41af6d9f796419d3ac395807817b900c9d04d723d0cf1709e9197f38e3c1d1f046000167cc5cf27f1330d6cd24c5666a8181ae732a64e83b4a337c0287a344b04021cb03f2825489121b4014c88804b43b05f00f7434839ae8897b62f588b1076f7c61d3103c57147f4f518ce61604cd6314806ae5050ee109437b133fe6494c4c4a4471c91ee88c7bb30eae78ab32a01f1139b1b9f7c66529a31198d4a5f625f2bd952e9be09e94dbee49a7cc90f1ce7226f8c3146ee65e937cea5f45c09e9359249c9a3702e25251709c94447e74926a551b67126369abc49a461727bc4d1e836173b3b24938f4fc3bed7914c4eecc32d5e8df8eab1fcb119b693340f4f16b32d924873a42a65afcd0c46a1ce92df4c7efb922db9a5ffc1c6fcf0038847a5b847c4f339ce65964c5e33d94a7f399752e9bb0b93ad7b4c3ec6cee43edf485ab6c56cfb163f8978bb2824489174fb0b1bb1c6b50fa6712110678a18a5c70725c618b1c9d168fa174d2613c71d6132d130994e4c0fe28e30dd06a37ffac7641b57193dc8b0773413a3049443037532aa218d4a6f629a11a19c14cb36eeeaff5c426568339d02929919551a10a74647d3716ebe1c9548f696ccc74c300ea8d56a6148a48e0ec6cdcf4c78cb463ca60dcbaa90373726b64444da481b8d9bbf71468036392365a48c9421e14d88aca931b125b8e2c0d58887d25a679a45bbe9144ef3b999e14edee4b519dd8fa2315134de34e34d3568dce79dc927d48367dce89da97bec3555eda6e48eeecdf44d37978254ee3a31e1648c8409251961101779228f0837f6da0cce3ecc4d13e7a2d9ed48b67131a7da1e4248a28e0e1771674764a4e2ca459c8883516a62439869f6e37ed2cf7e72f77d9651144a2f97c40bbd91c88c36f4a776df6823a242ea03e702a11555716f6eac88add81271f347a5cdc4827089f442b858536362b992122ed2d094806c98c4c599186dfca1e1121765644c6c1663228cc5b00e18261cfcf9997fda380db595ec10d093ec90d0ff68a4e9c098f080764cdeb493fd65473c99896972b72424f4858fcffc18a8cdc45e38ad560b09d4d1992fe36433b1b306d2409a2ae00dbc998f9ab1995809617e7e7e5010088a83337006c5cd3fe18c700c63c67335e73278356090dd932f7cdcc7c442dcd3ba15ad96111c9c23399e83c45d47c7c43ade384d07ead440d297fe841be23426a6eca3abb237b1efd520d913ce85cbaaf09b1b1adcfc1e38237c33b18d376ed37474b6ed338a95645082c196c979d3035784c4f03a10ce671e6aa8f7ba69c429a90645d749b312434da3a908638c3367e2b45a44343865d44e76dacc9a29bac12812da124dbc52b38ea51d22fa68879c9e9eaa953f283e3ed267ce88a6cc9c32f3e25ce25f32da21a2a753f2c49d2eec60ff1290eb645483d17f3c119405284785969880e0e73a1ae1488e27eb1fd534280bd3cfeda7297b4823db5edb668973c9b2928964ea48aa691a9679075e30fb5e8d96df02b58cab21d07c99b4350dcf90bfd18c8397e81431ce8ef0663fe0387ef60fd3a1fdd41ed3be5fda884dbe638ce850ef280d75b840211148140a22046ef39b4e6d9b907e9414d3e2472d82e455253489260c2427bdb8d8d949c2c343d2c9c1c129a1a09008240a6111cb3825b47923e55ce2d3c03824a663fa1867047d286018615c565cad56849b086b206a87843eda21a0cf2026125528aa21d0e807240a6d2058391c5f86381738d230b45715d7cd759361682f22978d0d67314ced10d0c36c64028942205108043299538b316709e7124d1b6727de4a40bc8365a8fd32061721fc5c9a89402e2157cd658a90e69ae982637ac1dc21d79d3f3e5df039319950500183e56b91da2100786987a0fc65473e30d506c860aa7f7b9dcaa51b60ff511cd4f0565702eae7911773c03d18f5601a7407a4534a43f0019661281ae30cd3d3cd3e6cfac14e9ed983fd4d4cb8217367ee609319d874611a52a82e859a4b385b253d9c67e4d1afdd49e59bb357173d3dd717cd5d3e30aee2be6404fb97704039ef5f02e22aedbfd47a500ea4b99ea215388a1882a938de39e4e0a8d253bc231eef62dffc70703f7d6dcad963e2d93145e65fcff1c01548a63e0c0c0c0c4b8bd9b328cde9f3638f7379b8c54b3754de5c6ad14b8fa8c9259b2622e7f270094c09bcb944063b0ecc1de193473f4de0887d8946d3341e987ec554e35ca0b61151e56b2d18e24421f004c9a88462bc03fdf0ceb907cdb86a8686f881aab8ca7e7c21fe7aabfaf14dde0ae5e33f5c9d3ededc6362f9f082642c088b0a9201fd00cd78e7a1184f5d4fa7732e365a1b828946987cc987645c35e3e6c63302f0b9c33084e13f5c09e0e15f6fd53d949f1dc3dc0386ff9ae599bc554a05cf78fbda0c1b92f1104c15b5f18ccf21989821a01780ed97d23e0056fbe8aaa87dfc540704002808001d107fd2818000c0d4a6164b6c6e5cf22db0c43e3ca35bbc4331ae7a42054357d9f70fc9441f38176ba11d027a0b422161f2848ac9bdc0f8f921a2d8fa8557abf0528f00f7dfafaa0357a2118d9b2136fdc9cd106fa6df5e644b423c5522c1174c2d675be0b538219c2b4eae3bb944249782e452915cb5c0fe1848c655a01fae8aef0f9a91343817084f268e17854436b34b63280c8c638e87878707fe6b252b5a33f5e1d20d5c59986a61278012357025f218587e2ed9d80bc02fd1c09584ab2ee1b8aa2507f03ca2e2ece9f70b7599ce2951f1fc510f8f8c3ba28e78c6b0f5f0362111c208e17777777777ef40c1f03bde15beec26c45374abc1f2371b576d365e7166dc6cbcab8136157ede6a3621de790fd6e60a6abf4d88ab9e783e18ba8a4613e7426f022aa49004493ed2475efac33b97919911bedcec808351f859c10e3ec0da63d57744073bf85d31862f8ad0834735cf46f6fe1a00782cf0584638f98d01bf9fc05369ff3e028f85e3a1f10f50e2b180723ac5ff048937e3f3cb02bf67842504633fbf29e0f70978aad1bfb771554f55f206f8018c78a6898b7433211da00ad81f75399e01e05c9ae925c8c06c38d89f06c773728f80fd675c7bbf64d4614dc0fe5a1486c829cdf8110ac0b2341371969f4b334a3c1c2c2f16b78b73b928353deee1e0b6a51992165d2284dc434a4d2698f65e87dde7da8dde711c100ca3d9eafa7833f71ab5251aef66e8966d91738937f7901fed8e0dd3879c0b7d39034581687286c6fbc4c69d38178e3399366cc36e3451fa269c0ba5a527a4a646ca176d5f1f44f0aa38231e488fd09c1c488d788783036de3b6a519ef4a403c2564e41364d4436f2edaa2365df0214220a28453bb303a69b8bb7bec61864c427978640f736a727edb88a7fcc91d0103d326bbf9b251a94a8e10e1d52ac33089f39439c04644d5fe00994c0e861febe7681d98829d0353391b16386e33999c2448ab37e3b053add43110a765723b8009e729c39384670b0ceba2075b420fb2ac3d933570357db08b521b1b8b4e0212901bfb7cccde87dd668fa2b10df76f9e6be7e28197527af1b8eac51eef44491c8188770f47ec2ad411fdf327caf40fd77ff94dcbde645ba6dafe21a3ddece6d9c2306f37548d883a9f1425618424f3f3b58361ee8eb51695baa096901f3f87ec190c3f7e8ea69951c3ccb655ad9a4c402199456c9b26a6aa711a9119925b8681e28fb685c9a3da063791b67924fcae68f160b6f2c4e92afae6668ef0bba295040ceb0c9b9e61a4e94d5b5a043bd18da1ae03fd4b19d0bf880357a01b7d1e4c692ffe8c7e8af8a2cf74e6a9c1077b217f2ec93345e8479fa94c7cd13311afe89908dde9f3cdea33d43c7d40d64787e1062c9861510151a0c32a927d27a9a0979f2f1b08e50f5fa9e0b1c82c59d0d15e5c780abee6dd869a250fc57daf1dd96a964b8b9702ff02836c0286df5dd4ecb3e4292921691cf7178dabfc6ee0847560df3f405cb5494a6b7d465cef379f2c8a05b2a879514b803ef411901fef145314792cb80a7d7fa51062ef97c52cf6d70e84da5f3bda6bdccd57100c63bc833e202b6a988669485ff2c0d52579a6c9e4241a9138ac44f3ed245b26a659b11fd846724e2b9936d366daccc84c9d29b3053070e1cd2f4c9da933cd80e16f5a66f19bdab41710efa60d4c91e1460d2d2f2e1c1a7fbff99a717bd1b0a1fae737e20242e31dfc1b38479c44cef4cc08a52d94471ba1f62005444f81d16b23cba36788133d55b8cc5f436d26600a3e1d972138d4a04367c5ef8a2560e1bae8c4c1904eda53fbe6cb06e53ffac742f945e110fdc339121083c31add29420f7ad19da2c814ac7cc9e0888917e51f5f7ee8a2fca296882f3f47e8411f7ad06bde18ce53c7013de0168d4098a43daf8bc81c813a4686ce6b8bd8843885e88417a1f0622b5a617ee11d7c2ac0f0b18bde9002b6d6a236ce53e60cb5357de6b4195d3bac8d887a05615d3533171019d1b7f8fc812b1f4572c807bd8fd08fae0fd0cbf7512447e945ef637451fda38f4f7a175d1f32fee82320bfe44b5e7ee95e3090641f4cf95d42f4a38f80e847778a2239403ffa29422ffa088cbee44e017a909d3e23111978a410bf88f855855f56607819c1f0e70f5cc1bf60e06af4f0af20d74c4bf4f9042f1a0c2f20dccd5f25cf44f273816147f6ea81c15064e1672923e414a402c1f03b0d75ee4c9d2da64e64c25b4d1f98824fa3e08305be5280e1977046348e5d5c3b97163e70756dd129f8305f3b29580386dfa97c9501a3a1469fd8336d84f06cbc9f48984378b30836d3e64d27cc2f4eb2668281a7172fe515b962e2f06a506d01db9b2cc0f0f3098ef15453e675f0df53c8808d4e249e82ef76ea7807a7ce7c6dea3c1b3ea2312e32dec11fefe049e7d9a067e82435bebc78e0ea87ce34cb8584fe7015f63d70255f16b179353eb8bc1003bfc0c050d6501c60486580b7cfb40619fbecb5c7516a95f0f7eb5b07ea7a9b69ccac16093710f18efe3043f57f38d3180c9dc6b88a3efc8063fa03c3c7ecc3daed76c2ebe06f3642e175f04db7871be17e51485c0fcb1ab88a537817926689ad4e812f8b442b60f8b409afc68504c3ef32d47ced3c1bd745f5cb0fc58bea8b5a223ee873c80f7d7cd0673a43d580a11718d60167ffde2ab62e32709348c8a2fc1feb025994df259a75edb0a6452171bdbf5f1dda45f53f2428dc64a8f366da78d73cd366c5ed102b1b7e5734e107fdb7d916cb8031d46ff5d56a31d40cbf2b9660a4e6a5e08ba15ef85141480b6759f358f3661a86d88a3d30059fd66ba7b9f00643a5384f1d148ef80f78acf81148400c1458326e51f3f4d9b9c35b4d9bcb0418c29f7178930e6fc2e1d9980f7ffa344bbfe491419aa56fa4e914c861f7bd1a3208861c77ede84c1bb8ba76600a3ed47a6a5121ce53e7e2c23bf82d4ac2086078f7f0c573af9d9dda82ab690353f069ae2d0c7ffabc1af0a70d5c4d2f5e0a7e0cd1f36983e1f7176a9e3e18feb5e34f69ada7d37f77ed60f8b107aefaa5fa312aaaa7fefcf0a9edbf3ac9033fd2fc80bd9fc7250f8640e07e1a0c5fe660d8af3dd4c90c20ba547ec1d4e7f2174a85bf74e659e84205707c68330a8691fe7b29dff7d5f1beb150e1dc8172752fe10994b80305b70b0a12edb94abe2e6220c0fe0d4780dd41efd588ffde04eda1e41ae32a663e0a9e356f11f843649e7549d94a443c645e0a41700a6e7b36fc23841446089da05db75f2747107d5e71f64b890de7f7a0b85f0df9f29ad775a18078de86ed50d01e0a7c92a7dce5227d941f39177949deb994524a29a5944efab68f73017d8b936211f0437f7215e8e6c627d25b3de933c4f2e5f76321bdfcf854a3974f9f2abefcedade6cb9b77a060d05faf81eca922a9a0cf1593bec51fae543e370ebd364d3fb25140d161e0d1f7a0b8e4b59288a365c08d221c8f6e0b17fad510bd287e7dadb76a61acd6659d6fb23716f06af8936c143d2a66754abc0ce82d3c6c8aa51fbd0a5c39010ff0561b784ec055fff00df40e5e0ff9e1fe1dc455a4f7ef1a5f95b6c732c4d8bf8eb87f60d7b8cf106b5fb237ec141273ef2fc5e8a51d3dc9e617d5687433e9b92224c9528165b51297d80f505c45dffd55745fe33897d148a33762d223c41a7ba26f7151bdf90543fb30e88521b74d7e61e48e01f6a7368a4872d5132858bebfffe97af31f47050aab084ade2750e0ddbc73da37202afa254acd88e6f3639412c61b7db623a1b350dff73ff8ec352555f5ebfab3ff7b7ee33cddd73ffb6547e830b691fabeef4be20749bc7b8f25a1c79ea0f76ac8be86900320189e4e3988c1f04fdeaa59ed9f6b7cd66deee1ceb9b4123ac5dfffa1c02c78a6cd50e8a5c4b0a6a10be5d3bf326d0b61d86d8121edb10df4d8cd214d7e6d1989b80a41f543df3212ddaa3de7a6172a8548a192d028240ad5101732dd4c411be8435ef2d0933cf4251efa91875ee4a1af37ab600f5dd0cd7405fbc3dfecec148cde7c4d09bdd4330f3f84fc00c2822e58c0052e007e47586093ff8a362f98be3c9b63fcd82cd7c70b1ffc1eee8098b337b32cfbecffb7eb31fb7ffde89d3342c775736b2793e8c2e05572952ed27581ae6b055f378f44a650c92da9a09b3bec44faf7ea755da7eb4da4eb45f5bab9fea88711c974927142e3ba2e14eb83bdd6deefe1a271adace04b45055f5d872f5389747dc9e812d5d005bab6db4362ed66d8a96a312db879c117b805351808fc8efcf8f9d1830d80df911f55cc7f39e21e8e75747e374292776f7b27126d02a6409f7d3ce1981fc7dca9c49bb7c7be09b86a1c98f27fb86a98d2cdd474732db9f914e3ebcd8ffad0cddd8ce71ebfa90427bee4c9bd835deeb40ebe6e963a253f7a7a73e7dcb7ffdeca872799febdd50f7f9271f2efadbaa7f1efbfb3efa580b0efa50060238abdf6bd148cbd7f7bb87985c68c9b554e503777326eeefe6472f38954724530d5398f37f79021d0ed2171d49e9b9f6d375f177be78cc82f3ab42bfbdc43ca9cf8987c7afbe755628b77760abc3cf8f940c5f5f29e2541055de00ebf232a30c2021a1c00fc8eaca00b7cc4054870c300bf232dc0c13c383e45f9d388a8726473e3d1775f0f1a3da8b1efcf1c6ff2af879c113ab0cf8e70dc2cf905cf4e013d28f4239b231e6d1f9ba51ff4db3f4e899063d16fb787e3ad6d3048e2f925ffdeaa05a6e2d34a2fd1e7921f7d0bad75b47dc9cd32e7843fc6bf371a553c3ae1d1e35187472a78442fd1f6a1bea21ffd8ba79b298e26a337dd7cc271f4a59b1fc7d1936eee701c7dc9cd2a388eb6bf7905c79fcd92fdf5213b3b057423ddbcdb70f6287f7a67a7cc3b3bc5d4d712b48792fd06c36fc25531495fec8bfa781ce09c4b7f5b216ab4b5fa3d1cd38759541dd74b9c9f8fed23b5c2150f98824f29e5e1aaece1f790c255dac3f701d3312de3aad66efd1a3ba53f77bdeeec94ee2a6cdfd86ef58d6cb90ab3826cf864cf4e692238cfef96abeac3ef2c6ae35c211615fba6f3e17748683837ceb353b26b83730fc7d7911570f17c78b8ea1d5901120cbf470e7e34373b65c64e91118988a1806184a1e33370d537ad03573c44d06b9c26f499823ed7d3775925afe0dc3a18fe6c96be5962fab987c4f547dfdf37a4be29e99b93c4d88f6e963958bee806c31e13d39b3bf082b19f9f7b4c5c79c0d0cd147473e59e8f76738755707e3e8d5dba82f3f3999d62fd66d4a09903e09711203f174001d83f0b310001ac60ff5c030820500800001a801e62f810c384df09763ad262e849e0a5fc310b81872200ec3f0b80fd1b01d85f024670c0553e00ce94521efc7ca0306aa141f815c2eff714aee8b7f869d26e02c36fb86a16ed87e345b4f83984df535755ecdd6513f6cf1a7ed83f6714875e97512e21ec32a0d84031a2d0b85307b2cda407a6993c40b3d2072e8c0482494ba490d72804718ab008e0083c62ff10054d119f9ba1edd990ef1f65d4f1d80d34f932a4d4a2caa37c77df647477f7e75d84d13be8300c9a3f11f57d4f15e355b8c2fef46c5c8ffd832bb8f2c7eeb4150c55febc1e905847fcf8da65413f5f379fc2d5f6f3633c15ad70a5fdfcd3b391713f37ebcfd9fe0c6421be9e7a0c8ca9b0cd2ef14800c31568008613f4c481a561587cccc6bf728c7f59c78fa35bd4f7995208f1002184de859a37d4f75af78b22f870e53330d5ff1eda248c80240b35fbcc95a476b7bceb876dc51b6a3e398dab9c06becf4020f0b6d378d7ef330d1f04c99f814ee3aaf7288e91d7972afe7bb95bb83f5e14c51bcd220a327db55cd5b8e54515011d775781bbb31eefbaf0aedbc7bbae4fb8fd076e8739f59f0481fbfd470fcc8fc7b80ac3fdddd35df8eab15af6ebb0fcd2117320de35f419effafbfbc755fd0d86abfed12ca67024ba5f93e45d774e4f165048d23d2f4563ee1edcdf39b1ff75f360afd95ab38337eba9e097835fce91fc7490609feb9f54ba96159cfdfb93772cad3923ba45a08c03c76ab729e3858207deb094d2b98e33c8e2093854f0810f8a46443d9dccd4f70ebe8c969a5730fc67051d9a1557bd2be8d005863fc43b82e10be1aa7cc2f089af1eebbdce9f779b7790f34b5f1425718418ef1ef68f0f05c2f6198d88da4e4f8f080de7f5fcebe30bf15acc8f259c10fe8a77ee59050bb102dd61df1515d8d23e15b86a96ffca772da8eff3b7e3e880d20a1f8701ed7d16eafcf7fe4cc055b35047bce0dc429a88113c6f7e3c2dc43b226d1bcbc0e6509f11fc70ae4b348b09986a32d477bbbf796adff41c50bed6d7bd4a56893059059fc1069ab3bc2d980097aa8043d202765b4bc880dd6278b406ec1624aac20f764b2b0c766bc2dadca20dd100bb2d6110158cdce0684158a35bb4dc10b02ddaed09d8ad0cac655bb4da17b0db11d6b42dda2c470ddb162d962307ac715bb4b404a02ddacb05d86dc55307758b561601bb05e12760b71bd6465bb4100bac956cd1ba17b046daa26d3360b7149b7eb05b11d64caf442a319980f2cbc3d03e1c2cd880dd72f805765c010c62e6eef8fdf175f49f4ef02f09ffc19713de2cdfbcdd57c53b7f22eac35131c055375c05df7f05ae7a0a0e218462a813bf2b6cb6783a71079a16227d8671f459e2f7f9c22f5396d067ecb3b671f8b1e49257c2cf06fc7e2ca537994c2653db7e35fa4b8efb4925a389fb453594e17e10c7e1fe0d84fbb54c344d38c6c09dca32f0abd179d7ff52e206eda164da0da39c8ffbcc37ac157b381b7d50fff0e95fde343994ed565bd132b9b345279d349b339b74d2ecf3b5d338de19c199b37b06880e0b5c058fc5657eb88afe9cc1f02f69857402135eca95ad5703ca24dea15400a3e039e70e147c5d760328985e1df3469f2fbc73ce855e9ac602998d035d56b8724243b0796fceeed6b3415550fb45f504aaf5741a8540328640a7938c519b747829f8330cf8020c3fcb19f767fa16f74145bf0005548061c5f74105cb158e80c38a4f054a122ffcb0e22d423fc71fda5712a73299c3f3b1c8209d021f738cfdb48128ec19e703f6776d84fd535aa6720fe8227c06a6e0d3ccc0c0d44ccab3c36068f2d5d27c91215f5de41d2ab8be4975992ab7de64f86819f4c401e6a2f103c0cf5547aaaca0befb94e1fc1085a34404000ac44323272bae2a4a84005141cdcf017af939461fbf64e5936cfc9015bd5bd187dec78c2f29b13e8ae408bde8fa881f7a1ff24b9ec295e8a790778a2239483ffa294a0ffa19eff14e41fad18b50f32e017af94c8072883ebe8fd2cfb84c8c3e5e1fa417ddd03fae641f8b641fcb6d760267facdb9748c4e2f20429d610098996bd945e70884f221f6bc14f82f0e3e94baa70005d5ff04d563aabf9ba0fa7b09aabf93a05147ccef9f28247a5e54848931f1419fdf36fe8832638832d99d983b9df1640e61dacc78ed8467c30a5f457fe77afacca6afe11c5b31a83e4102627058a8be3e8af4fb007dfcbea1eb23f4f25f582ddeff587dfd34aaa78fcffcf1b11dca8c88834843e3bd776d5a7dd4d3f9f5b77fcf8669ee507a61ffbcb8e87e7a318ee39aa5551b7162ebe42f9e6783c68811e3e4df3bf9f9f4ade4cfaf6f15fa19b2f5a55ecafd66ccdeec1f903837817b48cc71f7e2f1eeda39d92bc9bd7ade50eb8d38b195634f64c36b96353c1bcd614dd35ed6c095bcda4b5dfe105f4f5733e5fa68e14b5dd7cb78cde618877cd9c4b0999200c337b1d95f460f895b868c6f0e870914f040f6b16480ac4ce2296d76775fb7d96b315e1f3997ebbb676b4f43c915c0dce36afa479ddee4339b517ef8c7b9a0bcd69ba9f1fdf756b7e2ab7d26e1db49eb0476d36b3fa03c7ccd6a6fb2efa568375b00bb0fdfe28d35fbf00ff6798792f970dfab91bd763d8efb16973daedadefe7b156b9aa669b6f1661d57fbf8da3c9180e17336bfb4f00e94fcbac0f463cbde931be372ff1775ef89c63531fde36ce329846743e5a568bf1437d54f00a64fb7e73aefe857abc9eda26436bf1c4c5f9b9bdb7ecc6a32286dc9f8f764c8f8c7b9c8882db88a3d5a8bc79e9ec6dc26843985c7f4f3ac42bf14fad26e2f454fe8832028aee628c6aed3d7aecd2d7dccbeec9772d5642243a02c360aced3c7c45439cdb568c516cab00c8b38b1356d2a27836c5addb40cbb80c8bee7d573f9b8fb2809ddd7bb4a9b3dea01c6f2510f64f47a6db71dbb320bb2ad75db7bed02c3b5c362cd1f9e82ef1a7543cfc47abe984ebb4b1c6a8990ed7ec87f156ba892ba0ca114c3429661d8fc62ce1f9fa713bbf014fc2f680443c648797d7c4ead49a4a78f8f8fcf75336d9cce09c40fdf3d6caf01557b7f4d001b163e0003c7c00f0b1fe860ed21a02ed12cd06b34361aa18be7a23346341e02ba5006ce441a0cdf61aa8f223e66fc83ae0f102a02f149d773e4759bcf50a6887fc96d61f8a3eb2d9b30aae8435ff2a3d2676fc5f853ccb83e8ae4203d6807c32940d747910c02812e15a0f71f9882ff8249d777600ae6806e11efc1f0bdc7777a227c54118e219257033ed4c1d2c6eba3488e40bb210959c0b04af04360e2a502e2c014fcf8f2c21a98823579681d0cbff150e38529f2047d7f2a8a3c411f75443fbc813576808fc1a13e967c107d231ee6f14463d43746bde66e7ae75c4cdf60d4d3bff883330482738fcd3ae7b2bda65d42e0cc6599ed2131770bd029984c62258fe4e9eb88e481ab243cae7ab2e7dab983c397817df13e5b2dfa3ae8ebb88a3eaca1974e8e7747bc83385f3947ae1c1da885e09d3741a839183ecc974e4e82e15f3911e70b8910b6d04c3dd74e2db13e22fb5821fb5825f6b1aa7d78641fcbc46472af1f3b781daa76f365730981fed9f7e7e8d8af208db3cf57909a236af68e84ebf0222c7d9c0368f6d466eff6e12b8810576557c7f6dac3d7646072a8daebd8be9fdbbec5b56af30baeafc16db30f6bcd21a121a14524b25c9febaa6db8afb6559328d2cc5437ad512d856423d14543519336b24607aea64feb9c4c1f2070be7680c079faf8dc7cba155e4df2f0f0c0d3e91ac34d1a5a6fc0a1434e1878decc9663225abc93f481f366dac898702e43e2470b210f4c4135c09f3a3f5f3bcd3ae5efcb39603e7651485014f44182e11747cca7d0a73bf6441f9eda03af1d3973bd87e10b5ee8b0e05f3dad45dde00f04c31fbd4e32701569600abe4cc5a753ad3434d7a5992805b0a2755baf06ea9f0c89e20367362f11d3ca613bde0ece3ab6fc76b0cadb20bcf3eb7ffa8b7380dfbc7dbfc9b7406a517fb9ec783bf8e49d7339b1d97195ab824fdf76c7dbc1262617ceb165f219f5d9ede1f8723b24be49fcd8c59bd887638fab4eb78b93d39d3e74a83d871ae3418f3b82e6e8d82deadbe6c6576c3d1bde2d879aa78fcff441c9b031a20120d68410a20d355f3b3ee0f7f6b1cc7fb1d5d3d7634fdbf985a7e0375704c57e5bad0bd36b07e381da015471f0791d7c281470f55f4d3cf6bea753adfdd7c5d39f7ddb8ba787c4f3e2b976bc9b7f71e12affea2f6f1411f790787258a0b49d5ed79561aac6da6ad55f54c7daca5c414086a2c3c0198902f4a390e82a8481bbef8eeb79bc24d8bfab1006de71fd132f09f6fb03c60ffdd9dd08c8d7a3b47f387b9ffec2075f1beffa06e177051370e66c8d658b627e731ce55c7c133defb6db7957c35d63894162105c1114479a570376a479363c25e5078cd971a857f7136a9e3a35bde3841b0e354f9d1a57e56b67a71fda9c6a30a4c13e03537d27ce5367eeb8ea4d19ef66bc8badfeab864827e4839c2810a73f6270cf3d81d10e86a7e0d708a1b9667c7ebc4b439dd7632b25d26c31058cf65f0f3fb69a65fe8d40a6ac8137d2c89a861034ffd90882cf3402cc64425f5826796419241bde6ada4833c834489e669141641c6612288dad0a44e2fed6a97501c1f0b5217ec8a4c8bc1af0659e0d270001a6ccb3412f1b4a6588c68935920e6174ca7869998dcd74c2f469b55a2d958d000528c0f4ebbab00ccb2e2f300ccbb0ec922150c4faba3a84d129a36b197669599d322b9bdb69833289ccb90305d36b0328785e1d7ee78d771da45626c98d00ce45f6cc392fc98384cf2fd81fbb75046c3e6d244f124806aa062d5e0a3ef6323817ec26a03e6e9f9aa74d9e3ad80a57b9ea7a7ae355b82aef40c1f32f1daa037f22f1d563418c48cfab013ff6bca1ce9b3e839a4f2d6aac0b1a118094cce0f89a08c70af751f4cff79f11bb4c854ec0e703aab08a2a85d3ef1fb8a2302a80810d6a0e0968ffdcccd756de8ee8e6c7b3b2816effcc8b43fea800063620018e2b372d30b582c3ad134cc0959549a4e4413fbf7f60e0cabf5b3823510db9cd0ac42ea534477473b8cee93ab7d8f70fa5b59e4eff3facfe819199a1a909516fc1154e0ba77f40b76f6ce24b4169fe4ef44fd43fa1151c70e5045cf9af8056f2f3f901fd80e80f4cc507cdd7aa6ddc3f3f3f3f3816a91687dc42217a51a18b5a62db42ef43fbed43dc73ffc292f6b1a0a002e66a9e021c7fdb2a3dc11595ff2a39ae3ad22c449800c76f2c3c1b134729b4a10adcf17323c1f1ca34d339048cbc69d5d8ccd0c8f44f8b77deadc077d6ccd5b2c405da43a1efb1607d26642a7d2803aba8a48755d4dc3d8f15c3fdb63df7f1436e84110f5474e46369d9e753bdb96142f73e986a4a0321bc3866192acdb3216910aa11707426380fb0e760d7b99ec76599b0bd59296c1330159fae701d4cf511ef22e9432fdf69a0d7c055f6b2f3e0923a02390d769d926ea61496dc5cab761f7473a76516a3b4d6d3e9bf1fcb69e0eab16a6c6e5a383b70157b68ef2c11baadd33994d67a3afdcba6c1318ad1d7d71cb64350e843170b518cbe038deb156a7f1c5d14e83f240357f0e3f36002360157d8fbe79a3b4cbaf971cf9ceae3dc692fff6925b6714f0f4d8fd31479c063cd2fb138e68d89d1de3f2643812e0eee1ff058dc45819efb17d676fdb9cfe1cf5d1f4546ef437bbf28d08b9efbd1cd81fdf6dbf5913d7651a0c77efb175691d0438b62518b025dd412dc8b3e07f7a2eba308e87dc0e71e74736c8f3d7c8db38fd51c0a07f4afdde33038fe16b20f770fa5b5aac095f6f1bb15b8a2f3637cad368723e6fa99bb959818edb1e73e26267bfa5b0536eb3517c5c131bbe11ed02ca781a9c8daec6369f6b132fb58987d2c6a1febb28f35ed6335196a134c7817bf796a47f8fef00652415f5c9266b4190fa4c5b738cfc657a37f03f56161841f9c37bcfde3563145fae545e10c010c7c6255ff8a85f66016aa10991f8f1455ef50f29f15c07004bfcf28798b702cdf9f890ab8ea65010319dcdf32ae02e2abae414d065cf5ae1842cdfb89691c18d4a0b599222f8b1258d1ffbe48020934360923dcd8248c50451248002243084c3d963fcf91f85d31841bf0c0082184107643d8ad8323477ffbdf8037c7156857b00f713a51dab2b23284af22cb2386df154220821021acc1678317f515f6ee2bdeb9134cf857c0bbc0fe394e49f8af0ce115f094339155e4ab0811df5f07218a772eef9f6ea52ca8fd3e974321d0a977b095d0ad1a7fba7d5144bce3ede0786903d11e4a0b5ca1e0bf7f61a1e0452d717d7f8ecb47117873f4bfebe37dd3f7d17f5d14f68f75fd0beb1f84b4aaa17e0b5c82185a241584dce0fc645d9110aaa084df154338411221d0a16e91440ecd00efba0bef5ef7bb3c9d62fcf72d7ec355f176cbfe1b2d9601def5c30c70d57bf8fd37fae383ef79777777bf101a7e584c2105ad134da03d940c71b4f71a4bdb6cfdf72f0263bc8b463496a73e434d527ff8ec452fadd3d0d4eca38f2239b6dfaefb807f15c9a17df63ee06fd9f5e1afdddf4a3e432250080c028164f823c39816e860e0f8be13df7f5c453f5e13e5e57b2b5447df3b7025054cd13891f10f9efe411309e5e615297cb8f7e6b737777fb34a4b8b9edc5c65dc7c3a9d6efebfb9eb4837ab943c9cd1cd27d1cd2bf5e6aa72afbb33efcec95b30159fbbf931acc2bbe83fdec507c3532db872484446084c901f20a71f383e8c69792b7ea7a1c29677375b54a781ab6e75cb69bae534dd72ce88e6a2a59383c3d33b9bedc1f1335bc488c6be13836a1d06aecd2db38fe5c30b9f46436d1829bc8baff984af5d82ae7f2cb7c2bb38ffbf1fc779b9b7b7ef48ac1151a5f0e15d84f12ebe14dec5989d06c7f8cd45ec02c78737aecaefe73d88ab301c5f8af83e26f6be0357bd0353f129adbd8367efc0956bf152f1c9c0a3861e1cdd0b1ce3efbc1af15b384609e963f6e16eb515d8478c01dec516efe2cbf828ae9ad771a4f5560b20ce890af83263c90cda109822d20421f8ac87850fbac0f989013f2b78b1037cc355cf0a5eb800c74fc255221c9da3f052988a8fd9012551f2a296e8879fe31d47a5f70453981dea75fdbcfe012fc7fc2b02cdbabe59d7f551e4018f1533ef0a4cc53fc1e11d5e94fcc782ef17252f0a07fc073c16fc0834cbbf59fe79c51d1619a20bc29f3be8bd1a8f82722279071d6f3c7190c3b77defd6fbe1a6c1d9bf87e3981bbbf638250ad029fef1d9897a0f81606804b7b8e62a9dd2ff1e6e81ef8802744abf0b04f25c5cf5e26cc7c1e1d1430a1e3db35293330304fe8acf8d2478f400a3cec0d50d219a3e5cc9b837600a7e7d6df425320ff5f4409ac6552ea39e7ca6ab198f3d0fb89a717be6e43e9842dd2ae396947cc9e6175c12b9cded22ea2ff9dc33a6277d8bbfe0918db8edc324db4362d32d40a7947c0bbce1aaa72a79f8056896874bbee44bf661cab994dc04540804df28b949b48dab4caf32f9ec38fbf75872740afcec9b074f557af87d8356891e7ecbe0a9fc61139d1283670303af06fcec2c4c740a7ccd592ad029f0b76e2473344b06986816272ad02c3b30f06c44f16a340b8f4e817f7a1212d297ec94c00c70dc9f9260f82626db446cffe075f045b675d05d83d7f5d5e12f7af85138017af83b420f9f077dd0936e761cfa929bdd5fc555f07bc6553eba2aded1875c11fda26f8142e4c6f55b60cd8d83dc3dc81d040c5b07fd8324aea71231ec7b22d52dbe98b8d6d21e0a8e1ca7ee7412440e4a6b3d9d7e056ae1b4d1086556bc1bc23be83446b72b5fe4d9eef0eaa7179cf3a2d79452f66d21a2f6e3b8d1dddd3a3898c8f1b0908219a0ec2959c27b393df0b4830ee1ae7a3a0f677503a63aa3e0ee20700b813b9f40dfd7f757b82a7db76d5911431dc23b5822dd802bd24327e08a744dafdd7c2a911ebba67b2add075319e93e98d2fa46baf41dc23be8feddddbd6dde2b20972a1abd734a8c6c13d9bc83b689dcb6c951812f0414c23b4c46c5db6608573df176b05395537ffe7658459e783b580892772af121cafbd3494f2a3aceac063de3ebd8dddd1dbb23bc2a598887938510220b8806ed75417c8e92c5e4f334c5cf1be8732595b4cfa6530cfa59c6499e81df6b21fbf083b559e8fb8f9e8d79d22cf1fd75e94d2ce963c488112386c94661fa287a505c7a6fec0fae3a0509d0f7681c1f64a3a81fe3a38da2e4631c7d8f8a451487be47c5a03f354be48a70dc326474b70c197f3a09c1a7d3eba754c0c10fdc0f2b9636c6e9743a3df5ee54e14abe9f629c6c672a914a46a21a02719b9661f49a325edc0f517097a8e817083130b4ee6703b67bfbedee7ffcce558fe27745cb06d8fb5fa6ade203ed7da6ef4178753c19a58cf23df99e7c4fbe27a3eabdf75e4208634337684fb6a1e6d3e9a40b4225467e7cadbe068f6819ca921f6d0c0a5658f265282b5ef95d7448cc34471e787e852b7f9f5d8cea3000beac8e793f00f1fb8ab5dede83efc119dfc3f7e07b703e08a34dcd4b037e7708ea018f25dfc7c36185207e08e47b8481690ef5fee1f88f43bd8b43de87733c1c56742afcc5a13cc2031e78bf553f0c3f91d650fb0a57dbfbdf80abedf64c7673dd5ede4cfd3e988277bb33705561caff747a5cc08ec44bf9c7d79e169584a3885d85775034def250bbd56ba8ae3db4f99b789406409a45dbc15ba9c0940cba06af71f05433cde2f25262f06c18f16a7811b00fb901571a781cd058b4f7dff16c60ef857f1db07f8e6b44548a594a5f051af16cb83c967e2930abc8cfdeab015148de354ee674073c755e8f75dec1eee5c0951b49708161b73244178474e8a0f86ad0a79f4780bd5f9424bc83378c50e3bffc28f5d9701e4805eda1a8b8eaa2e6f36969c54fe5a5de3f581de5b99126c12f541df05dc7f5fe3ae05f50835bb740795d7f6af3e3c7188661efdc12efa5b21688e508afeaf7f4594316bca752e275f0c6b3e10237f4c49eb923aea105b5690f13af067c2528be015713789a732e4c3c1b54a5fb51f3eb71e2f5f8cd2f10cb0c8b6f1d470b0515786239feb58387132c70a2b5a8229cdf0ef647cd6f9c1d7fc071f681277c29bc83b787afa0367ceca9c0150c15500127ac065e0df81d5ce5268102ecf0e080e167952698f0ae7f862ae17482a72f64f1022fccf6f752bd79c7822fed1e844ca79f103c82d8fe3d8aabb47f4f2b5c5d3f5b06a660d360c803aefa47cfc8b44d1fc1b089b41518e696c1fa07b7e384b5975cdbfcc0be698c615fb71bef6cb0cf4dc41f28b3ce0da12df089b84abb4f9cb0f6f0dbc6fb06db6e02aa861fa7b5768764df19f6d87de2843b06e5b55073c3a8ccae93f646cb166a6e989681ab0ec24bc137026502862f8361146c5e0df87d849a1b262603efaa26e0335181d6a122bef4a44cd01eca7b0dc3448f57f6a5208e1c4ce0f8d705868fe75176b82a3f9d2632802387af1eeb3ddf4802922add7cd410e3f3d3adde55dcefe6d37b6fc709cb97b7e1504f5cd5a7d7ab9597ea7f37cb7b7a956e51dffbc7763368117ea1ce2d46abb7a804ec7695554e3a85680600000000a314000028100c88848201815cb26c7e14800f86aa5666589fa85190a39441c818428c018101001010088390005d0541921de8f26cd138f3229d4748e921dcb1723338c9716051b4a37d6e604f8007190626f802e34939c98ec749877c48218349a8908d34283cd423972efa6e19c78b5cf13a07e60d61cf785240a5e18d515f3af1d47603f42d39b1acb44ce5f2ddb252e7e37814089f6fd3f5f3a170c091092edaa8c070cf4214730c17c759b3c02b1f806094ba5bba0f40a6f6c6873ae4a9fa39216bd7fad59b07658e62bcf182f76a0b3d9648691aea8793dc00bcae984f0e7ad673595f67cb42dae261e870e37cc142d9cfe9b28128080d852fa8f6be60cd81afe1c824b21886589873d4df6ae55c0d33f9fd0f92d4d0a3c14dce24606ae8a1708fb3ec07cb998f8fea2849c876fed22ce0bca8a1b259df437ff86f74e643bb0f6f5ab11ef92c7a44aa016bb3b430c86120ec8d69d3ef0b33741973b2b6784cf91860466f9056abed602879bfd1b71d1a0c3c273f226022706f7c1bdf26e5cba71cf019e0342b92298ad06e24b0f2f09b78df945aaebe600dde2798c7900a820c376ffa1932889ecba4a66741e93b322bcedaab1f6c4bddf968ce63d83c84b0143b8e259edf9ec08563da559d8b7fbcb05a2d534cab1e099dfa0aa84227588dc8f4bcb07b701b81765540ef50131ef5e5c8c640e98cbc9deae507507f6538fcb74d28cdbc230a34c3fc3e6d381162e3c9d74cb462695910fed30448150552d665b0f6b2d98b20ac145148cba3aea6a1f1507c952081a8f228f96c630ad7195a8b3db66dbbf4e7e0148da2872304bda3d5aac6fd9c08a0feaca1938157a02cbd974809b66204bfd255c88ac75edd8dbbd100ac18d0ad4b0ffe854ce10d0fb25f0362be0a6010f6a50ec3890e46bc75a846ee873cffa8bc5b16fe692f43b9e170b4e942f6257101d330bc1ca5fd469d5de52291d96862b8074378ca44a3ac1ec15592a19daf93a12a3652f9cdd6494c62a0857b6aff84cab8b143bfed08552671999e773be6fb868562283564c965f8d0627da5648bc1842d64f5f966252e21c82695386b87ab856bae3ca9efa1e6064a7a7222dbfc1fbd1ca97509b200999e98e1aa3968aaedf14abe10585392b692de6ff72aedd71e31835da4cf878300c225017f36164607d2431929eb58ee881f883eeb943d2e46f016f7b69ce5dc7d18b45711b5f3cceb418ca071b27b42f6dd8346a2ac97a00b098f070103f3ae7414fcceaff1950f8b9b84cb479d5e894a3c7355415157b8a98837df1de4efda0496f83df2c93f25ce87b3affb90797f156f389e0177eb922d62647b34971005384575ae55bcebd5d1b37927f514b9685429832851a3ba2f85da95fa52b621636c74a8987e8162b728b88d7c38ac36bdd119e41935e17d9dc9f01158ae38238b1996485dc0d24234688ca8d332776b977992f993aa512ea0c9a5eaaaf9669ecdbbe62bacf0d3cdef9a5a802ca4ab27bdf8e2745cb354ceb9431f5e131ebd2d7b9dbf6a9bef7811556cb3bed0f4b189f281e4c75e4ebd9f69bdc3098e2e8f414db95f660f5d7a853383c0cc698f3c7a8f0a0da775f49d5eb089148c6e3a3982540e95f5be315a9611ceddab076061d08773f41ebaa4cb9011f87d6387c9b1a3a0d33152bdbbcaf6c254d3edfc0b60bb5e5c3710977e5b205ec590fb863487362dbb7611a01bf6466dcd8f609f1a4aff31ba82a230adbe46a931dc9ca6df7ad6bcdf305e9c58cf665cd17fc1ed0a5a81f89913f9786057845f1f61bc5d75fda86e2f98302f39cc93ba992ed5912b8bff4eab6dbcfa207557331e6be447e886547d9bb7f34bcbc8b4679639e2dbb1cc74bdef1551aef01cb5bc7c145061bf8cb8a788492e3434bad2cc717fbcb7f11d2c447edbf2e31e87839f70375b8a7b5e9100bd406334c708f34b759cd30e3c6524b07c3916fb96137c55b2cfc8c73ee504708b2aa78b5740aaee261749500013c09cb1ff582b25ea7f1b56d98631f4f19de578761c947e34469c982d154a7da3621e212613d88e21b6b701b966bd85418a2d1fbcd3894dc2687aaeb7903ee9bb7d811192814fc19fea5ef78639c01b0c6223bcb3ebbf2ba84a71f98371db57a9964f0abed588a9039b6bf1c0ef371c6210e9aacdcc1168126008262d91805082fb497ab499f21a2cd397dbc95e9e3e9159d65b0e56b89bcf6bbd3b418db4e3854be42a30df0ad0bc3849586e8d7e101ac40a20f3265b543149ef43c7e4dae31385ddcaa7c17a661404a4daa849e9800ad032083bddfdfdbf078555233aca6b6a327c9a50d68018fddfc1dab4be65af43c748d8abe5c226ed65a3103e15a2460cf42c34f73e80eb814864f270aaf7b27929f876bb3f24e6edb2cc67d1d2a2d3fe9a7fc78cf6f36a8de753db6b29ea8aa446b693b3b5262fd2aa8999376a7cacd1efafd6ff9e01edae7b58da57214c85403f61a6f987da895db08031dbb720a2729dcc68a6d654857bd20a0a29b489969a72484182a2fbfb0736e865db290a89ac963ce8e84390ae6e33c1dd8dd5b22dfbefbe008c207aa8793e80236c644f7664047cfb40d24d47f38e251f5f950aa027fcb95e23f70bde7382eb7bbfffc62eb0522c77d9950be5303c504618af897378191536114ac0b1d3ff378859ed267de18bbee4d75aea80e576b4fea3bf2b6d111433a27ff9b78ada451e2100f3c30f6acde7081100612b296ec7549efa3ace355f74afdd1d2b566f39e57b06f53cdddd383505d136b82b1f2f0f6c783162726f4fa5adcc8ff659562fb02a2b6b7c9e0297eab8797f93366143c4a25cb3abfa78f4195b71565141c0f5a218918768a321f58854ed92202c77ae07c9efdf2de0623b7a7fe0a924de543965cc11ee9f13bfe62c84033063a2a6af7b99b71d4a36f9c598a354a62a32ead7ce096ed4089f4caba002eaa67247aeff8aa4945d7507f7b2191c63386020a1c247ace196888694f79023b117a2065abb5f53782cf1e2b40236a3594069db03112adcd99095eb054066d3cb34d887a0d66b6272d169e48157597440150eaf32a5be73c1c38d3b4d834ef638501f89ef615bfcd62a7a140a7e862908792657e78d68da242d7bf64579e810455e5f9101ea33ac44c8aa5386e9c08294b1d54aee470812204b5389811e91ea0bf8e1ebab506470ce3b939cff2c7dd71b8d3b9a614684df39f46874cd5b58b894df98f93e6658213573349a34b7a0e02125af63425b170559a2b449a0d624508823f473df19db2b510125e622b418a0a8773408e122045042fd6da7607c966114136e4ff261c569fb0f429ebc760cb1329779900aed1994b825910e470659d8e60c769e0645ca0c1194b49d3cfa148aa52ed60f28837313a45402c619d71e4c8a463546429dfe18c43dfd9ecdbd60662872f6f4c615295db9ea5e7054aa8ebd2c8ed94deb408d2204a6c656c7e858cf6e0f6b1e20f8c0661143193460083d49c393dc68336837f2685f597a56df24456359a621c8908ecec95987e83bb19c2885af654af4a7c62ec2a0c75b4a9e215ea9ec20ba5d2521e6e48c7d85d707b457693c704b4c78cf3ec2086557cb37ead14644c12859efdd586c1f46674139e52cf78cfa45eb7e883c79a5b820068df5946bb54b433a5910817b2e35961fef5fa96df7d0d11244f2b77b73cd27555ad893a1d93418c21ec9537821f34ea24b26cd76d0318c0962572e804114ddf1f9178bfe6471a24cb8d75ad4e99781943bced26c2da5cd43393e872734434039fd2260dc8b1440bca7d00d54d4f80826e591a28778974339a9686eab98fd87c4471a319f6cb80210b2c5a17f9e0b938d0df8ac5dbfcff04c8c3e58c2c4d7d8e9a8db9351e77cf225ed704b7c7811b6442d02defa2a0c626f164dcd6a2031fc6543ca47ec8edc7e338be27971c326f7ad8d8d42edec9f26983b3c17f1bf415107fd9d4de002be474920c117c04b72a4c3678fb849d2ab9aeeb766a812c03677ac1ef186959151c5556c69f02609fbd53b90929b2340b578735863835220699dcab4006a62759496e5b15056a20741f4026dd32f5aa0d79b136351ca5b67953fa54a4da5f6b4a3a812efa729a53c7bebf3008a519197f21666f3991ba5cafb87382093c6441a0a01e0285c91fe818fb7aa876699ef26caa67de188e2ce41e706938bca6312d118e1be21fd02f4b6f51bdfeab30e26301424a0e05929a0b31f93bc2583e4dd78fee03c582dad64ebc04a354e03b81eb9c682430fe4daf51cd5a965d796ee6b0f052f4d8573839210c0bd8dd3a286383abcafc166d214018b22b861a4683d6beade6f6568140f8c6074924a4eb6141411c038c5e1387e5c97d759c0ffcad8ece96a76ec118069039677dc5bac8494087d0b72d144ce00902f1f43e9fcb79bf6208b9379f4a246e1cb62ae3edf6a2f6a673c2eed396397e2c0a2cfd6de562301b5e4dd6174968746d87f682ee289018cd914f21fbb3045bcb49b717120e08c94ff585aca7477356c49c816d2f00070217121d06bcb1642303089b3c69ae6e078f87a8dad8fe5f54d210952c1a4c73092c9df1f6d0dcea46c1b85f0da012a4f9b51d253bd46283bf7fec5fafed3f63a56567251a2eb22bf3e2894e4657a7fb8891b2accf1ff1e5a17689302518de0431ffcb8755dc22bd6771baf93c15ec20ddf4bf532e7e34d700ed10b3205c836bf6a4808c21c1e169851342bc1cb82c3b344ae80fb96ae82df6cb9773ae29ac38cfce216d2c43905ec916be08ca94d600ca4174d24be5ecf8505078676817c42704cad3081f25890e9c1bd911b4a4d279826c1ae3e363850bb43bf31f932b6a16a1d84d4d7bc5936a8ec3a3fd1bd504cc46623c806cc3ea4705e198f6bf6f75e505c5942cf840ff7eb1fb00a8f0a74c7660a38fc2f638092e3ec2dec869e883c74134a4388f6904308581d7310bce089e8897fc0077be54e821cbc3cb210044a92d88af21b044abf11003b4a045afe926cb3528b2cb79d83fca1d1c7cd8ce29f0b33e55533d5b721da0e7c8c1d1ed917a8caa53c5be47d178461f2c58ea255c68595270cb3595197d1c7ed0c62ff25b1da15d72af9a435609a91c391a5b498f5ce936f6a2953d8c02e1f277a07ff7f15ac9c05c071ba7cd1e74865037a49f4eca258e5fe6802835e8447c3c22745a1eada916a0379c56d4ac941cf2ad1f9f530eba771179a239860863253f3d66e98798f1722628439e64b3a52d3724fbd6f1eca9c38f4e9a32ba09642bcae330ccbb618a9ac978e67abd2768c29147199d343221814c30e1f739d008751bad554c9713c531552cfc869f56ab847426aeb223f1633120f90d5a94d4cccada7a3564b4212b93b544d507a22f852c92dfbdc012bb2f13af1d4679d6a23709db50692251b594cf3d75afc2c0157ca9fbab90608a591141507bb2641a7272731da9428703596d93193e8c341e7504d5ecc24b80a89d6f346d692f4e3b801ff9a0f10d76e267aeacb8ab039e802c00a32cf679aa7e2415949c2a6af1202dabefbbb93f889caf7a6e4f3c8a65029072927bae704696f9523ef71397ac208e9d3be5898f225760d8cd160ed8f8c81214b185d4c97d129c5f93b981d0ae3684086baa49aa176522d29ae9a36a9f2132239cac8a8d507a8af624c903666266eedad9bf41d925ab0e7cbc34e14c8b108d41935ad1e346e8e9daa9fa2da770abd3afca808dd725a6099e49927507eaa72045cec803b799f9f5196f1db491126abee3f47290a71f115412fa6b6729fb52c1fb24e273f1ec046a432e5195670f2c632340a77ef40ebfcc58411b07c6c55d432c8c43601276f902d9f0b0d4d46530887465dc93b4c07e033fcc7069f6f75201a1e06a70e4d918a6452c27fc504e36e38c27f15fe64b8eb4cdd85442281544fedcf756267b4bea261081e0686c414d28b7bd49b100af7b85ec217cec8ca1911ae671a1211fe27e8db66c25cc35646c1d6347cb2dc47a9cb85614bb3d1f148034eec7ff57a6a69eb3579ed6fe8bcbcc1bb3cc9b4fc751399c6838994ee969827b01984e5e9f086d822eb8cd219a585bd078dcb92f89cd9e1eaecb31d992740ee97edf4a2961bc90476151288405a97712107c838b2374d0a46fe285ac9baf1f6933c2b0fb606a48e9e4c47f7a37afd3f925b0be1ea9d68efc58e94ee374c6420585e23d856c1a1c3e60f97ac8f687af8a7c722b0c159391ff06f8716f8574e12ac1da2b3dc3f7bd4be6b6d9410e79faa047cb746db77d9834188bab00cf58de31780001b7e08dcf9254cc80f0c7c308ca5d08c443fa12c21e3bd84127612633fd6d4d55a48c0014a9c4cc55bf42b15d789944cf7f2e02332cd6d7424799ffb07f694858a06ce275b0c564f0f09a0c57be6478786c3846adb83b94c1c7d02bea954f82f12c0c3d208e6028ae45288c21ac2b8a145a5c4a5333c914228a5346bcef07fa4ccda7801c51eb87b77d54d215e9658ef5a62f841430efd8c0024ed45d26f1aeedb7df020fdae0c0e85b3b1d72c6cab90ec9074148813a2415b46fde8ffa084120e0f95655cb3fbb597b6f6d0c7d2c0138c3f7f67240cdf82a4aa50c1b38af01a67e49a994caa4d85237d366d99aca7bd6463de117a44a25b73c4dbc1e5a9a722d3312e0dc94867fcd58d7a23a3d97955e85c426e68ab108bd1b0c2f7b8845c3748ed49805dc864f7ba76a1991db958636b5c15f52a219ae4212b412a498490b9b82a8bcf0059646b3f65b53bbc2cebb7536f26b3294f88fb593b49c2001eacad4eaa3174bf55fe11bbc916ded1e50023034d50fd9410984022870a312b46da76c89d41e8445e3e74ab5a2780519f54d5a9257b4452895879df4a129ebe9208545886fdc905c3a8cd1a4ff38734d9583db86d2b11edb5da8ad7eec219ec359e68a5f8ba5103cc87baeb38cc7c9bab7f9fcc67056210817b643d13cf898576663b466df267d432c74dda309cd6a6491be806e65356e66a89f08cc0404f62664ab2a8fe4692c121ee005693511d9d02683233af82c5d8bab8c4feb6b0fa93fc2bcd481941e75501b52e6737126f21b1728b124f9c2af29f10bdfff3600299b254cf720b88bfcd677c683fecb48b037a7dc6c36646b1d72f7242bb14308bf96fec486c7e9316522fc1a1431c95a2a6da399fd3415cd4506450693c724f259ea802b016805d3f8d61829cb72cd137f9052b490a4b7c228b7fdfaa443ae216e82344bc7e2263785f1e2258eb66af46e0cf2625fb5d34512687fc3e8b0b1e70ab24fce0a33da93963f8c4a16391a86d3bc3164518c86b8492e4660970de6877f5722cd827d86251a0a651f31642d3ce991dfb6b05d929bd44140b6bb0c7c6437e409859e482d859ee18dd73695e963f5f8717a768f930ca83408d83d49743943430dd664cd2ce6194c3dc6c1bf437e751a46c549382455f111f23ff4fe95589c85bef05be9c44cd148d56eeb9027952b6d3ddb8b3e4253f5f6bfd8caff95d0b7f9bc4fcfb7b3c7fa07de4f0df646e55a4b2892b63080c4a9011438488e71a56cee3e6bc07a92586a0b1b4eeca9405446d76325e087cbc2067f3631ba01be7030135bfc9c6b29b57e09662b5b6d2e1385ff6bd2be30764abcdddf9c07a4e42bf7bbf30b1ee02c110a0eb41661dfce54b23f9f4a3435085a36bde90eeb51faa5271d08caeba16c6a11b88113f1f80baf46df340fddfca5eaeece1a63f45ab86c0c9b8e8d639338bd683684f93a57e8a29286f25302b509bab0ed03bfd42aa40afa274734d0cde799245dde045d45a5abe5ae59aacd476f16b30aaec02a72f5dec271d09034381813a00b8cd094506205ed9d38133813b631706ee64899a6076b9817a9d15725c637b7448b898b269e1eafc0dd1a1eee8756274fe186a214807ad43972632b75a3a3f7da362d4ebb61c466c61551c80296f71ebacb4f24679552ca430b2eaa0604bd9385e8efe30e71b444e67da448c165e84e0316e1dbd1864c18eda3927d6f547e326057fef973498a8d02b1e518b4080157748fb968e89ab30677cbb9e9fc78fe7fae964482dafaed2ad304d79f62e4b437081163944c425096add216ce0bb83274d0d45dcdac1d728ede68fd5e3e7c084db06e50b8b8f0df997b097bbab06c5fedc17fa7f5a88658e30a723014f37a86754b7fb66b5331564e94652a62a2b02f624efa3b968c9195d482980746463d0b1a74f7f044d7ed4c4e0ff4177c8b628e31d6af34f91391366d95d4a073f344aae19322569af15a77fb80151540380899252bf974e4550efc74a031793dd6361335016897e6a74848718d64d4b96a77ae51788ded50a3545c723c986661a3b0ced298d651c9bdac02e904c70442c9ad3b96b5620ed1424f3d6e26e5319d9f1faa6daf309ad1fcbe628304e6c9700c668c876f35b4b4b504e60f82e4a608a4c5d12adb8caa040ecfc5af8da79ac7f8bb5551b4d6247a73b0c59a9eece7c9eaf6a50b23dca159be081954a795de55eb2d2bd278c732e122a1277c3ac71d12ad6e1cc3ccb7bc1572adccceb99d587e18a40c43e25550afa05ea8f3353d0a4a603460236e6b409a634e9629fdb6b121eae9cba7ac2e54cf6b483169693483d0bf244590013c8c7e948bf7b84a41fc3289d47f7657f72124288668cb8a7942cbdb4dfb0d46af2e43dea83c5ae347df28815b027d6b47820facef60932350385cead89dbe384ab7e1927db5e7113cc4f1503b3fbd81ee39fa3c3ab9b1790bd2c460fcd3c77a23bab2f8f98c2a9fbfda2e4a1fed5330a0c90168d0a3b4d7633f1d0489b8d584496e2ba6f29e2cf9682f5441a58ef3b0c2a42fa9d8a774b646892a8a3ef912d4bea769f2d63c5c0b97759bd26a3b77636e2f02a0da645bf745ad88687cf32a03be899b6fbd443496372618234d86a34ec9f7a81a6f1b95c16b7d93d9e45ad7d38606f60b0d12a31cbe1074db5064b04ee85d5eb1c58755b02aa34038d1d726686ad5a7421afdc87d8eb0a291c585997b574c88748bfcdf0c907fbf19a735b780ed43ae007a8a0bc507c59e8376be86520eaef5517200aae77f5783646d28fceb67afb561b41d86dd5c7dd21656e8106bdf75e0c654fc6f3b6f89f3c59d27ae167c1a46b1489f3166794d9d291cb613865c1110862f0de530e1e02c57a66016f5c633de8ca9ef7c2eb064fd30b078331c77e827332b0bb240b043854aae1c9d200e1eee5ea0f50db26a96199a14d16fdd30ae513aefe798bb5141e8ba802a117f6f8676a9138426e475499da2374304d27c9cb386ae0818c06d5295452da4ce49a9c76ca9be334e1c4a28a0340cd60a6bf096e0eeb8d24375782ee8673b79bf720826f25f271d771cf247fa3d2098c701792f357379f447efa7142827f8f1922c7e0f6155cbe3fb8132776a269139f8a0809c1b93de60f91403247dd29e852c88c038b445a819fe2f248142221f5d5a2db7a7f9e1cf986d16be44bd16e14796da83a23372a657a56c2bf99c1a76b4ed23abf3bd1a1bc8a8d4fe0854dc6311fa32ff12661907a4cb7666b96b3c03e2e4a47756ef72a069112f5ee9a8a4c5177b6e5e4ca9290e8ca8194d7f0225631b15e3b54532492c0f45354f06a0dd2f2b7eb6c612fa3eee613d0b2a485a6c21af8abac03bec17b758afc15850f0a8d73164b808443f9b227136d0c0f9c44ad63fa02d3990dc5efe66e1d01ed508340135a5534ca2aaf44a3fc8532dfb5d92c3bd6a36c905ad57c2cdb5dbb63d690659a6d172b98dda5c020b0e693907043400e98af015b82a398761eec914d8cc52a5a256c780af786552fd70c81da08dc68e0180aa90b889327c6407a84c865021e4cbb321c640d8e7556bf4cd289641e6a8df6159d5acc00c5b4af0930561921d1215fd7825becd45d5013104420849a0393cc3f13c9f9f7ee4ac5df8c2fe75f5f6e02abd75c58484b98da25f64f6600333ba3bb8fa5fda2be695b5943ddd6c541d120a4ef2de1cfa15e89dfb84a462c66fc117100386e8c4d86f44c995a33c67dcb28063e48bb87e553f18e6b7eed39702572a50adc6f6eae39451c4774b49a7005da75eb157d5a48e1ccce44797d7b1a9309d30a34fc83b612d3b1cbe52c110c191dde01933dc30fe3ae2010458863985f3aad4e7244750bcbea8aec3177697c4d030895fc2704153631dd07e29c08804572717baed930eef344316723a95f02f10d04b0b2b5c3c83b0cb1f3b086fd3092f7ed1614991998913a8e5a6ac93b93b6502f1e34b18ea11b6bc259b665ab0a6266133ba07242e61ae0cb91f2d28079a556fe054357cbcb7c59885da8ec7a4d49439a7408c3abc569cdcec1069c6e8b8e7e9a639c014a229bb4cdf51468abdd092386c99078cef65f5798ab670875e92da1c3d9f4b73ac42702c0b7b5537eff3f543f242fcae66272b21d440e5bda8085f15065ee5abe9dff453c5a6aa82eb1a76e0a9c5135ab87d4cc5eb247b9fded6d1e87ae02f56305d5a37cdcacec77f45b68090cf9166fa1a6264f6572d46a03435b06b780d5d01f47277768239fc9341fe2ba6df123536e92537fb18231c641bea8e2656454c5d96e510d435fb218563527b29dced200e9552a03691c4785b7669789e6396247a64ff2e44515d95909c1e290fa5a6e90b38ade9742448d347280f53e7339d93b3f09a3d7e301cd876d938a197058f3b9783ad62d9921357db10e61336777d2f1ab5457e63eb4f02781d156ee56dbbe819fe3fd7b0c2e2b9f3aad52c0fcbb798cc8acf11bd8b580f3472903f741dc31f74a6ba5fbfd6680d409564967b0bc92ec6c86c35c714042f5596b7f552f3e2e96db2c572f25dd73b7d8c06efd07073dd5f217bb3e343d061c9236c7a95d8f5010eaf30580b199a62be76c760a0afcf1123b670973e787d714f374282910bdfce934bbba24f795aa0d01e2c2ff220cf900dadfe06177c5c93356e51469bae3a4ddd8b18aea7468cc544a1d3f308d88bae346fa1ad4048d8196c4a89574e3d129db2b1abb2dde0a5b0d0a402d12444a280714fee66da238fb4b3dd44c16dc0fb375fc04713842dbe9bb089c8ed18848c9cdefd11fce4dcee1cae624743b4d1681cd8ac0d07e7b5ea465680cde862c2bd4cc154dc3742435ad8851d8ea072b8e77a8c224dc38ca0ed3a31479e26b5254f5b96ad31b8cac435dad3853ad9c1db855f3015a50fff8e9a861e71dc5bfa4674b437f430f5a606f303374c94dc3c400078f42a48a26501851382cd813047f23503868ee5c890f4fbce4075f3f7a6708bd00fa3063b3a16c87e4f725fc41c364c9af64d6a72ce18d5e198b989a40ff5cef4bccfb5940619733cd58967002c41b1716ca62655597808af975393d6047b30cef1e7e67d3c3304a40f7fdfc66f92b9459076a5397135a9a17fcc5cbd304bbfd369e6184f483d86422bf580d8ef1a9535286518003c4e6fdedd5cee95310a1bea1a963a3bfb31487d11e2ad20937edecdcce1da92c59ca245eb66cf6e06cc88c230630e7648621ec87025c00b3f2b03932a1f0e2ad9e3e6de42432e8c743f945d8be03e9664c54781d9b59575aa39b6c65944f4df6c0b13f4cad82630e3288b43945614ae67a50b4ff032a2edcfb703d91903819fc121700dd48717f460c3b49ed00139abd7da8c7d49acba1efac47ebe101fa2ef4c186e765ed22cd36ca9899cb0bd9a6835da1bbd6bffc7d7b29cf7f9e3b31b6ad65cb81f49eac0c88fe10cf2d9077354fb485d7c9d268349756e291b0117a77e8ee352e6f938fe2c6454d123ee2ba2d656df438057a01d47b6ff4b966a15fcb01fb1928cca6539bc84d977606182059b7c8afe515135624b981f67a034154cc5a7519683a462339da85b0a8011117cddaa519436a4a7aacf137275409ae896ca26fe159b8ee708b7a001f29dfaae266b8d5f75688c9a7a4900781b7e9cdb899cbb0e7971b7fa39bcb0106b69aa2277343666fdccd448a1bb6d0b82e26b6c80e42e36a78806877078eb02b14c5bc755e577d45aeb22760d2a575c90c6d697c15f7e5dfc99260e014ee839d9c07cb294189571c2ddefbeba3779788a18bd68f0499b6dd751136253b3889294bbdecd0fb85b1623b75c827d5ee20c4e254a62e26ee705ccc75462533398ef0da10158243ce67db625d0fa27213b60a38e5c133e381d392a286ce547474462bbe92e99621d0af64178b9a48f631a28532a0f1eb907f570fa5ded7728b94f0dcf215fc8c2b31b0ab854a0e62a158b001da7c1cb8ab45dac81d1550889b3838a07435a5b98ec9b1d16b323509024b12f8f4b28c23fea3c84fa8367a3679ce5c77cb7d90ec15807b4d54b92f1809304b61315c0c4e949301791c6501fa3883e31b2e04918590ff015b9bcca507e9241e26452022c430c2a4b48d32394a8007f91842e1c772e99e99ba676a082e8b2b189169ddeac8b16559f8ab70c088b2b152fb1eb4f03fad0cf0c3956571fd078785669ab4475c2c2f8becf0a927bcf8d2a50a978eca779832394ea75dc4d57cea770493ea67b1889bfa51a552a8ba93ccdebb918c5b129b9f1dfb8d6206bb2d87e510641d87ad7160cbddc0b89464786605cfbc207bb9a0137538322a75aa85427c29e75db3a69cb890b0c58710844d25ef109fcb8e16174b681b46b6f8887d4714bcacbc2f893023f8f75d83f14325e2e8dfd381c66ed9e39cb8c0adcde9a100c39dce9871f31f41a37f3bf9d71ab466d05683838590efbcbc768b4f5b210aa56d158c55b0e403840fcaedf0c6d3d57cd78db2f6e94522b4866a41bb73104d427b478da724f46c131f34cda6166f2e1cb7ff84e774e54fa70aab0636c457bf9708791561a705f83e12e99023a0bc727830d1803049d1e1ddba01397c39a1807a88420b3f25355ebf32ea05f5a396a8301f3e63ebe0c8fb63e371cd236a892b03cedcc53887fee85d37642611705f044ea9226049983ebe4f81515277831193631420f98444a3d587ef5dd4284d4a8e36f87a6235a04ae9519acdc2c11594ccd51beb7c01687176a39473255a8ab7db2cb3a6c9251f2ad3e9c0e88c3d83608503dd1084995447b00a12392d0cbee7976cd5866a020868e98d2d6610b9ac663026be1ab5d859413c02044fbaaa332f02aa989540691b7e4557dad7d07c8b405824920c1c3beaa2ac98b9ec80b675bfe6a60ed12a130c24bf070ce68b63cb68cfb30b540843a04c76c987018d6b5c8fe1c055c46e259c47cc1cf8cf0c5df505f4b620f46c2b85ad98a8c1fc5ab6cb2cde33395d78bd94416d73f5c06e6acca771f0036c3123dc42611932200882bc5a33f9d99995645a029b57d0f235999b05ef59672070794177605503496cc932a19379ded66077779d04467df67afa7514bacb4a2e1b02dc784646c1820b3447ff2c09820af753ef686d8eac94e531864e0073279fe168492124337b6e26ddd5b669c9ad2b09d0d8097f4c5e7ef29a5d1d4c2054128ce734ca352705f87335b1b0a551a0e0e7b135f08643b4987a26bb66351878e287969b3ff4edb6d749612efcf418b270072143d111e8685db48c45a7a7d6032e0b2d8c4d73671b9abd40e720fa8bb6a78ecf07325e48dce3e8ddf46276cf62b4123403d8ba138b6943b5677467f70075e7fbbbf24855fbd75afb3e9eeae4c617e17664ac4d2735d92c29889e3747049d8cf240dec856d36468e6d758c3029b82dcdbb52323ec7a95d883af4da22041098f040b2d5eb5185cb36f634d5ab7590f9254790bc05cb4707aae1602d60f0036dab2dc2957fc4d25138921cc7540d621a307ff52bc41cd9c7fd922947cccdabea6670d807a7f6664982137aec27dd71bd6bd1a8ea08d6c5f5971cb053b6c619d6b92e9a601d73208b66ecd151eb10d3c848144f84bec111ad2c0c7ef86b0ada6a3c22db98a98d301aa3a4e4e0038d635c130fa476bea6171d242913c0ab38362e30c2dcb406167a9aff7d0f15cc93d7bf034f446b92eae516636e3e097bc61ee0aa187bb61139cf0549b7fc1e40f46f277ca510d48214f5929d0304bbf4a7db5e45f076b92abb1d6ae3bcfc7b89ad0e659948554a382e278570342841c75f095d7e5e74e881e2fa0cef6e19e7658325de7fe9b950cfecc7abb2c57c961de11fa9887a1de5a36224fae3443f4bc2e4b9533dfc00f37b5d686dc1d96dc5cd1588aab93b28e8e49c14acb9716abaf8b8d36c1b64b63323680667665c44fd362d50c0c54520338658f9c55116e4bc54e379fad611c4552c3e8245a4cbd1a5726e7ad60e09a14627d73028b6758479e8c584f84ba4805c93e6eec70ac9933ce449b2bda18e0c53e4e40daf5af40e574ead50c524ebdb97d942bff0f91914a1af1cb088da00259bd5de7ad8282cab6151d3f9c540bfe47e11dec8ce0bd5cd415090c5369baf9f1f133b622890d22907f04cf5703017eb0f6bdd25b777fb7c08a2a275d57b9ba19f686e26a4a2b6f07f0f933e59783081e237907f2ee1557d7c1907c9abc186c05246092105c0fb9627400f4f4d368ef31f3c7bd4493eaf0bd510ca87b0aed8f5a55d345e5ac5cfe219f489dca73298042b36b162e7287b06ec4c899524f0d4b20b3eb53fc1c4c6ee2277a15558094af49de8990bad36293c6a1da546959fb529e0d261b09834941a98616d32ac062b4edd2af0272cb5f6deb68eabfcd5c065e10cc139b4952195bf52d68c95105cab483086538996acbb89907574a33eabbed3889750d1a8ad8ccd26189b8c4bf48d1838dd8190c2792a496b129bfcf156385afe7c3567d0349a845cf23590522bb8b57337617818aefd775ff2177936f9cdd8eab3e46c7a976da16714ca29ca0ab99c6c6ddada8fb0c6d5be4715147de4c8b1cee45a12a60fb5cef3a58b89c851b932a15eb5addbd643ba545a727a376c7d1baae723763e97d8b389816ec1aaa4850f5e329c45ca9d47268751ea194093398563cc3c418f020ea069510f990aa55ea3405eaecf2d9438b81c1d10e4632b67709e5ce9f09b32dcee7dd9ec2b8ee0eed53dd52ded0e2edbe04b760ff960bb794dc2ece28ef211b1efd266d85f3eb471173d2219d4515436c6476150a8be6332f1621833fce4f622ab0578c521a965ce01fa6641039c6cb26a9e64520d36edc3f68a2751c32cbc913f1fa929370545a894043df1f3bb6a3fd9580db8ebaa5d5085ceece915b2c47979cd72c71422b87a1129b27faba528a5d734a15f569bf6898d31149c895442b5a123bbb5b35784e51169da44037b575d209a9405b1c452476e440f431b00b7af5b9de64ee652b0272abddb52b86b3e3d78fc0ffb8326024433c021d62239c07a40e4634c902b460ab32ada5badad50c1e9d109c528a733abf29e634935e5f66845e57ea8b9596110168ba87145a8019ca483920113cf5ddb1c28d5349d3db003ee2b7c726da4d3cd3663fbc3c4ef38cf7b01ed90c7ac2e328123b1b19c1533d86053b3683f2683e2294162cacebd787dee6163e4b075d6949bb066e4661377f775196c2b98d80045523034c0af88fae29bfb1967a66e79c8eec2a5516ce0843c875326538e8ce2816ae7f67c5c71ebfcff0a211636e7b8db4d4dc2b92d745d10bb15aba8386b7b70e2bbbd91b0df82eb0713065801d7086ceec88030bebc5c524ac52310125f5311602c755f0adc2a713ce7f80dbbef00e64829525a06d16148fc1ffc6ca1683b4a071d0a6bad2c64be97049c96441b029bc6a07f8d598c553ce8876d10c53e8fa381cb5b38fcdc87728c582b7b0874f3f212e8c5948750fc5b4c0019c72dfd2e94be970e5d4038eeb553e124a7798ef878deb2f560cc1b0c2489d08b12adde44920038b920d0a8c8e05cc6b532faf28154241989c49b1410a56f5298ea40fcf760f501ab098984a5448573626755a21a6e32ccdda949adb9b189d16bb488687c2b9c323ba91b1a16d1457f90292d202381a0d502ae582f161056181b345a09f3f822785bcf71680d0a8343a4c2b778eb200294110d34b3d2f5b31c12893124d36c9581fc320376bb854f7a306ba5aca2a4c4a92c29b1855446cac34c559eac538a8ad3914dc923c6090cf5db08fb318ab7a31cb1f29f8355f9e5506aa6945a7bf46d4b9f9ed2319700cc1adc9711e9ffa63acbbe9ad9515db295983d8e82e6df926bdffb9d468b61dcbb87bc6b1ace07d77634a510c7ca0ff62f55801280fa3cdd90201104853801bcceb46f31036ed345867383a9c9ff9974025fe6fc75f8f77359032460e5e7cc182c83a595dffe629d62ab8a0cc4a043035d1597d6d06fd235784a4053b91717d4022fd48f9809e05a5961a397ede572818d60b952ea191a8b718c966692dc918bfd27b7d80be45eeff59375e0b0ba8ccb15b2d4169868bd12f638b3f66d650c5311b500c2a6208d7d3f913ca8a78658454a2d421e099d24d32d4c87d7c8e6c437d293495448e374c92d931f5cb29cc85e29d3e99e1dc6b15d38b8a1aaf4436f8280785a793a9d18c31adeb41c5cf9cb5229110f9a5395b9fca20c4b9b7547390dfdc32b1e6740502b72e03e411afa885c0c0f1e05517c73a9f835aa101c6ee040bf20d531749b3ce6b4c89966c5cae3a172ccd0b1a0d321acf128c792340885fab914f8a2d2924cbebd8e7ca4afc8c1a4d81cd1cbca1cf89bd9944dcd03d08e17e0d7b557b92825e94020d850de86e5c136e741cdad7e329ffd808c705f76dd80863e3750cd51861be75459431d034e4d65d1310492a1b8c2435f84c7c0dc6f8e1f3f5ba0c19574cb1635ec1cc68789d28da13d33a51eafc84abcc6b0c33d24dbebdba2a43de3c83631a54eaad06eea12fc949b6499d54ecb34be0c8614426a0a3125f8a52565d76b818ecbff68ff30d019019f7a327b8f99cfd4739629dd94f6e5234389449179d4f628fc11c4e9a15f830ea84821e620d31410b2bc34d6de3b8524247857f6ca4fc46509657d67b73942150be25d53c510fe2a6b71e02df636b0ca684df58c3df22919b89ba82b7df99ad5190ea5164d6f1d997529708dc5c66638af34debc454c66c0806f999ceff298b62b0df133715f754c6502059ed271490bf52be505b808d93bc3c229b10317b1929448dc9fee59349d735f7997503bbbb54bbc107c987031f9c1db2576ddeb7321ba9f680911ebd0e2109c8d170b79a2da227af495c97a0baa450a158c88844d4487214fc730d90dd09bcd5cee85ae03c05d2a97d239eb8359ee0dd86b44b22b13ecd6584580ce7af34a1c236e48d034fd5dc6ee760e838f43e4131f2e77db436f87fa8b32f5b000e2f876b2806018544e3a017fd12d13662aa0ff173ce49c1e4582af22e905ec52e00f5c3605d8d18f58159bbc4591584485250e519d2c2e219bbe7a2edfd14e668e2e08200489435d6618c1c0233a819e2b482fec6ac99bb5467d31f40245dbbb6a5cce8b7cd2278238b826c3a907ed7a5d5979ce811be5560b06f2ca459aa63b99e2afc8f67bd046530401e878b9c489b209d91e82da158fe5c8d46dcf12501d604ae2659428df9ed2c681a9ba71e507442a6b34a77cd4a44685b0a6b5cabdaa37d403eb443ba931b411b717e7273b672c5f3cfbc360922058661cadde8437215f0a119e6ab99059f2824a4a10ccc7d58d90c46d6693142c2d32e64dec4328d9cce4bdad2a38c852ea5b7794694f0d7c7cfde50aeb32296df990a27dd8ce6cc32d066921d7b3fb53a8c7c5259b239b63ebfcd78577cf6d3cc3f217eeccbd60809b35a2e4c731b971c17cb779b2d48a1d546479ff9c12dfa6aadea6d224c4314f8d898302a6bb36b723f25170c4d402f10d14a4c84f0bec7b7b4e8bb52cf7b2cf8952780eccdb26312151c7dcc3023a73569872e00bd8f2c70fe931dcdfa985c3b9091b374814675df0aeeccffd01b7044e0f5fb6005e0ebd8634aff67de67a6eed7f06e47105d1600d54279ca8cbc8d1d788ea197b9997037e6ad82ccdc2de8ad6072b8de789cf49b579c23f85b7e2dce0487fe59013438436fa27d93680134e0477d6c506e2786be8aba3d43654de64b271083836fb64b0f7014f0270fbe884af40128165675edd23a4f2bd7b2f4de259fdcf642f7c1113d1f91d9fbe5875231c63aa62e972830a0507ae8a744371c6a6fcf7c65940fca7c78da81b9d1a3b050d85f5f771b56ea74ab66b912766f6f95c4735c6d90548ec195a801dcf2f949cdaf36266cf4b104c92bbbb0842ef0595506ea006c24c8b13d5d8e7489e3e47e07f2f8d4fbbf516f4aa843128eb1d15368b21e906d32cef5c94c8efeab0312d25f5d026885edb2e5056cd7e79cf523ecba8a9afa4018fe1512fa87fddb7c397f0ceafdc2a8af8c9ccd895392460d2a279dcaaef595d2f1106958f43ae1d0546376646058f8610a9e3097b2521d407c222814c62a83ca1b38085d1fe223ec9f14144d35e0fcb561c9d17be067a60606e22b71029a2086fbd8774009a76e18ba96c1e29c1a7077f2abb6554b5df71479f15537b698c5f8b7237bc0154a5752a724aa916e22e5a05026c82fc2789794081e1fa243176a48c1905294fe0463091fbc83f9009a4a21c804be563665edcf6f7a8126cb22073671680b3f136809ec0e5cf2030c499fbed488552d6f7b442659a30428b140768195215fd93998c7a7464d4b95b598331f8606298f1679c155dc0497915844d517607681809819e7246a0ccedec4be3be29e5efc45212046769495c66beaf24a0cd0faca07fa170bda895992e4547986d889fa0f7bb7a1d56fba444001155f1018d1fb512e9460e3d9ad8cb8a0990440faef79e70fef36f7e9d57f03f573c7297ed4b7580472a2387a685ce67e1df9ff14334553a5d3306a75d8f4604e739ed5a17e3c0779a12ae81f8944db9700348903ad2c12e1f2ab57865e15b21e917951fe8c3276886ccb39cfa0ac32c4026aac02b656c5cf663cad57b68c61978c91cebfae11aaa5d912b30fad542555a6b28072cde304ffbf6c26a252ec50e47cb4b95f3a21dc9610ba6f335f75e9d290fbae7d0dca4ebfb750c369edbed1c7b37e5212bf50aa6c2c6052610e6351266a6e05704d8870f089fae95a0d7a6496c78e3d49f242df6bf66cd21f38d305ca8964c46a26340a3362a271ae5869abd49db236f937c6481ea350fb0e0fd247aef119371b11be02a65ad122c58dde21f68282ab0d369414486d8b7723340bb8c3e5bf6392b081bb56d2438dd1889c6e2002f6c6924419fefe578ca1b3def218a50cb4ba7d74fd2b799738b782ed660406d17049dba37f94dfc2501764d1620e2af121c6283d796a1c1714376d101f44f81f3ed1094fdd849c79157735670e6aacc24c503f38b52239280339d82c6004a3cd361eb9b9c206aa9f805e870dfc50cc5d30b3cbaaac644f807e07dcd512659c18bafd3710428424ee53babf4fbabffa8ee7a6e48ff187ab36c07e1a8f2284521280459a6e582577d67d7a476fcb0171b5ca418579cfb9a057a6de65ceafc47d830556b23baec6df39560796b5bf6b126b47c51c768c4ea82a1db61e825d006d746c2a375e46f1002610f14f00b1a778089402b1f32e7d38fff4bd93137e062767c1f222395e1149e894009fee60d3fe76f275c55b5df4591525f370f8064a1a4a32ab92489bf7ce72ae09d44d7526eef70649158dc07d2245b26c436246d37213fa27fac0bfa1d12a703eb2b23a493ce7108601317c1517ee0a8d60cea257392fdac470a33acdf5b95ccc72b07ec1bf4e6fb21339c3e53f6e94d8a22fe4feb0216668ddbfb711125015b21c0fe9fc108317c898c0c03fed585b8c67f45c85b6adb9a8ff94fa67945d2676eeebf489ceadb0b6f9d61ff837543b54b10f277631618cc70247d1021d674d270769b95f362db0194767334a5a505061e99afda134f168880ef600d2878e5db01a363328741e30205025e875c8e8be03d74baf5f22888b48f9e93d9290998f7a4a0d72f22ed27c33c3a1baa8d94154a29a4f0cc4a4fcc9e5524840a08653360a9d3c5b189b8957fd07c8f070e600809e405f00f9e76c422eb859b39c3a8b6c476c54a1c62e19796a1cb75031a0ce245594c0c60e72378752d65dacab482c4d9f27f6d3414e10769c35343648127231008949e3ca46916ebf776d618c6e8cfd55b9b316d5594d4cf13329e1a8340377e3b9c7e5fca7dbd9000e9f79ec3c84c3a0cf4d47b756d136017808a0e13e66606c33eaa062fd0506c23bc8812b8989768a5824b6b368bb0d636b2721aae00b1ecd91cf29238186496270b58d3a49e75f0dc73daae06145c20331f504f4078ac156512c141affcb450b8fc78d2ce14ca132b28c703d0f4922b3dc5b4a45ae9f25dbc5853e1dcf2c86d00bb2caade27b1be269313dad4468cbccae0b5aae7fa93bf94ffd1b8965080e832fb2faa85a2d6e9ccecaa31f657c1aea12307c302d3d809ff6a1469daf61984196880232b060ef1828388e30fcfe3127a60adcf6c632ae81a2bf5193b4e6bd21c5ef64b0349d1d88158f22b229bd701a13bc0fdcfd70e3cd1b1e1f477ced062ea07c07859992f775b165d65877bb3355f5c5bbaa422197c7f6045c87419ee4e219b275c70bfb40bb406bdba75765a629e6fbf3d0938138f2806d7b29d3356773c7625b11ef5f68e39656b59810d7074eca6ebf108de4349795e99165c3d6d959fdbfcbe795483edb4636721c3f3312049e4f01b21677b7a55134493ad17c765ee3044304aec17581a271f1f4085d54e15a16bacba8f131d969585edec258fc35b9a03c4776ee48a38c7115d6e7027f6751c2a300e7cefead9d9743b237d9df4b434abb185a421a17c0b39f4a6e320d2bc4badb9f13a6059af8a0fc729b8d968b296c2bf9ab8d17ed7150b604af7c383d3477077015172846f6b63c4ba97460d15134734fa475ec9673476694af85c6531deb25c32861479266b9bbc46f613a91abdc14860d873a5695afa1af0e8ad3685202da20f8554cc703b9ad2c9136a0b21333bd5d67f3e594184d95f890858fcf1b921ec32f13a03c57882c4c3474834adf456c0c1915c70f0e11e7c75e8b2cd9a03b3c6c94b56fbb75ac40b92209a148891ee079a03706d18a0b2c5a2bc4c375a5a52ef4103db5f3b2c32d2a6bfe15d599f7edc63d05458c67be44df53856b8d83729720404b1b28e1c6fad8f09091c7021bd8883e00b2b87845f7874ff979a7726761adc206e48d66eb7797a54b4ddec3a7d00f064b5b84655e5d7af0e185585f6026d2370b503d3dd75f104cef6c80b42e1d7ad3598f282218237048006b72b314f83dda196907fcb60ed718790cf1fac92779fd06728d5e94b89183efed80e937ec56868f9d5591740874ee8efee9464ed79939853692545ad4742d9e77782696912594e1bb0a57f047414ce83aa6470fb76bc16597e37155815d3dfcf13513bb6f444a05b0fab51679699c82716653ac127c10161a9729ce099d2b42d91de8b4a2c5e2b52788f7efa70675866e58eca368486fed308080a2af72891017c53856bd3ea08b2d430c3a8fbd0ec917f1a428d45bc163d30cad09ca278103d5b594bcb658ee093c4cdd08a3cb4b68d26139caab38230f119eeefb0068f04a1c7bf4e5311a436afba3471b10ef984e0e290b553be39234421f8ef12f15040e3f18db450a8b932cf36dac669a01de92fced937b4cc0482cca149143fa243e422706e1a0ddd24729b48170c583990e8794ae1e48945c3ed75e3623bfd200d22335b916fdb5b0140be5989e313a532732a1c6d9c3944f3dc8f4bed5c033a146bd279e3dd6d63ec3cb098325a1d963f4f6eeb8c8d85b0ed86328103135393ae94b6a1ca9b5a207de0f69cb055aef37697e551ed95713a66604b090bfd44f97cc96256647bdce559c40267a4f34e0441089c1dfa0b86bfb76af9247ee6b381b172b05273a3505627a25c1f67ffa2e47462b6a629d5a6c901073f7d704186248a75a14f25e5b0a776d71adb223c970ff93e44a736bc4b07d150356c0bf8e5af3b030922cf901047af08cca109b5e67039db1e1ebf4b358f27960c7f29905dbe4e760b8b96436ae07d0bfc70a933322f0abfe31a68ac5013c93987bd526c78f48a680f708a01b92fa31e2d91a98780b5032a7c3c07c2ba73d363422f4e18fb511455451282ce6c05452c92d7504495f69068e845c6bbf4945d0edc4bc27b5ce575eb4c0dc3cc73ce8fbfc958367a86ff43b83414d29e20458179c5a783ccb4eed87da84bc6db93e26cd2713a56afab71dd539061e5e6f063f54a3ca6bc034f4ef4528d6008f823e2e9c0bdc5aec07a1f22801ed39c0be91de9e84b2ec8ef0f77e6f91bb4a282af73c8f5e74cd48cf92b96e13e1b6ccceb0697089fdaa4bceef328b5afefa29bef6d19ee10bbeb0712466006031dd45e0c1b2b16ba964562a897a6bd62ac053e04fbf32f669266cff291a88a17ba7825bb3c4b17bf91ab400af5b012efd21c37824ab9ada337427b857e66d9e54bfb5f3ebed4627e11eef78b94d293a8ab562849fa46ed741030f93d6d52d6cd69eb5f47e30724093207b86b415147b7bcb3530566c1e36c0fae83a068f974ea1482c5c8c14975c51e6198f2b6b4d547f81968d3de821711bd0b291cd0cca571353f88932f6f02e26ac7f6c1344f2b2e153f508ddfcd80912d4253bd8a9c33091106a4c86f9b2312d824a45ef41146ec6586b2093a2fc16da422d80616a02d943b8e1ce70c6a0a5e597ae6f92b3390da9f114144c5947089ef295c53e939c4df6621b8fa82115749c83995c047f3601b217d1a61cd5a4fc07e743db5173eead2ea9dcfb562484e577bcf0a6937aabea342968c026502a69ce1f8731968c981824c2b267bac185b34b8afa06e643734de482b60485fa21f6180455fc811e6a7e59e1410682b13c7c10e282fdaddeabb8beff9cf450f0df70bccf3b52703479bc244ed858e43620cefa0fda039357aa7c7a791fb88c635aba3263abb0304aa2a3a2acf92cbb77a714ee17e00b00c39660865037d56c1c922877b9aabd01e50b9cb5c60051da5c35cf8d52fdec88aed80c5d2eb9befa75bab62b148e2d3541e8e441f7cb3123eed4325f95c92f6cd39b254d4113db4611c05f3da69267b49c819e65a8b440e298b43272b75a181c56310ac585f51455ece7631507120a49355192d05633164af12fc540b253ee2a8b6b8e98afc5b7dc16ed3fec43a0f25041988a9cc0132ad9c0d482e51ab1c8dbcb0216d2a023e0713b464fdbd7f2498e351dd3ac6641e73b0e2aa0e1f10220bbc6fdfd295ddc12160234e5762c4955deed55990fcdc2f0ccf873b3c8831da8b9bbce15a3034ee6e0ca07e0e48d2a1ed2c2d85508e81e3239e676d515957878a7672e68f3265f8870c419bfd782490d81fb48ca350a006221dee3df39c3cf10892ce78ecb0db14cc03f0484bb9d012ed5c3d4f17fdd028e80f03a34bf5a62b469f41d2ee521ac7844baf3ae5ceee15a3965c0cdd70cd82bea6e3a7b53d0542dd5de11dcbc3a8afef144b34ffecb3a1286414052d8be34e60fe3c2765bae9585653fe906fec9a68c753eee0b1f530f7150cd757265cfe914b734e0df22543b8dba66ff9d158fa5f79b18f5d7c4debe030f58e5c4bf12758849506e6428a38e4ca07c1952f41494a6c60e4d701f885b6ded6002c8d2a38c9bad6ed9781e98271f2992b5542398eff4ea4e2233b0652f4eff79c18073622347e628110917256e2d79acdaf66c9470848787004bcc9039ef7bab766f3ab2b5be5134367b15df7982e264586f5c8c00715661dd6496ec05af84179094ccacd7ff94dce21b64de17daf6c766b3d0fe521e30982455bf8c41e4fc7c350ca3382fe8e1e0696d323f2d417ed5879ebcae8f14981b0a4a1ba2129772ae4be604fe2d8426d585637a76cdfae399d4b38972c08696689965e2bbe8512454df42339f8579d6d718f8d3a5d509ab9bd8ff0657f5faf607e641897a5687d605d11452d79bb3ce4444087269466e0fe3500ec8750cdf15356866978289f5040d4b6a6e95b03d65124981c5c6bd834a9c5f1751132b3ac203056c38c2e941c0e48b222eb9c69f35427f02f83bfa751b2d3b16f30c178a57c99de70a3e4e89f0fcf0b894e34dbb31c41d3e7ba3d1e6353df04ff8ff7a004d5c0e7fa081da2c71e24f9246b72941d95e23c61292377db453fd77eeaa1d300fc5bffdff95461615300909b05bbdad6f30d2a88e1e6c529570d5579e353afdac9f34391f3a1fc6adf35dd981878510b1bbb52a2dcb608d51a96c53f9e11a2755e7554129830a987b8186364347f7ec1df21e8d21e52e239c35c3c8eff188560043a77ca3f6e57f05a5e3d2ce011d349d18884ed9a952aa692f6924b35223443519339da8b892017215a7cb3420c16efb2247c40ba7216c0d1957e6c70ee6e711b5f7721d6df7623294c8aad6be303096eb5ad02386120636e41cef5347c252cceeb146b731e05c0eeb9ca01f761ea40ea3e76fe35f2c22cb223f426a458b2d100fd7d3d1b437bd98b8cc386a7cb2ea8f7a65a6c3068009c3ea359939092cc51dc3e9207671f963ec9cb0159768cfd2e3c8bd1eae298333232169af9cca92f4632c074170ff050eb61e7dd4f5d165bd3e9a95cea9c6e85dc2ce51cc056eda9c1c7bb893239af6f836b8a6a40839e95a74959ff29d87037ecb2b05925d47917b3c9afb5d02621126fb306d59b121db0f645e32304651d33a3446b99ed66139acdadd8284c0f7065f50bd07b90c8f3f90c093443d2b578bea1d7720a8552b4697feeb95df2974d09553bb848f55463f1b6e935ec7f6178134e407231d9dadf3c1b9812f9880482f2eb6bce6fa91b4148646c188aa3ce09ac1b34df1b982a62514cd5e8748b3904cdd3f85c47d37fc0683d818b7ccb174216d19f5a4ed381572728846989fd3c6fcd21072ec8a959d36199605215127a08841005ea9f3cbd17ef9c1719eabcae63812165515c722d6b50c3e1ca718b43e87d4c3ca41d12a798e798123c902ef49426e5271a540b0440d338cb577c81ad35068f26c17cf97652c6152f307e9de042850c8da6955c398ac7603fa34da6fe76d4ad4c099f7e9ab7b2b14d46e23f3c0ca10b0b1ccd6a94fc8ff311b348299df84cc66c7601646b935a6a74c992eb6fa00d1bf57cf680ba08e7985bd616ebb7701c7de5c1e2a2c17a7677ea43ef8b15ae1a3f5102faf794906c000d875fc64dc0a76b8e39b91a1c50088b7b33f9a7c1a8c7492494bc89a3cea49cf06ba894d678b0cb40a02b3e4b312913beddb34478094be337a04400665182e886c48e581ae13dea3164a75a60655eb41e14f5b4be152be8fca2bf3d6c87937fe0700bb7418528011aa8313a0a2849b160d01f85be604c9722baa96ce8b1f13ab3158c729b120c7c440ae915b42403078016b0927a4362484562e8987c8b74f41280c8ac3659dd6f9e00c88100a23940e6c7bd5cc05541fa79f546068eb453489098b307a661790e5b5f9b600f7689707d7093258c78d752b4874858b7f948780c966950c393041b2543bb5a674c101e36fe48675ecaab271826703f40075b14a344eca3221fecb71ade93f7e4f83c810e70ea591c5475195893142689c13a4a68c66b9abc8eb1df1c6fa09db08007bed5d1270cba42cfcd98b8f3e485b3be2b55e540d1c95b9efa2106d1d59b32f77ef61f06f8012bbc3489ac9847ed93b912272eb70569f694b6da3126b02f34ff74c16b2b3aa6515f977326c4574539cb7b94f422dbd1eaca08f87faf8ef3f45d566fda586e32ea76cd4b880fc3570d51166b0a5dc832adc920097575464b23a4dcb3ed81d1f813a1ff000dca73dcbd5a2cb231c9a14e3692ef62753c7d0a6d368940250b41160e7b0cd8e17d34be335d41f2ab2c4208a2d8adcd05e295e8df44ee5913d231a21da642ffedce26c60ce0a27a30fe15fa339d4f5d17819dd2a066e476b453a95d749110fe8976e751a7a3b61a4117f07c666ab4485395b95c23a1525b10cbb8921be21cc989530a06627842827c32b21d679c5e1cdd18836edc8315aa58edff60e43490633592f9d0d2980a3209e8df8ac683b1ccf04629ec0dcec2fbf089274de0314f6abbb259e81c1b69fbcd293058c46de32f65982bf644240f7886279f43d2b3a2a137bff9153ea08b1e37b3af8d324cd0506e2285c81d9b2060a687c32e74815ea31cf52d46bbd4e61ebfe572cfd97664cfb65c0c67e49a610ee10158a4c4d3cbda8d007a0421f582caad737ade485fa02d9f9b0a3dd00e616e8c99769baf6609d7ed8d5320edb3dd7d784bf4ac661b7c7759aa057cb6a2cf6b0fe1ef44a198fb8bfeb31ed7a782e921c7975585c699f13d788cbd11316be06406fc3c3ea5d50262ed61a296f760744ed7943d4c0b0b78111ac01c7a0500ae7de87e6c6e16d3a12a15d2302af89ad472549d6280ee2fe0111f76c2e99767c1b073e8da3445428ecf8f1cc5f321e6ad70cfcd5e0ff3042073c11d09fade2e6f9b52c29621294a66c8756e0afc67df7c4876ff9ae44155420f86bf8fd8f36ea7099d6a4f9b5ed9424c1c2d5bee26eed7981e71bda3e0ded571f3552b227a301304261aaab330b189dd35f126c00905e093c37e92cf2f842eb699ab7509a4618e19c66c1c539260de44704907242f9a3bdb1757284c48e8e9c02dc9d0996d2e7adf693166f84455465b05140ce442b86a9266d7946a78a051d412bea59e8e4e62b94995a9d257059e99f155f17e17d3c2b02f39a51797856b4ba8a23ff46511396e7e31f37a78e88dacffc77dc9144eea2eee29b52bca0ebb20eb01a5145ad288a7e66f12632081c840cd80d4a6fbef56cbfde25aed89da9cb153d0235a15949c81a76026019e0d6a040b39cbc4b6963a0023a50a14d6bc8a245a648e9db155c78619c5ce8182405dcabd3d5c7c9b6cbc122d9a7b89e2c3eec2384ad519059796fad457a10b7250fa2d327d5a839bc910dc03591bba9c1c478d11d09ec2d763d745d01a991bca1322d581f582c415ab3586cfea0f46f403974dbad9e611f4ee74eba54d1b21a7e4ee62b0f9f941db8f6af231a7c6bc508c99f9c72d7232f0662e411372a5daadafa54981d82b363e4180d1264b03112e06f4131ab243fe5b05f9a9c1ead95c7cf4bc78da418d58ebd6578939ba947f45752d14c5b4e62f40480f827a31c562770e39d30a99450ac312510a690b392471363e90f082ee2da12dfc5f6aa11f749f63e348d88359ee5d315b6d936582130717c2dc3387d7f476caad3461beca58028b04ac082168faf2d4f16a4be9659b69de841573185634792537e6b9d5ec7cc092c484f568d9e6d1577c95adc824e6a9f414fc41655f37a4713cb1278b33692e770bec231492156ba358a55d6d19deaea6dcabf2c06d58816d72f2b7a5d5fce27a9146808e6a7d944e0bf0d33641de16fafeb752be8c187524508febe375e74de42bc18c9c43b270cde49f90063bd6153ace8dfe1feb8fc9132e7517932ae51981847b0f4676286676fa855d266a36367cf60b39dfa393205b385a76d7df0e7f1c1b838052c3dc72d8ab7b83769e75319f58056f9cd2f2acf37d97ea76d206d9e6a79a7a3eb3769e4332a42c02a77892cbbc8795ac73218b464d5f466b8610d83d3cbdd5fa59904157b68e6a296b0214d41a73e1aa4ea65e5202cdc6fd664171123268a83b94beb33523ac7f32ce5bca4760d43dac3eb6fcd69fcbb69da42b18eeccd0fa908169a970876647e46d809ab5033ec49b4c5f46d55a159036f6d96d09faabde3a1d32a1b7ee98790cfa0b565c1ea95d99c75a504f835d624275db12895e5d855b6bb380450337416d549ebb373a849b4b72c468eb56b963e630e036ccff7138d8e1ca4f353120267ad062169d2072038487a7b81044bd096964d0eca330020241eee92697aa67788a055792fc17bb322ab9c2cf93c2c2630b0eb6f9c6a608e22d8289df9b31d784c71692898a1830c91d2b64c516459981390c0c16af005ca0ab509f4bf4a075209c200633be4d21948b418e048f6d5858ff1b0a828b0f47ffec91e7e699948d7a4665545570322250ea3cc4113e86e05b6d9da3eba7cce88b18f7f77a46f41e2a9df0ee786f0518c8062e0894633199eb0754205e0cb50325a8de88d1224dd61d228c9a560c42478bc9ad6a83877f777b7b91726874f92b64ee71a0cf2b6a500bd376add573c4ea8477bde27e2fd1d8b8ee6a80363709a145288f7c302b798321605577138199f0516b5eea08627ad250b5073bb8aceb45adc629383d10535ace34db392de97aa0dc206a247a11f8a24465fe40716a43d20cfde336319b60369e2f28cd36ce8b896f9d841f35ff9a8c5b10af603f2ac2b4b14a600791445bb80dc8433efaa7b29830e8eabe3dd95557fa6e7b4efcbe04d7d965d81af6f883baf8d9a725edb31e42865e4a2404152e6265a9831cd3ca373d57b3db8c0e43e19708e1f1aa862b84a03af6814ba69a0688972ed057169dbcc860e254f5018ae895819e35a90f39874cb0614535316e377200e4953280e96198cc54cfa49b996d09f0826a0c6e69b149d1dd4ea6ad423a611a85e13e2fc0e231f8496bddf0e2a045bc001a097f5c554133b88d042ad3be9b20c6338005eed1d4a97648e0713453c78779897eb88afe129c9264d68f172b842f4b6281a8e69beecb7e2a981ddd177f4f43157d7270982f2a74b91e7ec52ae697ced5a97ae60c2a9cddbf90e54da36a389b84ea51c64bcefa857eccc19851ad3ca4736e30d75e177d6a1a481740f34020dfb57cad54d4db364121e16524489088bfc3fcbe5c7a9a3cfdaa2a5ca132ffd1f62688fe94f226e6f6d42c827f725e43bd710249262ed7de30adc02b8aaebd45d9dad0182586d43487144079b8a4412a988d26ec4534c916c38ee1e2a9b097e6a8f160221ac665986ce50d1104101c966ffe4d661f64247d36562d924184e9bc843297ef36560c1854695967457198881dce232bcf24c43403b1e499f5c3e1adaf7d428f74e18c70da7374133646335afdc56c30d52352b6f5c4c7831de4a723ba6911ef25df7af8487819f78c7687e282e4e943fd4d2140780fceec47c6e0da160d99d6bc5d5bceb89a0579cecbd7aa1ef535d2fb027525c616ce14e958331abd22567be47c2ba5f3b44828a631991aace107ef08678a4e03138b81f28903646eb8f05258d386072863261c4f35cf814049d93fc0006084257b70485a3190ecaaaf69617906d69cf952eedbb453a989ed331fd5854cc65dd347c40dc8454457bc11187aec408ffe15e3bf8e93afa1f9877db482f6c8e558ca45ad4bfa51be762d6dc8af14bf3125deb980d7eef6554f642a2f511bdea95c1a3b2393ca6572c42e828515184b821381538fcf105e2c4b5f56579147a88086f64a1429f221056ec2ee90f2f62cde565e5c8c4c6282ff67eee0f499f0f9fa0b9cac043f85ad70182a7932e6bd26fadb15f264c6396adfe83b9dbe3b7922680fc82b9aaf4005a537c94b109519a82deb872d74803a2486ce526932c307f1be2b1bc9ca6ff6a8090981b9ba9c04c2a622e1b6b11b707e99e2ff960067172bc23209533368491cdde5da0efdce23df9e56e87f06ca9157c06e3c2093cc092dcc45820dddb455314ad13c15efd1d6081f304ae06b1632bd6ee49856ecfd2421f5197bbe33845a770cb08f0e09eee18e0b03101c1554780e07a390c0c16f981491eff9455594f083da5b7632d2e7c5bd895abbe283ca42d1978d2385148a2893e5c28fdf12f0715b61a8c3598d771d6a1e22d4d60831b7edf7bd55235980a9f23c310787b3f1e3c69c94895db90dfca2993dfc788dff5529b828c8ca66536e34c7a84914247c1d1e5bbb449f555975c693ca5b0819f48002af818dde4dc83536600f4556e5a1ea7f0c94334cd465d25ce213c5cfafda25b6a9ba80f137aac2b6bd6a92ca919f18721f28f4769588d4d9a5d73dbadc9a7ebea214c06d721b5ceb79d754845af2158df2506399b9729d298ab9272632243d3657415dd2774cc69d78b0eafb79f7c254294fa4a605e926270f520919b17682291d87af14736be663f6aac4e297ebf582cc1293ec81c32df8336345d42576225250c3886d6f8f22d00f61a610547ac5790bc1287c1090df9d2b111299acca8231b3ea60e5b87faa2a8b3ffb3cd1ed8789bf2a665276d0b08e540d17617277722467dc44ca61f96d52676acec728b2092f728d23f200fd1f8bf2990b01a31ba85361dd8d78b7e09076494378fcfb7150598f25b5c0f6c5b1c74cae2e2adc581ec03ad0342e2062524d91971cee24d9281e975abf4c8ef25871e34c710672ee922d56f88ffada85f3ff7f3b85084488c98acc7d81cf9af9386a53acffad0d5e6d7a14d807593b7e25bbb42b6e7f92f7ac62baa3e3c4f0c8627da3376117b3d33eaeaedecaa263fc2627350519bd33815dbc22d3a5b5e234712c2d1831c3af39293047fca83d867a32ea642e1a3082d614ca88baccc945c9d9618752758504e6579880e9b3f65700ad3c4d016a356942e34319e1706ea73668b6bbb6ad183be28a2bd49d1f1212b7c7a97587e4e2b9d1aeb1cfc561628d692d5bb268b2d76a1246e3284f863beb7ca7da8f5f8af3648093972bc1f9f4464c557ac7652586ad111e6c65ba785feba06ad911978a567a0423a0a350e01d225a4704c8708b56b25e5393dd530d6aa9ac9fffcf5f263a9759857b1593bc95e09f7fbc2c8773733df58ebf05a3344c2cfad7afdbe568db327f0ed623237142a7bf98f9b8530b934de55cea69412f9a5ed2b8ed19eb93214c1a6139f4ca91d9f92831f7cf511cbbc32aab821dec2500744177e7db44f151949addbf3cb688537daa157fe0f59df96ba0367fd0bcbd4526708131b69ffd8c0cc83d046d4738f63a27a1f61f3823708f788bfd7a3dcabc88c9b1d29b1090af15eff1bfb725052d1be544a53a81a51999465aa598e12053c0d482131359fd8ddd538d935a87226d6eafc166493358c6066ead45ac13ec36e9d152350adf96f323d8296840ddc466d86466e656a8915abcc280d49c5ea64469910f452ef3158d5f18094d09deaaa7e62679643bd8b654475650c07161b4f4e4a4be6e19aeb8a0f51583eec9e86819f229d637a64e99854df513769522d06f7b7d80d9b8a76c003134591b5fc2da4d18760aaaae5027020e5498f99c643c6e3757f3c94624495e582c7ccb0bede7f9e17e7c28d15923edc658ca9770d3564df6ac8a83c16032f71cd5518c461d07dcf4493ae69e939442f51d0a3d4ebc364a732c5eeb9b6e054ba636c2f8b68b2e2cfa82ce910a6fe1c2cf3307302bb40b4c5803d293d20e5c0a2433ee409289367d69feb8b689e07ea30f9af1d37e10eddca5ee29926983196238ffe9cb6ddd07be017bafe32a67ec17094309a892bbc0da9d5091b9b28172594d31cb8fdc0fa18e00d80da58c6943901588c03b070a09ca80c0a72e2ffc9766957b9f6781d90c8db67ac1e3c10565786c3882bef43cc74d01678a18e56525d28a65fc44e18fec53fe4d16e80cd6de4d21c12fca0eed1e256f40b444fc95dc6149a586579fb1ee633f15f4ac672649ec86c85a82e0338d33d7e5933280464b1372bf8f8a2657ec225858c06cde32b953f73cdbaff3ceee6db826401e458e056af2c4e2935719d9080ff1a84c8d64da8e7a63d3e4fb3051e48e9588250a8052a8293e5b1438d9bad881067930fbbd57d01962290bc5d5ca92fdf959ea345f03260ef473a0830a4c1090bda5b8e73284b3719fd7310ac91c587a2a31f8e596c7a991ac9bd4e1bcd0ffd5834dde92aec7cbe8fdfb824e12708d87e335a163ef80ff15c4a5f72ec0110a19901c66e14acd0d003e1c0c2b205e56294abb2d69d80499eb021a58ace8049b438106f61e80c45c0bdd0486627cf9609dc9f829f91860268c851bd7137bc8c3cffac4d5f69f7191264fadfc988729f2d48d186055c69adeaadef83a6872d1106cf4402542d23637ea0c128bca124c151d80e3277709524cc393403595155154ab95ad085f682bfe58578367e3a9f5f2e7d6cad6696c5ce1bf4580315be948e5f531b5e4ab95f131dfc4651bfa048cb5d47d8977e9928e2ebe57acaa3cff783b9f5b8e1f2d53ea8e9b35ef9ea191772fd3214bf94c2f961851c198dbc30a3a459d684c1b4acc38666af53d515e6750af5ce9bcb5976ae40ab94ea0d4dbf4e057ee3d2d7e9a9d3d3b95c61494b444a200d5dabda70fc750a3431e8eb14867500773773c70a42f5ecd9bc363a64275cb6d3a0df7d3898e381cbd96c14bb94c21f6971a48874b80fe751729d7200bb030848440880c7d4fad5bc60802f97d94bf9c0ae6094ab075ca67cf39149b252489ef11d0294671e64115c968ef2e94c35938028b6832ea57e8a84bc146ef42d87d14dc01075364826de3e146891d949be5da49c7cd75b4be3237a30f8bd4d5719fd46b976a025d06874493f46ec566261283937b825886b3f248950c03a9d1891a84f7cd657da6d2a5052aa225496e5d0274c90e8b163ec833804658cec74af0242470028c066d31ddf8ac14b4a5310a7ef5d3367e502e638c15cdcfc977ddcd1214bf7ea8e2c597971074900e0f60374bf76354a85febf7f87d3b5b05a835414ac2cc516e56b10a95702db2cc0f8243ca8a12fa58219dfcad71ff8a46fc3bea7b8e0f80c7d6169386016cfea76097006e0d62618bca1dde83a3c22df066b24de018075b5db504e260c8cd2ca8af20de405211c5548277a24d3abc2cc04b4b2bb937acfad8ef1fec544dc94e34840253ac7a5618db92d2103da2c15b5f38c97fa783b75582c1a24a24de4f7c13bc33df0f88ea49dc1fecdb6ad9fdd51925f29ae0d953e5b881a70f941963aaa493a19a04b6be5b7f385eee19b4b6a47719580766ca54e78277d2d858eff320c77d2ea14938b1bcb595b89b36e417500f4f1fd89e1bfd42f5a79fdd22d54dfa9a3554cac75966a7423742a971c9d1c0c6820270df16839bed94674333954e4a44c2d9b42f9a972642f1020a3ac891601244b5cbcd88098ed0125f81f8c6f52bbfee3657476f2da323c4573f0984ca3d6fa904c83502ce67fbc24e6780242a135d041e35491babce48a48611dce0dcfcfbba585284f35f4c654973ee860657f7012782d9d20e819e72f27eb3f2f7891e95fca4542353a8b0c9df414223a0b6c997ebd6a673541a7e43dc09aaeda718dc00da7e681dd4b1eedfd82d3bda40c5885c68b2dde954eef64c60b0281aeae4bef5344e4dec6f479c7118477b93edd7c4c9ad0666a3b5f14f74a594b3abc862ac8da0942573a30b84b7a9baec790f3c5c46cc4857a9a6d4c0c19087c36e93a7d4a0b018a3a8aa801fb921d235a2f96b8a58a1ae67be945d374fc4233898b6a85265910a63e4bd0d464c4eb8a6a7aaf0ef14fff2947ac7e0307f646e2e8758ace1e7d5dbe03b3e98ef18ae0e47ed6a7c029912d7e1c9fc21cbbc64ed91a77b5716739d40c0d0c79186352c14a38d668db01259e86f790f00c95138de7577a184691fb2d1426896b8acc0f3aa90f65f8410c60a8b4ee036e3bd067d0580a420cf0a21b0ff4ae04bd06c1c2861b642ab4f88a3d64eed050d0960a618c4efc0dea50fffb09ca83f5ffae155a3040fa34426c3f73089e69dfdc1d61b5d2cd2ab50dc417754ad13464f280390ff5c590961fc0f41d37560bc6cece2ec559d4071a5fcdb90237c70f27cd68e9cc0f225a44b166750cf53f57e9884369e029330089260c8937879d982568e393fb40b9f077bb4f35f3b02b4a7004e8c3e2863a359de4ece7d2e4d44f3459bd2a07dce62214dc0945189ef2182217d6f3c9b2cf8be1f39df579bac7e68e90bfdaa9a6feef60ac154260b633f2a144a49564c1490e17a71ffd25fdc4d2e87c8999a4ee9cee986de2e7c862fdb275cd60100d9f02bd4f3618f11a438fdaf3b45caec4da0c943881a60cc794bc10c4dc3aa1ca361e1196013f84b0832cf1a0989bd16a92a9e9abbb19b504d056e234ae08330bd55810a74f4a408cb42affd3280282ef08bca0b87d562cce37809426a9cc3698b1e8422edb0cc50f726c1f05522cf1294ce69a00101afdd3353f3f38555fa15e07274cee87e1dc9849d8ea1110e214294b9c69f995060e993377fa64cb49f0ad80c43e5d2531493a68b302650b18694ee4620ce438c32f459c77e03fb19f1c1a54a86eac26f71073e6fd49040cdf3a2737dc94c1fdf953423fe492bf235060931ff8d88e86d0f4218876029f38b145b355de0c6c97111a82d06daab992a73dbe525f844e971b73a070efedd21d601893fd544fcdbc88b1a84f13e068f3e534b73c674af1cc44799d34f604d757f8f221b5d7046cef2a3f0d5bbd518ed79bbddc652ad100c1a567a8c76e0b4803ab1c13047d05e37dc4ada1a11a15e7db51befa1c8886706d166637db7fa74df394831d2159526f95c00d6cde4f439dd27c3175dd42142985f3c55d2d79c1ae4ff13c9f868cffc169b8544e310f6aacc4650ddfea189b22120405568a21096ca4ad14907760b03475d10d525a799255494dbb5508d08f105f07763aae669483fed40873733d86e37f21b701ea490c46d881a78c801a4118359f157205541a0649cf667c2c32a44dd8bc5ba7ccf8aa26b0f3f6977a440253bf3e0a6253ef4a0eea70a86cfab24601ed184c53f7e989669811c90eca0074d2e110460ea5477b03428bf1c6205e68f43319ea2d060438190764852f868b5d64e7384b2cfc21725bee6169083b63f7694c14c2a0e4a2c8d8094de50c7082f6cb0e7436d834c4609cd8da708ea32a829de7236cc5d01a3a62b513783754ff4812b5b67168657617047724437426972df3bbad4d725713d182995d822841bee88b4e664bc010b6ca22e2c49e0211732d21478b9ae44235d64021c617157b3fb0775283a0cd5f915d98e6b4d3065a1523012a50a2d5bfb4bf9f59443b5060dd8e0181084733949141fd05fcd136ea5751c2ff3bffcea5c3e1af66c30894700aacd4dd2c2cd5c14d54ece5fc05961ced278e19f9ad3db718196a0e9b287129153c550b50e505c4fbe0f878fa801b50994325b3c8000b4afad43031100f96e90f0b1338e0682895b83f41dab2d5100ee8b1607b5f909578dc0e7d2785c030f0c81559085dd72f489295221634f58d4df23da5a2cb24935525fa9ebc5eeaa870cee50352a65b5942838961ead85f7567e02a9df1eb64dcd83cd9248536898b6698e87d368be1478650a989731d77d01fb03e9742cf37b6806d569231ed71e59b752110006fada6b41ab02f7f7f8a83622cea12510413a23a505dfe05cb4de65fd0ce8a4c29e9e262feebbff297d9cf3a2085a9ad8aff5d20d91e5a3138532c813cab2fba55160bf4dc5588d15b8091cb01919a4cd656175daccdab1c5a8fec92902589acad01fb329e824c80b046e2cf35cb6c6226750af34bcc6077574eefa081b33afa4c73b5671772da7f600c94cf5e8b17d4433c9a83e8355b6da3cd0af9788d7be9cd580555b856cbdc152329a34e0a225f0b1581172a9cf10803288ea88524a0e416e31099479ac5308d1ada1f1070c5ff8f3f937686ac5668dc4b9486115aee87891965fdd0622fa1a99b40f4d05c1e7761102479a40bda4c0911be30dfadf40e77ad0749c0b6dc11c8413b87b601946496c8a1da2548982200d16a7b20ee5bcc37f5585f49fbd4e052963fcf9b593fd977f9a7ff447bc09b690461bc09c2660df5af87f47068bb6b11f0a460b36facbf053535620985f8441cf8d4035b3d799682142adf175c4b46ae11e383824336912baa8edf2e7eb129ee32cae88befa133257907b68d2ab6d0387d2875811c68bd55e8c9998e5811c756ee8a2b075d3ada088ee6bd95c7048e4511822e250e27052615692f481b80541f535be52959cd87049c52a5468011ec6da29592f87fa92ed580489b230ec482c7d29d68846489976b7e608a8644e0224cdf69b9cc86a8cfb3abc005d558ea884bdd09462afe9b0eb30b462c7975e6fcdeef32783ad5dc7ed8f1e88e1ed070aa499e333227a052610e0928c48d7e735a5a43e8a14bad5730a3e74a54e20e5c1e8f33e3757e8370dd94cd6c217be0cf7691822c341b82c0b420ecebc4d7c00add2d360089fafeb1ce564131d36ec78b743d5ae0a0bb7b684e7c3fd568e0c5c81dc91331d7beddcd0c535ab49d9770403cd3144b1e0cd29e1477a34040d4bb9388b23a880d82c47f94866ea4f0fa0e30f7dc4ae5cd386bde43fe3ee745f079e44b8f79a16a9ac1325d8b4b8edf81e0a27ee388d8a8d979350ed74dd7fc48853c5d4cfefc82cf29c8282146201648bb314fd09461ec7917a6f1eae2488d12aeebccd3060569a23b4e782c6478d3c0d5d6a1df90dc1884314c7148b3b4470f1efa86e137e27fe7684fcc2e78db06f67f4636a68c2320d41eb65ec936793280439ced4d510faec53d1b6a0e7145e165c05b2f50c22fbe5a26bfcdb52b8bd2eaa4f25935da31834890d8a8991b56e9fa9b99e2c472eb5ab3b633e6d2435ac3a287ec0b927f01365676b4c6dcdd02b159a34f48d67059a8caf834e8468f5b98afae11e88d6e219934614efd8e61f6e93b231df5d724c88cb1cc00c6a8669479840f7c3e1a539e06616d4a7d03e9c1da50df1eed9d12641a6dd217fcbe836392c812c37939896b21cb52fdd0b085a24f73eaf02eb841e5660f9c54f66ceed8a74031559c708dba5d70fbb854205d705964a41db19557a5e8f547db90e4323b38cbf80db35af0d1e49903e6b9e09ed09e7226107c179c5b63dac566bd04ee62c8b3b199f999bb7c8dd78416b80f99eb499e3146b23960ef41c9f76f7b5ba0f431bd837e1b9d8cfc2e61c87a9eb38e7bfc700765f47dc6f873b866524f2bbbc0f606720d3a918f6b4625f93e2732891cf9b4bc2da472053e5bc56c1059301c556dc663a0a4a6c6fc40243a8da5ad20ee56f3ddeca61f8d07928adde277ccaa4841937440c22b71040e00905e000c078010f465d3cbbfd2da3cc10cf3b59f517195572f6ba5a27833f3aad9b4dfb7bd62bbbb7b4b296552106710d30f9fa14cc9c57f583c9d44211d853a79baca77208fe2a7abfcaae0394381e72cfc0985d4327fb22eab550622eaaad49d6044c809414ef8d134037a0aa109409a30c4f1ced1ffdcaef39ced9ecd5ecef18eb3ceecfbbedb989753f6b3b2541744aaebba6cb31de79c976f59876dd1e7c4eee569e92ef5f7af0cb0c35c7bd5f23b17ca7c5c2873180cc3def177d836cab3e5d417c476ecc3b6e871cea13bb645bfd1ebccbc8cf1f61339c7fb9673b66319e501e72c9637dde9baa7785867b6e16dbbf77bb38d779c7360f79ef352442af55de6fb0e351c1fe71c9d590d3c9c38fe9cf170e2f83b9c38ce4104b1f18e1fc4f61339757fe23ab31df0638fe520bce39cba990136f827720eedb12d3a8039a33eb6d5a2d799cd99ac7ece6059665b97d690837c9fb3974c5fadeadbffcdd9cc5b79ca672893e23786b8f5d47203524bdac3eab686322bbec22b7e670ee212d782d7a171accee1faf7bc5fbfafa10d967f9f15d6e2d6e52db779b3f8cd7901393ac7bf5fec62467843fb9753dd350dfee254f7db651b9bfbefe06b770d6fee2a23f47796dfa98fd0df5dbfb307fb1649e894dbd370f10face18c2fa738f016a7b877b75c5e71abcb6ceb9eaeb43cbb7cf1e6dea2a1dae52e324e2d7fbb2dccc105bc02a0dae5f75dfe8e88f7e0cbcf7086cbbb9cc3e55aced102a7ba1ccc2d68a4dcb6c8f39571ac66f9bdcdbb256b2c328ed5ae5fd73f1b2c7953edfa7717de3cf407defe6e218dddddfaa0b96fa10dab7777f0366fa18daa378ed5aebc8300678434c0ac7179dfe358fdd9adf3fdf381adf8f77dbf3e3110bf1544e8150348f9ca08591042afbee21c38c319222ebc61cfe51a44ec32f82f9c61bfbacc82addb0e73218d4f77e7429915cfd1c0adbd758b65ba9c63c557d7421a295fdd8633567cf57ba767b3026f1dbda203eb8acbead632122020a227121b40b2812bf05ebdbb93001b77af3b0164b6c55d665b9dc53b475baebb23b0c3abcf70065cb171aa5e5dc5b530a5c306decb3632db024f411e7a75d5e78aabbe024fddadc85b6785537e714905de385af516de395af59218ca94f90631c5c1b0868e4e9171aafe0e8633df331054a7dca7fcc33b477faf41c49bbfcbecdd3bf4c6390d6d501a249dd2841e7a0aa1c811bd454898d02e7a0aa1c88fbe1301e21442911efdd253084c1892c2123f3c429042127a0a4106413b47831d98533a6cf7bec3762f0711c406df7b105ddec10b02e7db1698bd2c9b7ddfbdd00b577eb1ea16ff170556c13763d3592870ea53c1de6d54eefdbb9773827cd9c6fb967352d7cba9ef273e6739a99b533a60ec7dcb416cf7b67b3908efa8cf994a4e7d39a583ca517c07fc13398813c747918308627322e320b839d39959cb719f0e6dbbcbea17cad88ca3e94e472aa503beca77c059254fdbda613ee7bc0a656828b33acb7e8537d5ab83788b1afcfee58da3dd8cb71eaa57abcbeaf7ddfbee77ef6f5bf71fb679631acaf8aef954d80ac453e715a6dab33195e7fc5428933196d9d6bdcafd3d17d698fa554bf07786353dc0dfb6c05bfce5ad4d1aca5cd52f7e0e813edca9a860996d597dafd5f2aafee18da3e96e862b59867655c8e1f0c70831e553eff027251452615f0642d3df812a0cbceaf714ca701e29e3683ae5a47026e50b9829bf391b4ed9ab5c67e661efdb6dbc6fb7dfb6abe49c1c9bbdebcc64f6c3aa7be09ca58433aa4e390d67be83df7c523e8bd01d31e5f7cbf67ef85e665330d5a005cffd5e11a8c25b4f117d2b0c48773294e9ee05411adefb0fef59447f7b1ed1b6c6d49b662ebf6a89fac537b3084c2d51286cf2139e3312cf190d654e2eb328786a5309d7e8193ab9c9099eb5ec31c1f30404c55f3c12f106a496f425235c6110dad8767a11121bf3b6bc19515b7413a229f5f2d67369b8a3e9eb0bc41dfe68fa2d42a2e9c39f50488d79a71721119da1c6b62141b5a4f453f4853c37e4d1f420908dcdd9cddb1381401fd006a4b636237a5c20eead47c7d55b4f2de9ab8fb8b71e3d1ada74421e55c7f2a83a253ca856428560823b6d1071a865b5a7b572df6e5fcb7a91a67ad3d66a696e70b7a6f70d792dbe251bc7cd6f97d9ad664a82d77c515f2f98c972846a3fe75daff942d35ee0ab6a754423d065af969ba6c1a8e576981988db9b5b0c60606052a91aed530f406766af33b3b7add44ccdbc039dd9d399cd64a733b3d7bed5b2c2d8563d876ba66981b8698feef13c51b43bb49c2cb5f5c3065d6b0b5d4fad90694f2d69116a29dd6c177a5c15366b84445f271275b5071c343f6438d410bad96153c3830e1bdba13da8103de090e140927f59be5e322fb5b4a911ea3182cb5561b396ae578d751d86515b1b4c2db76f48c4ede9adda7b60d56669b357c19d5ab52477b2ae10822ca1bfd3f0cecda4137d9d48d4d5260869a1ceea455f07e30346858d74fddc4cec53dfbbf75061a92fcba8faeb518de070065db549d7e3d08153633dc01e21c4c003ba3261a8be46854d210451e2eb6ca8ebe9e5b850e67a9e28929ef65c9385bc7d8ece9bf16512a99693058bb5f4be5baed6db3da4f1651c6aabbe1335057515a29653f370b64301cbf344f2acf9a29eb4aded1364cd17955acfab763b4c85d5571bd224883093653b696336ccd6f624bc88a0b7ef526f3fd0db69206ed172da378cde9ee2b28caab96fff01a7c6463fdb71f0a1b7cab31d4685cd2016f0e8ad88de7e8258b0824d09bd9da3da0c7778ba5aad526d0bf7deed156f13d75a672d6fe568b5b1a2737c5c3d8caedc3c9d226eceefdbb4ece94975bc6a83ee646d6dda8b26bf86b98dc3a4cf8697d5fa8598a439aedbdefdda14776d486f3d5b15a2e3643673dfb0f619ded086641ab63979f810e700e027bf33267a1810a26f06866850d3a360c88711fdd233091f32f031a4af67121700a2efbd60134046bf148479694d746dfbab9676db324c2d6d258f4a3dc43505a2498eefdce93facc216dc36ba6dd78634bc7bb5ec726581a85d75eea26ba2a9c2537b5b24a911ba4411267cc454de2499c5bcc5b09e44150808002cfe04e784cfe1b19a4212826625cfe151e2830f18998939c8e8393c4c368004a059490e72cf63b4c00d7e66610e02fefb6e70f8d0611cb890a4354dcc29548591f2a69aa696dc39d62692404d4bd508bd55207acbbbbb9ae6ba817006761cb4a9376d6814ca6814cb6a89034fcddb2b6bf8fecb77e9e2fbf54aa4452a6b7871e16ddd96a776aa02732326efaab5c3e45d55a88a8a4af6341595cf30e6b2aa02f4c206cff33c4ffbf6c2984c43fbb65af99c293b1acd29153b64eb556779cb5bd898b15dbbf1ad0d69ee30bca9865d14ce688ff90d6f807a3be584567c56159fd5c6525f8c7d037d0e0f06bd1daa31b2ea869c82c2f8c41e7d35bc755d77dd5d4503e937ee55081aa3715b3ba26f70b1ba818bb31da7561df30d6f6d487fdbb6e5987d436e786bfa7beaa89486d266cc69b6d13de6bbe6536130b77825c514f365edb26a81c8937f91b7b7e52d6af236e4e7f2ab77b80a415bbacb2c0c663d86b9c3605aae446ccceeb44865de640d79ff25efd2452562875a9ce6fd6af99677c9722defaff2269ff3f346a9cab755222d520a1427e83595671ade552a4f0a1427eee1ba01dab2e5d4eaddb957222d9275c9fbd522efd72befb225ef9245de2c79df35a4ca5b4cf18ae228adaec85bd428adabc8dbd328277e22625bf62837a4f65e7adcc170c67b8e2d7c25b2b5f2f636ed652665211bd3666b7b0a14798b27582a2f6f8e93e156986acae9d57e80de463b027afba635bce94d6fd7f40acf0dd098ed7343de909755cda650d766cc0ad90d6a8da4e5ed5575d56748ca37ea478754f2f64ebf47f3904857acd12113cecf9b5cc92a990e99fee54e1bfabeef64284373dd006de9aec2bbf2e84e8643f7ba011a33750786325dbe41d486b4ac96a98ccaa70cb4030404242a4bba432289687b140d3340d325bc557a571e3d8dc46aec8e1c129e9aa471f880438dcd99e6a34d7b066d475b3b74842e3159ec81604297d62ee2121c02c168eda5025103b2b192ee939ee4d1cb74c7b6425c53209a8c2f3939660a64c53c2d500997c9db25b41dd27c6842cc17f30c76a8c28e683d7676b86da3dbb6516ed69cd23e67e14db45c84f8392bb9c95f6a6cce4c441c7ad3fbd17cb4206d2f04d5a34f4d99e81137ddb9f3c5d454881a0bcf0da1eded908d8559f319a21cd7719c6684e64329d08e66a242bc909a71affd5e2775cdc229d1a7febea5c0729b08972ecd8702759a8fe6a30169419a911555e4cd4a60633c6e18868266415cb5b42f3026ebc16e0f079abbc982eefc3135aab76b0d4fa1d82fc3c16a5a6600b50b9831ea4d328812d024c580b69f479c40dcffa145da1ec67ce1b15ebc4c7f6cdbb611a13d4f941964830be8d975d8fba163d36a66cb723fa88fb6f487066df66bc29d2c2a2409fa9a92e00c37089a6d3965a333db9e0d659546c3688ee3b64b8bdee11b180dd638876b2aac3bad99a69635b5a4356a49ed3b5cb3e9ae86a6eb4e84b827111a5b5361537b29a0b544245558787a52d589bac24647f9a0846472bd4b06689a072249c389405cd04a320f15069ebe8711a641a3d1945c88e74578dad88b7e7b25107534fd3a184d75594920ea5d6e97883b1f43d47e27a6326812bd4d166db268b7d3a5c9d8ead23ef1d4da365fcc6bbff3de514a877bef3b8cfefdda6969d7811d38ebec7ebf439753f4dde7ece6d4bc08cc29da75dd0da21be5d414dd86bb28e70499cfb9e73eb3cd96d3cdb0a6c7cd5dd775ddbc597c79f1e56db514acb352999aa0974c246b828448d1b6a80edcbd1360fb77ed291d44f7be43f8efa9940ea27bb709ff7d6a1dbda94ea574b8f76e33faf77bef1518fdbb8e4ee9702ffa0e37a74a7e3f67a29caa3b8c72aae47e07ee370711c4e67e7b10a273df61fbe8a31cc4fdf69a533a70076fc31dcc3941ea7344e75eb3cd762b1ec09cf5a80077ef15d8523a70f76eb3fdd3a29c13c446f46b2427c81ec0bcf7661edde98e28e3b02d0f773948bd8e696468dac96959e511e9540b6a01c67c61d2b5d65a2b49da9e5a5620d4a7871e417f688faeaf42680f90ed241a4341305b2a0fb65545e079a248927f917acb748834889bfea03f2a584b18f385b5df805eafcde2975a6a1ab8699ab6699bfda6699bb66da73a3cd4b2c25458b771a8ee5e3ec4d40c918eb65d87a996e140435bb8df0d7feb68ef1adef0768ab54da31a6dd11e6ed9da7006475bb47399a6963c5498487ca9309b81a0da52fdd16bf65647cb2ac51e6dd98e44afd033091408c105324cf8b876db360ea5e10d8eb6a4b45f4f212dabd762ef146bb4653be7598da32d5b59615d2591363667dc6bad7f2db75bbc712ae6688bdd8668edb4decc2142e811330886b6af389ccf0f8c0a830820301586e7c74b7de921c4cba5edeb6b07dd7155d7cd91b296389ae06e58364bbce26cdad2add2da3992246a507b5bfba6a9b4fd8661d492fe40eec0d1f122616e483b705824970e71872671b4e380dbebced1f6b4c57a1aac25b5a41d1210276db113c71af9a84a122a83abb7624e534a29a594d2dbd480d9f4b52087eb2c2d0fbd593a592c0d6550bd597db5d19ca18cab9694d333b4b9a4a76755d835cdc113503e208782dcc9dab4caa089d38d218a2697d56d13c71f22a7811ebde9ce8e8d6d372c798d8d55cbd1035121f488d1c19379a78a40a43b1b501a368e23a90c86a4b81b83013b688f5a56eaa38640dcaf1dcf0555b33f42940cd5923e256aba63b5eb20067407a52712407c503385a691d9849e97418f46692528a017c0c36672b204140b67d0f4f4f5bb16d939df9d9b2299fdecd6bc772780d7695bb5f9a2dd81667134addd6a761619f2b3a32710963034c4086310a2574e62e224473bf968abb24a4b4e4a4a4af288d213538df508524269499e321047cf61fac9c3d3d16f8e929f3c87e925074d344a7ef2e3ada37f13de53479348af5a5e7b6556a524cf22df1191f41aea30673d48fb2f39788a3758723cb50ade1fc96a0c7a5092e9e4e439a2a9e4263fc936a58b17734e29cb6caba4a4e426589cb27a7ff13ab37d4d4f7466bbfc10e2b42dd1b6466fd191ccc9113d891044c80c7338796952c9e8d7829b34593536ab563f2d099bfa64fc28d3cbaa77147cef74109fee5558c92fc55e2d4baef27b757ca689741b23bd14a2fc29f0aacf99c9e9c5a3be83c9553988d24d8eca4104415efc9c89476df2b655f29297445c62ca333cf98804534bd265558594552eb32ad8fb89a84be67c414b5e5361e04b5e728a75740dbd5a96d050a6e4a68ff2d6f4e8259c7212ab8ec2e253d8e437547989211e8710e75f19e1514ec25b9b11d2a37ce5d782194fada34f4878ea15d2557e82379d41f9c949ce71727c949c83f495674c9368513883f495d310e521a64934caa90e4ff3d634ade17f825335fe3f43199c698e65241cfecef024ef1c7d7212de54938e82a946c1534f9593363dc93855affc529084a74659c9302af8554beda51249da88a289c98de183d703714f23359ec70311870f29292a95c703b1c6a6c67accb44f540c540c1f9fa54e0fd618a9d37f35ace951d3a374523cea153079ea364ce9201e751b93a73ec394d22ba0226f82454c3a7d47caa3cb2c896f5ba4a7b088494761d247a4dfd129de399ade1be56a4bf03dc5df4d788717fd84371d7f72a20489f412bc67115d72afc2e8efc8f4d4e82628176d2c65ca353dc8972e8aa6e7903935bace0c259bb28d78939be49c524e8db20caac95a6abf6d69d79989d79989591ce2e4271775f4c949f866163939c15e973d220401a22711820c31ca3b478faea8f3af0ca2c9459dd92635d599d1df8af9554bd147f8cb38556fa2fca566d06fa7dff21cd274288faa037e2a24ee646d7b0651fcc00aabb7d4401818db8a21ee80c9a9a5a59aa6f5c8740716dece25949849c0f0f6cbf85d9abe3d946f917c9d308951f0b42df1263c0685dc1131bcac927ec2755ee9239d705ebd26e208bc3d05ad0fba53615aa6611130d31e458c97d51d63b68781f16d4ad46d88de605893bb9514fcf22e3fca9ba4798b5aa6198d1ee65d7e795fb48d4ecbf2272d0d0c98ad170251e479a26887ca57a9b5ef226c85d8a09ed7f0f757be81d13fabc2c2db972f136b205961de3778ef38b4a645a0e838f3c59c4834137ad3a120dbb2dfbcadda4004bf6b9122b7a741798b96b4ddc13964579c4d6b2412d16e5b06a26a4ab52d6b255ae907c5015610879118228e5afac023e2a825a594d20dd3030e1faa4864438dfae088218a607c10c5d75a6bbd886f604418874d2de94bfe4385fd90f27d956f96165fb7eb2645d7bda2fa3ea5be4718eafbea30e94ac6e0d016fa5da2abc90eda420f81c942bf45bad6ef071c2a107db8a131393a680cddc1a131b4c70e1a437d4060bea019f89877a5264734cda13154881d1a43797ad0183a840f1a437f6460bea024982cf4dd3c03cf4ecd3d34fdb5a9b0a9824d4fc1a5ab30e9297c7214790f532384a031b48787c650203409da4282f9820093859e9efea0313cd0167a1421c6ef6af221742866ea3303b125da5123ba78c3d31544e9a144301d82290f66497f82e90d2895c12ce96d2aace61c220180d0d324e879b8a723104d4d68129a8aaf587c0df5a93091e69a7aabcceeab37f5d9a3ded4e7a437a53ed3870a136505c0e87a7a1c3f50eb550b535fb3026074976d48e214aab1d9b42cab25bda6b5d42fda6d2527d0283e21ea68f4873b597b34a4a9764bba8ee33a56e9fbbaae9b3a64fd5290c5a21e254289d0242892daa3c6503d540926289126e8103dc36cd322222415b6c39feba3c2b6d74489a6f79aa0446a4929152a8248840af9549877412b02f1eed6c3c5ac90ef2e41864a88e10f256285682de80d5a219ade02d97a3cb00241d46e712844864813e188a1ce6713b22e6ff11a4ebf05d9d8899fee35a1298cc88822c80fdbeffb3e9f5a521f9f914047d4f20ce2161111efbd5e1322a996a2b5446628c371dceb33aca1c04a9224496628562f5cbeaa20cdfd061df1a3b95f171d8ea63f11922250fcc6105730514b7a51e01e415a58fcd218a2fd8d4bb758fcfa0c5b6c74f7abd9777886322c66e892b74cbbe8fb1a706af597d56bb8ce8cc429ed244e69c7f77e02a7b8c7ae333be1147763882c2d3e439916a4154ee9a0f21a6ea3f21a724e90d573bcab7c956d6af84bced95ec3356c43a67438fdc46d4e3f91738268cf49717fb9ceec742ddb9c782ce7a4b8cc009bd85f724ececb5f32695bf4b14c63ef11f35e9ef8070671b67d97db9c799b74c145e0b7c02cf99ef09c9dc073a633dbd7af5f117871115ef6d12db08e56c17356039eb3d3eb24d699b9601d7de25e8571387df3ebd6f3c21b903a0491c58a8732a866d182371f4d5f911045442c8a531008ac4210b708c80704028d804d0c11b708490d82189e75facd07b43b155672fa4d88dedb0f674bbe7befbdf77e1cc71d3402634888fb84810163edbd292bfa421bdf47758e2fa7349b535aa6418becec68ad024144524bfabbf30371873fab50060d12efc19b81a09ae3fe31409b54ab23ee1cbebf33b4d6e21cf7389ae6b8dfcbaafd34c2139248d92ca36a7b350d9b4490410e34fd26b42d51632f3fb01974048f4abfc76644064bd07b23a2e94888083f12d07b5342d399bd5ff813ee8046b892940c875ad21fb1553a08345261291adcd4f43e45a3eb8ec40a88e81af44462053cface9878310f7d77b8218d7b8de6ef32ab82734ee7c1e560043bb320dfb750c6ad37ec2dcd617fdf853a7836de184850859d59ce76957757c13c3c17a080c84cc5fe27cc830e5980c84c2507e9be611e54064ceccc82d8700fa7721220832688d8997979667598332346211130b133a3df7cecf6636322245c111bdbca80a467c76723223a82863124b133db9bd056c4081dda1921a18422f0eccc36e783e3d134094a2861c8ce6c733f34e5b1ad50485322414121b7b91f6db5cd73b2dc2016f49061670d79a80b5c84770e873f9607048a39020d826642448242204defc2a20e8b7e6a498bd85e02ce24499224d121da241e8e160e515bf433fc014320f088daa2372e6d13e0d237e7f8f2b619514b0a1e514b4a2b0fc4bdf580411604aa3d10a9b617f5273a432de9c123c05711080fc41dfe04291112a9b016d88bd396d3874714d1f43b1ca2e9439e966f2fbe85322fde027635685abe2711f0aefbbad97559055b5afcc3ae1677b58e3a58632ad7b46bdab71e1b53c9a011dba2dfde96c98bc39db0472de9f8d04785ad728a2dea149bd4297e1a739fe2184f7cc2d3b65652e47d93f5ea2c58e070e7887027ec41afccae30d523de359abb09deafd54e85b1e84159b0f869ccea2c3e298bdb508645be41cc5a84a43ce9356f527c4956f115118d91c72a17f31675f94963a7f2218f8d9139fcb1387be0294fdb9afae293df18a20b96cf5086e5df2ad71d885eebebb2f8b9f8c5bb667f77f19b9766a9799d4e39677bcebe76f19b6f5e1acc1e68c4c6c0dad2ced2da533e6d4c3551afb7f80c5db4c0dba5b5dce232db02b73c056f5285b7f8c225de9b0a649868f9875b5e609116be2c6ac9a226569ee2339ce1d229fe611d2e9d42c5bfdf6983d8d2620b815a942d2c589e729bb7ea37b4d1e25f0e8172e870e9fb9b73d87b8b5d2e5c5c3b7863f5cf7edff77d9f7561ab0bf02b9796162c50ae839af69b53daef57ff0ee2947617073dcf9296cb292dbbc8db46835fd5dbd9d05699ebaee1d0608965b92b7f474430dfb8562cb62c165b96cb2a8837789bbfafb0dce61c2c2c6e5c60be716996fcb1b80b8a452e5b52542d5ab4b468a1853436a75de35a682d380d0402aab08f5a1b863f4242a0d7a60275152afeb2b98acb6cc93f10bf7e6d5c35a57c8ba4faacb1ed2c3e6becf4169f35a672179a88672d495905cfda6ae5fd595bb655e62daa724bde1e8bbc457dcf92b7d8226f525f1779953397b597fce2170dd455dc86335e5761f3c25b47bfbaaecb5cd7bd5e3757ab785d9d4322044336f085b78a2e2480f7ed6e5bae37102d772db4c1e555f66a09829c4b5b15d7a60a1baf661577b9acda00bb7b10ef1b977edde5b3963783af57de3a5a457efd8551af78ebf8d02e2fc1db46bb3cfcd1a1102d945949e19a0501826a14ea1fde36fa7bd581b85daea150975510a8c2605be4a3e9e96b0ec42d6aa2c25c4e2fd2428d6dbfb808ef25b8c776eff7da20df3d6c81cf82d8d46c1b7d5f81be5b6bf3fca9371037a8bf0fbb7cc33d3c9746fd1eb436df19ca9055144e804b7ff77090fcfb61975fecf2f2de1b91c12904ef08bc18bc79bbf4171321b12d7a1192fa551c8873e67d6f3da1e78922f91dfedcc0e87b914f2d69bd81d87dc6d2df5da8668d7dd740fd9db3d9e52ef00a6b38831a0c65beec825b1cc42e4c43192cdee2977e367707edb59bb9fb7b57bf79731bcc9b6eba6b8ab6bffbd5af0545468cbc071a03fef596ef97be798326e18dabaf18ceb01cbca808b8c437f5fdbee32043990fc4a222378b96a825fd328835eebe87c984deab8305a031dc4117df2e72e902e4f0fd5eddc537ea2e7289ca385553d005de2f1736eeb72af3e6aeddde7f79cfb8ff6edc7fe07bc8f603af9d056faa592e8633e5bf9ca3a4c405a02d1a781458fee09fb7a63510a59520a8a178f4fdf0a639eee3665cade5ef1dee81b680f629b8e52ef0eb2c2e0e7e7fb7a0cd71efe2f6bbcb38556f7a2dc8f2e50268ae7dcf7db39ccb5d5e7db3649caa59eee297ae720168cb77967db38b9c7a0168cc77f0dbc55777bbc83855bb38cb5f67790bce3875bf34f85138739fc3455edd1780c6dc552e006d91b19cd630d5ddd51fdef4bdd7b4e6e25f667171701ab907bf5aadec3786f23b78cec53b1dfde154ed221780b6806769714545444b1480c64c0d825fe1a94bd388be145c6151915a52170bcc6511502d69d0124a54d816d1541b88d4f344d147244ac206dc030a044b998729ba9f070a697a115085ddd38b8ef0a9b0eff422236a8cdecd084d59587c0854612b4ebfe217efd7cabab0aedfdb226fad458b0d7b78ebb13110c87a9e2bbb586d209012fa3b5d427fe798d0df3b2de8efe0bd0a5bfdbb16d6987a952d87ef8a873fe267f887404244954a01afbbe27e737a2a7164b5bd4b96551b6dbfec721f70d492fe7bad81b8bfbbd89bc253673cf517666c448fdcab96f7bee8eeb2dadd822008bef4ebe37eefe2e18f0a4be54d75ea2cab162b97956bb55ae57de3d2a977b7c3210f0dc4d487b8ac6a2c2d5c5c9afd0573f8b3b79eef329bc254bbc05ba747dbaca566a6117d439e7008968b6f95ee48ba037577adc64020dba2efdedd736910c8c6a82bef8377b102411112973b7b8cd83c03f1fbde644c0e62066826fbe696e8d1c0e8efdbae1b18fd6d9755267af41402133c5b2863431b1df79a5a8a2aeddf39edddad9667d4d472f59a5a6aefce69b94c4911551f476d540bde0fdbbcf9c8b0aa4f535dd3bee25c78e3bbcd5b07cc07c319dfb5f21f88c17bb997bf62076aaa6be06b6a69c1bbb91c0225b4374047db83b6a696dd6b6a79ed0804b1b602752d9c51534bfb1af1533cd52b56e4155f8155df385a7c89778e1645a14c4abe416c9d6b71aadfdba97e54e754aadf18e2fdaef80f54610754fd9c43bc7d68bbeea3e2418c5375499a369dc4a50edcc299135ff915f1781998244f9e464dd3b4711c7ac194af97f495563a545b946a14afe18dab4d99a32de3693893721417af8de33d9f0a133f521998fc0c474c35108df54c02033b7a095d3e27a1cbe7cb4aa723748a9bfc82600c91f51b863261ab04ace1cd4ba778492893a20a0dd572d48ed4b2045f118f4781b78e46f118a2f8317b3eb5145f12caa0109a2c73553a2de5117b3eb51cc7e3545dca5b479b4e43191369442cb237215dca439e2892a552a944be84c79358a32da50a8ea5d26778a313923ba05ad2eea796941211f7962ad154e953d36f43255ccaa88f98a32d6349061d4d3228212436f043b7f44442035ad09586a714151b54e79338e359cb1c3d9eda94ab602d4793bf153c9178cc27bc73744ad67856b85e1c06667c8dcfd9cc697c079ad7c841e4709ad3c84104b1c9e1340f62c6673e67b11f1506d37e64d86df88561ed870d58e3810db175f4cb6b20633be4709a3cd6e871d7e89b977e79c9b39635e4ed6915303078850aac0d4dfd62c52f056116c885ad10fb534b1a83a9e12f796bfa05c65b79bb74ebf734d7998da4cdcc69724e10f239333e43669b99d39c26e7e4f099ac3323f33e3da5988436f2cbcbece9e63565c8ecd5b2f519b65230ec30f0be71cd5a4e4ee83ffe513e5584308aca679eb57c79c1b197584382b51a700c06d318a6433c1566c3e9b5216a8cda409154d888844703a82edf00abcbbc00aac98f7fca6fc6387f534ade025558f9d3ef88f17821b5a425ce41de6a4a9eea9c2992944c8748a00a1bb305caf667da1f2b840e55d8112477c45bd3a75b9d1a5f35f91a3acc9c26a7c61aa7f94c4e8d39a5c38ccf7c87199f99f98c1a1b02b85123d7d8168b55836f0860d6b0711ba3916f5bac8f9995f73462a3066bc4bbb272c0a97c1acfe133702ae754fe0e33a7f90e399cc6693e7312a772d661e634e72187d3f8cbc60470983d836c8cb935e622baf53d8be8f102c02fdb6add46eb3570508b669c318e35defa6d2c877cdb6addbc6a601ab8f519add3b47e47ac0dd51249fecc29d6abd6347959d58e28e0a50d55d8787a0d4985cda953a1cc986f10c99c627d1ad13448df172b25c3b02dd659309af592f514d6f314d2ac9f3e2deb3825a3a8e47dcdfa1d5b675d564fbf33cc79d7e85aa4c24e27922449923cbdf57bc2b585abd0e94ad492fe74591dc7711c2f0d4f3494c9f9a67c15aab0d6e9ab12355667f4a950a635c399facff95f1ad2a03a3f05de8e8c6fe52d6a1aa7d3e934700ef894cf7a0a56ce34661c7fda580e47b12aa78173c0d3cec0d38ea34c8acb6cc654b7f0aed164def9a7a7c0fba553e05da3f365751b3a5263e2cc77a9599facdfc668ce7a2a9461d1909fc1e439214aa29057114319d65560f22bccfae9d9f4d2351a73caa6aff24d9f15a6a28eae1b2bf2aeba7457de75346114152ee34d75e9745ae5ed27e618a5f455ce344a3f99b4218ca272cb14a8974cacd2c7bc67943e7e3c0d6f943e9237dd448e2616098633b29b720ed357bf32bc29599a95b4289c293dc79865305a7996aff34bc974192ba5c8c9743a9d4ea7cbaa89c4329e824f1f6f7a096f4d973e2b8c75f21a8d194fb23ec31bf9a30a8ec698ceaae34ba5e3547dca25bc3d1fcd2a954aa56cda76a9f419927b23c209592a738cc351027095d3e9ab974af944661ba7af5876a665b9b4ca1c6d61e5f1b2bafd58991c93b78743dea2e6eee2270079939abb4bdea49de5edb5c8dbd3798bafbc4559de644bde64cefb2cf23e4bdee5cb95f72b6f9815da90665560f22978ea2b82e1986555e3b1f4f4128cd64da6cc2a7d13b231cb03e3d3b63eed4d3f993e6656a641b5a74b55e8758ca272537c5ad44f98a32da59cca5f9dbc114ec8c6b62100e44dc6c85b84f11bf2f6f4b6bdb00126067b9902758ec694be3a3d863c7da7bc0b674ecf3166d6b9f006a84fdf846008b562f2b7211b9b36e42dc2e44dc6f23e2cef52d7b00d959ef2976d28e6543a8b3c495e15ca907772a6ff9b2ee14dffc79a1e41aef4156bcce3f68fa46923a257df84589b50de844e5948631495f2e6f84b7fca533e4353be51fa2fab24de54ff1c4651b9650a5449562d8f8d4d17797b2e798b2d78347d15b231faf3cadb6bc95b649137595d79972b5464211de3845a797bacbcc54ccbbccb5da6c8fbf51af30f0b774f31e67c1b92b7a1ccf8d36576bc79e9f127f23f9d85b74bb37ec21bd4ac9378bb6cf4f8935066dc369af511dfb8748a8fe14cd5e4ef0c4f79d7e8d349bcc9e79bb10ce5b914cc98eaf1538fb8c4dbd3293fdee4571f439953be79698f7456e6421b264f912709aef0bf3a0ad35006f57b5cfa2543014c7d7acdbfbf2790863574f4e9339439e5ede99cf7f8d5592f6d44b4097b3e7ac453b3300ea79f39dab27a0ade9e5e5d665118c55758fcca8a16cfd198a9c5a3c05373a18c986f103d1f3d43f1b2cad1b9c92de66fef621495cc93f3f6bc53dea2b8491d2f65d19af2265f2ba79e278a24b972b02c57be5f2baf15acfa092c43fea6f07604f595ab3c056faa53346084461d6b80088dfa18ca301db521a930f234af58e784c6cd098d9f33c609d916fd485ef54be24d85b7212b88e48fd4929e3c9d9537793a3de7ed956ee9964abf324cff65d684575ec22ac7384503f595a3bef2d378941fa768a41cf594a33ede407d256faac7bcb282f2ed488501c1e9f1f4db5085a94ebf2121431955be411ca94e193317ce8c5fc04a0682ea1bd4b78e46a9f0f7149e9ac4539715863a25f3aed1e447bc5f7a7c09efebd25178538df23c519cf3a5cb6c0925e3f4f135104b9f7abf74d34d19884d9b8e72d426f3cd4b973efe6e28986e9b2e7d0b674a2f65af96e36c8de3479f767c38e64dca372e6d729935999a045f9a6ecedb38fa8d139a415d909e2b1e221d19951a91856badd3be6b51de3a5ac475dfb973b9d3eceb35ad46e4f07e69eebef3342dfa70478a46889bb691349114759ea7cd6cdb3b6bbba0510ad618a869db764a0ba0bd77335dde5977600d67ba87afa9b09bbd7b47c12778c4d3bb2fb9259846c82452a3965ac59ee7e51b4f2395b2a894b7a74522d179b0b1f1e4882daed8bbc9c56fcf032fb3bb003acbc8da3b4d85955c7b0dadb66e6336e750c02649320bb269d02449b40e1a1150804d92448bf28de8a3ebe89a49dbd2ecb5e02c0922ba4959926590d51186f9d15da3b4bb9a96276dd9fee1ede59bacbb6f9ba6e9809a87039c6a8770a12d2f3fe80545d77e2f08ce70e6c322d17651de55e7d36fa22f5f51c6a979a3a13d6f1f15d14b29cdf91ecddb6f63388cfc7bd118ed22aa69d9f7a2bf59446797f0c6d5378bc299d4fcfed228bd1d02cf6f939a660d6f28d17b7dd785c678bff5cbbbda21f4adf9b2faddfa7ddf9771e8c3924c83becbb27abd1517dab25d447b4828df69de33bed3d3d3fb178da1bf5944bb6fa2a7f0a63a755138734f730efafc2fbc017ed985b6ccd2b875acdb7dc5ca5b9bb9ef6ecdabbc5fbc1b6e9a1da22fc55b09a65ad334ace9929c5d68cb96290edbb2471de73faf68e153b0e82a3c7a2a452b0e1b3ba13278b228a54c3a09fa706aad55836d95a6a4ee8a9986f7fb623dec425bbe9c02af5d7432f7647a4de4bd68d14798ce78cff175afffcafdda30e59737cee6422f12894e431911c8e9ef3bdef4778a35fd51bce90b822eddb55a451a8ceaa5cdd8690e45f946f7dbfbeeb5b415c68b7569ab6ddb76bfef6a1d15614d7f5847d32ebbd09617ad5d974d469bd6f37e79509d2a76282028e0a5ddbc34b5af7acdd64a99a0d5b2765dc7dde02a38710eee537b0ea01a8782f8e0a431a919364992eebb87cb7dcba22fbd77bfb652ca39a06a2fe380b8ac65e5b8185aadc1c33856732e16f7a919a09d55619ff67aa9e10cf70c6322e2c2110d003d8dc005213d34784417924080388dd08525340a3d8dd08521b416ba700621f4786e88083d9efb788dfbb98ba35026853b4d8571e239d555d7421b3f97fad63449bece285738eee237de82e7be81efc0addb544c4c3ed5b5bc5746d5c96ddea9acd592cc3f11cf3d6f2ae2cd43bbddb8cc5931ef203ccb79da96f7c971ac3e39e138eedac9ef89e568380e7c0a11b3f3c683e06dca45bc77685126e57b26dd6219de8d925bf15e11dd65d5f3bc94afbccb39520ea6e47d99fd44dba560fb19dacdf3ee799bb4591ae3c183bf33acb51becba7b78c78d8d76182c49211dbf046f1e1adc2be08a4d4949c13fe895abac9c70a2e825a292f1f78ec0196aefba6f1bf7ada4db0ee222b47245fba869272b612843ca34a81ec7873a3ad46ab9bbdb0dbcf7140deef676cb3021dee173d88feee1140d7bcf86bd97738c6eedb9309ce1dd6a2bf96583fb586968e36ab55c911933cc0a7ec184e1af8eef9b6a2e1c752f1bdc411a9753c0779b24491ab4e8328ac334021736a03bac52cb5a3b2c68419bdc139fc39ea67e551731d53415a67a3df9ca579e7295e3efd039ecbddb6bb7b8e435bcd15dc316a7b66f1f4d6e2ffe443cb743db73e10d2ea7b673ef52dbc1d4966780b9cb7b87e66eb79f482fc9df11d1cb381685f48e7459b5599b41bacd3948ef728edfe25852d66ab9722dffe331de9a4e799eb55c49b94ad66a99924f9e86364e2e66f127a23de79d13b32672277907a1c593b7b85e1ad2b0d9238f63b57855de3a5accaa93a4ea33bc51b5eab2aaca9bead439f297c4b25ad2c4401469381938d4b2764f11314dde75e76e88f44bf0dea14beee11dcaa448e7b0a6711e58720b6ea92de748bd9b913a29f1b0b5f1690e4c61ee33e4b68ef6eec9ece916cb6c390767326306d7bd013a9adb6ef10eed7dc337b4fb811bee52a4a30ee2cd43777b3c2973a994c95178dfe8f127bc77e8f1b20a23330e32285ef6c219ee0ba09c897710ef1d1a8c954e6eb7bc71e0ad4e113e3e2b69f1b25ac2b3b63e9efb28e61cde4d6448f7f0d6d15cf66c987ceb68ef2778e358d0cb5b3cf8f11acee11d88aa4bce9998e0572d4d5eef99dc627bee9a09066f81c8d13815c76af00533247e2f15c66520ace66e3d4ee3383ac20af87e1f621ddf4156857d47442e77e1cc77738e14f714976758d16d92245a56392ce22eca7b6ae7bc8c53ff893cb4f7e150ed915410bd4fbd456dab586701b476ee1e8de18e43b5f7dfe4ee9bb7235a4dcb4050ad9df3f64dbe55ab7a0379509d13fb1a81cbe5ba12d4f328f5bc7324cdaba5cb76dccd5bd31ea5de497f6defde7b131671099eb6657293b5f66dab47ecd255cbca43e9f464dee4fd98b738de04e5a68f797be26f9e3456523a8c8da16493e7c1544a3fc3f17a98524d3d1f5dbaea27a5948ea73127df3e290f36467b4491243dcdfd8ebf3144939be4ad99989c6093a0ed89d924d71d945cbcacd2a017edddfbc87be81d2cc19e97f7f53425359db5d460d416bd126412433435c2a3765d5803ee375bdcd950663bd5b8cdda1b3522148286ecfc10a980117a223104207a97b5ac936ef7aef3ddbbcdb73de7cbf35bb60973b4cde4e1e7cc9ae4940e250fbf43c9c3f041e4921dc220c23c671aeec27baa892ede381a4b05935f2ab20b122b8c06178c003d1b232de96d642dabaa963573b8d33277fb0adbb6e8f52acfc6be8b44b7a18ce8c31e8de67ebb6bda39ee96d3b6fc7a596eeb9c60ad0db5d4aead84e5bb87380597cc580d4af15d7597f2ee283035425b584eb8ea2eef9bac53bcfb4d8149f1f414b9081faf4136760e45954bdc001d8df21aaafeeaf399a490a4902449923f216f4272aa6c837b0aae9a86326c9224fa848b084faab1f01af9392a22ac46d49646e6ea831f0611a9b0aab50904ddcd1fd8f016ba63c1c4ef13ba6be9f15b85ee56e8cea5bb9c6b502d358aeb90dafa3ff228388572d73dbce225ec7210b7f8885fbfb865342a535caf16578b1499068bb31cc551f0e9d705e52e94b740f90be52d282828282828282c3e3f431b2c722582b66867c95ed527bc57e47a02daa21de535a8c2ba6baf4354a078af51a02df345e9e20bf0ddbdf9627cf76fbeb8ef2e9aa3f962f4eede6d8cfed428d0188a848ad68f8d512348d0182a865213515ec2270e62d6f347b80e3159b48b70e511038de96c0c0134a6cb350446aa0b26ec00b3f4992f82cc17ab6baf31982ff2b55719cc179567b2fc5458edc0c4e1c37cc1baf69423a93c15467b6a19021a538ba852797b29328abc35edf704ae93a53b89ed2cbbb3703759baafb03759ba67fc4d96aeab30d12cbbeee4d364a4bb9e53b6f1854fa9ba04fb1067e1ab4f856d5ad3bee149bacc92b0883178bc55c24ee592c08ba987296882a91631d524a6244c3587a27aec66ac24169a6848ca1b4793408ae424ac24a83fbeb3b3330111dea016512436567d6c8b043f688c58ca07676ac5e4dd6734a6013adae45d1d7dcf1fd8502af9697162c2c0776fe51943899c1a19a5a01001c19b40100441306f1423de47fb1af4a3ca5b4c056d3fa5d24b4aa56b7fe9963e2a65948b1fab46c17388a6e1f8ea2372797ba47812de31dbe84e70d5209eb4e56ea008f52b926c28d365902b7dafd0a3951ef9a4f4a8448f4ef488069345fb1ee9d1411a437f688bf6d1285f1a88e3b55a6a1fb3577d6cac06511a883f34861259d11d8aee4e636cc9848ddebd9b31530c35425bb47747096d944efa8dd0188a442451f2aefa8eb09de5e826dccdd6e8386cac64b690acccd1c7d2aea5bc009b243ca96a2e94e96a387a0db2311c3ff1b4987705afee5ed21d07ca698cd75db4a245bacbfb06a61c651b5d2e22ccdec5dc45b876dcd633a419d173c563d3e978501d150faac3519d4f643d60067a849e740ed1f5544815c259fac371dace539fcdfa702b3f4060f41041040c203f6086e0e181f921c48b0f3d4f7bd01e2f42d09d97aedfb1633be2bab9711d69a2c481a39c05d99a58c2c686b5c446b359cdd65a87a860c0e03618f2f5e23618970248ba9e652b8bd3484d6bb6d6aa1dd4d6624d6b1c37edb6594b93501dad863fb831c4ad46bfaea9e8d513e189b3597cf3d2b5d21accaa6ddabee3eaa66dba7e0100e06175b85a83706f0c910aa9e5a4d4a796d3082260f4f0c00c417bbc501f3b5e67b8710de12899b06115a101c04c0286ea45beb048a46aea506ac75077741541527d915e64240e352a9b5ad6ea830e16ce4ed983c73544cf0bc8cf8b90209821423094a0466a592913df103de9117aefbdf7de8b64880e19f2c19841bafb9e417308c5de1092aec7d076a4c286900899436641bc2018385c134666d0f6024377df5a38dc66a4093018b94c70469af0e17e60c0c028220403c6f7020303038650914e02424ac0102a42040c20302f3044826060b698c96682676dc1c00411b942d0109820223c303f5e5e2f403f2f2f9febdbf0cbcb0f50921f212f3f40b4c78b102fd7cba7e7be5ee237abfb7669ef5bebf5eaf1d1420f90578fcf8e17dd7195ae1f3cd7e562952576f1fc3803cf102e9e1f37ae2325aba43ee84e596a6f8323166b84435c9674a7963ed0207a3d4abdbdfac05136c13a6b870e160b04492495ea67b174ecc0c2100e4bc70e1bd62cc81257e16c3fe0f8552a9c6dc3f1c3188cf8b0e1f88166d39e908a54f150a352914852a5aae1a10c4236aa1a1e606caa5910ef6e5dd7755dd76d5dd76d5db7759dd6751d498369b66a4ddb3406506d374ddb340ddc34efdfe6dd90341da9bdaef336c9db9d27a3e19898411bcdf66d1d7e6de42c88077343126f48302f1209044591447ac178e1f5427ac1b048b3202e1d224801717e6bbafbbeeffbbeef2b2f8a5af7bdac3df8bd1908eda5a63d4c7eb7c6544a35a52feac75140d4609aadb4c6dcfb7b2fa656d334edf324a8bd6b5dd7dd80dbd669f606e2b6911400eaeff522a97ddfc16f82b3205ba69aa6695aee3c4f7bbd15dc9ee6799ae77dd78b80f88963b5478144ef735e4f77dd278de1ec86379d1e8fa87d6a566f5ddd36ab354dab9ca7511f14b893358f3822e316df22f0f53d1247928944a9549e59284a152e162f971718cc0b18315c56af97cd21428ea081583f021de1d2e2d5c282c5b54245ab4c81e204eb85ae5f655c698be6812289549d55ba5e2f30307e7ef05b56587c8fc4916422512a9567168a52858bc5cbe50506f3e2955f0f0387f3f91183586f62c4cfab85058b6b858a569902c509d60aa6eb33c695b6681e289248d559a5ebf502438100f90acbb708747d8fc4916422512a9567168a52858bc5cbe505c602bf1e06061140382362bdd80384058b6b858a569902c509d62ae3e34a5b340f1449a4eaacd2f57af9f1634565458a8aef9138924c244aa5f2cc4251aa70b178b9b8fefa17189e1f1d05c4fa92217eb856a8188d26944a46a18245d53c502491aab34ad74b082154525adf22b0fc1e8923c944a2542acf2c14a50a170b152baf7fbde87ada43083288f5231f42a8689529509c60ad32be0a5dbfa2822b6dd13cda028a24527556e9a23b3b29aa142914df2371249948944ae59985a25451aabcde55bfa3967647b381581fe6d09d32058a13ac55c65f41a1eb555270a52d9a078a24527556c9813838aad4896f11c8fa1e8923c944a2542acf2c1428525e5fd6dfe0541a88f5a00e1c142758ab8cbfa292757d8a0a57daa279a04822556775e00f3fa450ab53fe1e8923c944a2542acf2cd5eb59a5aec7f1031706b1fefaf0036b95f15754525474bd2a852b6dd13c502491aaf7d003ea84bf45e0bf47e248329128954a4ebdfe363d5025c47a110f3d64fc159514154ad7a750b8d216cd034512a9aaa939912b282adf2371249948d451af57d5d3d4741710ebbf1a355f51198da6aa79a0482245200e38902829df2250f53d124792495795d77a52a5eb61e0c06d41acf76438a8a4a84663d53c50245d100606c594fa1681baa2be47e2a8225f4fa231272f980d0a627df702a34aa14655f340d1e532954edf2290fc1ea1505e2fde90743dcbc56541ace74a17ea448a74ad9a0786e05f42f91691a6d783f5e47f20d66faad7d24eda622ae1aa79239044e27435955eefd583a4ce8858bf41b1ce5a56da527f8235da527309a8d19893d7bc27f66220d65b8f84679db465d6f204ac4010ad89c968d6920ad9d48712a12d4f0f6d1fe23d91582526910de3b58124eb0583c606c7cd8e1e3c3e5aaed13324aab47db14135095ba4326187ea3c83f55187b03dd5086d81f48bba0cd1346d9ac4503ea72e39c126273150be95221e8f8247f228b84778f2ab8126b86a8ba94641397935c009ee3ee239c3a9ad7a716a59af69714785d993be7968d3278dd1e143a4dab475b41531a72daeda84a92e510000e349b8081fe26ca43b3a2aece4f538314088ba88f127aff4061f9f8d3ff916ca9cccc6cc5da0fe5061550a3e54d8bec9da5e7c3d0e03cc1753d75b13ef95870ae33eb20fedad2d7b91cddba5ede9657684f7b5e82106f1c5dbd3a2cc00edc3622d41dd91b5a49947d5d1344e0a396b7a4bd2acc455c0f61b9b2489a641134578a79e56bfc002f1deaca3d1e87784b78dae74bb74f5bc99b78dae9c97eb0d44d0fbb4e1e539bd89355c4778dfb88a8cf07675b37a9f75f45945316f4fcf11e86551def22ef5ac79bbf4fc6ccdcf90009d566f204e1bdad872dd60f4fc7c70276b77419ade47ff2a80f4af42c57f1bf01e6fc38fc7968a8a4a4a4a4a0a0b162c8cf0800f245a76d39b28a26597fdcef9e25f8c63fce2339489b9acdeb902002249ca2eabd4641a479815bd244992a65f92fc2d954a250a9ebc5a8e41104b991c635ffd627a04af2e497a55e5d33c6dc53b4e5bf12d9421939d6a99ecb24a0448c7dcf40ef874e0878e79cc6f47925bf8a5b06eca399f723e7177b57dfc0cd223f9f11b499279bfb816cab8279f3fde6473f66a39ded38bd75046ccc96cd2291a54c79cea98bc75748c0d990700e6c40da4fa19abdad0c550a6946f106790be349441675c1c40c2e383e7871e4ff2f8f0144182a78950c6ca556761d5c73fc553dcabb0f277c45e2dcb77c0071218b13cb5aace0862a28081a2542a4fcb174b754f3913d1a593e701ba152cc95f0bc62aac743276fd1bc354633a14bbac965e42be4a67bd5432fe6583e5accb6a0ba764e4ab78eb53cf0a034b1f674e436b7cce9891c3ad200d4eb9388debcc6670cac55db8c83634a79173669ce639397ce63ab319cac0c03378acd1a5bc6b363595503fadbe4199cd5b8481174035ebf734a24891827ce95b6883647d3cebbf0a6faa59d79e334ed5ac97f22bb4c162ad5c631c1ec35373780154076005531d00bc5d67c1a189224480f4f8920f077ee8f1f74870c047137ae5f744f4d4f3c8117a12e108114b10e10b49a8c018e2e8e2725538bee5926948d26432e5df18e26a68a6542acdd54d18a7ea180a9a382388333c9d4ce3789330977e321631430a65a0cefac5acafe0c9099529b85187367dc6ef0cc997b029ef972e9dc4a59af1e4d2e349bc41973ebd84b78d2e5d666f0e78e63330cd5df89e05535debe7ca49376c274c3ec3940e33cfe13ce4701e68b20ebdfa8c55de2f538d298f415cdd64fa0a6f509b9ef176e97cd284c7677ccadb468f242ee51b97e684ca1499cb27636823753ffe6eb01a5e4c7e31b451ca291af753b3c4d91a0fe695acca5e495863ea8f421bf7638691551606ff1bdab85fb9cc5e3c35ea278139609d990b4fcd82a75e415d5667609d590c4fad0ddda00d9186b4217a220b99a0c8bf30994a399a7c71f2370779bab2b17a69f58bc2ac9bf0e919df307d3c1d256f1aca28fdae382b7fcb8eba09effc06e868d92fdee2577c863223ea8561a8209e8e3a7dfc099f4e3f9d7e1a3310f55561a6d3c35c562863ca3788a369bc4d7247bcbaaca656ab1727bf7a8a4606a2ea1c2b8efa8acb2ad5323947beec2b9c233fe6c533be359c29b15ec3fb127e4d96d23dd6f85b2a1d0c6b4c5d1a7f431979e768d3c79c434319a6af206fc2a8cb6ac619a7ea98bf380a6f31e3542dfb8a23b18122348cb917ca8cacaf562f5d14ea964a3f954a5f95569986325837fd9a4a37bd863680a83a87690154af9e31d52c9caac722687e472c3b0d9ef18b3d949b5552aea2a2722ff46aa952c9f0060f5dfab5600c967d06cff888634e83675e431ab2c77c06f708f222c667e01e415600e0770b652c8026d1e3174093e8adc3e2237e4d169793f8355958bc84bf31882e5e8595eef22eac3175c9aba5cb78166366712d94e19239a1af00802c8505e684301703c760ae0382a8f2cdb1402fe56085a93c651c47b0962929ff42af9629a8d330a794f2ac658ac653224d1a8f09d5786035bca87ccc5b6589ee07e2f86d7fcaf1e28cd99f7b353667e3b717bd0d59d8a7ad01e52f9f16e59c101ac4bd0d09713cf3c584e5edd5905f72c65a19c43288dbfefccc173c37693c26a1f962b2563fd486cf5a52f223265f2a91ab52e68c206eb054caf9dbcbbfe378b2404e35e3fda2f70dd6a6974a377dc4a593f8742d942991b73dda0a9570be69fc89cce365b5448e37ddb4ca5b11dbb309d55266cc9b1233a3875781c3cf90860df76a39e63d3bca063c35fd69f19a6554cb4315a7a10d15b2aa62f4161807144e6894b7d2455cfa88c7129e63c938ee2a923434bd844dbf9a58bae7a3bd22fa24de346b295e4f71eb90322528b28865505cbc492d29cb6445083ddee4f7de3bc171bc09efadc2a8e48ad7a97349cc9c4234230802002314003030140c8985c30179445356e50314800d9dbe5260316c591243082163081820000000000000040120007d8ced6a5e7b22e3dc7b63b78f6628d41aed0d7c4f762d5e9a7593406c7536c910225e2b15560fede2180279502d4d805638decccdd90da38755fc40fe81c191980b7c4289de47f34ea36f71acafd7e860e21a13988fb428922523f8a98957e83602eda9cae2924b11eca2679305e1477b2f22e3a66c934f06c411a7e60ff5019c2c9215b85f19b031d85ca487a822ccd5be52b8798ba1d84a74605ec76d87db0c5aab2e150bf364302db4e9b80eaf60571f32a4a6ea4ecf74584b076ada038cdcb46fa3e4b177bbaa07338b12f334443d2040d6cf53572aeb5d6412e68237f928886d922c59f018c2a0b97436baf901bc4cda40b1790093c641c7dfdf73ba2e0bff3192dafcbf19d1d8501d7c503418dee8163032da27b9e5accab02ccbea3f0cd78655f6dbd210aa4f293f7dfb55f1f43c517469d20b343e0b4b094b481638ba983d65e3522f2992702aeb204501e6f8bcbba98bc48d7ed00f340b20477618e7fe907f6c8ac1145f85e44f9735fabef047be1cbcf3be8afd7439151e9dd0d4dcc6a79a8f2b51f70d4634b68995fa7e92881ceed242a10b51b20c5226ed76a562a58210299f480324738e56d192b81896290ca551ef46d89edfed92c3788eeb92cf9e62c2d06000f2c8e0010a09b39fc0421bc0875c0843669aaa7c0ddd3f829973313a03890e0830ae6db479e5918cb870b16943215ac41936ac85f812d413cf1acd5207187d5ae75a9b3bbc33e49450bc08cfc2961978816f10d0b10f5ce2da7a7dd69c6684eb450822dbd22bf490fe4cc58a80b717c9bff105f9a41ff3fbcdf2a7847a51ed8c1e73cd83bd83c5776739251156e945ca05f73262a9f72648b2588f732fbeddef9d1d8a48c2df7b0e88803fe5d1e8cbfd8e5848c017f7cbeb7426136121b141e73a00fc16228cbc415fc401523abb2dd18f5e8cbed168d2865f43458268788c1d8007649bce81c21df9ff86eafa71238759b494efd5c373df572aadd638f967fd953bade22f030c5b797bdfd6780c6fadf7144b50f630eef6a88f1b3e2e7b01682cf6bb405cca2ab9888bd447e8b909823f035cd9863593af8e6f49150d6b44f806136f06331ef145a06718ff537196946f46613a540dfb1e0a9fe5ec016828796a0002cc213cabaf5e881289f4b071cbd3e9445528579f24898d2d35f152d71c94b8ab726a90e5ecd5acd4e889df03784696bdddc1014e3732a7351f6a5ad788397f16a2f7ced00245b99a3dc21e6864a98805d2f190d5ee0b229c95abadc19d1b0b624b406cd6d3beb9af739150830b039f641622ac78884ef0556ee52aa76d920f6f358b477f05bc42432591affae12e471ab1b37468d2aa238ece4c5b87eafaaed130f5975e5fddd76888ec1aa40bf14025dfbbc617ff517d872dd334aea5e2e2136ac121cc0fe941d0a6e8ac277533a5d922f9e2c3fb4e1352185d8bc8b1d4c7f9ecb72290d0e3b92f9572bd54c0a5e326ddd69e33a5095f57aa8859235630c5dfc4f200d82f902f68dcb50905344fe9487da5438cac1298b449350a9733d1f20317b8eca9b2a91a628f17a8b774e7aa7d3891eb1207c5bedeb8d269c68a85a4be7bdea0c0bdbef3dfb47052c35d1e892ec373ce4214fff92da083b31582104473d5f37890cce672d9a5eb774059235f666cff82ab4fa0e82efb8da1d747402c7760cd074eea85db8a7d84748c0dba2d219090aceddf78f4241a27aedbe0b62d02627b4508fdae7b0a8c2639a5ec3f1299f52ede5f779a471916962dd71bfb20eaa25a37a1998450cfea2b5de1a6106724e7b0fc6de9394833ad791346e9b9aba5d9499b052b76f68b1a55dbad1a6925f002933ef5dbd76e338e8648e0df143a36d7500beadf0d5bc5803ea15bec87486fb8a2aa657f731abed821b8910f4a0bf512aa9890dc591e7c012025d8b49d7a053ffcad58f1508f60e03c493d4db5dfe53f3ca84207603a950f1cf8be7d44664057efbfe6028a8aafb47389110265572c1039c0c1c9b220933326c5ce01896ea908a7e4b3a409c5641ce91223841aef2ad5ec2b0d11a5ca7b71b073b0b4960971a1fee11a24218d54a179710ad4c32736a5751fe6b8d387c9c46ca6126d3d11e802ec9abe80df74a89e00b6ba51a0dd27a3ed9db58334663c589c583500ca763a020c38b1b8d09814d98d87ef4925e76cdd18e04e0f05a85d37b6acfd68233a4f1cca637ff1b710bb3526e231fbb2057dc3895fe08f91a827e5fdadd97e8138f7707d2902618a3f9388b2c97e7bd32ce64a1e2e7820a2f3d5858a081ed139ccf57d124442c73aeff04de01e2f33f6197b761f767b5a3333cc3a6cba0529c51b1d78c9e08ea16541b1b64def6773e0e7e27002c5655022c1b76307c9cb750bc058b0ed71de14a482dce6805ec7e30c0eccb5ccd2792f5b490bde600b1f47b44de0cda466a10540f59bfbaa9d31cf6956f1869b8cdbcf6273bffe15273d68b75529d37ef96cbdfdc6e82137448fe2efffdc8d55e90163fc9c69d9d69b973e520719f4029b91f6855ab08457bdbc21cb94b7e414d6c8b504f8b5688cd16edec95644ea9fe04cd6c2acd87cb1181b619c87e4a58e779f4f8f55364463a012acceb6010925a240d56ed2181fa87db29e2e29bd6380080968652a93c42527bd4f3429968dd83a99ee76098eb1ccc66cce69098add2fa13875bf7a589da5572825266b6000a9cb022e7a003ce612df6276800632e47efca8815fa4c06af4d7612245eacd7744debbe7d33bc8b6bf1860ff7adb808814f1289b4e1e19d2a3ceda8b4c5b8ae708601c60ae7ae48df079c5487aef5cbd79f0045703d85b2f03b0c80178fc1b82c4ab50d300497e556b5ac60244f0b8053ae1345224f46028eba46ca5678e91604ccf7b5cce3b67ecd122125667427136d8d7650cc0d6fe88cef190bd24814a6a88a5e2b4ee0faf43ed5ae7273f0cb5841856a54e87396324cc2bc4a10a9f6f0f1312723610dbf5b50023ec90924244a81771314ece03293fd72c822dd9725a80e36faf60de3df391b3802855cd332cc7bbf3f77601c367310009921f2cf977fdcf55dbe3cf799114ffb52d620efdb985f9565063f49f932f5e2541b5f6f58e0b93671a3cee5fddfbf735d907bf25b4cac95e889fee00f6ccbe27d6087bb02e77e8f07ad4ae8dcd08112ea9f98bcaf6ee4c3d1bf80421d60092cfa7bcb0afb7e0388aa30ecf93dccc5283cffc02e6ffe084599baa1f38baf0bc5e5f58e616cedd2bfe77430d6c6eebad398d3c2a9abf2b5b86fa44f1f344a170994d533c7cc5ba28eac95c38d61afd8815e48f62649ea557fad60e1918f6bafa0ea23b2adf5359f448480266e71c82d3aa7a1afb33d0e9b9336155f15065d536a3c18208ea71078d536d07cffbc7029d10237d586baa330dffa5b5f2351cc4271555a56c2e6dbd11245e9680901f591aacb6b87d62dbb1f18197f124e48dc6bc5fe7061801a6bdd029c86fe504df65a4480285ae55cef078041e324b1281daa05fe3c1de8089a224ff978e7894db83e1e7541c84bd69a88ccc8793b3b97df1296e3fcd860de565065a01a37861012e39a31b8aa9839a4124f5215483d9bc184407b39ed2083790521145b2ad14ff3bb28c52dc8576e110c8f5a3c5c6f3e18908af55149c50b7568bb98af8945b6b8d5b837a2cc9beb430880a6f5da84ce69ce45f8528451bb1d5068307ae2def7edf49d370ab92af77e54cb4a2a00db7c9504c259823fd349b101e080a65d486139a57950f75ff2896a9f7b3232c1546b28ff406e8f11b4dcfe2c77fe80d8c64185b9452531858a87966e2a995b782919829dc940fcf16073f0702f2c488a1a2e1ca18d395f00c907b30e3b705f48461d08df340087bd7a05ff73316d7bef6dc335be3496ca0dbbcd6160475ab901082ddac880c42c4f9a7dcead07213f9889c2572315489322af2a74fa2a1b5961d07d461a6743b6f77b53491e9a739bf06e1808fad2f1a31a73148a778e6024f920ec762cb87602d6f6fcf8b07e4828770b3024e1e9e3bd85629ed73adf44ac07241433d3da0276928d4aee0536cb087f2684bea500d51e86cf0a99b672742ad557ff2740ff7e7908fce71cb1e55834278fbdb6bb08c25dea1a8c69a282f32ea9130d5b9f8cfd46904c6dd71a6eea9b88956f87af63dad877064443941edab7e57e0b733e52cfc51841867ed6c77a0b736fc1f5374b57fe015ce66c367f3847bc3f5783644c75f59dcf16156d106719488c3873f4ba115f6e240e5e4f04ab80fc27f24dbb5543e61f4a9754e36530b717b9a9dd05af817e607f9d9ad71ad24df4d0c45e33f1b82124855599ab29590546c9f35b7c489968f050b946ae612b212c7cdcb7a29c3ac2422364f0f0055823fa6e3950ec478c54c9c1751ce0f8a9f14ce5e28468a8e68a19720d89ca0924eb34f293be9c621210065786afb4af6a7a82ea32388f6931d62d612d0fda78a5562a8c1518507f455efd130c2898ade1d606d424d16078c1bddf1b981a337a7d022da653449ddf479fe6249b0a0a70c3372f4049ab95e4f533379eac135e3400f716654ea4130e34b0fc166f4e8416dc64f0fe9cca8e8c1db8caf1e8266d4d1836246645d40fe681905efe019f31a62ed01de571da6982392271269bec94fe5422e3f435d4d3dec450dcbdd54c88ab249a3f2db0680f00c443915cc40fca9900d882215bc405c522107443b2a2840fca0421688222ae880b8a44200882e2a0881f8a5421410d73ac506e7c3cba352e53a70963c5de26c07c051518a4d25405a6132d14f74fb02462c4925b67b31ea2d2f1efeabbafb42ff06ec2f5c6d20e785ce06442fdc6d20ea85c2065c5e386e20d70b950d785f78db40e4859e1b705f38da8081063be18c5b0bc51fdd618039127e813f47bde8e58304a29408dd40630b55ddfc9e35aa52b1723b1fe597f5a080c9efec996f6faaa0217b5b0a1ad8dba5a089bd3d05add99b50d0aebd2d050deccd55d0c4de40415beda5ae12d8321fc8c60703b014c8b7fc1bdc5b822c0ded1f0640d73cbc89f1d6bcc4e2e83577be47f56f3c1179b00be5bd8cbe288f1f4df77287d170946b8deebffc5a7454e5f446bb550e18ad7d7997d1e35506563e36797b5d62812b0c84cf1b31599212df08c7fb2776364633787f9c8fdf01c5e642abac9ffb0c9530c5c153dd4dbbf2c6e61403351e2f5d511df2c285aa85b75fd4ebbc51a0d2c3eb161530aff6a8a92822de8b88f7dda3632ce08e029bd24b48f76748a3d64bf7fab5b0e6ea8faf1471baf8a1c88cc450791cf9dfd6ca5103bba83c1b187725c540d7578206eaabb26fe0616574035108a6a9e0db65477ad87d23047b4bb825a96c9fdc8b58b18da92b594c960d6c3147ec015778d4b890b96286a384cb0938402ebde13ae4ba03171517cb40e138a7ce12974264e1f21428b840b666b63f52bad4dd82b9d26dca551968092e5404084bc3b8e9b3747813fb25aa37ee5c82bd11245ff1fed0f7e09ce674fe929c21f12dbdeeda63d6ab3e81f7c9b18c48fdd05bb9bb4c62159b044689f82674917060029784b2b2b17addabbdd2a3dbaebbc4043eea0295d87f194e8bf601811b0159b1c8d7e1e8021c6d5b04448a76c2c44de398e2f0e3ff5e387d5501f399df6d50ed76fa58e306f3d4c26be0715c933d83d40329f6281f221db0ec283d25fd61c3102e6113645091a0110dcb2856a1609b6578e47ff1bbece4abbc801bc0e76e3f6ca118917dff92d73bc5337171ca4e30d31b8b406bc23af72516e3b19358250765a1bd669c0d9a70e17f680e8b08d8fc22c621d71732e181519ef946ff6a562135bb0d1f47e454e381699e63bad9c123b5cc5e65633dd6330886707942f6b72cf7fad6f44b6ca7bb81826136f2d322a01442015975a9b1980932c3067b4531badf27325d117304abbe148235363db3edab129718378190cdd9b525829b81569cb25f2b1427060674a5f35efcca5a7f51b240365c1e33494b26243a5f7e7067da3f699ca1390ec63e4b10a3eaeabca6a626dc65d73eecca7acb912ed10cb926d7ceda59588b7ffb609dcf0aa937ecbd714630eb2d19702e268e6c46a2721d8d5cdc1f1d02a5660128022c897e98b461c14e5171e29a2c904f0fa270589a2b6afaff5a381f6fc173527c424f4926fe21ce701019a70c2c6f062100307405edb71a86691f4ced08702a05148f577fb0251ae710c8e4e818efc58c4181235c82893d6e3f6ea1896e987bf1d129283b2cf64f6cb50a8c72e3e7e698b7ce8179311a9588baf4ac0a92381001e89bea69d8f28a562af56a5b0a8440c23551aa3345b88fb38f9e174f6bf2381a1149772b6efd6356753f99b018237007af5b7ae11c423bc6b3e65e10d52bea2faed66d1478b3f06da2d6bbe0ed88a17d20d38f5a72db96efed34c7040d6e21889cf4c83e394965e8b5f6bdcbc227d60f14113b7321be59357c99b96858e86a6fe07403996c94264ccbd581e30780ba61fd2548cc476ef2ba88b070081877d175d2bbaebacff1ba4d355b4fc4561f5388beaef0ea75d79bfb07794f64134a5f40fe2860da026fd203b9997793d41f61d32c765b48c3d0ca81845c3f3f75c3f72ca068881d8e8e38145952111aa23fdc1fe1d3820cf2e3220d69315334179d315b605ed3caae98ac6f7fd519386c40ff7e75111b4b0e3a2e71a01abf366ffd5a13eb476eb7b0dd0c5bf0ada163c4d19da87562d73b5259fc52959794a09ac5356e238ab939d69aa25d4e02bbc0852f06e2c20c6a272421b843c2a6a863e16ad66a7e4a8e298c5c360df89e50a7a743ac1e280b18eb62b6b8a0ecc72f64354a32cd2eaea2e8a3bc390df5f59ed00fe90899d5cb2ce016fee8b075d5028c95512133381f61c792abd49b0e797786dbc2c9214523d158a8b4e6aefc9243fe23639a809322489c0050101ec62ae7b123ed7760df89be8600e800f68e220fc04004645b573a026f7f35a8d6bfcb8d2986afaa428b4e8abc1e2c190bd486c97ae214922174e1c41911a6f0b18e8ac2585ec1bb0d055b39a71bd95ebffe716b189be7258b2d72a1c18becb042d65296effdb8feceb0212a126c76875874ab856ca355eb7b810ade5817f7f786fb50a86a03c362f8c18d1d1a692d9e02de28ef43816cabf17c21281b8d91dc62c92e8dbb1a039343940e42b585b1dfa6930db9de2dc3a26d22e6f90cf489498a96087a798c6769d986548bcbc35c49fc0b7e6636fa28e0ba792f4f52d7eac86528c18bef8329f3d7e51f15df0b35b33d0897911dac14deeb2b55fc2bee75e58c7f08aa946d24cefccb58ec13c9adeb52458ad7d1c3e610efc0fab733c6757fc6e628db36e5428a4a83e5475958396b9d509800c0112f10e136a69d79962bb6aa98e919da23ec0f222f67b74c86aab2537b2739a1178dfc9044d777d95bbf039d9d4dde75edfff2baa2f735e3c01ee6f5a962157805b1d8e71143435bb2ab87fab6fd75d1fb72ba7df2979607bac003bc50d659b838c2d4249db2d9ccb00f7f52083f9a32c2e1b3bd59b6ade29960b8c58fa7735c2460217868f2b533426ded91ef3d260fdf7d557833f0d48f6d0c477019070c5c36c1b31f8ef0ea14836f818f70df440423335152b75fc16a58b1d0cf28c676304e8c15c7c6d39216efc6b7448cfa3d803e32ca255accf7b014d7abbe75e724af19a4422fdcac3d01897e1aab278f01209b42fbc0ea2ca2e1a48d59916678e57c781574619fedfbfd03fee3e67c0be0b1b7a3e085b62332f6c066a2244ef274925ac2dd3fe8dac4193cfde1aac2ab17c23f7c4103a9637997e81891a743820bf4e72a459a59022dfc69e81a1001d46ba0df4a332d24f037f700b61aca637cacfe72b05eaf4af8075c052fc86071a6d0ec8f1523f63f542d80ee988543779e2624ad8740ca28a60584f029901eb7524e8603af1c1ff8dcb6252aa015e6c31a94b199639e31ea7278b73990f33b9e41b2f35b40b568bd2daa52005148370c710bf53b934856316a766cd37e87e721efbc5378991c52219432ce6349eb1b25616d2fa99ecf57dd75c0cfc9d864a57c3f16369b580f8153efd6de8a74070335cb50fd9f6cd405f42e7bd18c1f58ef8edc0b674478f78c82dceee3fb1b1e088e5208254ffd62027d9e5bc6e8c4351e1bed49c3b007be74709b7f27ee07b792c0d63230bd990e29026cbe2b54961b0953b6bbaa74304d364fdd109c6f9f5748a0eb02a508c651e208b9241f8ecb3b62c01352320f4a91870b946480547a8e82a179f3a513251e362bd2cfea92fd0211145b94ad8d54437095f7b9abfe91a3225e89cfac1f38d8d537101cf8903b905fd9442eeb624161670bea8380084b819530fdcb6043614f4a67235b6edc379c14f84b8a67194be6571d7944ae7a2d6739988a556a8bc53cee772bdb9733fbfc3f79e0627187767e6fe8a621d537ce3dcd8798558234283c516fb3861f3ec01b0e150845b9e0b239f0ef364d1d46b6f409eb8679a4f4e14106b5abf4d99ac55c3c01bfc03e60f4e28bcf07c6f9f8fac3015dbb7df732354fa2e066ecb03f7b9e516dbaff8b2ce658b071ceaa780e039a0d8c2488ea7f51b493bcd0485b15ba768cab6c891d7a222b4265e26e1179c15b4225c75512ee13a31d834a2ffdfe701c5ce7e4ac41f2289a12cd7194afdfc7ee2ce480dee505f40886e82487eea46a1d45f50ed2c42705424dd8cd9fe3e98e0b621e3a3af7f4fa4fca4f50b5e9b1e44c17ff89a8f6cc340629a505790667bca5a08f013134067542a1958ef2f9480abaae80c0d8d7e1e3d3ba98eb7a4b6a01a8da054d4edcd4e388d30af643f7580c3e9518d2c8321aff9b493b272dae86b91e620509be575371ff903bac4f86451e2bd5fccd1ca8d381507dc9d684a7fe540913298266c84a697ade4b1872a43f9090a29477dfb418f48f3d170148c1156e6230af866d45101e681308af073f4078ee234c9afcea83bb9c3d65769de986a5072cb6cc6d26b2ec2473460668b0bb87628651d7e076e632fce091cd44826bf9a1b96dbb5e590081af978786f07c6b186af2f10f1f267cfa4f32f5d04ee5fef9e3aa6630e3d6488a606c801226462ab913fd9bef2c80f87bd1d369a2bdf37cd1af00471725addd0ec9578e10e1b8fa5a96f0093e71e80195a4c139263f866e11ef78036f5c85edcbe227bd9164e5d8bd3f9f12b5cb5e73492359155cb2f87e7134d7ddecce409b470ee5208a73c7e488f14a949c1873db82bfe17dce41da59d4ea2e1e746a0687208bf97d92696f57c63583a51b087db7d3b0b861a3208be2061c1e0a14ad7f3dcc24f83ef851ffc67dd8f943aafd9bc6a6498df46fc427ece49e1acf76cb6efab8e2dd2b0f53d4f00493a10fb565ea5411c4f6282ef44daf4dde4f7d65246d78d21e94a90ac1afc570dfc9b4f96a9bcbb149bba509418c0c5e4a58a616fb1bce235a6598cad8542c88ea575f16488f8120e019bf46741568f8ef59f14a536cf04ce65776b54f7f2bc22d55015411806fbadb0e968f67b5276ebe4c94ca72d732cfeec6f3a2696d103e6d40549c7f95b97d751de8307f95e4148f40ee1d6746d1a78d92925ee96f518aa6f80b4163648b3d54e2933bf55dcdc0f4027432e72f5d3846cc5c111439bc1c20bf121ca5a2b8bf65e415a3392ad0256ce051c29f78226bdfdf5b5841eaad0944131d424ab09fc0e6057a5feb5297b6638bececa9a1396b8473b59d1a19dbdabc24edb615338fa4fc5b407fda42e145ba1b101b5331af44b81aa865290c95c0dcbb899329272c4e9254ec8f6d149d905c7702866463e980e71e519ad0f8f3527795b53401c701957a0e54fcc6e621c9a729737ceeb4f291575eaec5c2ce73952269db63924310b99463a1a3fdf79504adaa892da24119383da24207b6c381234ac56e5785f0aab0d7e634af4abb1041a2231587a3a919d2209d5bd9587d745dd0dc751c4524171baf417451f2235843e9938d26ee437e264864eb09fec00dcd90782062d46a5bf319fa19407c6141e7965ea0f38fb73796a3090044f4dd33e9e481c3721f9e2af3b93acf8ee231ef88a8c6db1aa5d9cd4e7f242dac551b42a87a9e20107f6dff4b5a2cd1d8844ab557b8ee71751c1b52722f3def0fb41f4e4e4d31bfbae4d8f3c88a93d59b12ff026dd710e0a10cbe1b2f7d7363852f213f8276fbf6a0013dabd515fd8bf27af451a2c787b9ec5699f7e034c01463e32ed72ef294f147f58a30db72a26716db80afd9f7f1f86695a745cef6a91c2e2a9d6368c72d970c061f7e0e9183813a7b9f9973d5d16d6a601bf5f82301d38679f49c29cbeb2815499c756ac0d020b4bda435b612f8528f927427e558f430b57cf75c21441b5f87188a9d08b1641b334db9b3b86428a1631bd680990e87fcebce0b7e6732e22277b795ca7b72de8dbe5181bcdb878e8be3de33d7cb31f5781befb738697861cec1fc60e8de13922948f31446eb139d68f8a6822ed2407235e431cb6d013252b2220b798aa5350e442b9670d086974e5a0bf71181014b31854461d664e8106423cb144fe6f70968885de001e27629784f096f94f1fd9b28ef8864365a1c5d9f2332106518fee722a4af3db3bbc638d9da7eba71e2373043ee8045c20a06e028da3a4f7332fedee20898845423b90424247246f22d4997e0e451954274e4e429369843edc3755d6a40d4693db48807ed19d811034e55a07875db71439716f0e87c61c7ab0f0070cb13257e59020428d99a31c00e7af6a69ac846070a855d6f1ee7ae26e603fd64c9b3162661562c674230ec2d278c50a30c742a6b38d30fa8c30f2ebb1be6c9673f4017f23d1de1bc2c7fefeda101043aa97e35db503b31421c2edf5095f1c5fdadd5876e2f22ce34fb0eb403b3a080672a324b2cb3b79abb271313b841e3299cea3689174379edbeb39896e9119e28976575ba964a3d1b1632415ec9b5beaf27578a88f0323e51c6ca818285099daf5723747d8e566b847e98e79507326581f70c46e8573b1c387e73ebb17e598987ad8d38cd9355b580fa02fc50d7390bbfd0654469fda087a73cb42db66f4cde46cc453a5aa492b41c26976b6e7f2c3fbc96b8c506ced82dd281dc3ae6c7334cbc0da6760745f8ff62016df60463dbf48494bd929133f9306f500cb2434fc7937963247ca4352d4e3896f8fa5f73595d5b70a27cbf9e4324ddea621a8bd9d3b48eec753b3c7ecccf38dbec4375488e38050c18d01c8226637031f3976928bfeb8cd29c40b6eea8556fe0b21083c8a809ef4942375967721a829c8f71499f104af31d3e176f940f3a60ccb7696505573fe64666bcb1e85f9c1031093004ebba26b41810052ed7c27e5dd00616f93b80f473af82220f58ec25f73317a661fa9084b3e2b233621747989c8310fe138f7fd750ffd34dc01733bcac0bc64f1c83fd69f328060201708add7f765acb60e1e5051ae3efe1650673c26a23a6fb8864cfd4ec82e6279acb64e0d8471ff6fca0027a327f453dd8fdc997305459847d5ff9580ba569c082837949d33acffc76e4eccf942f248dfd03cc2e0facccc47e2813d0c7d263209e5fa2f0f04f6cbb316191c7db2ebb780242c50e0d33dfe2d82f9bc1ba05657f30288b58f6b7b38a1d58dc4db8ba2b8cdd93a89edc1d965164283cba37d58d07c99a9141e60fe06900ba09f892863fa54a25cd03a967f98446ede862645ad48823a3bbc4c116c63446702e3cc912418c68f4e24302b282330d520bb95ea0e48429a22ce181c03a05c4378967735fb8e59a375e0a5e2e17970be57873786825cd5f5269da33b7b5a1e74dac21bf21a040809d2380bc674fa0ba6ce270ad9d059eaf9a90fb1c52a4c332904cada0c9ff3bb20939e0d7ab98b5ccd845800c92d759b892a719fd67f28f08e6123ad3d49f4fe587e954438c9c70fd2447b1d95f1f3aea71844a2060dbc1763b753ae30fea3164acc594257034fdd172fa7ed0f7af38c5b975e5e503cf1e010a39ddae29b256c6393a2cd2add078cf37063017956279a11108a033417bc5ffe7e1e0ec32f780adeff419b2fcff4d7748e783b98e6558e6e5a75653570c2bef670106e6fe5d2ba3111ae952f180ad2737b9a6cdf5ae50a6abe04c7c8ebc750a16b321a37398ba1ed9b109f54ec9c6e1bc2b6fb14ac7ade6cb2f51aeb114cecd5d2d9c3bff43c8aae2f33f300498b59f538706b2257a61c00f19b3889a65ace7dcf386578b5f6b5c9c1871363d4eabfc7004ef04194a2d559de9237abec6c04179aaeccd3e0a12bb8c0365759d97c354dc9652c90877b80f7caa1f6e994a5a747648d0a650830e6937157892435a52ee2eefd3a821036925d8b12ac04a36c3668e213c037fc6d96882f268a42e3f861c11f52b17d5d5fa2e03038ccdbc73ac240f682a15b1d043d31314da1b962fe27b346024b13a0efec98ada4d48e6f47baa52c9dd2d1623225c82e42a7f709945a805a84aa6db0f5f1dc0a1a366b6ba8dacff0450119a89726ed0fec93ed8cf1c380ff48b65b9d4b2bb05229c66d2ca408859e9d2e237a8a55b9d3fde5a4aee1494a94d6a5f63f6ffc2207d043690b4b87defa06b47fad2b29e4287ce2060f4ba1d6608eece3d9f6cda8f84bae65fc6394ba5c7b2867ab3b3114afb158b1b46343fa205de464327d259a8e6f9a081113993b8d0a41df06df085267423c507842acd5538d797bf0c8df3cc6c3a884df107e0e5b65c1602d5fbb98d8fed3e0174612d3034df3605c64b641cf38cb18f032ea6b32d2e35590caa5e649c42f2409f26a7feb67baa90f8e329d6b4d503ef5e929f17ef67af019b5d5c2489f7d27a0bc77790de324f6cfd65627b03d3f98dfea1b41dffba129bf7e355a1182f7155b9d279479d4f4a11333bea1a84904c6b5ebe20253f7d28281a70461886231b78a1de22bfd570f4c250200903947ba346a6306b4298fb0f5077881101d812b12623186f7dd85326c0e8f5d6b1ce09dac484b07116f72fec3d2371c5612bc2e81611a58140115436283d69030fd5921b7f480d1962f270374b402a12cbb63961fc10fb2bb0ac5ab8b0e0c2e501367fccf91d113954184bd02d2e5b5179a40ede60260ffdb678bac57df684391a7e96ba63f35aeddf1075c93d7ee07009772e4cfba5fd2a28f4e077d0f182211c65bf605903c4c5c570c2fa88b11f6b26e9daa623c5f2c07350edfd9bb2c5f1bf3c809361fe3e7378b50c95d01ea952abcff8b6b4efb064ca9ea1a3fc8bc0e837129b9e5c9922c5f090561a81cf495ef33ddc248c8e27609f5a558f74d1ca8b2659bb6b281044912293b781bea9b6f59bea282ff18657422895daab28e597d08f17935daa4a5673b86c0edc8b78aba646a69b9e0b48554138dd5d25e21baa4da1a22feb3b7a57dcba67c3d20afe29e871d3a49c3947d81812443c82bf5073931d25bcd3413fe802659793639779557300842aadaa7ae390f784d714f28486947024b78092507d8f49ba2b61b86d06ac6fe6dbdedc123ebf1c84cedd14b853f0489ebf71d201952fa12e790dbcd040ba955682bca0e312327f09f49471a644b79ef57b3d4d1b1ec1a69c4c3d6252d1128f4e7f03bd29a93aa41da68ee3e7e48f4170ea62e89ddc1946cc10abd8e345352e42dc964e2885b87d092e879369620d5cd2824e13351dcb429f3565c3c3a24d8209768ab3955ad63a5c56dd76a236c76562e56077b8d220d4962ce14e30bdf76eab9fe71005c6ae932f9e8884a55722cac1ef4bcd77bc47d1228c21240c17c6743dcab0c35857b0203d767389f0a62dc24ba78e7d3889cf65e134803b18f01a27ddedfc94d4e7b005d36467b9d398dfd06dd4276e98b94f6a7d497253b8319f129159bebd4f3045d5a341734afa4d7223a75a2e739162351c2b2d94502807b330122ba1405f72d1d4167821fdd7f539b7bd1db923183820ed4559dc088167b9f33df8e1f771dcb2b6240a5f6876686b6dde2b4ab9b6ad3b1228b99fbda62f988dab0173f7b3c64920e1f07a8e2a59fa073897d3cf8ea4419632f569455a04d169e8a05b9f81bcfd1094f9f1a79cb1eb02d24e417e14757637f0bcbbedf265d34559b0b40204f667eb0d2aef2c67671406dfb19651c903cbfdc43f126ebedde344e4c319cad86eb74715ec37a47d6eccbccdef4fe792336f1cbea15a4d25099471df2784dc45abed5e6a99c67d5c04ec3f4b7adc87cb04740ae29e71ecfde6c944fe193861474cc36ca50711f6c4a01f1a8115e1180fb6e9c0821ef66a3c038f338691858bf20dbed52564a4eeee6d6633532a33a46ceddb19156f9c50fd4f89c54ddf3beced97adc96f3bdebb6bbf591b180ba5b7a3906f0d4fbaff1cc55cf2adcdf026882dba9f605ee95ddd38149315c8fe9495ccf49c547a098f431d4ff0191e7f8b25410d297090254d2212a655a88f1271890757a45f606182154653016e3e21f06d2e97323a0279da1b7577e18a4f4cf71adf755c5cddb464bea539e21e5431bcf63fa2bc140f0144c9c56c6203b85d14255ca95df10ff06f3ae70cf4317cc6c0e47bb363f702955a68217ba2a428080479a1349b33516d09f73df05f7854b018871089ef2c2f98bc759dc185a887340db1c1d96666e0e539caebfb68311e7240ab7f8633b90153f69180016d243c21006710f1edd7e1545f65e5176d0cfeff6ba39252c901cc423c0eca21bc2785ab96382c80e525ce84e4bf39599207a2c469d3704a4e2bd9119d939ad0496b07cf6b34de1380ec22869a300e95f1972255f14915be80b83c2d5b1032f96ade2002552c4143b74c616a404c08fa8b8628cb653f68d2f848e117fead35fb63accf7be334bd35a6a47f8998546eba188b1b8f5d96d10ebda1f88e22e4807341e27223c938dfda5f233436a97a797e5d5b04ce3bf900b475cb8dfa1b5369258f5cb8af24244277cfc09a8bd94a651ba21dae0714f8706e78da072c07fa698b6efe57c0c1ce3787d5c2a43388205d22efe71ca898d529c3137fa15f57acb641b8698c2432d639f9b790a648e3e4703ec654f811e8961cf74578a7c8ec151a365e44cce00d8b85d7b1f559f7150438d06945c027cb191c9f5238927bd448d6467f60fbeeddd307bbd90c695f0ce41d4ba8c7c7aab31b78b9d9bdc9bf0d2be3a5955d62f32fb010422e64c5b80e9f9f1204b8f4f43b736ddc4c76455af6a00914aa80dd72a2c5f17635d7153a7aa4d2bca0f1c158381e5ff32ad890bb2f58666887c8570aaff819ff25a5c98435f549adabcea3f9883ba18e3521c28254a80234d1e812167086d972c87605741b1fe8d838b6dd9f22bfd282a31e52ee6517fbddde1d08325946181a23a8740090be11e4c2a30b51116d3d56ecf678660ec4cc66d0b53f5d3ff7098d4b73714e71d0cda4db94eb0141eeedf769a4e1ca78c948ef43cac8d62ab5eb81af36f56f5a9162ab8d6e1748ef6f24db0817b36ad535f87ca09aadc0072b8e2e1771fae40117a4a57a41f65dc2d89b9f76f9a2f6305c50952e28ae8e57dd825519ef04390f50ff4b85e7be9923f61b45ed47655c9243416dc40f990ec5dd3c5b954679f3d4b28e9307c2777e0d51888004740a25468fad7eeffa4cbbd68acc9fbf77adc9dcb3eed53bd44b3e71995b16ea2e621da2c8993b813ebf00d65ec6f12591ef3bef28a4e8a56e33cd5bf5d2911f396e3baf099e5b49ad7aba095242411cc40ed03862c2cbabbed34c13815fe28c84425455bde8b1e6dc8006f0140b0bccade56cfc698f57df296b6bf37ade94aa8e1cfb871a7d76ef3e09d1a567635381b94fc2881de6ff5cc931981e6d44252e23b519530672558d807fe02192225328357344c321abdd1c84e0a8bb5f605211d2986fa154bfc281bd4e9e7e1d7c3d2a35e56a3bd37659258782b0fe530c82f284daa8f0dfb5fbde2a15eedcfac28ba33a59ad464fe01e0fcd217c1aa86160e0e5d5de17ae0f3d6715bda216f763cfc0c3c84eb716b389ff1dd990f56a6068b581ed8d144bd5480ea85d9550fd9c7cf68938b88325e13c42d4380840459e3cc7d2030dd068dfd6e7f794d65647e0022a575de8275c1dca75235abbb13eee64164d01b864590169dcbe25e22c45acf5dbc51df530bfd13717fce48e6640de9ab95355aedc149ec2a9125706105e4a003cde0fd5f51a5db0f3cc7b608690f6a303ae91a99c470b59a2545457137b21e84e6a9d67b189050bddfd7f8052b8380f06c1ac9dc74585fa83447af3bb15d7416b66f743ff7914d5fc30e301c505022d65a39e1a1594b8cf2377e0a2ed684cf8fbf043acecf96449b2f954129ca01397cf34012c3a9c3112475c29ac9657284e2049f309588c6e2a48f0bd16a77596861c6a3d338e2ade560184bf66f3d1bfc1a32ba1b053233253b03b9ab99a02d8b6123607054fd123bc8ef5ce10742f97d0d3bdf3f190950819626e9f700b43a040d241b7ab359a432ece90d306237d062bcc2e902e659efc5041f4118f4c10fb10e6c157bff5816311c5ef135fd50f2280c930d245e67c1f402ae7944ebc756e8f4d79da5004850a9d649a98620f994aa0806d72b4fc4023c853f492b3564bea071346216c47666ca581e26f92bfc1c56a5c26fbfb3d6ceb8e0383c6f257fda44890a0f1e824ddc691f11904e37979d1b723c9a85364d94faf40d88b480d18aa293b8733226364520fb56688cd4c9b546194baf85d044a82019ed038fa9aaf3eaa7c25c7117e435beba609d2799ea8f73f40471e7f61d4f4f7d30c40c62bec1011793edf5a9bfc77ade3f523965ab756f112be3644ea3fd2b854accf50495f551b0968a9e89bef0341fd3e5a9b1017adf9c57a1a89039833bfef94c157b41c35c34e3bf0bf72ee4b841b3020298f93f4bdd204b9697f5918f05f504c8e9879ca07a618b603f38899b584b890d5c85bd4b63709baaee3320b6ce98853338aa2cb106c5046ef1b32b6ad0ce80c03c7e768fe086ae4ee7821b5214182ec1d2819b353a38b9e8bca0ed7dc0dacd717bdf92126e1407bcbd59326750e8484296909888e82a2c194eb25dbda5d628ec234ec1b7ddb5ba3c26b40cdd989252f80227a8d284c634b5bd8fddf7f281d98066055341a3e645b530588deaf26e8ce52c023f454e537e0f6538211ee06ee6b84e2a31fcc83fd35aa0591e4820430a012826a02cf813d8a67e16cb99249d6a2c4303640374dc12794cdf6a887e5ed3b1070847d4ea005e4b0a76680ff06f6e9bae852c4572690c48c7ea7f49752849bce8709cde8c2aac771c8d588fa894fe222d736f8d1076b15d7f7a178922d28dfe1414312f80b14e3a235928e065c80ceb7295311149f3c3be7c3cfa8a683ed657368d113ea16f7e55467ea18c02376c3c5f31b09c2d88ba4103d6b21cf590111d072284ea6b9cb00bfa2edd02be9f393a46f36fd6d7a819d685bfb0a6c122b0f1e1901852424259d2415c6830b52b9bef2bfa5a0a80b6e44b05f846127649b3f59b63a914e0f2ac5f8a4006930658490999e414604a542438f6c082bc9c34e8249a0a3236762da0709ce9d8fdade98faec116d30472f47241e5eccdc86de9dec0f71089fbd7ed095d669b3191c5977d7fd12f75fde9ad1a11e78e08908f5b6187f564d8e9a320d422dbb8292d9e24ccff492b44cd535e143ce49c8d102f8120d658e8f8879eb35a729b915c34c2077af72ee10287dfe7d651884d1038a59416a4cdc66da733c84229e3e41e974d64007d41d057003b8de4b149a8396860e0ee231f13451630c2ae47c268ed1af112145283139ad6b49f189ee1778d41647ce6330308392e61a2440d932a6b67b52fd10c6ccfb9e66915c47f0e8e0a0727a1ace5f4f99be4474544ef50b0300d7642b6db48940bbbbf842a5241924da65d71617110378c48790e2646d78d7d1c34a2dd94af6d9fc1adf65458555c9765306d613c9919880c6c3ad0e261f8761c95341d2714693d3da9248675086605c49577aa40be30789d4523987e5b2e91e10ac22144a2e31dd93ea836ecb3d38b4317aebec758ae8c7f01eb6417ca6cb967a510aad0ecc4918174275ede502e1ae86bf8d126127270efb2b96c17e19ec1455142f18588b4169554831ef744f76c8459c957529cad91626f38c2a227069e7f24a97e5990bf3329dadeec3133bb6abc576395609a73ab7b6fdcaf9752af198bad78c20537a9023656dbc844fd2c7acedb58616735ab6bfee7581ec1a825101a0ba4be368f3342ee3a8e664d201380f0aa105ec9baf8933626815a997f8975ee9673b73bb27785982062725111097325583b62f706c0f0211cb9d51f7e7bd16ae3da2457b580367a87851f0b45cebc1dd8bbaa422df7263088c02b784b9028eeea481c7d76fe337834369aad9f0e262e1db74ced5a486e0f9778a7768801c52d130d61a2c74360cf7e66043a585891c8bf40d04375b488c8a056d3bcb1210dc22f90a198201195de125e3cc7ee15f0a00681cdecba8d7f5f8734e292f6b0b349f3546e1c26e2857d82b0552c9ee57ad638886d1211c13a272bd0217878ccd120bee3971247a9237b20dfdd9485a335626d3539a7ea234548ead79ea9e8bb064a31c4e2ddab8ce4f1b884c52fd51328f59c0d0013ca9cb07ecf7971f79c8407037f84740462120f924796d36c7746a619fff7b4964292589f05c187ab3691fac6bc49ad254e88a65b95ac1c125c86731dd4386d528ee8b888631daa17434a8ed1dcb9f64f29290905c6196b996ec8e36eb15cffcc99b2c09ac85bbcbcc219b9a38fec03a345fddc13743706ed3353a531613f64b23bcd7c780aa582af10491f2fb11fa6aafa2594fa9a99c16647f3c0683ba064dd196061bb8ccabf1bd6edf5b7f767b5a80d61fb64e2e4a2e545c879d9353703866dd2588b0291ab770913ff174272bb6df3b9c0f0af0682677117c45a27b042a4e6a99494a7fec4f8c061e6bedfe765d085ff9d380a0c44d0eab2411f8910fb923239e1f7ac00d6b2543ccd5436325a18cb07ce70ec8771270096c1e6ac75c3320920b44060a345b32e14ac82d0f39568e06af905b689df70a03fb9328f90d03e824bf189013c5d3cc874d7cfabb9f74833599df482ae95802ca281d6c049a3dc67b03865f7b9c8896a74a1c39967707bbd930a54ea04968f94011fd093bb1b92fc68e6dca0ca4d8808970fbc17ea4f54226e9ea5efedc90456e1cef8977f74783058a5c383af74e977b58f0dc0202db0c2dd09a8b8b26e8c0a7d26def89d104a48aaae21f6fa30f1c2fd88475a5c20f1100cf4511bfb0c687d2df5743befd8c42a0a29448f524e5192e9ebfd3c1e3f6b2782cf922af1575e11c41ab926932d38ee610fde06f95334f2e865000429c0d730ac770e83761d62b9d3b346cc526586e160084592e77a9300d87e89cf2080d75e4b1b281a8232044ab1eb7c27b8334eba4fcc8985ed303605ed621f90a9390dc88b486ecdd7005dd4f8e01985f7eca797317e26e810a3b98fda27c3b74bc90d0cf66710140e2a2aaf291f6fcc627677303c86e3070b6b881494f143963c15874dfced716d7a81eaf038a2852081343328b1bbf803c3f7ac5851b8e4e3533922c28970079591c6a5359456903b1cd9bbbe22cb52c2c233300f724138803bbe5f11f1e635c13374083aac2afb2df4039eb8badecba6099f73d760bb64dad4ca17e087cfea0c02aeccc9b2e93a3ec92a8b71aa118feb08474ee5f62fcff6b0a544f4771902607c30f36ec807e47516f112b83d3d7b409d783b86382d8f4f7826483a17015e5bcd5757837517a2d75fa9312cadd835ee4833d38df6257d7561c53e44e09b6fa7211121903adf4147fe7f9fde7a9bc39eb50260c67eeced2768b09d2340963cb3ece64617eec31648503ba6ab720f30204135dae1f0766fc6f5972608033f745f62d08725b8478aed40a1a3b02ab50f6e076e972a3c5d53f275a6fc4d0aea0e8ab33c36a8ac2f2f158377a91c0c5246022e8ecd28c1ab204d92f0cf09459d6a5035a692c4b27e4a321390eaf677b807c110815fccd7aaff41e19ae428d9d070ac11641a15969c778e71081cb21544c081dcf46640a95ccb58256279303f5185bc984e0e337e714166d051ae25e289071f1fe9eaaf6266d5a854f7a7b0674902b0c3ad09fc420dbe2c9eed09937183f2b686aa9c8ff2e1a0672d8708fd45739661b66a33598184aca30f94055358a2239e8d5037282357453040db2be4c18735dc04c29f0e4654862f2ff6acdee03388d8554862d036251c3b53ee34005ccb9a092c49c2aa20ff7f26f8e3eb929134d6ee62d992de85062d5bb19f60437939c1a3beb8a0387267eecc70e74d656c45ff2509e81787ec673b71f576e53defd1c4206ec9083f6a35956c58b2ba0741016acb198df86735d0f3c4c39a89496596f61726b1af6849bf2cc9b39f261b833ef8b3ae2814a41144533207eb0e5ed3151a00410ac4f9159ca3019365dc9f158b41334992d9029516c9dadf4bda7694b5960546b5cc90643b80951be838c8b7ba219cdca8f7e5206779572563a51288043fcc742501c0326152c4a1ab7a7b6e1ac3bf09ed214bf193417aad41d7af4eca2e780eb026709c41e1b1b2375c078515818109c2cc45d7fa7d2e6d0d977f6c2a082440c0965e594f22c74ae9f3986c8b9c1a722b910424b9dfc39490af560417ad56086de4e0d451cdfbc0c21487b72da1ed9cb54014e0355143dadcbf88e53f5f367b5fdc4e667c1b95d2c43f53adc57cf8d2e795994d76f066eec2e122123cd621cd78972b0493aedecb7538169c7e912086b52668aa0fb6339a25f8927c1323673108ca6d3a066e0dc5402cb429971b5ae489a61e4aff0631eab253cdd7f05844f780e895600c3515d9431adf83912a1f9d74101828ddee0e84c2135cc329890897cd4a160a89e8c8bf2b304295a0984d7275abcfc82b6379d5bab0b49453d78b91135a1b1c6cb60c82641a258b32ec6548472286e9800512bf6d1e2440a6738cccf88355f01306fad201e611517c47275045c892ac7462bfe3a7020c73afa501234b010c159587d173afb25bdd23b7aa4c7d2b7b5e41c5f5ee4ca638f9fdcc6b1be611f5bccb82c75b5625bb33bb5af9f95bd26a96727a7c6cfdf0fdd75ab1f15055b135301dd56c14815f0b632b3d216d34632d45b1d7724e27bff99239f0f0226f2032f9c985e73e65860dfa0e0dd3738e796a50d4ae3a97260889b5642f894981649f01f179dfa2519dca4a1eb05bce03b2d7a0992bea921f221c5498603d449af1f85ea42e39d71aeaac7c8ca228ebcede362cad0d02afc567a59af3f31ca166d8ceb3e4fb3c268bd3212ce6fb5e5322d0b5e3c5d44fd18e99774f148468c19d0ad02bbcb88b240b9acda6d26f56fe0655ec0c659fbe03cc0c993141830da328d8833986994b0e90fa0b5cb8acb1e7d24b5ad639f796e0a376661f30a151db96f65f93373ff3ec4af5be3b3be512806e7b238c2f1223797e1ba1e9053b934c32b49183d8aa939b2e3922e56ac4fdc4098086af90b09974cef8579a35ba2728bab9921a6966e8ca3014b0c82b67c9e90d4004752b19d3e7238173b087ac080115a9ad09a1b72ab124ec5a3df266ce51de7f15864b574d32a409929856469224a7047a0767da679325fdaee16e204418e1caf438e718e98009a5106a50e14ae083416b97e0700fea79324131886de384f9186dbd42bdaf63340424002e1c6599caace8907e34a75629d9ffb2c5c60d227bad6ba1bc66409323fe69e12859680c9569cba0e6607b62b0ee174eaa9814686e3bc620fbed0be5c0974322c164ad4a0cbbfb4c605c5dc301752bee4d0851b3724481c2fb9b2c00a7d891682deb92451ff528fc204c5b8007deb1c3f1b7853d5141f902347736ac63dcafc22130044c65e3f1462baee7304439bbfa5740881a78ee82191a3ca093d031d22274078ef904f86dcb20a4443724c5794acff6015c8c519b091b9c54a0dc948bd84a9bb8b4028359903a8163cb65994ebedc37f2d320b79024f145343d1532fae18cb9de5ddbd646018cdd771622d0db33fc3f81872feb8317ae23f22a7055fce65df803728845dcfb647bc803203d8fe1db25c1647f8bd09f74eff944635f0743ade1d4768392c73ea96b58923f7b4b8b0cb01a1105b7bae5ab8e0032220b88ee162915bc972483c8ec04f002a2b096de2fe98893e961fa520fd31a431d9e749e96b048564e8ac4e559f3aa386cd8ce4c1edd63591bf438448fc82dc5528cc8192909cbec310a917a2a553802d826f687c0ba8293d7d6826fdaca2f94e4cdac17b77619792fba2ce6464a31d94b2390cf143f1d670d6da19154796ac70bf9a94c015227164161240f9ad4a3e0fd921b1de5eb208d9e7c0ac59e41b73c5f6dfd71d95d0013bde50e2e16cd11e22927b20a9dfc1b45204b91e2eb2bbdc038fa9fdb9f5d14e902e933841a6a0a6cae9c471f23a3265836ddb0c61e9d6ba8ae9bcceba2121c7e0137f2995cf40358d753f8ad462a56de8b93e2fe589599907428736222777cf84e0256a5d98c5987a508bde7f1fa8f3815d3bb164ce5fee4bc69c51ab48065acc505e48f485b3298fc62f815a279e2377e2bb4d8779cdb32ff6014f445ade817fa3343395803c184597cec6709b4e7b474bd61bcae20e434aaedb18747fa37a17c9414295a4071c366cc7ce1f0e4a4c0d062ec30cd12a54d2c0c90eb435ff676ffac0a3466ece4dd3ae89d1b56922da3e5408bea3564ca790943c999ea4642fc136b788bc245d7fc15f0809c5ece7b229072d5abab993433ebe5c612b1918a17d027ad6c07bc807b6f16ae5555748accbe70c415e12f934a056f6e46f91679090b3bc0f4bad4ea01bd37820fa007302444c19a5342654aea52413d3d5538af63a5cac9de29e20c273ca75240fad93539311f5d1517ca7a25f86a7a2a0adca7b1a2b533e7b8ef641ba0942b7978260555ab7758798b7d92ad3b76164e8e2e5d3db5b44d78e2a3d773e4f0fad12afb15e16af661ef5da2b0f483c5168e1734efc5173089a197798ddafe519e15c679e358b4c0c01acb5ba984fc6725d5b020564fe7a62eef1b974b270c420fb72d3ca944f144ed09f2ddd91c31e545fa913a7f7681c7e12211003cbfd4a5646ccabf83183626cef402ef1ae5d81d554d8b761356b43f5f19d6beacae58159a4f50374466209dddcb2c5dbedd51f3a756db873cdee22cb4226867bf094047dfc57288b75bfc74f504c84f308930eb2e4e90cf156c39b98a26d3449b6213167e03cf44cfa5883684e19dd8f849c1eea6874cb879ac61d2ef5e7ada7344d3eb37d3807c597f7375bbc69b132c3a256e59269a565ab3cfb5a49c43d6ac9eb2121c38ae19b9d30537d9f42465842f400e1020c15bc002012a6f0dd20e4c345829a32965f27346e93410bf5df24f61426ed8cd8eb9177ea55d88d7d711a70ca00e21666f7a456d5b1bb22911d52bb0efae86c23a906dc4f72dba806556eee261e564b73c822e734a368ed10703d057dca085e12aea72910a071430c428bdc1d0f13a81540206780c49e99847688f56998277972f00696f5a28ee632ee3c0a681eb9b6cf126348650420255ce7792d40a73b4c0dfa92f2e09689d2e37523a03d19f80a4b11fb53126754aa46039c134c84ae95dd50596bc02a2271ef7e5150b1c0090a75f78bb4dc3887a194d8ca095bb26693d3ab88f5258fc11c91493d94a653e9f71e1acc190e635cb3d47a05ba09494d7e885d07d5df20c7d416cc866f52fab2472939d2108d650df1f432055463a6224a7e4bfbde9f53b8ab6cdc1d05174bb7abe38f7a70e99664ae7cf762c05e7bfd9ebc556659a66e069132092bafac5f64c8294f6fd09f045d35ff5a4e062b8c4b36793e1b685851025465e5a3a9bdf4d64538c59de3e3d5f3d217860250a2a1d011795f8e7371a30d6eb920af1b35620b72ad3d5b6bdc504a97440c1ebb418e824c13ec4d2a73282492be8f290c300e256fe970d5af756611923c868454ea608bb90c2287d62fc1478f924311ca32ea143f1a3f8f77aa388d9cf329a88b5251e0155b0f3c440605227935562b4ab88fca9ca95350b16c6827c08d34fda9ba3016f0d45ee6914782a7c31d312951e7615aa364e7d396f70c4ad5a4ece091c94b059e1793c21f4a61f7f6465de5a4a486742555b9b40083a7b6381eab120bf0a071eb7ec787c1712d75fb44a6f050870522b517b982664f9a47cf03533625f7508289c2ab316ca51322134ff872b945834744e37c5b39191c416f10768b1494a8c550830e97e60cdf642bf405b7d28fdd262a9cefbe945d71e124fec9f0b36a43b0a6841d4dbc37286e3080e86a597b23d19aef8e6ab4aa1128940a8a2d584bcff30f84fd48aeecfa62a2cc8767b10383966668a52b72f9c2a6fe42277129c01ee270475471ac15b15e09e0e4514d3625708987799f05345d021471d1f55682d0b0710f49e68210d940385d86507266e93984578163c91bf5abc6355548b8b7648ae3122acc8d580c545fc515bfeb614b0d4007c172490014d0eca3365c27df8848f2546919b84091e24be3234429b1ae691ea65b67451a660fd5591b2a04443312192a3cd822e215747ac98ee15462923b1e48e1896a44dda43b767090f6018dfc600194f166f976100c52e1f9eb902f6fab498c933f07853ed14583f0caf17a0dcc0c32a208c95cb7ec05ee5987fb25be7b75f7381d71faa42711d574ec9584f3dbcb84f8ffbe1afb785e0c13d8a88544f3e33c0a84ca66ec27bd410dad2193e50009ea92628ffd83a5bbc6b84d343f7c3a421894cc64914797a638a14ed0c221807368a0192cfaac818e0ce4b80ceba71a5aca38bd7136be8b94519edf8804515994421d4480aa3676410c9f07eb82338d0cbd22c516d294cb4b0b1b9545fe7f8d94ba5038aa77562b1ae195c486e97b89efb6ef68b93ee3a0ab57e03e98a9b47eb90c4132954dabbe0b8a6536449c2f411592ca0c4db31c22797701da5d31c50bb6caaf868670638ce1c27afddf6dd72acd8cf3768af162f5d14fd02974087d905a90d92437473b6c302ba20cb0d3fa92bb0b888760640c02f557dc5515ced21a1e165ef46cbe04920cd93ed04fabd1a0819809d807e04b093113f70048fd6c218091bffefb68fe787bec43ed960ed70f8cf929eab02f6e0bd6497ae7afa51999e97ebb9e85000ae2a5122d6778ca88e4f5513f55e032edc95f3c960159d091ccf564cafe3e011d0486653e6ce712541c14174e12d029877c62aa3895061c6ca5e093235dafea6dcd33078276a48a234e1656728ad94fdbb9b5acfd9cda079c7b69673b7dbcd5decef7bec17cadbdef7ea79bc510b31627b38e54eb1618cad9835278d38ac7c816f0e4fda705afc52dcc0090f85ee3a2bef388bf6b98b683b2f02a4e1a7d6df9eae3d27ba0f4788fe1dad835c07dffb8bdf707f009b1db237ff52f26c254527b9f937870797c27c39b87af350ebf3b7c449ee818c52851b816b0627b0acc77fb37f0b87ed66de4aed1426698a346b547d505fa1b2343f28f257fbc38fcdba1cdc273891e27c0cfdfafe2c99bfc897d2c3505362aa1baaae0c0f482021b5b6a6953a208328bd05f5ef325832b10b88eb39fa3bff0c87e3701a9953db818e2f3bd6d56b8825e7d92c233447a6b168bd71aa978886b6ae31e1a84d4b149ec223d0e042a743572d539145e3f6ed908acba1da989a479999fa9e077565d6daada4d52e43b9edc85193f3c65bf685b116776d5d9944a4839f07ea1066eb73ab0132a59f72fe666bf46031428012401440da4d126fb754041d0f955d6603fd06449efc05006be5715fcd5431aee24f09227801b41498d2877a33c989f9a4fafb76a044305208fd350c0c5da189d47a1753f4be6933b2a4f5a38e25b6d2c55c21ef2fa57ddc33e1acce1561c830d21d895bfbb56c8a3f2a2995999d7024d4ae9d9d88ac65cce8b90734a4a5c6652d932bdcbbe20e87a2b18415b73fd31e8ad4be2fb1f78149befcb53d633fc028b7f5ee40b5927474ab41f8a827e4959597e81215364c5b60f106ec8421685cd78a77670b2c75c344a48404736fca49d49b1e0d3ad2f8d0d058158e1b7a64cc62db81aa735f5931361bd800230c16829853a8d75827af07836e11a9820f1f7fad3e63f3500dae27ac9fda39e7909252bf860332347e9ef57e0c7ff83fa462f7953bcd7b29433385fb7b5b26b49faf5c97c435a08d29ac85d2c8702672328eb8ce700a030ce1a470bca24177236705dfab4dd7d058b1d2e9eafa69b9e2728ddb1eb30a3410664b0105f59d14fb8aec52bc2bf604014240cbacd3924852b20e3b381260f59f2e256950c8554c92361c9a855d0882fb97b2b063761b8b97467dd154fdba4850f0f72cabe7f6a7f4c8150c52320b52ea5a6321599df7d9322d09334f745a2306b9066f291fcd1feb81137e717d560909effebde7c9615244405275ee72661270a1274fe78ce2524442001c4148a5cb527ae15718cf38cb891b80b8892d95978dfc2c9f1cabe252f7eb11541f115542698a11735c2ccfd9588dd776cabd3d149670dfa6cfe31e05c5b8805fbb18e70855780c1ea609b9ca1c23e9faee57cd87895dab812588a4c893b7fa010d76c6308a8e82e61e02f2c570ac115013908500fd7192cd00f30780474e87658bbc4afa5e6011850a2301449143b35cc658d1d096405e5df83668d6a3ea68ce3f29123f70876641c4bc5fdb0e189f22112b1ccaaa97656622d05f5930e2c539576c7221dea109004bbcdfa57b004956c5c99dff8a73aede1abe89bb6848ea8c96bfc5c918732fe4b25262bdbdd2a1653def225bd98ed01c477de2c7331243fd4154d8273621dc983f4118442b55b8eb866b4b264ec5279a5145c95ee8642f95a9a4f3cbd2387dbd49f54fe20d11bdc542f701d23e2b04bcb0db12cc87bab6a6a1bc3964b11bb85f3cce207a7706f5b9f43243a2b15f13bfb9a760a02374f68527f21b01405919554510a6c5eb6d6fe8c2bec73ccc5e7ea317c3df489d521716195905936a12b330d5fd627877599adce2076e9601c95abaf8efc1a42d8878f0d1846b5f71a9e170076adad380e2b4dd1b32ce1c1a0f0467e33b7c5064ea8c6b8273fa986ac6f7e692269ef7cb2a98363bf64201cbeae319e948c3d78b142c062d768a42213e154a3ce8e5fdd726f7790e217c3e0945c2093c0b52e84506934e46031f64caaf3231047d8d44f67856c15616a7f2c8d2c2c8f4eb28a06158c1d715fcf11c83ead20638fcab67e8f3622b87c971cd8579bff45322e4f853aa9a3f26a33dbd0603b8876275086dd71ef79e0b6c287f5d62c9a0bd91fe13fc9cf01432c22b389a025c8aa0ae5e8dd9cdf62a22f6a665714a2dc27684a2952a03c94d7b2e40bdda3ba3ab3bfa870db0da48e1b8d73de689e4ab265e06ed5d520c989510c111b272a782b82c2161e06aa02be64b04b0cf7df2fd0305cc76bc6c9e373122a41a9e25ad04ce167d3b862185cea641edf46bccc8a80fd08ad60a015ed3968e09faa925cbd2688015dba49a5f17249fb0ade9f2284158ad17f227afc49c6cb380051aac1cef2249fc1debbb204183b9fd0aadba67ca5d49498c086aa903563f22d9f47bafc50d93e9d4cb31b4c02a665871514128fcc2c673b047e8f4f2fa2b03af784de7b12d64ab879bb64ee95b4d0e1512d05787d62013a213ad8716d9e8bea01bb5389fbe24521b56fa0f5bca7bb420ecdb71a89b0e69e5a67eadc51e123dd47379ef897d2ce7d2ce2e5b63d955fea363cfa5e364753f0c458635104ddfdb093c4d4e45e68598db8f0493fdb4bf1d7b4b01541afa36147374f5475f1c4e8d797c7f5aca568481cb89405ebae2be1ea8117c50ad9f59a6dcb92d503c2f870f642d93051af02568f5e929743ebced306e9f3662967893aa05e814e1f5854987ba3f2b9a1accf7e068fcf204a7487aaeb090d6e3d0d688699f0d319fb54ec39089f21e4100a36d103daa1aeb1b3d953b0ee407d5c58263890d3cec5cf554e3d9b66de505e30f21a980c4297f4fe3e949e257bd1306ff62182f32e981373d51a72e7e66e8227173e4063405b13af464ee067a72569208e3ad7edf8290f3fb58288d3b0560fa8a3e0ea130430872a0745706b57cc46d5ad367653c335f12be8df3c36c8eff03c2f83a25ca7a576591d52012a84a2870ad8a401c96f755bb82c8f8acb2f4320c9543b7a0a99263460fd9b40132084091ecd10313f2109b0111e08414300618844f9bd213f939082c6fa4a33b19989840df9489f91f78622f0242a2ecf0435c6152573602d87fcbfc0e87b35527439798fa2f28f8b07eb52319f7bbb9177d1fb9ffa1a980e6e10c6b2f68311ebfbe4db31e70033c2331e83c086e5a39913174410173d6259ac29f4c30168ba6ac55ae84000981e868d80beb26da7e91e4e5411814b2e2bfd00cb713a39fbfb433fa7f74764e80906fec7eefc4f4c78318178f4143e42df67d2279b95f0e93782bea62f367e70be35f603762d3fb6d5e7371e78cff03beef6762e31f5217b87ab9a0ad80b8b18ce2b1a87f0b7ebfb7a57e271bd7dcc701b794bb51873d30825af80a2a2b2c12ecb8a1fa7fe9aa6b0e1b5c61df780f2e3c3488d9f28ec197d350e06b2c38bbefcad4c55b33f73278a25b4813219d3d2508d93df0e8b887822edb9eee1e22115164945d37ac7782a807d1c438db5ae479094097429cf0c1ef34b32eb8f9297d384c4c0a9f932e7bdcfa767f3f2141460da287aea3b9b5eecf15626c395305b2cb17c3a6f363508b05e97d4f868c039d309c0c0106dfab1eb73356afac2851a6918600d08db57ce09fc0ca63bf7f6c720bc55a1b3082a3df9728fa31ab4c9608f381c64a142c7eacd627dac153791624b947c7c7beb14665da9e20220ededf64f5f184952725ce921a1674df485b7818dabb4fd819285125868e5f56503bb2aa20e0ccb35d5dd9090975f1ca532b055ce437addcfa73675dc93b4e520ddf3b42a4ddb3ff73941dbdc013b888b69502c0455b8960d6a4d1436467b3f9584fc2015b4c3e8aa793bda094e0f631f85613c9882ff2eb47691585bfc0d2795f2d2d4f870a024cc7aeee52f029695cccf173d42bf785b69afa5776b7a3bf5c8bcd173e0a87a89bac72795d8eda0271a99c2545c4f4e48c62c876767605f0d3ed17af964cb864684df1f09d811303f68450249a83e9cf8575dbcf01c8c3794d016c29d5fbf887d93ee29b0aae8289c66eebae17aa116c53a5a8ea2a13f91e715c3b340f169fb1cb5fca17bf3e54565c4dd60450eae6b80c47d2320c35aaeed5815ba8e957e83b8c9fa9a2019d5cd819b3e81ef9c8e18e031ba8f6c7897db049ecef3eba88b55915fd9b8446d84ed4c3db8fbd19a123fed084bd784d628231d723e37cab0a343370d0df4a4a993b3e884b36f0c13791e9fbc2daaef4ce46da9e540d0a452d481b04cb845dc4766c7340c825e785de0b9a7fa531fc8c4af509dc30fd5e0e3bf5cdb357584b643f556284013a173d27888ddb2cc0aa407d953fa81a3c2b05e719e2609ab908411e7acf3dfc196ee09fa5ce834dc16a637d8219b3800401921300f6fb5ea9468c4780184ae808d560b93261e528e8369cb6fcabb624c12089c9ef88146f07094498bfdc974203d48ca6437793b66bc7813021e54a717d0e2ad412e8005501d1fac041772c496f5a4bb8f153a0b5cbb3f54c01b6512381114169313a3d801930beb36b432d6f9b9a9decb21f4023e884401b0601a2512fbf798393ae0c821903be10706fe84c6bb35d413108aa881567b00f6a52f1cb012f213a23b695818c03cd345a755eed79c6e7e7e81fba51b60a96ff85cc1a50f90fecae303d3929afcdca2922914b755d86af433b2fd0b729414b1320a4b8f95206f82c885d1f9d45f32038b765c7e36126945511c15b466e206c2019e23d3e8e8e4992232320998583af6c3d536ba5d05f33da576c2643678eece8bed099d74cfebadfa98048168f3e003c47d218d323fc8fdc46614f1031520527fc8daf719a1e9fa88dbb3ac345b97bb81b92924271324a1c5e2af9d2d5339a3ffb4fb3778a5d0d1105a36854d100c3975cc77bf3714c386334d3c27ab48fc664e22e95f2c857ba5d5ace01edc01b476f2528dea315f0a3cc30fb63e4f7aeaff150d069ab645b1b777acdbef755b4f7775fcd51e05b02fc2c155a6c1776021190e6c08e08c6dbbe098d91037f16373eaea25e7c959bb0ec425cca0ed0cc74c236bf158ec6f38399d6c9bc779b324aeb5a7eaafee91087c8b5befec5286b551be62c39c53bae2c57bd40c673c3f77002b29aa7386ae23e7a0c89c4577b6e3d066da7de195d0c3549124dbd493e42cbf6f19314bf93b867a554f5eb5b7753ff2254cfb9f95c77e9efb6f15af63a0a0f360d48219d1bdd85599fa64e137e531110222da4f084f799f0e75f7944a0ee0f9552f88c6af0e131ea7d9c0e46774dcad63c13e0a43806158e05fbf28901647163ebeb20dc325f9ddb8f68b075022df89379d9be87fc38ca60655b64b525288f45f0a963baf9d307843a1d408ef85e93f08882274a5c2cc80757960361133df7280b5435c424a1d42ee06537c7f4105219467282803c99b7162f0685a5e298d1d49c2591624ead4e7b4949213a78ebcdb1b8edad5019f543b5c1933d1e605263cbc20977ff9238a0c70c32124c4987600114be4505dad70a1498126aa45e18f910d3a39f5e6d32150129b8cf0dea4438bdc94c13540cea9be513e1171bd82dd4397db12e89f4cf6ac732d183c198ad2342dfa4de823557e03010d0811f29b562f43c723ffa57a1b620263b8b980cff14699309efe7e2317a969289dff14d25870dbc63be895455eb5582f626f4fec127361ff97a2a152461014516b26f9fb87eafc463a7a38c743f8073aa619210ae25c7cac4ae3d691930e62abf5ce49920445d13220d48c40fcbb104e47086269e718dec5a9c2adc835ff09e59f014a5f84755fee671717c6567aac648c51111981ba29b056756b2892f87be748fa4053c238126120ae85ae5ab246ba07527d86c92010e84e9cd4e3c6db09a89fd260bb378a89288d0dcab6eafc703db3094a57b62d5e29d1f8e190e0d50bf970595a2b58cc1369f5fb0b4285f3ebb0292e855921d7ffdb9b4e524cdbde3dcf1a8e4cefba4f64d315fdb46de044c89d0df7aa8f74bfeeea9d80229eaaf038542c1eeddedf037f23e7ceebc2aded4d1facf9c06edcde20152a61ffb410eee5807f5f68bd9ff4b3cca5bceff1e84e08aac3d0cbf6bafa3945816fede1e1dae2b1bc56368d37c394536814aa6bcaf6b8cd32ab52d265d4d72b4470993822d38d06285e853a1a76ced40653d41675c16ebde0589b3515ba22526d293b8050e5544c391d5455c1f8b6c2233d95546a22be6a8774a2f7aa79bde6197d2c9c933097f2491dd9f2e4ad5c2ec69aa0eea1dfdc3fd64bc51792b226f135bb36a59220a8da193b6abf02a5bf52e93d20d01121538c16be9dac4c1ebf17a1dcde12c76b856fb3428d2f45f83e46e54830d8ae2a6ab6cb28c6d6d80041a95f946cf878a27da711a89ab3a0c5ff0a2a8970abdec53686de8c329774eeb09d27158889197c0c0f3bb13a51ab5f3835eec2527a4e4d878bb49e1cb558f82968668b591ac408820f2bfc1bd385d0154076647583049ef73ff78f3277dfaff4b10ed1e07767a798402c87c29ebdf64df2ddade2483a65ac5e4c8259096b2d29c35712ee457cf13f8593e46febc8677ccc7c58ff88048ebcd77c6336d8aa4b844c6fd429f9e437f436c32beb0ff8aa50d4404b0319ea59ac1153e22af9bfca6544f0baa55d414e5565fad939c545418807339b7015fe9aba3ef2cdd16cea4cf08078dac5819a83b201172549aaf11eec98faed8401fe1c8189c04a7768db337ccbceb93725505dedddcf5582fc5ac29e294cf91b1b9f4a4b88b9b9f1a4a25d94bc520914ca689e460d97e8c37c4286933addf118e5c96f647d2089e739db4ff4783a5d49ab91f3a352640dd92e8b2f93041032fd7e00aec892ef6c053182ed4ecc391a2cefd14993aedc295cbed34532e0dfc99a785d18db184e77b10b4635dabd3a93a664a73ab9b8159bb8db57ae56b9a8b7f7ee02b92399a03a9597204853cad7370003429fe2a3cc1468d334cc6acd13b31a141e19fe4a809606d5116b2f6da89cf87a587b55f0418488d0005c93f8f65869b2a84d44e91201c1fb13faac0cfd6eafaec41b87e970717f91d288169e46c27470e4edeb447e1540f94cb5d6f193d319cbd4ab90e9062ec5c7bef27c76f025b6201e6756c05992e13a79dd179676cb16e50029dd356201b5419b229fa33fe38f708afd6a5d604345828b5838fb54bfe790ba935209df09ae58e4a20eeaf26cb5dc8b0778f0093a8a73e5968a9ec7618e660f81b62c15ffc8a4cc82a7b86d2b2005177f2b0f232a45492b79bec9f54a7eedebb9073f6984f06f9118ee9cda4ea6ecc01f229bfacaa1687219f535e40c963e1bc5dee997d41c90890dc16c6a7242bfb79504828f4f686a5517af10264911163db1a2f5d17af4b465c3e2e772d5c8e0bf035cad62cbac0145cdfb62ce688de2783dd40c1c04095030fb917d32cd6a664a751c84b90e44be25c021759d795b0d32db53d774f9263f3a6983df066cfbb8e673973b662c86d8ea957ef34c062150ee2862314c4bf4a4c6286d046d38bb988f9b7b73531858a72c3aa2987f3f6cbf38a81fc885d01b0e729c82ac5cb661903afccba76713a9ded9aed187abc007ccff6cf0aa1bd9eae2ee1af2cc13c7d136b13c8001538b5f1b5b84bbffd72fe3a1f3ba64dfbfa9a34b7a212025ae7f87c6235f4edeab03e33d70bfe90655340baa30454d83e4688f4f7f3cd250a8f79bf1a8cd78c7e857890a75dd04f871767e5e8767268c842cc920b095abcfbd4f757c534905cd974cfb8d8339880e0845a03c83f2e3491b40028e97b3892f58966b6953527e29472f01d32d5c513c2f1fd4595e3a2247582cee665ce55ae72fa1ac0f17b151ef34ce899d00f01a904b0304a7972ae7d5669588aa4ba1c0fdd9f1f4743250c895e466e9a12c9209f6220ff02e53ec7dccce2c78939351ef33fb15af5ad8e8231bed8389a691446e94e22ed4426153c5708580d5b2fefbbe737909e458cc84d1d42bdffbc46648a2303450e94032ef0810f01a3de7d0efdb4a08087bf442ff43082536720d60bf114e2d53c297969fbaf20a21d38a6236615048d2891363321558310d0d6c461a33e1532f3134a65293ba5d1b8378153209f7a8b329b853f9e66b536d0df7b0478ca54cc816a324b7b9a0ff04893d22255c2353b314433dff2eede6eb2e4adda033d3abcd5e5dc7589eea48af144ecbd16452d1a9c224186fc1ada5eeff89991c1748ac907ea56250adb6bb22214f56059dbdf4c732a11d9b74385568228b6ac4489da90c823e14b4e8945d873a6543445aaeb26516aef43b207666a830d0397bb25994d6ac0c53d95bba9292be9394bb2aaf2289495b8430084fd8a2a8d7bfe1f4326fb89c159760d3b2c49c2127b44e387f98e01d53944e83b87aa273b5fe9eb96f6cd1866b69a72e2f460c0bbd0eaeddade075d09f5a2050f32250a6a92e583684c0f81de0b33c9a6fd54c88370034b1c402ffbdd7501c66304a635f027856a3007111f8efef7c4500e9a1967d037c1486273ae99adbdea9f2e15df3d7b6d9411c300067d466e3872fe4d32bcbcc0cccf6605193b3c8448672a6a209e84ca920d8fb1d075abfd1b460b893c987f4446ac6d4643cebe74da7d99f3d95476a8e714f95a6208984876e10d72f7e0722601f0478d58cfa281db2916fda8058997c78fa2b909e82a6fc51323e1b6261f83d417089f0b0245224b1a9b9fa4227d7554a5413bdd35a205073e9a4d3f4439f21715c2ae82e0bf0ec144a6faaab564bfc16175501a216d9632dd451b164166dfd3a42244c6c982028bd7d695e02d6a7990cb0416c4a16252a68af59f7c4288680f43256c8e5dad47c2cc95eae2abcaae46d5d1ab6afce9cd0716a10824e79d4266461ef7f6bd0ea153e035f279187e05860399414e7ff533f727fb5df86b88b044990fda08b7abb505a3cd20535f367ab7bd9aab2dd8fdd3a2e37687c21ae8d1c9cbffbc9468b4f3b1d316d29c1a0c11a27b663c0493d2a17aaa04555a1168ab2fb88d49e88c22f1c44461d5d2ebebaba12524a12728873fa21e56b8ebdcf2bd3afb4cabc7a201eaac3cbd7ddea5601eae73967f5682d2e70c0e56be1d4a81fb5002f7e3ee1b40ecba29b6c07ac7545ac4c0200d8dadae3da1d29f6f11104f16029cb3d17d028edb2e0341b1bcc640b4aa67670fbd11740f2b965640c35bb701c4d6cecac28d3e848143a069569d65daccdd69e95cf584e1963b0b021714c9257ad27f399a45948353086dd0c32e4ec3f7451c482838a864e2141c1f65826018bf3fcab11d10c43a840a7296c90dbd44b1c4304b4b1a08b15d29a1dce3e88de927e956e0acde8e202709b454e1575f31c6b9c155132e3ad591cdffaa367e0635a45d549a6217e0059d0c9044196448cc3cccc17753e572623a60b5c8eebc84e1c8b133cb506c4b847cbab0d290198024e17789036c5c8f08c37ef70596c70fd084686a2c2b8c7e1f8d9807be0ea6bb7c625efd0c0bf4c369520025c588bfdc2a88b2ef481e800fead7852277738cbdd76da76ec934ac7f3b90827786393d266be4d76da860fc6aa3d52ce821903d06d266d7811bf76890c5f9a46668af835f3a38cf7893620a8502148aaab53e643bb4fa011cada4085ea5ad9d42c0ac28ee5c3b6f7c7318cdcc8ff03cf9ab85f6cb9dd08a3d2421024d6eef50e4c846ab0466fa4221039851d24e6f4ef1f5b7d0624945c2959d81b21df3da6e7f6c10ffad079424ce5b05bfb715de97e0502da2d26aae3c7bf46e843cea11ddc6fbaed4a276d79b6bab275ac3a1c9aeddae16a02eaaeb51abef18fbbfba2dac2a2549df00fa1ed982ce4da444fefbb7215c14c21b14a0d8355756368f60bb03af4117931c9507d5aab101180dc6ed0978807cbd6b4c81084d77eebd8337543eedc33ff7b475df730641c414bba60d337c05b646a9581dbbd8338341c1200ea501ae777b63230502e8bf3a14c136b446703ed2f22fbf58f86f8e41d2a47fb533ee435f86f9e883e4b8317cd4d3d11994b0f8aec142cafd9cc3ca52363357528b17f3be755719a29514ef16b692ebbc1ca58a9f6dacba245c2baed10345117da6842774169f624875b8fda17af978b8e8798d6494d7ccb73c034ed2ef4cf254f855ab310bd3fa4623f0b9650fdefe65a0ed9611d11b8a0d48408983b7442cad680dcbe35e3b8e03ce9f005539799f7d8d361a99b0a403cf13a12499c4920f46288dfafe4e9ef2a220038c28fe8a983928b9e0864b41028dfe714163ca7372aa48bef9961a8f75051c1210598508a8878fd9535e44df86a324e363e049d43fa2187e4ba2859005de2efa7e112d23ca2f38a22c5c6cfaf62051c83a87ba52a6be48e29f3590d6ddc944f6fbc79f1d80361645f8eb7b1ba3058bea84d7591c68d939edd10d1e47c70d891cd01f3bcec40a3142bd80a69beff20cd237e8a31b1a0a7049e99b2c420307b52632032769ffd898966fb2e731e867f92eb90730c8d99549a63d8a4dfe4d018b007aa06b9407bbba1c66f2039119fc586da4462f94a77f3924cc9efff8635f5837254c1e11d6b938595656a81c6edd24efa9b4892aa425611cf64648324e4edab9556204245d42f214b45a8d001f94450feff9e26324aab5a4afa5a005ef74d85c81bab0430dda8cd10f729c6e82a005328ad9f5c975c47a5a349668fd03d6db8ab93852f20236a6aaed942c7a50e093500c3bc3d0e50198a2fde3a46a2cb888dad0783225137d65f9fd8a5ac99c5e0d0f26c9e9a7fc4b418cb30acfdb13a82cb3dd7593ce2b9a48b01dec24d69b2e82224ee5914bc75186910924534f8b02c06c0e8ede2562f256226fd1fe5b2b92e864e4fcd864f54399972c57a095cfa052022c6fc2a59833d2056125090d53e851a6411ea0929d2e7f2d41b9825eca06cfcb49c5cee1001031fcd643fa0161ec538c2958c176bf4ef555c7dd59fcce6bf872165f453e22848bc790f915493626cb22aaf2a0d6573201852110784f7679940fda28e9d01af460db966148cfca23170d11f7015e57aac7c6013d64c1d57ec9881854c92f3b84459799d0e328d94e5c9efb823cac9d63afd7565c43575ba52635328066867614eb0e38583854e800901a1d06b6bd42723e47e7f104222b2c71d0bbcdcd4301998262343ba29544881bbc58298216a669dfda9ed118164f0f77583283319e20d4b3e817c48042e167a60678667b0299cce85405c3b89a5ce820c2984001a12da74a2a45b849eabc85d33fe84550a7bd2f5658517f0710c13dd00ff90bde7a8aa01d5b34cabac480736b3c704d52f25f2623cbfb54b11f6b4649d1f99a476e35d2717526e581c9534198fca4ae3ae75a5a97349697a11c5d1526e43d0f3c610b256f290d17584b5a60522de2022a37214922c37fd2514f5c672ba9d01986a539dd11704bda3c973a94159f80587e62404c49a023cc380b69880cec4e286523c10d7932438e4ada190889b58459f03f61b24974951343893342c5b53b266a857fd9225586ee8d0ea52c9a7517acace24d7e3e28befcdd7eda20d1101bb5e2424afcff52347d3e3efa798d24191fdaf8db920ddf52d7b034c430b9235e2a2d4a315e0604190432840502868704146c75b9672656ba31b1c696841ca03a1be057894770f36a885c33b3e2defe2a7965b4ed6835ef2847244e6ddbb87e2d838c88fcf75e87c01589fa4c49d1d7168f9e76a4a9eee28c4ee13613ecebc7c5a3c7a887199260a213d0a804c211d1533486a1c41ccc14b0df8820240393b94f9a0cf077c60437c138474ffb3195d0ec3c0ebcf3cc1b79b472e68ba9edfaeb63d60b0bfa720b449ad398d3d2fcbc822219ed1a461a5a4c1e723f426cab4d3c2838dab8e126f1e69df9c7d4fd5ebe6bf1ffd8995487ff201e749a60640176ec1fbc3f989d518c0f78accbe7d6e206068d74132c01df1539ff178290a18f0b9d6ef3752c78639e48c369427558561d6087eb0c584d82c14988d1d0ad454ae7c93e7f7d2f5b4e9e6edb766fd282dcbbff21920ec3dc5fb0f80d14a9dfd1ca2400eea2191da64f1e8f1a23a30e6744fa8e77ee04b570d22ce89dbff30bdc1953543a5a3bd356188350a67c4a83b948c2434ca2515c0854ba4b67c73feab7d0a05954cc067c850e1c140c5294c312e653a6b1c2013327064f9e07d3aa16811131d0742e216340564eec8e0a4102736ef78f34f82bf7f157f476f8274d3baaffe801d8aefc25c443a86f8aa7dc89c9ffb99ab41d060291a85c2b1ccefd93fb16bd6df0f410a9999c45a745eca16f50e5333938beb9ede638929085ffb7b94dcea9aa9f9ef3b1e2cc7543466f01f27cf36dcdd89626d63350e0f82bc9137225e0caea126eecf02e941b2b95afa05eded0a2651c4aa24fc032357bfcea01975b1f97946876623eb2730c309ebfd144e9a5c826a7b6e1fcf4286cccd43a10b49b1922a087f7f0848d0752698af3d025313c044b17d6b4d078b74d95a06354e59aa53b6fd2c1221cc53eb3901f3dbc3c0dcfa263d966289650a6ed675381eadaacb3067e4547819cb0bbd062ea35b344561e826eed26d4de6e59f807d4aba1c75f00e109236c09ab42e62d9219cf0a6502140125edd7aab0ff762bafbd3fe15ce7b97f7ff4bd3427c9b90c3e9c8fbea202408a7d5eff66cf62c6205d701d2e6136a9542a8e533d350d8f311d5b7d99c4c69b198fe0179f497562ad642fbe423436c40114a78ff202de0d7f12541956219f5e89a10aa8b09d56db82fe04cff52933a955797baa9312885fbc2e5c39e7c7d9e9f9223c98c14104dd5a423d3ff36299bb1f0bc66bed624197d2e405c79a436b3f07fb2187c7df2bbf0dedc31c83ecf646137519549df92a4a3970dd89f0fd99f1f4571d1e81fff5808a72380bb50c6972fd2c6377ca58c8536a9ce012690fdb2aacc379a6d613d55f6cd8d1f6075a11ce667df8deec6df1c74c71f1b910ec327901e3e3c06c099b947d3676142469f8e9b250ab044950ac76e12d29d197632cbdf3430b4703768f5b09c6ac56f0e54f6b55b4f64b7963c28339c3d6ac415cf724dd34924eb5a5659ae3778fd51674e0e954fd06475efd005887790fac5549bbc821acbd75e539a825cb036aa13bdf868ada9940b661581ac227e74a283387f0613759d05a82ad20e0168958970993471b8cff2aef06378cc7e8799ace50fa84bbfb429a648dbac694ef77f7253c7e0356dc659601cd18aeb7eaa5e8461702ed02d4a7b4609dd0bc6ade2b7c3ce16ab1c6caf2a9bc6c8e6e500049153641bc2b73389145aeea056400f059425d1dd1af7567bf1a3c03ea4cddf022a5d47bd98d7876b2b08342ac40ac74dd9bb096579e4a3c014da03132811c3c39055f0782f3950ff04f7bb650ba1b798101fbe7fd46d10bba74811d71da0d81d7acc47323a9c95bdc31c74eac3a5ee67e288a22b346c7aaee285b837081bd0e2dd126920c4576ef4ed1c155507905198a17a8238290635aca13cdf69443ac83ccb228c0c304c323771b715cb3180c09b807ac2caa196b239a56741eb3f5800a5798f4c450086421b53e83a1afc9573bc30591bca24fe31b0f57aea0e04ba271b042156ff091ab0546933557c79aac65821137ada3f92288b3ced1895afc625e6bc3e8a8307ce7e8bf0033d22bce9a6b19bfadc8d7eac5cdda068866c8091a17cfd1142bd5a503cbe75064d2aa0bc678f901b896c9ce3137d92afdbb7ae51ff36c8874dfaa3448cfb1ec9c8d7090c0fb008b4785e679ee3e41590992b432074ed7843603243cb2c82ba6ead797f51df9ae4eea02c653b506b6d046eab9ea88f9c030e9d2b117d2c52a6909581e9dc6056d6095b8a3b491a7a9f74efe374cbdd037a41203cf7901f09d2c2282f7984894c49876e21346841fde3d6bca301c534dc8d5d88ca5a41321ba33c1f0daaa6cb911478a4a31484bcaae3430092abadf042442769e1131c1b049a9893b15c4058156d3ae969ee1af779b5337e77bdb3dcdbfa75bbb3bc7fb6dd56ddf5ab4b95b906389c65923ce807b8febde87fdf3fd83d41fe5c836eeb888218fab749f875130e27988d08fd686fa2d9f7b5d1acdbacdbe8098d9a90bde5de012f0bf40a9e0af40c999e76337d8a832238209283499e4dd62370b5dab9e2ae3ee266661dae299d4ae45a6bad38a6bb07c6d6cc5251fc49d26298cec6be55d67c4c63c72c86599a838fd22ca39a4db66ddf67b3d9cad6c64bde618fcb2fcfcc1ec3983d76bb03fbe4c187618b595a27680cdc5c95d626db7358d65dab8f2ca6b19d4c95c8b65fa2585fd5a74592bf387163ad652a1b24b5af6558f5993694cbca436a2cabb5b1ea535f748866d95b5a7db2bd29c25777dab56ddf278a642bf195ad4cdff32a36ad1f29edb1a74bd8b74d0fd1afd491b963031964cb93edfb0d245bfa0cab95a75d655dd2d3aef24bb2a45de396435d91b4cbcb369775896c735999c8f6340adf27ad75c964d9dba63d9ba53ed92ac9f666f6e4982b2c111fbd7dd8ae7a6b6d2c0da960e61e8218a0071f7480cdec5d939d79f62bf5f73585a6db3ee147a976c326c17ff76bd2bb65e97a0f6f1fbc2693c943e2954a5ee9da2631d367a7f5d6a1d3bf1ee329ea2015ef581fb55c742faafefaa239077d9ffdb19c0c9b05824fa9e5964522ee1868769fa373e1ed370d994ca630e4405c8637954c600daf9ba1df5894640e65e4f02eb056ab5ddcc3b7eecb65715784b2207ce1c3d2b1934ef3774b7b4b0b73027398d0e9c323c6507847b473fc030cb51e5a08f630712693a66960e881ad7926ef829e7613e8695e09ff90658fe62526738989c91293bbe8d75bed0a6f5259d84d9eba9e877d64d93bd6cdf0ee79f76a72d6cd84ef515f348a66613782147222c421beef6cdbf78922fdd9b9dc4fb3b0631bfd34b1047e7e652b8746d16d0488ea218064ec30f51536cb3be69d14deaf49cffb874b12a43b2078ba035edb11395377a9c132ec9bc2f0defb8637ddd2391beab04de0bddb4ee0f6094da53bb3d74fb44934fde4623cda4517d4cd88ce8142191822d93caf7578c16e266cb214966e18b6862131f567e7f59f305dbbfdf07ae7b090a685c77832f653ba49bba7bd463f415fb487615683f1e4d07d74f08e5e92f95bf1e6fab60cba19e28a7be90fe9c33fa415af9161f98aeb60f90af02c8d75b07cc557609a571678165c2353ea6ee67b831ce5703f31ba652b83a7dd8c5686fa6083eceda9e9e1fdc277984b622e95b4dba69348377588bdec25a9f0736a2187e1675da9ab30c4dd5914e267dd0c948bded7de4eb40f4fbbb499a63ff555c3b90e44a670a901c388e389a5e21cf7dd74ef7e87a92fba736ff2c2458b83eff61e96423c6b7b4fd018e0bd3e71e1b2bd7b7d72cf0bc3300c717982bb34ea8f704c875e5f3c82ff6e3addc1c696b3ae227ce3b246f87e9f7638c2b7e9dedb096cea3681ba19276f930e47a8a439349dfeacac543aeebbc9f4994cde61b86e86e93bbc93873a1ca16c3add1147efdf4fb8f4300c4e319d7cdf4fe6fa62a552a974f04ecfa75ddf4d6f27688c369518925c9635b5c301defbd761781f5d761e3dfcc2f0077bdfcbef4d7f30930e74eee7e57ae332c4a58f1e62ac43a93f18ae1b7db89da02fde63eaeba6eebaa8e38bdba749af86dfff262f7f81cbb768780b5cb67ad4570d98eed0805b2d4cbee0f22cb0b8026f58f8b05f5326fc567a97dea02a4c09c3f01697251c8e1e86364647c1250d3b45f5d1ed27e84be311e5def1e94e75c1654b052e5b986cc1e54fb8145970d7f756702966d0412ab8dc324c6561071d5f1014dfe86578efa49f40507c235c86b89564d24dba19e2778427f13035fc85c9f5b8fc425c8ef76e729a535fdb6485c75254a9a3ae9d6488cb118f445c4ea026f74fa4b70f878212861d86b719e5ce5c3e416378ffc2ae9be99ee99ed7cd17cda92cecddb7d3f5bd7169c2e1491f7d8483f4f0315da239d83110975b9763c3e404fb7769144d82b8fc4a18f3309ef0debfef33d56ec6844161f85ec265df3bd7a1f092c09adc3eb04cc2fd047df13eba652bb9a27bd7e70911c6536b6833b922f6edd2d9477e64179b49013757740be5edf4d24c5b36631905bd86a80eed28e8f46a8fa9efee36455ad7518a418fa9780775804bce9eddd9dbf67de2972d25bd477d6ddbf789e2cbb9c3859a069fc95b2666f479a26e66c746ddbfee5e775137b7832ef6edda0c6f7888a835107073454f8b8084c88009a9767302442b0a9187cb92cf07d289918e5553aaed945aa28b6d1552ab8944d7344d73c9a26b5794893e2bebcecc95eecc5ce8cecc8deecc2777660e04835613e9c404124f4e40a6cc03892228f3aa98b9b24c14412c16201620960862b1104517201008943d3c2813c1eca5fbe2a16bc34b7c8936805e8836bc40209c0031132b48bc2a545cf1aa007de54bb26cbd8469dd18fa72d2ac939363b884397986cbd6c9c9c9c9c935182eed30fe75339a0b7a1897ca2025c3e1739dd34219e874c201e5040010002008822288228220008050504894f1c48272ed2c271c4ea7110391a40882507048a15a48ac43eb2394dbf90463c446acc512d32e40181bc0d708db103f527101be606c48a15a449c00fa623f3a61214f18055471470cbca08af0a3d488c2544015377c4b08de2043c60d32f06c5697b9ae0263941d294273646421195936622396dd5246ceb071c4466cc45c466cc4466cc45aad0b435f32195996655996c930628810182d0413de80030e3038dc70032923860b1931f06c160c0e11415c6ca1172f4e505050c6f1962ef29842a55027949616141494d329854aa14e28ae134acb09a525854aa15a5a562d2d2794130a8c140a460a754239a1a45064ebb6e8cb18631c3f8ee338ba1882026981422e5c88326eb8a175830c1930ee72c57089f10286f617d4060817972f868c1619b8e5962eb945468c182c2466c1c22c162b15162c95158a646121f1cb066cc34be565830a0bc9426215f7aa505171557ca02fb645f7896f79eb92f4a5a5454bcb4d2d5e4bd7d2e202c5121e4dd293e428860c19a48c1831c416ab1678368b54e2840fab5068d52c98e596abcce2c2272216c595ca89a8b20af108848141504505aba8882c6fddd317161696b3b0b05c17575931e1a20bb9422d62c4788c162d6088272c5827ac1316e2090bd6c9ed2c7ee0c8c543f765c3c886d10b3ce762f4b2015471af0a1517d52c170c570fbdebd24089422f5e94402b2cb382cf683404cb4e8eac6e89caabc7f4b9b045eff0a04611040261f40774e408969da0a01c9593c30332f58e0f6af4410109c10943718585c83a611ba7ab88ac1516a8f1844f2ae04fa73be70af2fbc29448e4c202c2bc402cc3a00d302fd48813a000fa12922d393928275bb00b0a4b2a89e68109868c7a0763193ec0e8aa54f44e13d887d55b57a42fab7fb5ba8b63ea8372117ae1e2310dce6ca246b4a06768417f46233aa48547f4a139393c3ca61c3a840ee1315123fad509c16911010e094a6082212d2499b3b5880087042530c19016922ce2821611e090a0042618d242b280c4c9f17242fae2f2ef05497f5ec0b87871b92fe4e2c56737f3c22495f250a97046ca5d4662681a8d46a3d148030d77b965985d1ed3e7425386bd805e8e42a1a0c4d40975eda754e8690fcf69612a754d1c8d28223802a13c4dd35a2d542ad4422dbc2e7bf096368307dd1267d06b787ba7c9d44f52bc74573c745927dd95739785b8c24264a5b08dd431b74264adb0d052292c9629f0a42fe0cbc6c960bb461dca49c42504b2e6c30110b0000634a07c40d670097a78f1b60e4224ca9a3c7a67d09d4964901e35fee48eda08fc76412f5d180f5d1b4eba30e7ee4b245aa980302fd0865b1b2717c96bb746e5608036c0bc30ede4441cdd12149e4294300c7510866118866118eae08422ae502ae3e89e7455e7ae0a1672a45231bae0c34ed2040b26df45d0177bae86d155a96822d340301cddce382e6fdd8fbeb874d836cbe5f62ed6e5ba7856daeca22145bb8b4f9717d7c525dda9022de666bf4ca9b0c916289fe772f84331d34eb4174c967da9656d47f35abc04b396237e8aa2f87d9d4fa7c7b4780ea50538d2017b4a140375891eda33b15abb8c4ee1e39930904c1844983078b8d00d420b5c40729339225a8da2597d935b7f9a6c6bbbecdc7689683c9b5679ea12b98fe18aa459fd8acb1a24c395a77dbeb2f2e4ce9c928a2d90b92204dfb49507e3e96a637d4a3fb61a8b81163093cc243ee4eca5dd39313a6dd32bbc60aecaeec918a50dba66f26dbe42ef237d3ba78b740eee2247b0eddb7cd96fb8a4b88f34ee1c7a9ba77732769709237469304d17f25e6e34dd3f3cf1b3e8b49bc9016423bf8f4e531f4477fbc6137f3808bc6a928a95858d5e8aa336c2a3f67d87d1bfef41843ec23446748cfec17c279df47ddf877ff05093471886fc68c04c9e2e0790eec70d95e930f530109535867b2fe78f87c70eddc3dd77e88210bdebba0effa0dd6bb2476f3a4cf60b9ac31a430e2042d87717a2deb3efaea3de7b4c43d12476a78c37654477ca705c0e5f36798d2f83ce795774bfc9dadeddd0dd70f87aa795689edec93102a773ba48236144bbcadec1b111d23bad04777b8808f4c8374d629a06a45d1ba63fdaa54bb0539edaaeec1ae5c176e3a1fdeed1baf300d863db35dae86fef6fa73bb4ef307936b59bbce21df526c72ee8eeb8c9b5d107ddde9226dbb9615b93b35ab351ea036eccc1e63c5775ce39e79c73ce1bf330326aeecc55ce8ae65cd12e4dce39279d9f932e692dd8572e9bc18bf9fa666bc2e84c4fc374651c080216a450cac8f4e07c9dccf45a135cb44ba399824c7e100ee7e777f4376c5db6f3bce825c7f5cc22ce4767aeff75d8246d4c45df3e510dcb71db29bd28f2d1999bddb4356737f7feca863d7792cef92629d79d48e83cf23cf7791f100abd0be11ff3081a28838d8c911e731ee1fb47c71a589ec7f2c4a0d18d2388c0723993b4e664626ef3d9b49f37cb6c961d746d5eeed9e53822a173a1affa153afd43376c1605d1d5a7a9e09b1b29cf215041498bce0f97dbdcc9ba3e6c7b3b7334642bee25beb2d5a74d7c5a9e43a0024f2e5b323099529ecceb00b7b5eb05c448dd3a1dfa16efd840b8a4d647e78c5d6a71bd9b46a90c2815e7bf267beb7b716973f6ceb068eb7cd780a3d5a5fb3460f0cddc5ff5dba76d7777378d1b019041baf48d76d16f3772e400dd12884ccf6537476b7fbb9ad4f069b2bd9123c3ba996dd3aa86471bd8b353bcfaea7bb64de0ea94e9eeeeeeee26bbb34b65b48b7535b65c5660aea032d89d93a4dd3294089c778ce36697a00343d8c878dea589418423766448a7216ddbb66d5bb635cf663191b74d93adb35d74939f6c1b4c7d6de52a6f652b6f2ef2f67665dfeed22e97af7cfb565f2adf6612d2e54c6eef34f1d919cd232ad1e0df93ee0f7a849210ecc8b09cb38d44bf48a4db489a856d57a58384c9e94f93f81ad97e2fcd3d3ecb35a2b5cd557cbb3a483fbd8adb273abf343fc946c5e7b43739676fdbfc5c1ac5dc4c66eeeda75d74c31d6405df4d2e694fbb50e3b1d31f8c2661e117bc02bbdc1497bcdd03059397cda382b5ba2bb76f4897fefcf6bd1c7d0f69177e29aa6cdffefaba2c6ef354167696ab72f1e55a06427ac8bdfd7beca2d2ef7f572b5c6da2f8f909adf86ab55a31c3768e8ef614a40a96a66ddbc53fcdfd683f65f08f697e153c5a4c84e55346e5d8b78c46656157b9392a0b3bbebfe376fc2973efb8e17100f72adfe1c73808fc5f0507614407fe1f048d111d2ac798c608c618ff58397e4d56c1f7c734463086b978ab2cec53865ea199f834dc6d2bbf6425bb700c135357ae11ed2edb6fe368b787741b6e197cd9e7a63af61632a9b514f70e123ad65a6b63cbb21ddb9643027c68127bc2f4a13f372a700a4ce2edabfbd5b7f9ba98c6888e955fe59e087e4d5e39cb57b8ccf096cbe609228365c762fae6d6203a687824c094f9676ef9865d7b5bfe3b65381cbe1aa4de340ff64ed2489a8976e19c8ebd0e61c3cb254d5efd97caccce46b6784e525b61ead36449936458eb38e13379f7950b4465e1f03513cdb5123ed14da80f4d32c45773eacd9cb391e030c1d50677144d62fdd3844f8441f1d1cc4d3a69922fa67396e108d033e466c267b2854cd39464758826b120140b1b96c0761bd9517a7a8976a11c7b3bb1b2cd449358cf6d28e60afb141fdc4e3489adee8eec28d83643ab417a095f77255ad0e16924ed3239f65ed22ef0d81b8a0963666cdbcac62e3a4793d457bdc130257c26a749da3533363a76ea439d6857ea58578968123379ebece41c09c2c88c993321823092e1ff446c7e904e712a0b7b4d9e3217c0d7e607e90ca82c1d1d9a73ff9754e7e25959c7af2c13ec246c643bbda9ac319c841dd48563939370abb24cfaa683d09fb6d9ce81b467d9359367df6ee943e826b7e47110772b7edab299c8d855a97b63c812d4787fc6ed277c945be9af0f2ce3b197b04111c61c68f66f2697f2649722a13c739e6ca63c7d70031c934854c2e507de31f49945e770f840340b4640b123d35d20324dceba8edba74c1da259d84178dc7e63c8125c6f9200862465fb64ec268fe9ee7ef7ee8cc20b80d8c88cee68e3fbf6ef337790cf95e70e0f96c8b3db1a499318edb97489287cdd839ba749ec25edc9d85b03df8767378096a93795853512be7a336d50030c872f0889dd64ec2663af383ff5067b1d021392b1f74dbb4a9a2463c73050c64e93cc4c99e8d794c144784e9a4dbadb48348971b875cae6e922ed7ac6260bbb96e9002197add33993851ddbb037cf86693c196b9f7ae447d7d01fb64633e96230316bf0d1bf4076ce3931eb2353416809cad3e539842670f0822c0ea10923b00cc386d00411436842031998e710a00045169ba477085070228b4dd21be6390428f48044630d50aeaf802d829bab12db4922a633fc610f6da1cff5bddc4228750ba98ec357bf79dfba198f064ca61d45938df2f96118cab1cbc365fb3e517c2bcf1246469e9beafd6358961d690da92fb2e5fdaa535f2cef98963b66dd1db3ed3abaade5204c037acb69b677af915921bf5dc7ca4127bf9d85f51a99d1e82cd7313acbb3b3601a2319d6c17216a619b3d7c8b09cf5142a0e4405fe9e02d3d0a4780abce159593532a3d7c888203c65363ceb88bc3514bb3eb28cba352d77ca8cee9461a991991daa0a6912089f7694db579c2a24f4ddfec17763a3c06cda85f25e9de32637bbecd8cd7cc0eea642bb1c54c757754b1e386f4dd2df8ac3e419ae37a01c536949ff9d878bfd41b9ed838fd26c45390359ac48b3b8cea945e8512e56e447d6ca67ef2ad4c55b76163f942d5b7d3c8d462b959b42f0664739297def9fcf4e870f4ffa221e9b647a4d3276a45dd89ba2a887e5c4a0acc918cdd8b3764b9a8c8f4b9b43f7be1145119d70b9659108d3a131503086047d6918229e73c509de708841ac33c23e1b186efa12ba87ab4d937d6b85dcaf45b6ade254564cdb24493e8a6b87dd3e61baa2305fdbfbd609980eb215e6ab7bdf26a131b0eef0178669b9904599de3ab51f24e8bb69ff34d918122639bb2659078aa78d28cf4ecb69b248934d23673d830f7bbd99b3e2cc99eb4d408fe93a44f74f6ba15f205c8534abbfe17e17a9384d76c5e9699c6f569cfeb67d9fd83ae44f0f60ca6c8fe9d6a92ffb83c95f14bffe69b2a308f2613f15a773da55d69bdcfd2aa45f54a616c9fd56d2aed2deb4abec9f5c87b03f368aa632f6a7be2a4e297e1f0ef69fdcf63507ab3876fad42115a7b11cac48938de534d939b9fb1d45bb6e6d60059bcd1eadc926fbe4ec99c1e4b6b1b1b1400e63cb854dd2aa38985671329bc426c16c12fbd3ddd80e4837720b74d21f21962011a20a3dca1389104b98c00626d0997305c5e68a39574cac849603ab936bd7ab806f2211224788146424429080b3a03c910841441691087193c54ccbb21f241af880b6691b12204a9000696203023763663ae74e23d1f33702010538c1a0d038a32b53d7aebab3d35162402e574f611f36873eec88555eafc9bbe421afbeddb2475e9dc68d157cc3373ad7dda8c923cc4d95739c169a5d8f3c727d55e7c067d7beaf0a37d6e1080b50faac2cd51866a85b008bbffaacab877847bd8a0d95a71ad7c7d4d41d6fe9637cf8d533151595d3ab6438fbdc546ef8ecee18f10f359740e4993bb4096fdf28f94e2fdbe6f406d2aec63fd86c7353bb990c64f3e9a0e9726d543cc551ee05546023a7a7388785c2fb43cdad3a3da89b51999874334ea7143888b13f36d661bae9310d44ae7dcb4d47e9264c33ed4b65c54ada753a3d67dbbee8fba8f974fbca9deecc3e55494686afe2a8d58976f9cc6cedddea8cfa55b6398407796eddb19f558976a9f00f9d55a7af3be1aaaa5a857d80b5e5b4cb017b0b6e93b3eeccdf9d99ab3ed589956d53bd416bc1b6b676f7635a653fbe2a69d7874fa117a2c254187eb62bf339e2fbee4493143c79e05129b09c3c3135a67e97e65175b0fbf3699713ab31cc99ed57e774ce53b87cf61187202e656d6362edbbbb6707ddcd645702b6e5ae5c754b8b794c9fdcf2151a86ba995037a3dd5aecf6f280c91bc884ebb4ccb6b44dd717f551dda8f74a07d16be95de51597249cc3fef6a6ec2d1e6d6947f016543d479360f656e1a93aee8bfaa813cb6bea8dc7f07dd5b3d73b86075fc3f139aeba3d1db105bda730088acfe27e8abda0f7d05ed0bb3d88533ebb1ade41bcc37b88779cde1eb698e584e70afba85974156c49d8be45b8519d35a86af019aa6f3b0355b8b46d73b4ab31edde8d4b4ca3498a73344973e470a3c94e88d7d5681cb23c0cdf3deb70d464b8a4a5ae463f7c4cfd3bbb335db557d55baafedbfb03cd19ded13dbced6cb0d4e81ed667b5eb54b86dca3003336b419bd9ec862a1bfe56152e7fe4f0c6ccb63b3ecd5d87bbc734cbdb47c6f8346e78dd4c0abee1c3fe7ddd8c3efe81669673dc176279df9226f7fbc857e27b9d0e34b3b094b6e6d0cf7089df14e84ce21df8f5e0a4340cbbf1edc5cfae8fceaacf6e4675fcd981ff4c217bf1fb469394ec1680781c7de6ef2651e941eacb8475743d525f254ca336c63a49e774913e025e194d921e9ea3a19898eef115fcf811c43e3af7b18fcea0bdc5d65a0b1e750ba26ec7f1dddd28d4ed184add0034467dcaaad8f983db47ed81c6c0c1f5b56ec67d3d8c0c1e0cc0430f7527ec66ba5e986ec6621ad53b9de3e6f87af08ed5e72907afe2a10d406380b62a013e5bb9553d43b11cb5c282cbce60597772a6ba1ce80b9fea738a549f532566150aef00df57a93a63395d39ada2f7ed81be6478547d7c3d0dcf5afb3e0f06a031fa19ae7d2fd7cd68413dd4e108d15cc7d70b82e22bc7a7ca96b1d677dd0cfb1d99ca451d8e50b6a7514f5bc67b5665342d01411004af42e11ee8cb88fbe03500cb5d7de5aa1c5fd40539ae866e631e9a045f7dea4bfc9682cb8fbe6dea4bc4a2b6c9f43d5894b1be55ef2ccbb26cc43beaed335c66aa672a6c6f0ff7e0519de83dd0187df0a80b8222957a09fca89b917d87c527753842393b8dfada4e5fa95c3b498b4bd47ba031329c4aa52e7633a97b69aed6567b6b3d79342a8b3ee59de11df6a937aae292668b235577bc31751a75a7d256ed64ba934bf0e33866b5f6c1a7ae7a4cd7a8ae0f2ca7700ff4053c2abc254c0ecfc1b4cb059e9e871ec63bf3a8eed0a82ff1d43bbd1443116f9315fee4db4ce23759a548b183988c1eddd6775d44e16b75211a9e88877e62d7e74ceed807cd266b119f76c77e288f8d73a0f9c608befecce5e4b136df0fac26b4340348e8735449653dc186a7d6202585822ee9be90b9532b86cdf8903b51fdeab31e91087b370234675554455d2b8f4874ef9ce85ed1cbca23aa3ded1235ae3db8f2dc8aa4f2dcd42065f8b023b93157f46998e11361efa812baa476edd79efa12aff0cd95cf6e66a5e539b49ce55c7737c3e348ade1b1cb63f6e4d27c626a3a3f5868763358c67af035325a2dd2646f15091de2b5d73b00f1da7b094dcab55ed24a7a492be925ad050cc3f5484e934ae47e55a295f492aa5377a8186a4e2dd2ae9777ebfd2a8376b17853231bd6710f621a95df6b97065f3cd7ba638db6c9ad73387cf5347c76355a9986c774bd3d5a99069d8a04774df5a8fa1086856ea203ea95548e3e1ec3e5e919aeb8eeb4327651e544cf8ee1713bf63a6e2f5b397b566bad75db6156d66bf7ef96db51b0a3b087ba935aefb8e7c081e171f4fe5d4492bf28965fce3af0da0e1f2e7364d1375ce6c8d8f616dde81ce6d1aaa11bfdcb6e377af60e83a0f8b2d7d7f00eef18fdc33b48ef78b4ca0cf368e511b6b86cbd236113eca366d4b377b5e2f2847dd41cc250a16321ac136dc730d1bb578c61215c06d1d9e8b00897d97dd4ec315d7772dd3161b7eedcaa83bdac3a489cbb49c80c75ad73dc45a18baee9a35be6c823d339935377afd6731d0897347727bd5e51ddf99e4b32878318e6ad3c7a7767deba4bf3ac2fd2677da1aac86bef262399bd8e070df390623a4a08ef309d33e1b2268b40a3edd690e98a3ebbeece0ee47ac1d8503f4d4e28122ec9dcddfb090c4eb9e2ac2c172ebfdc757834fd64aee58bb778bd9bc846ab86e8dcb96e871d44228e8644b7e43e819adce571fb77d1b59b72f03e070f2903d02eba3c1ccfca02854297bb37b3a97c7117f752be83d63d650710cfcaea4a94bfc0b3b2aae8283424c2dc6d3dbb2c17b7fcb124a3bcc52d736414d6fb15897e4d991af00d1f0ddf68c044b46fda0f34b7dec2bdd32f2c6e2bd164e3acc02eb854d1ad852182dc5cf4fa9e13cb5e6f9aac41ea4d866b9026c99ea929ea0d8fccf46e2f51f2a960f25f8acf0d37f98a9ba43f3db9ce26df5271cb636acb0d2f4e9914f7f288e16f89e558ad5de5a9ac7ebd69b2b11da2492b7c18f63611e6d9b92c0fe992265b49490bcdc2519ad5ec148a766daf1ac8c057b1ca23c4575f56205f7d63e0abef0b7cf56d816f7bc53bc61c4ac825cd3a9aec9ed0104f7cf4db96bf6b802dc9caa54c34d9afa14ec2111f1e8b7519567582d42138edea6ed4351d8c6724494d07ab3aed9a2d5c31ac6b3723630646d3e93a1ca30f09784c4f9f7a0325aaa6d33f2629a39b6a4c8f6eba4fbb4aef73a3876e397b72a8140a6d39f4d717f8d04b32f5b2157abde1a92f8c1ba7ef769c826765a11c9739727730e535329a76f03ab483c70e824fc1343f789a946baf91a9b76cf588c45652598d7dabaf9463b8e478aaf0652f9b2737924de42949dd113b7e8d8ceaaa7eaf43f57b0ceb481d639a3f759a94c6f91db1d39b943b6258023a527e25408029d3a3b2fa1120c09439f9c534344054563f05df549efa5a3de525bd49f9943979397fc44f997f851b6351cacd208f56c65477caa4ee946924b57b50246e03810781733be1f26b55563d76e9e8e2118fd923deb19eca803fb963fd0e54069c329a76f025c5195d9373a54b7dc24b93384193e0c82813edaaf801332c75336178b79c4b8f68b973597b7a870550f4118ee87cd4270921dc9016a0605a0cc36912cb65e5c1b05ab12ea327b0c9e9326c0b6d18367393d520f5a6b26a57375197a007a7f626ea9a270cbf5abbae514db628baa8eb688ccc02b9fbe632da331cb437f8350e605feb667a648c64980259ee30bd42ce76a4a7f0013112c26aa7a422a93db8b614befafef8ddbb77a912fd9dcffbf89146af3cedaafdfad32e20fda224f0a94bb46beef4c026f7a713b9bf97cf40ec4e0dc8d0363b464e90cb1a0569e4354ed93c23e5c9148997bbcff37d9e17c717bbd0ce8e1042f793c60821e13d3d4e08857c7c3216e88b92909210145d684993bd2477493a92fbae5b928ec8fd172e5ad4d0c2b2b252c1f7209942a5522448668b435174a19f26c2e2aaeb8055e6b1ca446e2ec322f493fb2c4edd4ce95c09042f5659adb85a5e8a64eaf6b72a6ec197ce81252c7c34836077011b1b52ceca4a05df93773689426da0c5cd8d078204a9a1081a7070503064488b052f3939471c39b2e2062e3a3a49ececa410028b8707093d5d4fe70455922453a02f3e9d4f8705259d92ae0bf46549b7a41bbbaefbc98d6a714b920b72bf061a5a2f2b58292a9455092c95589cb278c00a4827b26922229bd40905e5e424a54af9ee4b52b62697ca4bb184ba3d8ac658dd9ece9d5cd24ddbd07c7222dac0cd0d4905241450b2ff4b1aa24aa154ee6c12043db02248902270705c50a062c81016e4e4a4388275e4c80d7474c8245a767684c023e261f9a431444858e9e971027d49224a229a828fc8478405faa244a4440485aa132d112d0149414a120b72dfe59624234a538a9244b6b0aca09cecc9c9899e583cda40114591ea443f5f781d80ca3c50a29f7733e239f1e4e4fbc0b0f4daacbd4863a050f9bb78eebba49b266d68fe3eef02369ecd904b12029e561b50b9b9f1409020b8888b8383822143ce82949c9c238e1cc9adba414a472709fab2e3ed7842e0e141027de9f17a721fe57a4cdcce4be22559dd9264044905b98fef5354a91394f88922ea0475823d27de793ed5741d20661ea2e7a3d2cd8cce8dbecf64e2025f86c2979f8872fb90c62889b97e44b2f1b0405f5a8912d2c9847272e275e15f75de126f893706efc7fb49b980cac666033737290fa082042982bee0e0a060c81016d0979c9cbceabeef8414848482dc4f51a5509f381a8dc44fcc167f48749f0e91ede375409879842cdd0ce91ce9c625ba4c2f43a39353c8d54bba21d9d05cbf247676484550120828d93fb92422e84b93df2784120f0f127a7af2e70430499229f87c3ef6c3027de92b51f27581be2cf996e4fee87e51b474dfcff7934941482520e19800b136ed225592fd116a61b678c4d28d6c88d80069569fd55d92cd4d69fb05baf6108d41ba86cbee8664d33ab00142baa30dd0979b1beda34f1a63e4812f4890227070729f44048d01021a638402fad21f328405f4252767248326fb29bad19126fb48ee9254928ac84db2695707a45dda4da7dd87cd1afec122d164bbb874332edd8cc524225484683733d269b21fba4440f7ae0342994728eb10b1a27b9965ab856ebfd118228ea3c128899d9d911078784648e8e9c97ded8e9848922494b520ede2a8663311d029e80121273212112c42ddcd8c7c7c886c07e100c2b35996c70f358f02c0308d6cf128809a8c7dc3198984d32e120ec6d94bc2b9a420348fb0405f945c40c9088a6eb4a4c9fe92dca420271141c2a9b6627814c568f443eac953a566fb416b5e7ed09ad58faec934fa8123b8b92a415d4322ce65e476d1ede289a2e8ef4832d46a7178a797982bccf0d1978dd3dc77ea6b841be7c3adb5866765bdc5ca9211657ed0b9c21e0b45d138a12db437ed32b14420d98e6ddbf78962e3806cb64fc47a321b22329b261bb49d82429dc45766361987cd1bc8a6be349ecaea7fe5a6ed88fd0ab2c9aded5456ffa0cc6cb49d327cf4a5b653a9051d0135f7537ae9b39230b58a647ddd3295f942afeff32797db77e94fdbe4fefe9162eb304a7c1bcdb01a80b902a65d5e58abb577d1ae9276b99a7c727b4db76c65d3411771697af8f19eeeac2c940bea664e3e7a4c3d9979f4d27d402b8fae753321bee11b71341cbdb22a46e43bf679b886b49b5c0cff90658b75339946319ba534ada2b6b1b44694819230a7a0937560080b8c083ff694c48e8eb60317472c5159a044063a687b5933a5999ee2d0ad99a321d1b36ec6c3377c224f6445a1d09db9dce614dd393f140d379b27bd49b9d16cbb19eeb4cb613bf698caa972af56da8661ab8a5d819baf6fe64033ad53a4275e6853a864430ccc130629c36e9d61ed37278cd1f6813c289884e684210acd09a3cbf35c2844278c50c7e5794e1432f1564795dac32df4d5a999d09092be556f36b7a899d82fd42f93cd5a6badcddc2834270c2dcf73a4d06c9be5f9f6c2c781a13961cc9879ce15589ed696385308c649e8549abc49ccc640ade4f97235e7697e677a139294e929d3a699ce15f4dba5515995655f6fe7138ad613892aadcdaa5cdb524c34e78a729529cd9c189a138492e7e97cd1c9a29f73a754049ab3c2bab4cd0ace7e1dd33594ba2481829c7e69323c4802452ebf3c7319e6f91f18a1e382093c284218c2840561e0290248d6ae7dcb91b14aed695659d99bfb72631aa6e107b432b6d94f7b0d0ab3566b6b9da4285a3be766ed9cd3ce39274eabb698307b6aaddde3043ae712211eda94ea78395dbb71a210c4d61a051b286c133eb636c544da114ec3c1d79a58adad51477ff66b64c4efabac3a0421e840879ece16a532b45623705c9d346fd6520c4fdaae3ad6b04d5f6b2c6d26e8b959735f22a5ab2e11d339cc42de5ca6b4fa3eab3a57431891af84c9d42ed1e4acaf1c9545eb0cfade7895e6129996ee8d66d106c2071ef44ed23d4dd21e8c4e7f23c7e895db4a2c20a69774641bd3a66ba4be7433701923216a6da9566cc9f095a1dcd65ebbb2b81f53b3eb0097acc23b4058a8ded4fbde735785d43dd4a8d71a24cc2ce650a1bee36a95fb59d569178aba94e2c9535c972bfaa0ae7acb55dd7a04e5322babfa504c0bc3165cbac5a59843f175a7eea4c0e23db92ed888fd9441b12d8fa9a8d20039c325eae35b6eb942ad8eb44b258352a954c23f4a37bd269fe0d7b0b6d4ad96b091ec530605db9457994aef9e4ab79eaf86b7178579ac6e04799015e64a77ca90e1035fc2643a9eaae07295eb594878a5c35874539fdd88274e81ce72576e2966d1b1046cd8cdf447b46ccce1771f69d7e93439b4b76c594b66eb791e2e6b622aab69d457f7a0706ad47a5ad507b5b08db8aa2e784fef1c8e86c8d3ed232c9f1907cb8bb4abf1035ab94fada5444aa72596735a37037bcbb9e670f8aa12e104c1f0f6eee837a640671f4de346932a20c61a07319151c73dd5c183396e348d1c9cb5d65a0ad49c256992d6ebc39e42a7db4cf4127d9ba45d96aa4edf4c605605de065267f4714e17f9fbcf76d8d32cfa78459d7d4a775adde252e515774e1fb159adb592ece919f8f0aa6721ae8157b25b66d9b52a9bd97bcab00f4bfa29a55ba9d8ceda6edbd6b66ddbb66de7587ba4492a4ad59c3e62df478a3449c78b84ccd43f8eefd4fb8aaeba654d561d75cb1e591482aaf705c15685202acbb23013893e8af0a8ba3bc6f76b4ad4a0779447a3be667d88579edd14ded11fdf9d8d7f3c3d57a3bb3f3e75b30b3e7bdf92a6ee989a5954a2be3d75cb1f35321f72493a0afbb079fc6c72e6548ff7afd764bb658e4cfaca2d7b6492c9c5377c9af62c54d5d7f4cdc17e3ced70a8fe8563ea315d4b77ab2c3b9b24a5f08eec9f413dcb1e53c11eb9f461331b34ff47c1343532284d652c6e9b5f217f735b68d6c8a06c955566d7a17f3cda681e6a644a19d6ba1ca7bee30e27377db4d1afd939944b83f2204a77b9e98e3b946ee2a174130ec2e525bc912c3eb95b65913026ddb6e99b8e005306e5dced717a494f5e2a753a4c2f611a979bf0565915976d737a76fb46878aa7784cb78d8ad9ed5099c8c207ce2063fa0ab52ad50d3dbc339f545ec3770f2fe9be9244b7bfc565ca6b0faefbfb5499aa2df815c95ea472db038f20f8f075c4238875ccca2a8160852a5cf600bfd95ab10fbb6255b6dee2ec2b16eff0aec23b44e06d2bfa4ae55674b18f6a9f5249f61c66b1693196d9b6b52db5349accd14208107e8ecf54ec787bbb833775cb1e39f56c9619786b73a0b9cc0edad4b31a1595ddcb5059a7b276ec7008de1de1edebd85dfbd959152e6b728f2f67606acbd94fc014fe81e611776743e561784e478d9d404db61df8d23d7906dea4c4a8244b99ca93d43a4533122000002315002028100a87c462e170348c33c50f14000e8dac54684e9b884910a320639401061842002004008c088cccd04600f890e17d1af47c199ca39faa582f48ecf99926f36f35e929fa531022162818398a39ef58d714f3180af123c4ab2d643a61d9332d980deb624b0e2250e1fd517c70704ea8537ad0cc46fb503560e97780e5e24cf8aea2c7889027aa80796455b8f11391a4e5d71a960d3a4a51ae1e3edb8e18a2b08b9688c5ef5b2fece90d071385598b44d4fd860155ab2eb74840928de83b3d3d2685f275630fca0929b9780b79e741e15c89f3798a4d25effc3ae20d51cfe9540e67d6000555389721c93bc7c6aff837ae3d9f01383862bc0ecee6c59dba6ca9f5f6aab1ed07bb8d918955729c9484014718c36f51a5454d0a45bdbaaa4edb6546c74cc2f7c0f5055e92e60c2c75a3cd13f5eef98690141c3853447010d28470604419d5ba940f61807cbc50420700e6173567952d25aaa307c8d532b967653005dc72077b76ac0c296ced7ce8696b7a40b182423230a69236ac5f7a2a0aa8dc940de64f8a2921ea5119dd6b47d6ca6299618b65827a72ef94d0975432834c14f70f045ac6c420a8f521848aced2ed5db8d8df71c479f123294763416d8cd32d2acd85a9a069f27e0b7b6ca9b03ab690e5d3cf98717bf77744a5088594b347b28bc8b5acbcba00d23a98a800c535853e2c94dcb95348676e43914fe31061fce442120661c0ab3b8df18351ec9229fa788c62d50ae458aa1bd0603ff8f606485c4e7491c416eb46e86a590c524ea3aba3155353d445b6862c1e848c6edb7a4ece95acb719fee014f2dc4f9be3af302c6c0f3865cd90596618d94be141cb3c11dccdcde4514da25d034e9a94d960862c92193383a2b1d436aec1ca80dd935c3576e7c281b2ff284eaa73bbbf8778cf0f9a93da2f065297bbb897fa3d4c5e61a00512795a91147a26765d441332622de126d11fd483178b52a756fcada59d392d4a37cd15823b56d81bfb421156fe6480eeb5d07c0c5763fed7318867a1e05c9268a38f2182303c3267a10528532a84d8b932a92954ba4b09fbab1b46d806376a7029ff50743a071893f6a558161114948fd170d63fea1d8fbeb6857f0d138cd49aa8d9e0c334ac9d077ec1b84f1ff26a9908ac15c0619f4b66d61ca8546afce374431b31d670d39c11ba60443640dd032515d94fe2ed7d4552c724dca3cadf4fc021ead1ca19fd3ad78356f601f344f2cf7455f84965b7d923895aecc620af62e8d3b1592ca2d69416aff4ad077f593a07ba795b9e0f4bb5769b86a5885bb3150a86c0dde56761331bae5f798184810132bdad9922c97943cf555da71487592acf9bbe399f33dc5567397547108924346d6633e353c8ee6bc49f8f57ee0bd6e1224dec0c58315681c0eda50d34e56f2c354730ca54a462a20d23ef3c4aea04ab26f2e9b0204e6d6b04bd5ed9ad0844202ab933eaaba97b675418fbe50658cdaa8e03a8b666ce1fc7deb1919840bfb6e9b91a9880e7ab731b38b94d47af018d5b1746a9c462208cd97111f8b103bb22149d33a98948383cb9f06153be568927b3917401f4129917fd7bce7903b9ec165a0d7d94a9a66adb5728ad6052c48e701f6f0dbf8049a59042abf9a165ac408a8e9dba75362859b315db7d0ecf7c3d4385956d7fe88ff3c029bc22ab72cbe807f9e2444ec8ea008476d2913413fd2738a146086272e6f3d1b372621764adb37831d58073fd01cb7b8eebf29bd0e2023434e9259847fce56021f65d274490ec90c231071eb29ade7b2a4fa248673d836015c432583c70e96857c17a4f195787e9f111f3633ce28d7ff7b899a6fb030b80a71129e5abaf3ee95879f1f858adf8782552f31b5f36e1f5cc983e6c1328aa0bdd1b8b03815b1c002bd472004120098b7c17d6d64f38777f2de5a212ce4720040ee9e09c64e3c13005e74af8aac9977e9c185e12fbebc6b186deaad869fc6611b524c70ca06890e7fbd4d566a7174fcf1d57f6bdac0a86855263e767bb8019a01c7700415be466228a535329cc6dcd8072f8f63065d3dc921b87b1efdddf97ff5f3dfa0364aabb94122e61bf9bbb59ffc3f862568e9734361117c98055bb33e491983dee3acf634ad3da0527aa899c0cab72c52c3df4958d5b8f950564ef44984bcf2559d3875207e6f6391f025ced33e683db52347af5a3bd07368ee6155668c171351c0b53c1d16f676ccfd403565979e8cee50a8541c3162114c5be5855b98f4c0fcddfb3a287b2b0553e51d78891db1bf84b45e57c7a541c4cf4341ef02499b8f16d7140b3f60aa89f404c1916177f12b7cc8c4966b0fa5514830cc9198e5ecc7312de0fa0ba4b4a02c37fdabcf58cd5129faeae81f112f15c5036d4fe4954879a0b5baf9ec923e4436f1b452bcc0195ebe200f4c7dceb71801bc1248c9acc2a1afebc69db426a774d8380de2b0e445fef98fef8397cebf478a117dc2e2d696160aa7e7408764d9cd88373f3e31ac25e7acd5e1ffefa92ca3c019c5cd4ccd670f838659a0444e201e064cb358cdb7f59666bd9c505b036fa39d97fb0a5c7f4027c47fa9c755fbf8d6d9b03cc1bf96ccf69667586d4be93e85d1b8c6d7259445f772d33290fba0741b87d248e97cfed7feee1ae7978efffe1f7140272d7519d0058693e00826a211e8f6e480e2ea774117ad09676e65ade095429c1a8a9080405b811fa894871b0bfdfb15bed7da01991045ed3bf2ec6bf049f0e315088edc266999d7f166f0bf946cd764ae8c0d07e7a5b7713056c4299436f84a522e2291f12fbb9687f1387df9b693dfbfb9b72235558d05756fc88be430f753b5954a5d3f3d7044504b454b3aac780fc190fed1101c4fa833755bb0b5698dd2f627734975f71a98fdde058c8434d0123cdf6ac8a80a3d49bd0a5550ee3e35b57840035e99e6fcd4eabf4c81c960dc6542fcd5d2b140880ebd34d90a27f23c967ed8a669409a3fae7d2e08af25dcb45501ec36fed55eb039b5a3d3a540dd33b58adefbe16fa0621b3dec8357288bf222b4c3f8f0caae37557e416d190398605ac64d011cb4c08ccc4a90afeaa976687dec7ca964bea472b2788d62579a09d8b5996f09fe97ca68fcb0a96f46ef59253c3c883f3d5a117ed4e325ba6406f64546d498e17618ef4be4d5becc642f17435c7dfd06cc37e2aa8ddd57f29033d5de6ff975f1891cf4bbcb167f3108d19890744a79f5bf5c13a030c11e486c308d971ce204e68152cddeef7ccb587d4c9d984ae8d76ad32dc35985b9c7ebc9dfa8aac6efa529a0220f8b5ec236e13134b10fcc15a1d2d701ae6c1244b2060ea2eb169fededfc1da8c2d5b688e192a6ccb49f6064bcee2c478c3b2bbf00beff625a5d0791f72601572bc63d492c1045c99d4dd419c5d3583e96ede24aa77498e6e02739303b1d0e55375b5c00aca527d29cb37c6893cb14bf76f0f8187323512dbcf925b3a2f33494b6255cafcff7c5d1f1c368c831cc72ade99fe48da8ea993c99f25db1a05e8ad2d3a7c82fc1ac20eff2923dc7dd5e3e375c2361e6cc875032fd5af001057430fc2aafd9fcbdb78e134c10a00a0b20f6e7b7efd0c07c91a0da49d040940d1801fd7b3f2dea21b81d5a112e81cf5b09753a6ee3923ed7790bd0055bc6cd3bb431fecc0a433e4251d43b5fd41f9e0f81853cf1a4796bf56c57e9d6b1e40fe0ffb76c5eaa98b8bdcde19987c1ae9d38c7364cc9468383ca33b32cc5c5521a1c0cc8c76045b38a0c198479365b861e3745414b036093a35d4090ddf082fb837af99f64615a6bc79770deeeb59facf9b35c39cf0bd9b855b7d7e7b271737f9400f8bcbe31a86cc6b0c9cd7426b33d6a596470c4d12649f16db7d4a882b4b687b207799b916b5c0374d1869ac85a8df8ac938bf733bb0f2474bcee5bf10fab9fa8d018bf1e2059f5f559493112ef4db086711f96db0381b3c456c451e98755386682177b6256766e7a773c122f292fd5abba436e68c86952692cf34a442ce23d5ed5e7fa2f5f1e6bdc4c815db093fe7fd2d623c174a361f08239062c74105afca85cfd523d55b4dd21534140d4a214702c11bdbc5d93e0919e46790f318b4f548c1a806074492177a1699a6f33749ad45562722bf19b29ece4d2303a1e43f762b71a43cf7d326d71672857690ee1d7c3b059d9898790a037dddaa8d30629d42ca4fef28e96c7bf5bed82102f1215bd2cf4d44a1d73727635e051da678f5b347f9cbb26790545352794b50632ed68914ddc22736af43f04a1d174bad30ce6357a9d1f329a558dc71c6d802b1c8f2cc10052cb27985384622fad18c5c54cd1a62a39a9513a90d29c0520f6c779f40bb3144b819f07640f961a92dfaaf644a74141858aa05ffe98c880e024325be45daf17f677a19e7ffd0bae352d6b3360c142a8d16e6d0bdb909e83661fd8e721fa6a8f91238bdd215b4c89d09a72bff678524096c0b4fe42381d830b4483b0f8471f8960f3f3c6460c17c2df6dc67bcb7062bff7c1bbfcb7022887014612aded0902da8fa879aa9ba25f12a5c7508dad2024eee2d7b4633b1bbba9dc4f203f2539c87f8a5f8edfd09c9cc3377db44bc5c66b4f75def70195ed079672354c9b488572a874078d73b4b51c2e2801322de67ac08f3882c06a1aaa2f15721af8ba8c04475ab5ae430c96045315a922f3f40cff499282185c5381205a734a2bc3ac4f4df55b4f54b454cbb71f74d022f2fc44d9249c8ac9be43a47df48ce70b2ce20a814323e9ebb0724d41c0e363aeca93a22ff386e79cd293539611d68f0ea44128f45113d7518774d606d2a5fbcef8309e2648b9b4ad890a16378dbaa718638c6d94e75c959113ef0d254dfaae5b689cfdb17d6981abff9d07ac9b0a6afd1da007776d9dc23641b6f2e3c11932d91ae7b9d3b44426ff4d7b28ab249a88a855221769425809dfd198e921dd8dbfbb881caec94507bdd6ea6ef1bef4e1ea53a1be54035bcd8e025e1240e9ed55946db704022b30c33780d0b338d6ab021cd29c8b4cd1ffc24c16268a281d24e75d629a4d4f14334ce2389484662f5dce5d482c9ed383290fcd9c4f455f15d52d13ff5b43c241443e21e8a8221033c34ad2e20389e87843789b11262e05ab8325864be304ae39ac47d2b5aef84d2475c433460b23e370ca62438255699fee31629e0863b4061366a80653470206c138d0681185bc1e6938859183a7ebfbbf6045d1378056cf8408f31244cddf0a9eaa7f5f0988612d1746eb72f4219a0c488dcd4366c28f91a19a89347faadfed2ab7d418b4518a3258a2127e168ba78363bbe92a2a3fea69e9f615dbe14356dfb73c70918391f484758387aa87c193f3a9205d96c20188380f630df3d1245b45bb137a4ddf6f16d0a096070d5962d2d0f2fd131dfb61385b4cddee0d5998def6ba094166d32704cc798fbd2799d21ff5c9ebdc02faafc2836f0944ae358f287ab7cbd32138c7610cfe48af12034d4d9b727112473bcdf459c58e09a6c07b264cb1db6a24499922b7b865b8a64504c748f9adf8b0a286cefc80d42043a429a72660dd2ba4a05a2974fc3223161d3867ce7d832e16932842912cd2062d5436d4c9cebfd373fa976bff6bad0666529e97ad0fd47129d359e1c27364819f0a402d88516876cc8f22fb2208febde92ef8ec105ae45d28eb16d4e915691d7cad7043337c4b037a84628f5868e39b9e160dc40c5991fb4ec562e92c03ac5016913ef2bb372467f72c23831abfd92a9a469615a85ac5ff87564eee1ab56c03e2492e4705bd4b6fef390fed42d491d2daa8caa1edf4777ebf4c697e1d8fb6dcece80d5a35c85efbce62505ed580e5839959c0ce52ade0a1af969caeaf8b0b3ad0c8fd4f3f86c91289b1d6c8c89af3e1c8653c93250c965e2cf3d4e2e6cbcb206337ca428055ca306777e8a2730e108730b561e57a084dca8d427a120355be95acd206fb0c5c5f15d748327bdc1bda7f9c914298070902fbe51b82fa8fd277e68860ad9a210920899d1ef36b638faa8596619861bff5e7b67fa358effe4c48021313ca8fa61114ebf085206ea5971a657dcb7b0798b101be1fbb6a9e1a760f2fad7c05d58bd6223a8231ad2eb46fbd4ca5bea45ee5159e60977a2cdce57ff8467235e4c663d2af6bf0ca9bc5f8abf6de9b18fdd9dc108453c4f8d6779fbed87b69a53f4d4673e26da57ee0f51d953d7b61b6646c548bb1471b0522f6220bb9037af56d6b3f4700ebd5aa61027cf486b78fdff84849289993d963f25b67582c6ffdac5aebb8a29dc250d7791feb56404a23484ff84024a71d5244c3d491ad8472a49a022b16eff2166f5bf9090574cb4b2e2991fe6135a3f08c3227839b70fbf8182697ff54ad4fe3a6687fcc51aca7c85c30b6fada94bbf44921e43e2be18c3e17396d162252d5b1dbbafb73220e78f42c973d7070d22946cd1040193ac3f43850db7db1a30d092a84731ba619c802d13c91ecc458b5c8bd6b3bcb0f31ac9c184166ad19d0ccfde0ced6fa730adb5917831bcaf912414db1f001a3ede565f5cf060256a370b9ea7bd9f1b84cfdda0c76352a0c26bfd5603cda1d5848319cebce7a28c3cebc50697dd3478fe4ba9d4114a2093c9910680bdc1d11cc77aba18086038af49876e54607d6b5ecd11092c05f08a33087843b53bd36046f11fe28acc23444c6abdc7a831d89a85c4ee06f3bb341a422e28eb96a8e6d90bf4130b924b1fa7a319f7bce43833ed606f1de2a5c40bf6285adadb7815519176f1da714260db527fce1eb0269d5de03e72f63543b9ed3139869fdf90f812e259ae0bd156fae13e9bb2564ec2a75cae90b757400c8e3fab87818e872356d00462bed4dbfb8f9ab438495e212be0799b6a40794d5f5cee4e62c6e1b4db590e0df49564eabcfa0f3b197cc1d306c251ff1f06b296bc70a64523176eeed0a274622005e3004fbd6491ac5e86ed5ec32ec7005b1d25fd1708127ec027af7e7031a55fc4cfc21330fe6e9d6d35a21e55f7710409061298a8c087d62ff16deca531ca4be388cfe075776917e8f5b301c9e24afd9ef2d34be19d3afe8161cceab09b96dac04fb2b82a16ac56e71172f871fdfa793ab53bd0d57927f8652b95c02cba0510ec5b79651c55239459019f50c059689545b99351e819cd515549d08d71a3659e68a10aef23c95c30f66614fa41b247268faaed65087ea5200be5b67c3f7fa34f3296eedb7ed04995b2c344cfcde9bea4bffe2e1839b61b3bf923f9018ce52f3f85e4e9e6ffd8f96e98819ba4509a9f9e4beec73428d5b363d84992e758314b33efe6d05ccc6cbbcc0323a8e146de06efbe87efbddf07c4b605fd27fd333ea4e6294d5473e9ce71bc10cea68e0a20dc6193aa76b59ce212d453280178bca6d5adb286e3577cbe847ce41cd86f53b884907338bf2548882ac67cceea14d80c686e313eee371212db2829620648c19d12c25453e66ac41efdbc6a84246c58862009f2ce0c3d8a10ec63d18ce5d1b62ea1fef2ba5460bf260469e05d93b440bed380cae580c15034613c1602b1b8cb862efbc1eafce4c72ed045120d9ff4d20bb9f6268964eb1e7cdba34fed674fd4ed0963dc273ac612f1615be208bfef5d1099b41df6759c1ab7eb37e96cf6b6a2d3a43714f9f2c7fa75675da09a5d6ee4fa41cdec1ce44249061746b7c30aea65acb2a13be920b457d3a5e48d7815bbd6b0145b29c4c3fb074e7e945cd062c3853c596f8710eb977f7aba05f22868181e7849f3653e6d610f5e3435cb0a92e10af13e976737df8b23cf95d2557a1006bb7403ac12fd3bfa41fb3bea3ed8fa591d66eda6f129b955a54508c147dc86d328771af5b230732eae999e14a796e255da3f0ef2e3336df443c9b09ae835723c56e55ad464854c4c3dcadc757d2683abbd1aa138601fbb873d895e20ef4dcf9153e36a8b47d887e7dac40e420aabbbd8e703f73961387ab4042d5ff24f67b211af3ee79fc39ac6e271cac36408bd3d5a58595602e4c1b6792205ecaf9e8e5291e28257beebf2e25e10d0431c74d00069ba69539130c6c26bc1e01ea960700c39ece3e19b935f2aa4459d83d31fc0ca5d13e1b1202cc79e97ce71aba5261b8e9ed62d69c254b1beeadca67b07215a8a336d1b61997ccd72cd269e485e4fc2fe6d8842984fb275d632ed6ef8b1da751e19081c86aa0bbf4d52e3802c0379b4a1a14d00207986a17e3e589c03039ab340230e7b1c19eac0266d41b84b0ab828eaf00235bec139aa58c2d0ad76e5b2bf7ea52e89c7d61186504d534bf22e7eb44efa15bb27a79d242ac750053b9c110ae0897646d2070c35583b77d302d827bb42c18cb34cf2bca5c47790365c1b0fe271dcbed86e72eccbebb822b1c673e7b18f4a26bc4c97cb5ce9619c02f652373b39c0dd372445fdf831f3f606b83adbda97e034229e66014e47e843797e899a27787f68bbca549f562a9914ef1400eabbe1a3bd490a1e7a30eb576608991103ecd3cbfebeaf83126776c9715cecdd7d78c57945442de182b016bd6038948ea9309a742456a7737acc10248e3b5cef5ef8fffd09ddc1349fa974b45308fdb8a6ac4437e376524e46587cfba94f0f56128ac3193708d2db3dca4c9f32c378340ed71256da8f38769419ce7d2b2e0fa7190a77c872ffac271eac0cd213cfae36c83ed066bfbe890cfb10d28fa0278f8ae54275a4cb926986701e2e48d16a9f48ad38861f6883abd54648dd46344241cba9d6e1549c35a31fc022dd38cdd06ed08c15aef789aa2ebd160e19e23258171c5c970bfd1cbed10c116b0294de9c5eb7fcddb019cf28c0a8dcb017f3b6a23fee4dd8ddbe1a7310de0f4e6c689922d1360251973ca12a945835755cb1e8a3c62816503a23c0151ffa777fa392e67ef985ebbd1a7da926a90cf43918eaf63923c3220b535df48364e8dd02a466ccbdd33c641f0b34e60be36fa49cc067bf8d52a03150957231242732db649f8d6422208123fa73e36b1612dd3198ac562ab67616ec15d5bc54a57ea2f56fb20e4f42a201d3153942267be349178dae3a9d853c50bb659e35174c2e10338ee2ff63e989b0846d53d50fcbe98584a6b2069c645b0f1484675a2872ca01d7494420e73cd4de1d2034fd05eaffcecf9dbae7b6172de6ab0681be4c53298ab1661249ded61496827b00943440b288bfe5ef72f34294871fa44887a90ef7f3077071e735830f86d8da8e9ac4292de523861ca44ab12e52682a7f00ecd1498c29a74a412f957aea0029e0784151408322ff77548335ae4674fef68256c2b0abcedd70c1ca4b8b468b2c23faa1a95ea85b5206318d95302cfda1cb91ee866ab26feca4d29e5f22dfb8434ab71f9414ad5f34e019f331c399b77909f4c174c0101f46cd97d9f8a7d8b09fa5ba46da8bd5a62a39f4f4cdda652b312970e2635540f59d46fc79b22b7909c3bb75c808e33f908668d6ba6fd88390c0fe2b97977615cfa849ec9b0e08d00443461e2d54f110b65a3b8483b59de9ad7d88ee2a87535773b3925eeb394996bc12d8999ec8e13d05eda00ed883609414ac4b3b283ad9a68e7cc0ed72f75ab3d20383fae1a844fd1b15a8e4a55f84d4a44c8d32cd83e888d81a9371d01c74f81fea2fbf941b58c141a8eaaa46684403df13f4745a41b3af4e587566f37465d88d1d53d86404e6e943c9681d8854ce8a0da44f601a68a3e3b0fdf8d000748914bebdfb02b101b8168c260fdad1082acdf08d883d32988b0463aa82db4309739910a0586a5608b9a7c599139031ea84dca2464800bd42ac00a5820635e9e91f8afc9dafab3a21cdba6233ed77308ea02439a1ae7e7a1647a7187fa2177b356f028789e53ec9ba09efb6ae22d18423285e017f17c5a86de1955d1e92bfa86e9f4711359adbef9b78e6d880e8333b36a7791623da784f0e8660872a259718925feca271fca250dcd254c8323b178833b336901631eff8160ddd549133317d0294aaa63ae2e4eacd176dc0dc7738cf42fb64ad197af79d67be2ae6e27deb86d9be9c6202b44279e53f9dec0ade78edb4e5535ee548df152499a8044c2a67aad2b892b8a3af9602e427f3aa1470330f2774f65c3724a2fe2769031faca000ca9e916b5bf152108c8eb9f59fce3bf0f30c5b7aaf5502e7e51df07825ae2b8947775c083c57d0920960d12cfc8e3b04078ac0fbbc075efa5cae268be86029905c5d897052ef2c1203a98add10a42213dde9cd245f49f43d57cd9f815e3282bb944b8bfe23a1c5ed7b47ce2a0764bc093a140a2a29e09335207d7a87b22086ddc1184a6fe153f1a9b54272277da0ffd9dc01d492788fcaf8d5ac6345ac7537a481e2f09610178a27659b9155bf6820bab0c4c36bf6a7087d37d15e17c939bb3101da3ef31e9613b115ba88c7e651dba5090107e5cd6411c0c507e6a6f2d0c898ceb247d3c918f1c488bf96743a1088d2c6c0ce4d79d3698440e4a4216f02898ba8629c8dedf40323880481384734036fce0ed0d2829fa942f4d2a626671581147d3b741a9310c088fc649ab57189d20421e8610d34185facd32b74b0900e4f466dba8de6ad61d750255e560af78cbb9c36b5704bb0616ea7ba1ccaec108f7a80013a97be7c4fed678c4acc674381ed2583b6a0fc126e742462a390b0479a1953ce122b054f2bfbe099817416c95d7c9f64a6a5dac449cb98e371f6cb21eeb70e027122e0902e94665557ef2a887148ed27dadca9ac55ac6d666edc3d9a732c73839b53d776dea91303e1c8e6460466f4066c76bda670617f2c14818410be9997f01a69166ce9bce31dcfa1f4090aa365cc664cdf3cebd3ee72556c257f35729df500781bdca9ca3ed8edef4791ca6c1fc11740344d8f467136ca095da35d5354ff073771cd86f44a9ca71c978da1f32241ffdf9efeb37bf2ff8d2ef8df36d2c73fa9c908581a404a472b86d9532151273dc93341253c4574dc1671d032068e8ab87893b4b995bfea584ea637b2fbd749b6f8c43c132601fbb5f48cf6b9051fd969a56247d11d990056b9d73a25739935f75a613e8a7af35245f71ce755cf611aba37c56ad31d6a476432f974c4e47098ccd88ac47cdc4bf482395ff03d89cfdcbfd0087f7a5fe56ac65d25d107fbce73624e7ae0c9429055da308c45c4be058269665640618fb55283b59710116ab8bc0c23de9b808d71cf82fa36e9168e820ab8b00d7368d2cbda60dc072526b55d689672c1c03f2af3049c49ba1233d7d26104137330bfc496c9eff28a05e17d4579bd02a986a9ae4ebf756ca743e0c0c40d4070002bc49bcd5ac0c19ce8f873c7542e2cc8eb52493418abaa61960b9bacd9db48d337240dfac34cf9e010bf211bbe3db086f5b130fa455784edcabcf7d7031041f069d0a97ae3abec51f54220633cf9d682ca95d0d082cbe48f460b3ea606c0568f41f5265db13c78bd29f4b79c77027d42aa701f1428dea54ed32764dfa6e12da7d8fd069b46cf949b14d88b7cc97cbe6c39f95d52003892a0b68857cd1d209216c484149ecf0226daa05a45640c07ab5aadfc6d26b3974ef994d910eaf14e5014a7d7158b674d09a3107a9078815d33e867c0c9dd5250483346df7251bfcdb79c0a693dd01e594596dd3a05b8b682365d4993cb0c572acf85b1dc4b23a018556161dfad171ef862311c891e30030dc0b9cefbed03237c84a2d30dc8a0920c9eaf850bc4b461edf5245a34f8003f94fcaa6a06c9497a77790c48aa19cf8443ad1d21d342f273f097c26166950c91493fc7c8286b3ab6a93ff369f9fcd06f7fd14a8dd0b0777479ad56fa6699b961458a976f628584228d403a8885395ee2efd4fe80d54afd3d6abd425acf8a0e1c8fd7182276cd6f63d16364be672d59e876e91707710c30e1510ce813a5cd6713e9008d9cd9c6d836c3be2df3d66d8b9747a2bedee814d7cd9ca9a9e833c891b2f646ce4aca41b46a9319008f090a61e029bbc3acbe7b7e11ade14176b2d23ae9330c4317a322ebaedf3a6182bf58d9aae71c9d454c8de1f3a3cd62b07e65bf76abd21b87b5cabfce8401be96c3a3606a13e13820ca50c95494398e76b1f7394227d3118112a950fb00a7865ea7657540a966c3f335716f0b334bea39c8478e9443cf771c2e3fb7370aee58df283bda5c1fe2cbfb027681c81c80b998f848f1762c05b9986f11991de90169c70587839ecf23ebbee26278aa2f57b8e2626009c8a2e74b1269f4862e8b32e3f844f9cfba99d438c817d6981610b59030b23a6ec6cc6b22b4253ccb62bb864f70974962a7431f6283fcf1c56c0d900e7a31c9e14cec2d97c41d333583211f369b5430f9eae98944884c6d2437b4e6e48326a9b5beae3bddece45e9f2023446baf22978f8ba0b509b2967d8607082b32d6b3ef7be939f2097002ca67e5c73f65de8c31d922b432c861ffb7b65aaf76091a518e61bd538cf8c284dccf4ca728ec5c98394d30146db0242ab90b28091a72bd4d056c3c445ebbb4444651a6d2a87a56f5c74e4e75e792a1ca824540e212744494871b4dd173397a428abbedbe1dcf823b14661bc310e60a064ae821c5051f8c73df1a36f71d7abd75683c0635f284b69a04d6bc0b4109ad2c09a8b891f3a0780e927d2320d8a7c51d7434ec5dcfbb1736c4219c8c8b16ef617fe287962c70187cfdeffa15d801ba3b04f0abf8525efbe61caa1da2280709396e1e4def215997bc4b9994add7a1229c5911310ef9316e8308dacb339a2846f7e4359e482b9f08e7463d9aeac2782120b5a4bdbe959a435c448a60746a87f432b340542faa30f537419ea9cbcb624a512bd6ee2e7de0a1e70be27e38dd94045aa1ed4e9a05a75362ec9d90095768469137cf768654c1e6668290e906d0f52c7827548c89295530ff7561572a724e038b6d5b72937bcebaafe9bfd6ccbaeefa3180e9b0c89eae1e6064f98184a523bda8d44457562174dbe437174e37759d967907baf98b5ba167cede55700796f57c684fb6fa9451be890d388150899873737e10d48b320c4c804f59c72d6077feb58b64fc7e4562db0a902ecd82a459fdfe67483b392f928ba63eb57ee7a294653dc20dca75c1409a449561f665bae5c7d62ba11b0a0a3dc825baa680859ed759af56153eb8a55e4aee90cf1270aa7497b3304ab93d6deeccfd01e61e16d1ffba1a1afe574bc30a6b977f61013d158811cdedff7bdc34a0c87c386a7eca70f82dd25b7cac2cf51aa068b618b8cb40e6eb0df8696c9fe6fcf4d6708796ba5e10f0617d89e629f0153380bea781b4d0edab897cbb9be9cdfa106d9bfcec6037e7fc61d0eb28b61625b00f8b439605505644cb2dba9e70bea09c5152681dd657d09047ec6f1b938573e43777b1ca4d278fe2ef60b0db936d02f87cb11e8f9490fcde4c74cdf721743a233153912c4efe1d74dc66e79a20285b703df0c809bdb13a53d751209fdedfb77a722705257059004fd34ad6050e311c5a4cb1e197301b755748f2ad3d0af173abf57c8ca109687468c6ce693390b4ced30de4a832996953191702995783e8f42e2ba029a603ca907b1aae1e8253c27ef21e77e08f2c71d78c54b5c44dfddea1b9554c65b45665dfd54325acc16054cdc56e881394df7bcaef58cf5870c67a988650e0969b74cda6e7185e9e4d5b8542f27d3ae91ae40059f85fe5ea86ec4d2bd55c7544e4d03010273d6ae0d3d041c511c9f09ccd88c55766884f731c095262f88976c90b6628c558dad41b3225dc4d6f2bf302fb50d840b545e297927d60b1a007fa6e755bdd2de64062e4d6de53c9093849c826a227982d3f39973d2d98131716901b921e300a677c78afd9e60b222758bdf3d1921337e2b4026564339372f73fdbbb258cc1ad81711fb3fb30df55aa7709f6829db9ea1034fe8c8d6dbc7c482245ef7b0b0ad6efc8a0b5f6b4a691be8d9e747c5195a04e2306be2c8fcaabc871871b069a19298d88318dc324d892e595f84d21a09e6300a244c92c83d7073840964a784ebbf261c64d4750b566ec55ae5a6994a7aa3fbb6e6754c3ce9eeea7b4e6ae217a9d1a32fa399e8fbf8b7dd273f341f9d6349d1d4c5f0f75e9ebf32fe16f24dc15e60927143a487c11b85d248b70d34dc294d8a109885994ae2a6539c82c125ed2a86ebc0158eb7f80ee5b870dd999811a305136dbf62095feb81bf646c48fbb22cd0f361d8876eea6f65912e4e04e0d38bf09387b6b2b304e6b4abfc1c374b9c0b9fc2224e09a4aef72d448cee2ed3802fdac3e3b318efe39b00cc7741d4f7ddddaa5d417a8a6c150538c7a560247e35276839d0cfe2f9a1f11bf84d6a2e202be196235b62dcdb021be7d58a5eb52c39655f680ee1df979c92287e40c2c920791e4e888c58f9c6fc727adf2618d79e24dee507e8af58ac615c198a3b0b004ca4ea21fcb17eb9fe21f36e475b9423384facf7dc698a4acb63293ea961575690397807a18cd9c889a7679f61605b185fbb55fa4924b8f49736b59a494aa925e5b03a14bc9fbec8928758bbf9c9c0c16dfa41cb0a578cb4fdbb19acdcd1eec32f3cf3e4b50ad9467c38db6971538540822a8267308e2a12a36de17fabe93dd2a2739e4451750c28261ef9621e326a2f92edf5721ae7bf2c88cadc0a56256ca0b2821f48cd93d81bdea8d46b34463c259bdedfa0eb42a2ec83ee5d19f553cc214454d2222741a17debb35c42a3e2295ea920275e19613bc5fb95a1d5dac89a76870bebe89ecc8cdca75ffb5b4354e748061d91f43695e2d58be1f8197807efb1d14a3cb663031e4203bcd6e238509ce58de5344390e3e5398b47021eb733bae8765747248bed47cd22219f2804411127c11cddb95d15d77dad72cbcf2857bd32fb8293dc7c7b4717ec4267cd5e156512fbcfd9a8d9e79ae72624c2efa8ebc8569452a717fb87a227818a75b71eab7e5e329d34c0e8f124e2b0470dda84f92bb882a408f1d463b1f7969d27cdf458cfa64aa75a1c4e81e2929408c2a535baa8e15ef836ddecdcb0fe50da315808a7451f43ca8593415bca2843c40942c7288ba79796c7ae14577be3c9ddb80c64efa74054099aca627a806260b300ba6520655b7af65e598a8f03d9a9a6314e2f2409a542d54a488517630c5ddc29c6a002e90868925f62807e5ede21b4251e2caa8d25f74557004f3bb4f2391bbabdd0e9aab7665116251837fc2d0f7e63a360cd90dbf05872de96b40423798241a4b4b46caa08a294d921dadb1b11ea2964a8acea4db2c1d4251de89d60a859376ff4964ef3d935fc7a56d59fad5cdaba9a28a054285f2df8675d4e6973b560aa67d1b5913d6b117f149581c1dc1faa1ed6059ae347d47747cab97bd9fb6c29cbe54ec72dfe9a02351c6fa5368fbc3c63b5fad836420c2712a46630bb7771928eca53eb0ea11d6fc2d1e907237e9d46e97963339a7742a9f13198ec3ca924d774ea3b4e30ca8e9873e7e9433f2505401d1600bdd78103d6b35d6bb5226e1325b99b54b1c4ab7ef4112d529dbf5d5920d099672bbc6af30b21f088ce79fbbe1b86a01294149943686fa04435445b9a2c41c1a296876770b0c8b8ec3c9e08502350d537630802de6d8a0b80f06a59e7c848dbaa7e158b3c823f06b7856e81809f12f8121f82f22364c4a53ab0d27fad09bd2427113d58a9180231ba645361da06e51c637d334eba3f5fe183f95d84319afd6de91b458a9b16f108f8c5286cd69f92766c3a489ba2ad604e8e81713a14d588c2c0abd87b0ecba0a0ca87ac990e7923e5dbbdb8708c58f695ce70b6fe1d58c3dff401946996baf99e7e912d86574598d12cdf7891740983ccc64694745dc0e1d385b5de60991c7cab4e69a0c1e7f226b4d8a0907170d111b64e32365377982654b79826a5a1ed17c3f334fb41e4b36e36cba2ec0ab737c804bad4d2365d44e6c10832e33d73ce5ed4f6b300c1f98188fa4c3eaad0638350c2143d23f443ab30d17c14cca635c7d1210f59ed1930441cc4ae1ef25a88cf454de95b5f02e7379ec809965f9b167d4592f377315db107e238a19aca3401b838bbbe822a05cb78794a554fa524d8d304fd12aa0c27df6f3401136d2dad7aff4ae78680f391a44e24b4339a315b1940e7613fbe3a6b0e9c5734d335408eb95ff426a7ed956e67e17471d3f8192cf125f433d6212e47d6d0c511d3ce44817a34926c17a2fed429241f5dd783aea7b7d3cbc63f862931640ba5431bc58efab0146342c557ddbe0bad861e162808a4187e786fb31e54bc683b5f908adcf282d8a103ec65b7e1c5c35c326190b7a89ba9ea2c66529059d26e29a0fbd991b0b88ced48d09af5258f7b41a5b5898bddc5c99c8cfe53da8095f08ecd6a9bdbb303e51cc828c96fbd589c879da1b6655075f291c1602b003ed2e0f7653bfec27e6e46dc711394cbb1d90631c46de4663691b21fab928eee3fec1f9a9b3b765582da2380a0c17c664545a0f587ebe286edcc3cde5de770d5b80a3b938c8f0dcbda018a7a63da03a8f40ebac1ffe1ca5f9fa82edb3814abd1c77fa48dbddae3c112326d19a691b24f249cbbfed30023b37a7d5be36b1edfbaed4c813ff26d043938f3fc57b2939515fc1b1f738b5f1898e523dfb5c912c917babb105ae0b1117da4ae9b334748263c366bd3f71926a8850aae5cc01887aeded46015f7754827406bdc621330438de785982627e3a3f0a8c929cd9352e165a4e1c29b5e283d807dd3e411c6a2461ce2f4951bf7d44f7fe8bc1be5a7d2ac20716fee72fa2f4fea3636d8dc4d890c04998d9ccb6fe9b3ed4e5c76c4762492ab7032385493fe1a1c24398606a44a0912302f485ef6f63c376baf856674655908a4e640aac5135d70500208e0059d3220d33244e2989632e4a2c97aedcb7c6af798732723d50f0222d4020c1dde09b13bf43a8ebf73310535a9546817ea08c74147611c23a113d95edb9f05f9aa3e937dd06465bc89a8320ab0ed0c227a6d4d7bd220dd6c8bd4f98238fda495dcc67f214d09a2cd5cfad123bb8c71c293016d1da14aec33cc7dce46de4d2aad264ffe01c7cdfa63ac85b61c6a499fe0c1877257e362406c3720656af8b8f45c3d7b152f24a405bb26b17755c515b7f56f2e17130c985b5420cf1146997941ae13202ef5f07179749876df57c78768078024a10a338850a8a701542791ea2fa1d663b472b95f20d6470c0a92568019744779e21b1a26b62181c276bfd04d88046d43c99ebd1a870822cdb91b60b04613151144c281ca22351a4fd156ec41f74e52a52de4885a3152adbd046dad663af1bd774834cee422ba676f9439953600302ce4389491f70549c877c236e9270c4c1ec0f710709892c9e014e39479e4b280e88816eeea6a17f6c91540be1593dbc5b6d24c9c75281a48ee99b4db047fad3ed1602574491407c341aa01008789222addc118a1c0d40eda7d82143577330d8600a505a68f6b9ec55bc8e46f90c42fa129c17e8107bc47f0664a3b9f6a926161b6dc084768ba8037c8ccfbb856eec8090fa0e89862f06bce8647690a3921336ab2eada865d4006a4873440f303c176bc786466ce0f5a6a8232e1cbf86ffd058f881a24224fb160dbcfe3e88d78a25a16daa0cadcae47d741e19f9194da8d2a67bd991e577e6ea1284548eb36abebf3a9487ecc2faa2e788957004760b67922d70182183705d1234435c69c7f88f1d1b5e8a0f4d55c595c6ae984fb57d127b5ea0ade54994c0a83ef32982fbe5867e488bb22bdbd8e1b0ef1967fc8f5d4036c53444dec12af5cbaa780cec18063cd5416c118b92ac891d24865c60f0b6eadba8d63b4470b0291bdcbc4ae4d5fdae86a23f28db60bdba3ae28b87ff7d300a922522d5fadc66e096dcef699883689cb326c51174b57544518855ae42c10d867a23944428058b035c8c02746983633bb2c235f19707042d985d2a67bc8bd2b204bf85a3077300333ab024a8f82f383e9c781f1e570e0975c79a641badcf3649f29f14380351844ee10e1b91c7a6072c183b6a37ef8c7232c6649101d00694ea78d2a5a06083ee1de8adf5c849cfdf8dde5c0a723639ece6816305bad3081c7006100f272984679837b3170eaa779963cb99de2e2b21a17382d174f98f1a9cc53617f9be1873bcabced0024bc758e9eda7de7aa46a91ce854023a3f3001e2be1089caf1e870b6fcaf3a1c8210e1ab572f794b134f0ab5e6d64a7490e4181374ad85e2477ebca5fea05ed59f9459d1468d9bea8d96afa3deacaf2cacdd35bbd58f2f330972611773e16637597b314a6d4d025d33bc5a50de45afc9d9c13491bee10d86560ef6fae2ef3090bd3ceadb1206c3be3e7c7379ec23a9a4d780302f07968d36d85c2d81f52d4deb5dbb40050f6c61f6f76dc9fcf4b68f5e4d7697d4688b3de732570c79d9deeb472410aaa8379be4322900780ae97cbf5487395ab31067090022c511cf1b3dd6e2a789037f1955b5466504b18ce32386d6e4b9a0587e6c6c2a2a63a91a6bfef74496e65fdf50fd8e744b41cf6349c391f3ad3cb0594aa78c6e8c54a13e360facf6373af47e08239d12790e1dc49372bc248d457182f15ece8c1be2047c8e1299c6898c7b34a4c7925d4a1050bc6fcd8aac4c746fd7cd34c48955ad0d5b3b2449687cd0fcbb55a1145f26a34ae4b8cc7254886288d77ff389d2bee04dab3a6e4dc819fa76f6469404554bbcb238dcc1bf6e7811efd9132ededbe86216b6591fd22257d63eebb573082244c18f9cd307ef55171363e9eb90ca9740c3fe92497281687fcec3550d8f059cbfa6bdc70ecc88dba05bd9ec5e7fb5db6187716683058c04d68651b72b2ac6dec404780463d98520770d3f278fce30478ea47cbccabc9bd031860e674c62a880288773f5b7f4d901d624569982c1984954174a2743c5c93284081e81945d9a1448d8a6a87e3216ddccdd8f7c3263a37d80fdd605fb556d85f7525443114477889146795209258b62835e6c6baa79d36a3a09bbd076aba80eed71af77ece9323f0a1001d16ca325d28b85264e8ea392e8c1ab5ba1db9b440463b024e28a250a3d3d6e556ddac7a91f02acec85d22fd2a8744d8a189cdfddd446fa4f8c7c5515d4d863ec84dce0669804d05717abe501b9fc37ad0949a72099c7336dd62d9249adc590acef2113443e3441aeacf66d596e897262e65e8218130e28c189bb20a4c958bf33ff48dc88a7266bf2cb0110db372f82d65adbbbe2b62bbcd2774904869521da3e6b538531f370f852194d7c14c132cbd30bccf729bdd93e24660620364769b64de8f34b26e85acc2b880fc222c571200fd5302805b8b474220d8352ca4576a970f0a6d23ae79b6061224dae666532324adffca070ce63f661cc50cfa9eaed871b6082facdce76e9ce0429a4513d7e602672a2f2afa6dd25ed8b3c4e92fca25ae9a5ce92a952c4d2070dd373b60d866d9817f84ff95bd3a5d9cb2a2d648dfc59b4cd2edae348c597f7b965f3e190d956b39b01abe615b70dfe9699078fa251711881fcb735833cd437cf86204922e69bbe82278eb3cd27ef1d3efb877e1264d1cd7476a2d897f045ebbe5a3b378212966cababe33676b320dc83f3b3b5ff7948aa5dcc2d2abf832ec51702e69dd0f868ef1e5bfbc828fd943ac82eef1413115484af8b5a53bd440d8a4419539d5f23723682e1cd9f1a7bd0be3b5be6cf33c84b3a490468b1aa69fb02dacbc9975b2d178692a94bd13e717c21e196be428f2eea150473aa9a3517a8805e177ed1b2f4af776da1566f00b503adec1fb36393eca889092dacc608883de2810be1ac0678e12a19361fa7f4cc8be3efb30d542d62097c7902269249a802562a0659718cfc0869faee7a0ade925ad5253e5a205acb9740c08a53f3a04b41114e019c3147cc76bc47e02ff33d4f83988f5301b6ef45d6568d90fccee0fddf859b7058278545809eb926d06e85ad3893dd214ebb05219f10f80481cd3f3cb4c3aee0f381a835031ec619eb6f1974f852d1e4841189163a97693aa376255b55c0837c5467515df0042e2203aa4ea1d129907fb546be2b605a3767f51ab7bb5b94a3c4e710ba7b5bb91fa10e239159359d5a0862715caf2b0a245750f5c1f024f783bf8a78a50d9ccfc7af270a28d428a0104d124593b0b04edf7f535cdd0220a533ce5d30fc7da0d4d58099f5c1378093848ef30934418c157d7e2567e275470a21353c635ac5f81f5f6ad004a79a734fd49209d2024fa3d595e310743ddff754fb36c170c7d4c7ef68e5d1a1f90ca59ca47a402296bda201c4b86fd8076de87bfb20e46f4e55609e6db2c121e111fd3ac9446b1a7dc0cdc4256e62195c93a20db62e8d7b872d036c55c2fb1732edf66daa4e5670b124f8c7c1f391f1471f4a4da2c575bb7da4c16adb0144850cef9a2f7eb0cb38140520899834a978bf04a92ca122090cc1aebc577724eadbfa686da3c1c023a7cac17aecd65281561e0465fe41a880381a4f73d1a0e66eb5383e0ff9cafa5cbd8910eb19c29fae36e57cf081c96e2b6840484beb4aa7b2733f843dedd30ecb05fa7bd15af95420761f212d21a3b80b950b23fddce853e7175b5559f9ad8b3bce85b805c322f7550f79aae6eacd029d1bc3a7a93feb0c7a579f2b3fe461b653e92a3e95f1870147c81ea3e97e67001d1e716004f6e6ed8a245fc816cb861f748415e4512374a31f41ed0f6cd93790f9203f1e259a227b33a2453a3390631ce53a40ed008563daffe3b4af285c98eeda40d51bed2279d15028ddee99050996c2f55090218f18617dbe427c87e0828f5b7b672ff1578632f935a7de62167ec12724009d119f1adf000665b278f777e1580dae93f5931099e5923adc91f79b1480cb539d8e2476abf4a8e4f35ad56d9678e47a23bce95ca205402ef98a012c87d5c93dc8cff154d8e436766edb75ae3d8e24544ddab0f4dae189765eb2eafe4144aceea60c2526b134737b814be7e71e9c70f95b21460fbc7a8b67a5074fd84f0ef10c9648a489696af11af0460b8f06602ecb12c84693fd141a50a6145060494153e3221e706848c152db775640b175755a34458a210812d36d5eb7118840a210d18ec5ab51ffde1aff924a348f89d2ddb7c591da1bd06ebceb0cf54c428eb4406612989c88478a7a4cff9a5f9ff386eccc0aa0645a53e925294a04fe969e930397eb8dd9819693d3de9621b25b8948159e09e25779d8aa9b9e023308bde177757b06685098790b6b8e210613d0be693301011c5a9d5e9a63fb60a52920e711fb1142035ab7f8cd53be1c08ec0fd4a61936b6da79e0bece6072f4a860780ea5747dafd7a535ea42f0e38684dc29b2f443cb2d51bca60f66f0acb9206c6d5d2fb89512c2611fb1122850d1a3c709625a08b13483b810af39c875f53301cf66539c6290ce56935226696a7022131470fad637a857cc5e2b27537c26ef8c2eec77eb3dd820383df5e222f71b97d0915dc3e174a2de96ff367880c353a5249b581b831d0d7e6d7b5bdbdb9f23b6cdfce16da3202374653b54fede821c21668799affab76131e83924635005e3e33e44ea01f609c7602aff6000d27090271efb96538f049c5bbab6146d6b6e7b707c0919799423dac53ef80db163cc64c89b4147c56c345c4fa730e8908825ee05a8fb16fef7f83225eaf9c8b39fc75fa1c7650c891efeea102d9b231c48bfd2a498a4522452b7c411ab6c386b4a700f1ba4291a089f58194f0bdef44b0601ce91471c840e774561bf0e81d9c1df748a2af26deaeea35226db80f3bb095adb7d889ac5e13313538b2d8bf67d128d3c38b796391b960846e3551d97ed32e35197fb5dcdce36e2b1ed85001361adf23f9da61927914ab192a5924953d9cfae0800a0ad1f7424dc9ca0721813a720cceec8e34acb7b4ee6dc427fc9bb1dc275d499bc1b1d622b06a4ea50ccea90fad9bbcd7ad012307adfa06ec23043d74cf550e4d93ac7c55c9f0281754acc449bdb14eba3e0887b678c480fa4ea48bb6c07f7f6191ea7bf2933df86be9950cd1c185d551dd7699a8fb7cc8d648a39b45e9b2c4da45b75b192b5731a194152cdc3c3497825734ff16c1be9b3c53d2264003e4b09cbea15fbc8cdda50a1e708d9a13e099b953d5cde7fa5b270f743e7fd25ad651cac8668bd486fa2565d3e84463da9ed6e23bcbcc1709b4b13c119d08f1594e633989b4a36a7bb8edf1bb50fa27e423658837e798dbc270316a4300b03d9e81ae563b140fcf0f78f770719c9a67a70745f491d79704cebe8e66a4a32619d7670ebc404b9fd80b71ff2e3d57fd203befb4d52a1ac76be218862e84bc026b6fa34800ad9508186652a89eb5e9e5b453493f013ec8ddaca80217a5256484a1e7eeb56bc27baf78a00d6d8e30b79bd01b1b653c6b99e176ed22d9ac88f25834ce0a095423f824e16b0072262b344fd37501581371c189d7eec98d5521b2aad69a096f753cde328093946a8bbacd258349773c670e497432b55888ccd44a1ba3c2e5c661516d5667d3ff77275877f93eb10a4a800415307a3dc2de547bd482fd2cd5def2896a50bf8e8d9f2f8fb68915421a46d2021917263a403ea0c4920538bd2d84f6faa49d73ad1cbc22c4783de0a4fcd152826128379031e6e14426a5d349f01ce4131ab6da8b3f49cdf3f5c50f9d7c2c8ce0ce413bf2809064b7614a8571a4f40e213761eee5361bcb8a2e34bde89f14f9608152ec0d35da36753f8225110368a1276b3b5a108dbd4d1c34ffe43a5375380283fa526e5c618b9ac35d449ba2b2fe43b7965725fb2105931f2a5d0bffa99cff3a6bc176191c78ddd51ccaeaf80adb82932b64aef3dcd5e4c3738c30654dfd2a905d0d16006c8423d5872846af17f6a745fa47e5ff00202596466c527941bc9144acfc2b1525cd4adea1c6f55b4f92fe09d6ff90caeb7b9547808804fd51fc2e68e712dcb431a8ffa9ee75c5d46392f60864fb7e17484af64b6981b355f0f90375a2dab01d77632b0d2c527313488fd98f0ef6651ecb93d4d225b88d53a1548bf32cde04dc5d4afba3a3a61d53611b7eafbfa63d053ba1440de0da6fbe79b57fc95e4c0e21e8fc6b4ee070bd97fb2b16aa6da53d62f9077c2cbcf452ef305af44f2ef47d3c54e03ae8ac325fc55c7a8e8585f3c5404b64b45d954cd1f90ee054cbf80c028ddd648032ac1122e539c0b5b5bf40b1c87b85a3165ff003874189a87174fb1fac4d7c8237b93de0d586868df06c2023a6d1a1c4e23c279a4f57a21529ada1557724d02586f56ea8240348cf885fdf32b2b02c72cfd4ae771342af2052873990f9e53347aeb80305dafc9aa88a595a0cf02fd03df5235395ac6f732dcebff04c4aa4eac1ad60c52db71f85236d619474d3869c1690821ca111c61a5eb6e28461cb2a4ec2318b35d30306807ef965a9f02c45017f75ac197c81f139018d80d3ad6e5f45c25340d830c7c8d03cbf01e161cb13638dda5772d597f373ef040296c65df19b492770c3d1c7b3a78a58e97d89ce352cdc5d758d88db2de2e83ab71227178384709fa6a2c4e98a69c8462a55f5e1190dbdbfc571389461c7daa4de6323c9c2ec1afa7c7cde45ec5e2c8069de7a993c0d043e2f63e9779f5d2e94d868a6ba831940af7145334bc3094a25def6d68825aa7105449dea35cccce23b70a47f2ddcb7d8324e43ae5819e23031d2aa11504290c10187c53a6f287062bcc061a8e349f2d9d3a3c464eca8ac0bca30881cd4749d46f2726ab44b6fc5aee4960f1d96eedf2a3f7963f9078c2801b52bbbe31f285f41da6745cf956dec2a521cb6b4c613540036df8a20a98b7b489c1ecc4bba1943c6aa0f4042d43b9172bf7339b6264bd246f163bc720185ad21de63daf8b5101285fb9927736ed652c47ef16326c0f811c0890f92b4d10c558aa3a83dd3a5e284b3129f7f7abf018acea2a0ecd385b6bdab430563dd9bd71c8d8fcc414cd85506541986699453b1f484fe3c319bd1b4139e002453c1f97e55c68807860476b70804b3b75221298265d03ca419711e8138b65ee40185419477aebf4642d404d7a8bb6b1da75ff14696eb5aa07006d33ea0349baee88c83ae8ae426e144d0091fb65dce110ad98cec3060a68973b28ccfb43a45a87e7494ff41461bc8b3915819b7e698e135fd81dae6a2aa62a6cb5807e2a6cb74014e24186f62163eb58b5b88930a49731fe4ac4b7f087c3f105f005d23f32212c8ee3bd3e68565c250cd84c91ff7b07509ac754063408b628c54c8fde055f05fecd33637a425102ee2ad27da106f1a4111744b36940ee222296665e05ada179c5ff63beee963af85f50aef41b106c33cde48428ba3bcc3b0db37b21147e4cfd97931133f4632f04f885613b20ef7e61e616b9998d4e080d53c83afd7279644dd54bac8b7013e1c10037c4fa9edc1145fbee82e6bcb3ab1bf853f051e0b2ff7ff0ec1003173a714a9ae5f1d10634ab6cd59a5178ca513f30ddea0003e87a30b3858f4c64d7c5f511309a2437db0c880d625ab20a5a95541e8dea1940a52770a3a2a85f0c39ae80d40a66c331a9f84a7b58428a577c26bc634f89f3d246e2516786afb2cd2b498d21cac94488fa0bb70966a0761191e3f681299f9c9d811578ada09e7c839d0b2acfb72f01660e45a7bf7025ec5d78fd13bdf6f0b9bf40d9f026d9eb1c5f953e1cb22d1b9fc9ece182fb2b9e4eadbf56d7c524712af852c4d17b3be16906ae425c282d743750a4bce95b26b028f6e4576753a33aa9639ba183563c2d1e1695872128fca84401d6d6fc907cab40d9387ef1f47a6c4075ab600db9de35ea9c4dfafadc28acc82e375dfa22fbc89029bf117fe23a120ddfa4b89aaad524e36f3f16fb529aff7bf800c6bd0bd6caedac68b385ea0f5209bf1fa33bddef2ecf3b36bff78587aa45208ecc612ccd948ee88fbecfaf641583aaf9f1d7d063b4c4a0fdc5f6816536b4938d0f0f8ca616166f9285645be8e86581051d56322d0f408e2286ffe3d68d20cac7d4f1c108a1cabdab640c329248c8d989093f67a7ecee3372603bc7ae637df2566040da917350e4ff1da01cdb172d1b701ac265830b10741a17741cba82b516ad38980a0ebc589cd02f805d20ec90005b14a2b060bf3b9685f234fb6ba90b6f185ef8d727c73b066d208959100442e600a778c03f0fdc9a2413852b0fa0d96a1b52e9745f1bf3aaa851d8f88f1a1b077ad2db421bcb03ab45d92b2a24dd481ac10b03808e6f04130ce44042598d01a8c00d40d87bd44d732ce3fedf5555aeb95808cd7481cdbcac17e8675e375a19cce4d4465d4aaea231b533f73dba7371d2c35dab6e11c7c4fad9cdc10164fa9e017bdbff821cb41f7f8c175ec4adc90bda38055170ccdb2527cd20d88f762b58a29af05877fcbe59f4f5d0104f8b0f008bc3dc3bf4af3a7341cca91242c625195b327875c860ae903281dda41420cfe193881069040a86eca79001290445281adcf8db3e2a46bc3083c41db7326d05ce69da03ef71800480a207d24c5483efadd472e97e8062768dd3bdfb0f91ebc953111c70a57fccaaf3a36c252c149a56705abedd8f633a36d45587aacd057822cfb8f9f226d09660e7c6f491608c42ce0fc83d4d0538595df0901f2242f9e2476e2ff84fb4c41f20335125255f1e40cc603661a85126df5a871d84145ca19fff9256ee45fa7e2d38d597d7d4cedeb904278e782a5161efd432c3eb33d319d2810f59a6a3e03fcad08978ac99f3a0b67b56a8715c3b3f9017a436b53f0bd61678174b60e0dbc6704b26cb999a52509995de7e7ba391df98cc3c0b27ee33b05ebbe4b3fdc9fd34a155b8e350c1be0b294a81d2c39c2c16104c9042bae38e8d8cbb11e5e59e2c8f5cd50f64028d5315f64184197416deec06c93142538c6c4e04c095ba5f86c78f20544160da552abd805f4ce4f69fa229c4ace8002301f3b80d64d8f4857d097e10a086058945d80a804b4c01a29a6cce6411bc9002a5f8f82e8a87e44bc714910215a95ef5bf79bf9dcc2cb276c3370cba5a7b2806664123ee8f90bf88cfb367eff3a8f6ec13d5eca59bcf4fb6f5b5cd28774831a6e166bf70bb548323f93e851bd0fc8978542e02d5742500ea9840fc4356081c49c779b59b533b70ee7f230d883983a1eacceed4a3e70c5baa1407b7860b949175cf9ece4100040f1ec56c2d121395d131d1aa6c138abe2f684ab5b429e46e7a842a33c5067d2c4f534005d4cae77fd6e934bbba364088d83fe64c1514e6fce8f6530cfb30cb2a6de683a0220cba6ac92e11e7170281b6f14d8525d569aa076480bc4685dcd8195e8b2827f2aa575bd1b0e39cb23e7513310e1e6130fa449ce6027e3f4fbcaddb3d0433c803d90d4078bc581d69ad0b483855c7e6e8cdc51e3980bacec775bede87a25758455a64c8684d5e6c7cbb2230d6a4f67c3edc41101ea05c7e4b803c607bfc89e1b71948b06f4b1d81f31dc87384a5ebcacb0831a14b969a952fe6edc49c425c4722af1444b766631dd5b2d079d2650608402317fa833ed85ce9eb71180a9342434d8c72783059204a91ea7c1b48c7f7eeac56795a738db313f2bc4a84909272848a8794ae6bc58dd74a3f027488642d3929f51dbe7b9f38d6bcfc8e42af63b4a8453d5066e2bc340b7d70a442c5fa6f194a785994ccccb919b5de28b353460102c7efadf3a452219e989034cefb88da3acba55a473c0de47af77f038e127d3fbb8bab2465398abc8a14718f6018653e46b731b6d0bc589b074df5bf1cbb00763e25eb86e285a52c4554852ae4e320b987692fcb92d9796c30166c2d69823f7f44a73aef6dc8638e18669fcd51894b0ff202cb7d729db05140c5270dccdbfd028b083b52e3ef975048cdbd5525eace58d0c2ec2f01ecb23a9af19638a072befb4cdd876ade0b297cc6e0d95780d25e1cc2ca5855dbe1c299c1a28e08693b3ec2fa50af83300dad8e3126df5a30b369541f28f541f74ab1237dddc47fce45872383a553c53bb92ad4cc199cdb658ab556995368c227228210b73843ca28e02d66e59277b2e459c903dd38be4e73c47affbf2c3f810c0c11269a9014fc176960abcfd921122ff81e3eb13275cc845bce49677f68798ee949eacd48daedf65f8f41d885fd68c144d8ce84d64cf2fe8d3c6a47c2af8c5673f96fd613a98069f4239a00ba98825166b0fabbd87b415607e7917d86c93302a52a9475d360dd8afae92a4770d027ed486e65252f3d020846abfc48ec4c882773b2d13fd6e1822a30dcfd3e5db8df83ec438420a441bc168c1590b8fc02afcdbc94aea067cec951256df150ffcda06fb8f629fe1133450af6fba67471ac87d0ecda31a6bcb37c95c40167e69761f3fac9ea4641a17086a9ab357711c66e5290059ccd2a930cf961b06ac913a0dcfe8c154238956c5b3e4c2b137736fb173933779e43bee397bf5325812ab124a3b959ae15129111c345fb62fe723596b28e9a506c1f9b4b0faede4d2e242d7068286366375c48295b728682f2822cc26ac9b7d39260a8254035e402fc9f4880e233117e6c6cc088c629c91a3248eb3289df7c592f28bd289f91f36215b681b2eca387451ae610edd71b5035cfd5b94c65a6d251722cfe719cd0ded8b21ccfd5e273e1422a94f66da0d02671585f1d0df9cbe085c2699342a8a68be70fc27830716c41cfb75b5e7228b08cf806496ba84a288c94dcf16f00112771be9659ddf139d7ed787b7b198415a41a145935a9ca843b7d4bb11f31a115bcebbcf6af1d2402a5f9e06aa3093ed770c2b63a6c5f17b4e03a5fe012e53227561d02637bf81ce8c4ec1c3c50c48cc1c0e44400a853f4697dca2ada2147e312e38b1a2a03dbbc6ef48cdf697d5f814f4b7eeefdf25168ce329157ab476efc56243148f858d7acef342f17d311742d9bba757c3176522189c2870d8d3b7d141c4aea82bee1d3c7de13128617d31f5114b78737094f5295dbf163d908d74a8a0c31feb85ce0480538e048fa470ad4a262b1ebbf9d48c2f3d363ba8ed826abe89c291edb45272835a71a2cb9c02aec7fda179545db7a7f7a05c87c507f9312beb4e7779c5b9a3c4d9229f03425cec5a2a3159e16bf4a4522d9623750f4cb7e2c178287c069c68187a0b985a9a01a1a3c67e035c8f44f14e40ef5804f4347005c3cc84ddab2aec1730d9be18c55b94d4657cc90510795f1d0cb56a5f3e9928f55a2a5287ef9e973b39be29341676aea9f6631c6da75ce564d5a4209bf6b823cb0af683017050bf12400372763c1cc83da1bf8168c9f531ee19199fc7fe1fc03a3cef11beb88bea60146b924aa8cd12d74bbfc985bff12748e70cac7c4244d6c1647e5b845630b826a19134ce4bdfb73b489645ffde3886ab3cea4ebe539922ec8bfe0ce292eb2f7d379a03bbfd4b5f02162bc665f46b9fc997a3d0268d3b7b332e420397b07a15383d99649df1fd6eb0c4739f4e3abeff55af12edb0fbd3aa78cdf5ecc26901ba8ac46bd67a4c1dae2f1caf7671307b9e70acfaf44c820df44552688dba1b4a483a081c8485f803d7c5142c5bb7868ff151372b4c2638a4e24b2b3e031b4c77d677c2d3eaed651a4a87c30a2f6ae7e9217fd8fa5e18f1456d7ded6635e02bc68bde0de5ed1b2cb5fdba60712303d17b1e3ee43a053f1300d46d133550df1a8daeb0440f89684d8d359e0cadc5d4c5b7fa10ed44105cab08dd88d995488477350dedf0dbd28d8cdb86fc766fec682ed6ffc45478539a30ffd9c82f7e17a8d75c77bda87714d6dcce15eb6666a1d2c03fd0a66345ba55625db9f9ee454aec5faf7ae1acc54508c23cafc5edf7915eb2b87673f390c8fd8a4da49a9a96fbe7ab179e42e929415d374c7b7ba0ccd6e8c592e83ccd8cb0533e119f7338dc2c6b7ef8b72bc242cc58454504cd9f60a7581b1c1ad0e2844beeb44e60f78355ac21276e69acbed54cb30b94ff768343ea4371e1dd407053f06e372c69c8c4a0674a5e5c7b03699b696cf6b4db07aa19f46b4495bb9eddb60613122bb25be3c0e637aaddeb08377f03ff3868f927b434d608b79ad8abdbdf7aa7ea2585fda4bc8f7f6366ecbf1301516389dcaa5dad39d5e556c6d87cfb80b3c81bb72b99457d91f2ad24d00098846f15ca2fd091df2e05a007ad01a17fedf66b2f192e8932b7f06110a5460caa1641b1c673875af1b8a02fe4e553b7de581987a154aac4a2e45a4a3c77512b8c238e5a7a1ca5620f0853a30725add898376309692f25e5964523a8494e5a487ef740929567566b872f32c3f14331e8819b8d120329f901b83a883663abbad541f84541bd15905fa127628d74abc45ebbf5b59794ec73a0d43b6b5e28e47067ed5dc6a84e9ad6291831d99bc766812b63bfb829ac916eec33ba8ba83657060d26b41c2025254aa834380e2b0d7d80d3ade44cc245e77a9cc02b186442423ad519960310deb7f37d93bb61d3fa9d76c073202b941fc17505876c07db7d50faa8cb277a61b90f07653aab49c9b84661cd582a96c80965ffc4f9373449ec08379a5857b7df7aa6ea9171340ada5f2bc8948bd7ecae0a6388151b1f15750b9355d8ebe2b43c3c63ada3e49d30f10aaea835af1857624709e4bb68398a228a054f896579cd601e5436941509297b178b27e08aced23c5da9f9e355e999a26c65cb1bf1d684cc3dab9a492caaff630bfd1db8a619f50d343f7c5073491d6b7c1b5c95f2433799d7f610e9f0052b718b26d86a52c50a06f22393793748d1720153b79a80122b87afb2980a5c6c0cebfa09793b5f34eab565059a0d700c1251996c13a8608826784d61fba280e1ba4dea10bab2cb346ba321b577347ce57212b4a8d5bff97d59f7232770a8576b92bd964c16723ccc83d95e270f03e0a86e2801427faf03b9f6c3395a54544495c92b196e3151c1fb387ed6c6ec8b72f16a6076c5a2bdcf09a9947329f8872eafd5ca6390e9d270467d8fe2d5d2c86b7130af4a3f9e223fc543bcf49c57716554a9e19127bbf36a20c76dca601043c60d056edbb367d97c57b1b9664984624158bc631d7765daa04cc5f7838f9fad93c7b20085ac3cff838dab5294c349bce67f039768e095a30595febbfa2b13d7cca37b63c7f9fe02d83cf9b9a85d45febb8bbba333e42ea6c6bf913ad414c84383cb3afd4ce551e7c68a033fb65d464a83b042ba1e7676e9bdd055fceef6199d2bdf2a8fdbbe8211f3c24f6027e02ad93b11aeb96ce15bc74082b9803bf00bc1049eab41667a9d6baf20e59cc1bc627b7996956fc6ac15435a235491c758150bc127e30cb3ca828cdcd4fc37229661b579360921ac704faa3f6f0af2904076eeccbc28ebd6f1d5f2d434875b85c62c373f4c86acd29030c56874dc1f6b34d08e40974635abbc1f7a70b723e2fd727f39aba6dc29f26465b4f63bb3129e07aa2fd63c2e98f539d44b2cca3a719095eccf882897438eba403c7d8f2d23e98f1328ab3aba5fcdb1ae5c01fde3a778023a91a809f3eef7d89bd3d1b306071d75455352c49ddf7335a74b530dab80dd2b43b6d4a9dc03bd66b4c0a3d7851263ba5bcf795895cd0f35df8af54de8883a232afd41fc8c581cab70ee78c01b178e69c6ba3e6ae501846ad2d635670eff605a5bf2de5528539ee4cd0ee11fae5205b746cfd81686dbad72f6197cc1a897b5fadad9073576e56bb45d39b5e0297f8d6c9f1fbcb77e615178ef6124b9eac14d9a83aba0b68f67ec821690ca1cc31df6cfeaa9d6f8edcfd414aadc26783184616b08556860dd8dd3670dee1e635eca821373e796bfd51aa1bea30e61a68096d2a782460bc7104e13394ae665d8f0ba765a30e0fce92abee987119fd156ab86b78624f23eedad9a26ca192159c1dfb68e4db1adfad1d5dc655edf869033b2676ea4c8e1375396f61d2e2639c96a4049b556f80cd94d31b504653bec23250814daa4daa896ce8b0f5453e2a240655033b0021eedd3398c7f8e77a51036a0a95d4a3ec9edc34e4081021ea3a125d32f1517374640081cde8da70e7ea93ebcfaab06bc2dd37ad6a0ca5b16b10edab0ac73d5e20d48815f3e647d9930615917b3d9d40e12b6ade5830e9ecd3690ee063cafa8a1b0eff31ad2f8223ec01c166c0a05e6b5e685b51a30d8b72f511e08062f54ffb7662105888cc51403af1d178030ef65780e7035205673d00a1dde88d6aa36d6f04eb0d2da476ce764466bbdcad1b6ca55d27f80ba275ae9b8ce7a3e019e87ac75def848a5c496b0a6f84d136b75f3ddb4e37a13215ecba58df6719b30f10fe3982738730f87dbc2e128da454c5b17f6efa910e2430de01c8ba27b04dbec33159e70c75d9fe464e5c101a2d8bd22402014f96a3ce67ae6b4bea0faa14e643f765d520409275ea5889b326d417f2b3f011e1095e257b35c7ee78d25344c3348cb2f42033303124d039578034f138904b5c1ea9f7712e0959c37052ea344ff0e5920d41d710e9d1ce3d1f02acb86ad7816d50d6bec4973e12a0f52b670e927a47469373e2af5a94de54bcbda154f680f6006149ea58f5f68d062fb476e85e11586ff80836893e78f25d705545ea816ffdb4d444444844899920c890f700e820e79e8daeeb5d9d62783120857549ceebcd17ad6fbec673fd082160c6d6845d1725c47b2df91402cae377e3fbd44f69ba2bc45445394a85cb1184109b5769725905acf6c49100a25f87624810001ff924038b2bdb96b6b47b2406abdb938e5bebec5b5de384e39543bf1b3dfafcd59dee1d2baa0f4f976505a204adb82b2bff3bd44ce52ddafd53ec704ec12d5eebeba146f992b9716d072dbaeb34fdcdd715adfbe78872e51bde9b72b2839ef6bb0a8876ff6aba9c4d66e1c3073f8b8946e46d14596d352c859fd1de42c8fa24b2cf7b713eefb025d31d0f97e9317e87e780e75f8e1f98703b9f9621b88dc9b839f158442e9a5b4ad2e415df5ab20d582dc2d83dcb655d1ef971da2bc457e12f9d96f6950a640d9fb5150d65b6765a4088bb27bf77d7befbd17dbeff13695d89abb97dc5fec4a6cadf4d3caa0bc9f7e636a89bad9ad068b724f943d975db991f5a1de72ea0965b7b6f6959edfee5e5bb335eb53c3226bef4d3472efbdf7de7bef556283a488edbccf8bf1d5480295a7877604d6ccd76740e599a171fc11500d507982348e7fed8ada03228de35caa609d62727262a83c3b1ac77f47abf2e8348ebf0e0c698e1e393b95553e8a35de78166cfe068bf469cc8dc679b3b2c4af3fa3f2d8549aca73368e7ffd18a6115ff98b20e9e3fd75168c371f090be0a736778fdab1c1dffd37d6568cefbe2b0ff81d4e95d81441d2a5348224896de570fb629841533c1b8f4d1d967cb98679738d7e22d4e17e9fce8e36a693366667cf1c22c6db305ba87de81eea0dce87fbc9143666cd3662fcb7c2bbbc87ac086aab97a843b6d55e7ce5efdf4b78c16633a13614eacabfbdc800e32cb0b5028dafa15123a3bd649ff12b98a0d94f7650b9fef7becfebba5779df8feef3ccef6d4c2ed73035f065fc3d77bfe770e77da5affbc8ef4b52c8e795a289f36b4d6daa1fc9fb14c8fb40d3acf91bd653a8c8ae45f6570df9de88b32a605304c9e70d11e36d0c18df7d872b60936160d4f7e0f7cc108448112d4bad72b1299a19190efcfb1c68613f76e8f4c8d9a1d323e3d03df7a89893a92c9935cd93a4713c87b31b4ce3f8177dbdb9ce5e8298a406d90645cd82ea2fb610d93f6c1864ff1c3a88ec2ec84ba83bfd43bd0113e505d9dfd5f9bde99efbdb406193064a71aa2e4422427c711e35579bd43a29531f02dfce86fc8ab3deb30cb5eb88033616517bf196a30da683ea8b31949ead65b09a43d97ecffaab99da5ab52b5cdf7b6b2ab1b59aca7ed67a54e457bc7e73d67e77777777f75b53898d877dc8045e23caee59b2fb151e4affd259d554f5bfa57d4110aff531bbedacad9e992a19b37d8ee32cc779df7b3b5b6b55fde87c628eb3e1bcd626ba26cafafdeef5201a59916bc47e29be88e52ac517b0bc235729a4000493bb59bcdcd85d47baa54db58018348247ef7341cc22cec3dfbecaf4cbfe034a915d55a3f2968272f4aef39503b3ab9a539d1f2f10b2ab5a839415cb11a054a21c2428fb1371d6cd8ee5084eb2e7b476c94e048927ceb25fb368cd6bed1d2dd79146509a5c16459ffd906b26724415a15cb3e85d9d4404092167a9ec77b6b8e65ae46e93f8418da69a4c80e92feec572f12bd9519a2c7255ba118b1552bae3bcdb8504c107ef7dbf6f1d8b61077a8871f0ef42d0825d875ff8377d31c43f923488191449205cfd1efcfb7dff96f4f942b382f8fa29827fc11eeb1ffef7de87de6112a7ee1fbeca7bfbf7fb6800ff0bff36cff721fec2b7220984fcee4312778d6349128738ed4fb49c2d8b9fc96577f777bfd9ebbe77f3daf17ecdf385ef856f1fc45de37c6f710a6295d775063f5dd2a2591b0708f83874348c19fcae79409c6200287f6f71776beec2d0e432f85ffe3ae300a69e3f9c2ee9dcda31fccc2687dc7fffeebdeff16f49e70e7766bfd835e9e315686c1209207fb78092fd6d6ecce4f47e9b9d5361b27fcd7923655ee0da1c1188fdd526cdc9e5f79fce722e41b32c0512bec8ee9e8ed99d2593fdc79c7e89d5c67ae20e9d1e75877b4f95ef5c8fba63c55bdd5a528f73244bfa70d896a9f26fd9bfc7ae5097f4b9000db187e3483b72d735f9d53c7766ee5395f5cf7d4d6599a48ff1dccb549e1f9accbda9b2683cf761b5955479da5566eebdcad34160e6be72afeffb3efffb5dfda273652ff9b793e66928b1282d03a2ee3411f5c6ff3ae1b0bf48326b3efd9b314fc344fd0c53e66598a9af3161bcca9cf918e60c509aa767b1e6e92a8d13a5797aa889a83bcd44bdf1e6e92b3450b2bb93704fadebaaf429b354fabeb3f0fd6b38035207d005a867122640f1fd7bc8bfaf80ef6295ec650ff538ab2b8125129014d9abc87e45f6ea75ff35d7610d749f059ae1c82a88d5263dd9b277dda48f92318fdfa4cf480639e9843aa1b2e799526e6daa265593cbb2c678a791b191b1c93060c83865bcc7c4fc8d7fafa9c139f89d068d1576acf05ea3c6a973bedbb0e1420f17deef7b3d05e1bcdffce966accea240cd9295d42cf9d3be6233278e9f96a59a9b97dc53ade98d5cd39c1d33a9b2d62a172e2fe1d2da85a87aa945f54b35aa606e36f5a87ec1c20a35da49aeb5a60da5e6d4b4a564a0cb4bba5cd3ae1203033eed210658d227c78b3970e0d081bd0bc7f23493aa99816d7816f0e9c94af2690b3c0ef8f405d6033ecde181c0a73b5811f894c523814f77580df8b4878e0dbffa9ee699c0afb08ecff1a28e1c5e50d959878eeff109985e25609e22609eb4f4e90f01f394a571fc1fe080240b50400210700023480c70a4000418624303ccea670c318435fc25bfef54964562d0f0974ca5f0ff00be364f0b7fc9f3cc919343a471fc03f097d4d1417b68420210e42f19a46643111b1004fcf84b22217a4092a29cfafc256f30d22187db0c5f9bc70397e4c00e2e17cac3ceebd5030cd603040c424241c43ad644c8645466331f567a0c0d61a135adb7d46a55d8dad658ec2022d2a2a88b7a0b23a3e6a2716e7deb2ffaa88f749835c760a63d6a30d3d314d9bf080d66ba330033dd2100336511111204480b393dc16c4e499c66b866464e4fb0d489882833258bc70e1cab1cab1cab151e8201df0c500dc151819a255fec41ee3287708ef4c17911e706a740f9e64f2f67e1f02eafc2bc2af3eac443804f675805f834c573e4d31a96013e9d91917c8af3ca26af0ef0e9995708f8b485bc4ac0a72fe495023ecdc9ab1d79f5d5593d7ef5b77906f0abefd13c0bf8158ec7791187797ab93ae3c0f13dbe00d379681c7fbdb2f8ca5f010940c0018c2031c091021060880d3514a16100027022df91eeee1e0017f21de9eeee419cca6c666568c8b1d0685b6a35afc266c38288c8b5282adac2c8c8b9e848bff9cdbdf0233fb23bb85c3cbc5eb607180c0821211b442c46844cd6a2c29acdac0c0df1c0b28346db52b3b595ad2287cd860591255ad9a222bb45e31859231ba623ed0d8759b300ccf454cbfe44ccf4b425fb07404810203fb24f0b363b3d30cc9021061f2d168f1d3a72dce0ac70b08f12076785839774798555436e7ef52bac81ee06db2fecd1cd3129d0232be9e1c28b2eac5637374202f069c822f2e9c823804f4bd6003e3df1d0f0e90cabc8a7299e1a3ead61d9f0e90c9e219f6216013eb5e129c0a727ebc8a72df018e0d31758483ecd31f2e98e1d41febe4ef31ca047be79175ebc314f2f17cc93abf3cdcdf7f801ccbb83cb95fd9198279a9ffe06385200020cb1a18622340c4000440220248811b3fa8903070f405eaf1e60b01f406421a12062311f226690c9a8cc6600b0820e0d61a1d176b6f4d46a55d86c3060a14344a4455111cf163218195d2eee8de1fad8c1e5eac143ebf5ea01066301c143482888584c07113964322ab31967056768084be3d0381ab7a556aba2716cb65c392f1c11477463d68cc34c770031d39396ecff23fbcc000074a707061d1e1962f0d1a3c5e2a123470eceaa870b2eb8d063d56385b92f1fc915d9b8615240272bd1e18a44d2e77cf1b46163b5f2c93f8004f9f424e4d399007c9a22f2698d003e9d31804f310d9fda14f9f4ace1d3166cf8f485219fe6e0ccf0f777340f01feaefe7c71659e5eeeeabc5a7d8f13c0e4b6681c3732cafe369827261ac7bf06f364a54fff22e669a871fc691880008804404810203fb2cf0c43cceaa70b1c17b71be70577c41da13becb85c3cbc5e3d3dc0008301212494bb20623122649daca3329b5919ea863a2c34da965aadabc266c382a823eab4282adac2a833eab818c9eed6dd3a2fbaa3ee08c70e392e170faf97d7c30d180c0821212f88588c88c691c9bc91f45c30d31c0098e9094bf647cdf474e5851e333d5bd0e19121061f3d5a2c1e3b74e4c0917373c386ceb93a4f1d1b3a36b027925e0d738817be0593023bb2921d2f782facf0e20a356ad8b0d1f369c7b3f369c8423f1d7900f069c99ae1d3138fcfa733a91f9fd600f97446904fb1904f6d4e18fe7e4ef3046047b6f12bbc68c33cbd56304faece366c7c8f07c0f4b0d068428200f9917d660000bad30383ce169e5aad0a9b4d062c622022d2a271bcc887b7859191c78577f36e9e1725d23bdac1e5e2c1c38ed7ab07184c07103984848288c570109123935199cd70acdc0c0d61a1d16e6c71a156abc266fbb058111169d1384545df16469fd1c745e3dcbedbf74589fc8ebe231d333d5dc9fe3c667a6222fbcb10838f1e2d168f1d3a72e0c8c1b9b9e1420bab1a3b56b0b1c20a3b6aeca881c1201209ba68b0605220272bc9015d4198064e81328d3f79178e3c3a9f962c183e3df1f47c3ac3daf934c5837e5ac302c0a7337866f814b37c3eb5c99f9e367cfcfd1bcdf323a706065376aef1c3047978bdb2bf8f79aa020074a707061d1e1962f091cdeae70a2bf4d00306034248a815042b16234226e34165c76c6665684807961c34da965a0d471539361b164444d971402d8a8ab630028d402e4e2478036fa017e0117814eee072f1f00a5f610f2cc06040348e50281406118b11712243992cfbdb38350fd2b387999eac64ff168bc70e1d3372706e6eb8d0c2ea6481460eae81710e8d1c1a38bc6222c3a11a1b930237b2921b2fa0489f7ff16b6a68d0c8a163070f0fd6a7a7d6a7333d3e4df9f8b426864f67c8f029e6f9d4a6068ebf7f364fcf5f1aff2fd2304f2f7775a6618658683298272a8de31f83792aa24f7f1fe6494ae3f8f768b178ecd09103070fdeb253ab5561b3c180850e119116456151b8859151c845780b6fa117326478141eede072b9c0430baf570f30d80a88534828889818138990c9a8ccc49968c56668084be3d0449ab8a556aba2716c36d10b2912f9e944d9539b1d333d2591fd61d031539cd3130c36e3860b2dac4e166cac605373e369fcdfa8b95183c52f28522c8a314d0a9c59c92916d1903e325e9411135353b36ac1851b373839ad17689c7fdfa679709cb9e665bc58639e5e32cc93ab734d8db885916824c557fe393837375c686175b6442e589f22c59b7813bd108fc4231e3bec70b97878bd74f49003060342488885206cc46244c8642b50b199cdac0c0dd5c0d2381e4a10dd1866f5336592403a7757cab4857c48b94a9184adb6780b492994807509052ddaafef47b6c5fde5def447caff3093efcb3795cfc4f4dc5754fc4c269a8f7926a437fd112634def79ce93df747c0ffb0eabee9812efe397df93fdf730f848aa7ef2b5f755517ab6a30fdf7464cff91def4171b89f9a1f99807424f464effbdea3ef8a5e7502fd29080509a9997799a277dea37d57dfba61892695d4650effd356b4061d57bdfa6911256dd2f7d1110a484e922e642a168684c201465fad26fe651ae3f0384cac43c97fa8d8bb1ae5c81504e75a451ee994c3182fa98af2813143e7d0c56353e72faef4ff8e7678aaac8e96da8e8091fe98e7e48c20b5e5073b9d0d2aeeabf1c3d7d13d7f76f57d55e31c10da698e2cb09efc0894068e9373febab8e70fffd875535345a72687782984553bff9cd8ffc66bbab91aa082dd7fa5e054241209d5ba87b5251f236c50756720073b9d08a367acd1c3feb974c1dbbaa9d0f659a533b53ae5214a10845e8418bff758c3355e303a11c942671919f2946bee7be72f86707cf08f5fec341ecaa63e03e6ddcb16a8456d4e519a11e56214193d855b5b1f273251a6dae500c71a960ae5a663085dae27366b52b477f80d01632bd8a3a36293ef99fa463d5dafb246ea1b3fef8a2b984cb37e6677d326da16f28ceeaafdfb1d154894f44882fdf3adcac12bfa25c0d4208c557f545b385b294e1134328b857f8cd6fa1dffc96eb78a58b2208506a98ab96285f5aa8135d8b127c0eab8c70efbd877f54f62bea7d0dfd75ccae6e5076c7ecaabe6772f5ad1465bf6cfd1bbe6a6461b9d600229b844097f35836b1daa439f66dec8b9e5efbe7bfcd69f1f9f57bbcf3db56a3d6ddadbb125a48d64fa67cefd65a6badb5d65afb363530e7e1df56f43bd7a52cecd57deb1b1a57ae7b0ff7ab61fd7262fb822c51a6fd4a3f73ef5d570e37ecf5b95eaf9e76e53ef6d530eb82d20251f610cacfded957715ff3fd7ed9ee57974a71a832772e6e1145b7b5d65a6badb57a1d77adf7e7911a7be7ceddafb57296e3bcdb76fd48de211751f4aeb6c1cfbf76b59eb5b671c75debfdd6dafb17c8fb4382a988152a51cf5638b3ab26295149b370665b24580b4aee2b56d5705677ea1fa56e465f38bb41e4207b1acec24f53b258c5f14f431c84a94c02e3a7e53e0d67d6de0f67cee2b27f58252c6a2bb6f08ab3ea16d851f6af5c661f12650fbf5cce93392b2581c9a5ec39f5aa64ff1e42f95fd7594b02e3acf4fb9a739ea954097e687ea417c965aa6a68f4fb0f93472fdb225df195ff88aa490dfd8d9c92864843b64502e32bfff3ccc9711218d29093c090869c048634e42430a4a1ec4fba79ab8cd9f3c637e61295aac929094c4a0293fd6f95f213bb6b5bd211473fecc9ecea558e4f3e92efc34702be388246a7a8fa8f7c1ffe11f0451233015f7c26538c802f3e93efc34f4b362167a5a55acdb698880f36f84cc2ffc2ff1e49889188ae82f27bf03b1894340f223ffca0f1c597d9168855fda069665b9ff820fe1945cc647cf17f48fc3d13d2833fbef84c48ff8f8af2678a91f14fff033e297cf24ff8a784559c11f04958c5157d4fc2a42f9d49c6f0c937123e89550ec50f4490822278808117d4c8eb60647cf26da8e8e9c58d074fc8620649c08296f0cf937a8a68f50b4ae29f1c5cedaac82dfc3427075a5151c44cbe1f3d5a383e13f0499f7a4318049ff447c21f9ff460e9c927994c987c2fbe68477f954ca61821bff44cc4ff9e09f9aafe2362e949aac6357c2ffe910fab7a48fc2325ac6a3ccbde43a96a5563f2997cdfd8c8e9c73b3d104a7e45d3d236aafa4baafed203a144aa26bd91ef49df4f227d09ff90f0a7c38ffed1aa1a1a25fdf7aa23df97be64ebb6ddd825b22bb3da959783d2243309759d7beec574451155db521d09c10f7145d3d266b3c94c4d44d9df44942ad16c4b6542a94c7866a528bb8f293d8fc1aa231f93d27fa5ff489f491e75e3b759bab2389af7aa2efee1f9729deb1615bcb2bf474463e6ef5529ca59b237eb8ba5094639f56cd949db948a850b14e4d4f372b936c99c9596b62cc55931726973969762f506482916ab91be9245beb7dd59f8fe57665be0bb3a9cdea25266571efbcc3206442933d94c4474abb49964a61ad49dfbe5126a46588aacb4894af6bfb1ae05657a63dcf77819b3ad6eb49471252d2d87c6cb715cd77537c771a5cdb6becf93d956a9fc3ccf722aba62a52b162b75a5d10c4d4f067a328ba5a002970c235729a830cbf73bd287b3b936d661c9789150a6a29bbc4a99de98b352af2817f174e8c75706f5c6bffc6ec9e89996989e33958c97661acafedd95ec5f66f1b85825ca540cd2c1cb4bbe7c83e8afbbbb76a49449beb17ae3fea44c45a1ec2fbeb2dfb1b4b97259c64a34db2a1535cda371b4ec5f8ad956e98a65ffd2655ba52292874bd7c5aed266cb4e2a15a1a4e9cdcc962151aa8a04811fbe297756f5f846c41f4b2ffef823fe210595b0f84124ec15d9953f299a36553fe981d01f5563550de2936f447cf2fb49fc33a5b111f24998e6fd78b54ada405a2a25f7406a2681a0def8bffd8a394c72992757b652b607c65b26991726fb7b466d5bf7fbca32957a99ec7ab21b93a986b872e7ca5c19c54fbf79617ce5efcdbec8fe463a3a3939e7f99f2ac71bb3ad8ac66643b49a2d3b912c8bb29495313fbba8aca1a2e26792b92e67ea4c6e92854476e5dfa151f60f6fd94b45df57969d963effda92d20d64d1453424f366269b57cb7e1bdb2da57d127964578e7e38ec5868441956f11389321c0a675e94aaeeab27f3a478b3f6b45fae9cde9cde58acdf0679321bd41bffcef46a5071fcdbf4644594b5fc04e6a7500dca70662afa803ace0715ec13f17bcfa534945ca7c0f1693d72e9e06153776ebefe0a7567f5f56dd49d16be3e0b75c785af7f56d68daf7fe3e6051c1d7567fcfa3bea0ef9f579d41dd2d767555669a7fcfa3c75c774fafa3e6aae3ba8af8fd61d99af0f80ba33f3f567a82c9aaf1fa4eea4bebe90ba03e3eb07a0eec4f8fa432a4bf5f569a83b355fbf48dd91f1f56ba83b33bebe0d9545e3eb1fa93bbf637e7d2475077ffd0354568dafbf80ba63b3b3c2d76f40ddb1f1f59354160b5f3f0275e7fcfa12a83b2f7cfd1b72b0ad1d5f7ff4af2b0f11191bb3b11b883937a4658ea3dd17b12d1bbba17994348e7f0e9c83d32f3b18a3986dd55792f38ed3fa450ed6a1735a6f607898158c92ba237ed607a5e88d9f676f88cfe611b0e371e026aa238de2f84671e0d788eef8d7458370fc083e54c77766a34d1ab9e80e3c821094501cef39cfe930bbe2c8f9267d72dcbf2410ef7c8ae0f89c1c3805ca38cf3d0eb3561c393858bc31fd852fd90ee1440aa9b426bcd2b28d8d3766a3ec8d59f30dd30e514f7f174c4b837ae3df826985a83751ea8dff4984eccf820cd98610b2ff0a41c8fe365eb27f0dfc83ec6ffa20fbbf15d99f060fb2ff0c5bf6974145f6af9922fbabb664ff1851647f182928b23f8d13d97f064bf6976922fb95ec7fca41f63759c9fe250eb27fc9bc41f62755c9fe2412d97fa492fd455b44f60fa764b7d606d97f86142243b64059b4a4c536e6a78b56866c63ceaade35c5215897e460bb385a4922403903a9bc2495ef0db665d17a815a856a6bbdf170f5010a1ac1a353381c8252f79644400e4099b3b99a37b81660e040acadb2a3392b0d8dd26e280fc1b27f77255573a3cb12debc98f390390f7f9105462842bdf1f7fcbbee746efba5dec8ec0fa5258216f5c6df66516fbcbd9817c5933556fde86cb12dca9ded0aca976dddf762b6c8a2b3f7d353f5c63b758b862c7a6dd12b36e4c5c25bc784eaee6d2ef1eca31a7273ffad596bbdad089a62d37e30fcee5310042b4b8706afb5b71fec4fc1ffc00741107cfba2d9b7df7607767af3f5ff94912bfbd7d48b02f127da0e43f33e68827f5b88aa45882c3906f9f967021e6c51424e2dfefc7ab7cdea7d6ac1d403cdcfaaa0ebfa0ec1fde52c8ea17ca2ca0e52589a6085a8a5092a210c485130f165ac094921c5503ad6e2c48b6cb37dfbe5ea2ccfe1ca2d6d53e379cf711cc7711cc7713ddebd67a65a50d65cb36b5126b1abfe11973f3e100a8416752b28ab95b28d8c3f2a23e5a31e857f9a0921bc5c6889bf5a09848e0f847a4694094000929bab16218a206fb328c2db1347f0d2794588dd7b373d55f6cb07424913499eecedc2a2a042179716451558409e4c4452f8d0c52b5d2e10240001485c0cc1efa6a791f1cbcfa1f5cd0923846e91169b93ce9362085fbe04200049d8bd2df30fce0fb0b8d0f14f7e3a99be5815cfba9e408216ee560341adfb93c989be20972b6b11824a2e73bf674449807ad36f43bde92fd238224e53a96b5b08b7a11becaadfdea014827247b37ccfecfe7acccf267d8628ff9ade37d939b152a6b5c8fb8e39cb4fdfb685fafe1b6c2be6633c8cef6f18897cb1656e45f7b3df77ffc7597d8b9eb0c1ed6683a43d21e5071a97d1776dcbea4debc8c44f25e21f9ec57ef547007683b3622ccc64ebcfc1fe384b04bf7bdffb6b561cec8331cc9ababa0fc3bc5157f753668fbaba4f63d6ba9ad99165acabfb31a87cff64326f3defbbd833d91267f5d93318894006d3251914457c819f0c7ec53d746e0c317e933e43942f7638026e4b26c9140a9d7cbe8ecbdad2a95e83efb5eda24c5d86c154ae5b9c888287bc4f6b51c7aa514c210b0c8ab762684a9c55b7ec20d439ad46edcaed34efb79d27eb9bdbabe4ee727f1167d9dcafc3eda975e7ac37fda9a773d69d9b1bedca79dd9fc4595dc1e4ee3c0c74fed14971822224e45acf0ff422e792fb734812810e93fb9d4bf708537aef429ff7357fd847e9797884e227ca855ce843b3c3483eb7b705cb2ca73ab9cfce653e94db69b9ff9d65bd47792b49f63cefc72f9dd5bd67cd37535d4aeb325ff58b1834c117fff3fe13bb7ac3d9ea67aef156456d2e7637aa907a2d9532cafe3536de5ebac84b1bb597d1e7e87bdc88a8bdf85b1e4a9bd7830fa2649b5ca3f081ebde322a85aaf1b39dd8c0dcdddddddd95d8e4fbfea4da6ef9cc350a2b6af7bf29cacfa45cb904d972257d2e7e59319459c8350a2b6019966b728da20761b258bf27caf412e5a3dc7fbda4d728f75f30517431ca33728da24b2d324525d347823324928d592b9ba1cdc09e94e9e8b22aa83cf596fd1d0475c8b66886b2879e1db255b29dc9b2d37c516862b69bc609cd8ba692a3185eb02665f337e6ac9466882444120a93fd4950acb5a428ddf7eb3aaf2a5511557ff740e803a11c5675877f4acfbd0d15edfe4b6669a6ecaa8a89969dc3aa239d4b75a4d1f21b2d9ffb0e4fa9806a4867ef6f2e57ae68e9d3d2c2aa9447b6557a7f1a976d352a4333cbfe32bba279d1c44e6f2abdccd3c4b2c73cf741a8ef641e082d954a6fbf24837f50b8fb9fce5459ce3c2d4d65bb37c27df7f6bbee4b568883595845bbfb406a461d51edca84c512a364a985cdd0beb11453e10ccdceca1bcd14c557fe6395ec35d8c425fb5b6c9f949f47fa7857a4584b92f9d9b972686facda8b51b399282a0b75c397e2064a8a19276ace9aa1d5d3dfcdcef6de6aad1dadb516a763b576247d6e87b06b9a1676df0a398b7c4f7d224e496c85b08599ac27a238e68a45db4c183f2d2c7716e5ccd1cccdc24842b625535496a9d4bfea08c7a463b203f7a5ff2961d591aef4dd57f487fb9258aba1a21c166976d55354393bc49024349284464f91a318567214c34a8e62583913080dbf237d3a58f60f699e84268d133f7da409ca6ead9291c6e5830a2acfc53a2c797f6b55607dc016566fdc3ec962cb7e43b4b1f7490bb34794dea366f5c61f25b3ab999b6dcdc0eccafffbca32f53f039b8115151515cd66b3998ceb2395646a9471c9c8b84c31db427da4096533c550b67c663b83d9564581d0b643a8fcf98ab3da54ab3b9dfd419ca23e8b43766544f9e154349291844421d30cac699281296661a967833db1a698b3746843b6c515d96c3a2ce88ac429657a67164acc0a7176065677ea759184b27f7a5fa6184988091d13722a0a7db49818031b2cdae16f88332d6a7d28d3995b768b8a3ed6ead6ced0666ece4a676833b4992c336172bdf75e2e5b1a9a6739225410ab4ddaae6c5f7493e39e7b91b3691e77657b95e89a286d11244250c0f8800827f0f2843e9dc5aa5110d1b2cd698e982b903087f77f78d8e0f73992f1c5b7a93b35db5fa1ee90defe55a24c75ee973ef2cf6cefdfc8b9a1fd9279fa69cf1c7bfd092d86727d420b3038d727b4a8f98b0ea4f317659a22996d615056f759a1ded82721807cf12b19e22323fee92d66e8a8fafc2cedcaea84496caba2dd7897205a2296a4ee74b6ef007b6fff640f7b86ecdf633ffb9e59c499e9cf5056626b1d25e7806d9aa75d16e8b3e10beecb4b767fe251c6113c2afef8d526bdb0ec47e6e73cfc899feeb22ca57fe32536e3f4b9e7beaded5fe2b9a3a17b6bb6fdda62d3802f27ebbc6d5ba05c6d3539e0a777b85dee1cbe22a837167f15d7a07a13d4d997c3a04cad2cfb5b1b94a9c364b66585ac2c8cbfc39cf5c4063906c394354cf716066577a32b87df477e76307f629d78cb0a59dbd927b91bbba0dc752fcb5df756c8b67e7cd57d67bb7fc1c790fdf8d9dddbcd013f3b13741de64c0eb8ba837efcf44ffbe8c85feea4bfb830d05151881586528b2f32f79ec5dabaf553eebb0e3faafb2af81507fbe083dc4def07cafaf7b98b538b4b1d2f6787573def45eb716fd37531c02794dda7fe1cfe40e93d0dde7bdedb782728bfceb1a735d973e5b05d626d0fe9b717f5afd99a4528eba72d6484b27ef76213b936d1b789dc959671e8ef71afaf73dd37addddd7deb07ca4acbe41019320edca72b64ebd56e9b7a633b27657dfb41b9335fe4aae7eaa70d8ede605716d7f4f35c2b4fcd764bbe38bd764baea423dc6eb93dfb545879becdd1e9a10067a59fb3e36daec8753cdf38f62bb630667a20433ded77b54bb6cfd51d64fb5eb564fbb8eec4506fecdbffe6e9d138f63f5b9d129727b2fd34142b0d20d0a031038b1933645c2143460d514d8dea072a550c1fc48801c30a1830525d52299a1ed0d0cc54313323c3031919940d858aa12226e634c5e964da81c9547229cb9214a512690b8944464192636d1c45284431d41286e01320f865f93ecf09cfebb0741dd784bd37db97a1ee586bb3fd18ea8ebb67fb3eea4eebf4a81d62b14507416d45f9dd7b2f4e3ff3abdf47546454e43f9cdee7f0d5e99ceaf7e3beeefbbeb4d65e30adef2b91d88df398900fa56dcb437ea5b9800ec59bb4ff99467c55a488112226113fbb2f1f09921672647f5c53ef6fd69d18ef3f53591d44827a3a699cfe9a5365d1ccc4bcff57791a16f6abde9174544ab05b069bfa8a9f24a8acce52ab71e2aab6d9950e2aab9d50af64699e3efac2d538fd1f0c9c7e32d8cb924f4d857a53135166e7be39cb83fc74426539099cf43715fafb8be67158e374f3f8937effc15ddfd7b68e61767621f1bfaf2c853afb900771568afad3f713c101f5de0fd49bde495059ee827a3a213d0c274e64fa0eaa6b691dd4b3df61fdfec393f01d3b0fead9dfa597c10e1b53cfe3137116eafb519e63bedf879c85ca3138f51fee315c3ea51fc8de9b5ee4ba3aa9d69b130e62c2ee846f712b72a72ea4431b298284bb9f8789e0b1d68210e9d13a7ea63a69f9d94b96ec6559846ad2409e2d5d0efeedba6bbbbff87eaaa496f7f3bd5756a2fad57d0f861102ca5915a8b7dcd9aeebaeebaddeb2fdace564e0ddbd5704abed863a9237f859bb9c5c76e878a0d8d2b12b6fb98eceeb9cb6d5338b4fa4ce429264d76831df52727a4bfaa05e4491251a12459233df1887fb32df4f33438a971472f1c5b7962eea8a240a24492326e1f1fbeef87d8e358f26aabcc15422be2bf1d3fb45f306a01c720ee5fd30871b94f8e9b7ef934ab8fa7943d267fc70cd380ab940a0f8fe3938ab8e23560d093570436cf34aea0d4aee79fea76ef868a5912dd71a245bd281ad71abafdd57307e5ff3d04ebceff1daf9ebb75973ad956ba39cfa7f25b93177efcd432772fd25fb93fce26ef350fb4b672d10e7c5249cb22b074553285e25cab4d27a66f096e92b193ee99dec2f65598e7f4dd14cc72c5ad267c42014ca2fbd4f7e7a86e6e981b268f309370f8d437e8f0d32fd081e35e12962ca59cd43f3d44c921ee943621f657fc935a76d91c22771085ffcfb25130c53864f8edfd9c2a04ccf944843187ecde383a4cf887d94e1188678c4f586af42af039d072af7019c9f1798dc3421ff46dd19df45f2fe28def0a63a720e1cd99f336b2eca4f1f3930065b50e024572db96e3941965cd64a5a6badc5e497622549a4da336775939ff697f00c5b1cfa5b8a9f5e83f2db94f5f7d95969a648d8c2a014bf3077118ce8657375b5effb3e1f501c6fdd133fbb27bef24e49bde5b19cf9e9d6a479929fb5564cb2e40fd2d3bca832c3ec249030abbe1b72d6a96bdbee6ea89b75b3ae8abd593f55b79deac117556627e4a7cb4ad593eff1fe26ed777789fc3653100aa50cdccdcc255caec1dd909faa21fdf6fb6b2e7d932014cacf30de93e2279254ea4da99f497d8c69a6deb837f3647e5a1a94b5b3fd6a8528d396f5104e26d3c788f1e57f1993bec7f638c90c634cf1c317bb1919f3d6e62c13a6994921c1d5b4b5cea647e29fa2f950a5c5692a97dfd1d214aaa3c9e00ba471e92bf9e387678b7bacc9ec5cda1bd0955cca52b3d89ae55256533dd55bb5b7942d9bf4ddcc5955dafce1b9e25a6fc82f99a9c54a6a27eba278178b52a65d2c3bac7b028ea339c47dd136e913cea04c5bd652f0134300f3599911acc812d9da77346b9a36684a7fd0081eed7e0439e8ad44f6f685691dfed7b45db40ebfb13ed996135c7967d9584eed4df6b0d4abec68d93b9a5d79a7b2ffc20dfd79e186767fdfd16e59c5efe154cd69ca12d91b12a2951626bae433572d4bccb21626b2e4aa6509d84dae5aae6491edad09b59533245404142eb841156150ff268778f9c3360665d572e58a9cd620a99ad3b62e6e995da5ded075c964b4ec371be60655814199b62cbb9f1dcd4fb761beb037fb8232ed6837240ae8b2904dda3d9b272af8624b0f4e72dda2821bb96e51012debe894b5954a4f24f5092228722d7daa63a73651b9a430a4393e222305c4c093a471eae7549e08344e7ffd22fd3d37ad91fdcdcad3b60aa3caa82cd3cb98b2a736fbcf344f773935cbe369a2c669d6f7fe5fe56959e3dcd7e9b93f7af4c8fca084e02ed908ea4d7f0c4ebd3395def7e31a4190abc6bdf7de7befbdf7de7befbdf7de7befbdf7deab84f4f11bea351139c28b9f355f9c7af8e296f5cc593523691e7fa2dc5d92344f1345a079da4be3d89ac771ad38ed25b710ea4d7fc9ed44eeb7e5fe12c9949149e4fe7189dc2ff677172b99a891c85d77ba887ae3a5795a4ae3f45fc9fdb74bee1b10d19022b737360984068d195b66cc9011850c1935b59a1a15142a550c2d3162c07802068c5496548ac6091a9a192c3333324dc8c8a06828548c0e62624e4c9c4ea6254ca6f24a599672502a91ac9048240e48721c1a475109510c930843f00620f855f93e0f09cfeba8741d7744ee7a63ef35a2ee586b8ba83bdedf53ea4ed71bfba35b4addb9c1cff6719c839b885089e26795e267cf5ae6a76a48488118e45026e4a4c517a60cf2666a826f9d989eac5676b861ed45e99e35ed8b4dfa7c4582d824cacfc720454253e589b67afdb0ca7eb566e7d7377e3a527cd51fbbe19675b1b25a9ad0ed9750aaff88266caba25f4ad6325a507769b73001a66f5febf665b765f755f4591b546881e2497621572d5a8cb2588794e31356aae4f1c5faf7de8b6d17500cdd64cce8f11e2a2f5adf6fbe22bb2289cd2f364bae92711cc7bef7458e4370e410afb731c130653f69da7c6756600c0a41b73b39621cc41f2b30e6fb9d39844792967b4b86c0fb2b5edc59ca6bda7c9ba98dd857c998c5bff2c568a67e4926bfcd17ad998e43fa1de3d01deeb11af03cc4f7f69aaa21a9bf7f3ff56daa86c078185fb3a81a12038721b88ff1352b19f38887f87043711b53759f48ec86a12853bfd508a558220b364dfc38b52e1a38b5af5c67980d25c8db720229b9d272dde2648b2cd6cf568a76146328c3f8598ffcac0f26f5a25c1b4a7530ce4addf6c55960186f55545563491935a60a0fa17ee591deec9547e3d47e675fb60582ea5eb43ba1b23a06b5693025572b8223a84004142acf0c321775a761506f6ecdd3501aa73e122410220ab95a2212a7f7fd45201d2e91b3baaf22feb17e87fbe5677d9559b3db8cbc8bb3fe4a11690f35e9e31e13a5cc8b36db026dfe9ecdab795c3eecd96e655dacf2be6a3194d3aac550467dead893c15ecd7a36ce541949fd3494189a7a20546c5200f73bc8cf76b9aa9d919141c2bdf743c999b7ae848cb9fa09dafc5ca25ce54abb812d774e99de0f25ca6c27fe126da24d14876aa3ab72a6fbaa19d47b5f5433f887e7997b4f46deaddf3b72d617fd5f90b7581eec675017b411815d402fceaac97dc559a8eff786ae5b77f9d9a291084624f253ece2a768f3f33f952a4b9aa7c992ed2c8f529ec0645ecae8fa4fa5dc5dec32ba9ef8d94263d0e86a287ef65d41e9fd1d5de92825f7d77e1a9c8eb3dce350ee74a4e574ace51e6d52c628b9d311caf8c449ee21bb1a8352f128f745fdf8d5b6b8a11eb22db1715a9a382d1fa7291a38fd0cda9c1bb2df0c9c7e6599aac1690ab443b96966b8216e2837f6449bafd2ffecd5accd595d9c55737bf18a9cf5c5592ab0df337256fd7e0f8cb34290c8046d609712c9ab795c14706d6217d7e8c45b2d9be82596db13c1e4cea94824de8c90c8a97824d29e309222a763d0755b222a09e1b2257d62fe64c6cc8061dfc278eb33de9e6a1c7b35ecd992641c1ef5d6bc33efbd9b338f32d32419f5a21542f35725f3dd7b28140aa749320d4e93786f1f95ca7cf9a801f40c06c394a8b75f7ab1daa0002ed9fb937d18f667bcd8893ef316ab645e25f3e987c22a19eca9cc8fcf91446a7ee6393248e79af7ccd41f854b7f4921358fc238d4fc0cc6e1f4decb984bb8ece17b22df7b27859c7035b1f734f0129b61c078180fc37a7f517fad0052d47b7fb18531c4c328199cbabd5ecdbeb5f9e9d9bc9afdd4ab795c64c83f9dc83f8917f5d79479cf4c93644fc67b52a2b0f7a7f22fca94f9185306f53dee99e9abfe76345f6b4bc6c3a8f9d4d7c4f89a558df72a338659eb0a062e3db3c41ae88cc238c80c2185c8fc2948157d94914992ef15bf18b3e614f532dfd9f432260ea7f75cc92035777809974f3fa2ccce312793348d5f9a69923c7add122edbef4820f6497fd27b523a4edb7a4f4ec75fc265921cdf9ae45bd287c422916833c52e3e949d1396c0020939159128a3f819f3408f8b7d2e5b2c036da20db4812e825a2fa1aff7acab54b723155ecdf36ca22db758945b34ca4d0a20071f41b46c5542eec71041be0f24da441b69b1067a088e3355465ec60984781273a11c6ec23df7e21de22388c6c5593e8268b9dfab39cbf1102e1f4134b40987a7f84fb9df6f4d2e575248778258f61c245421fb0fe1722968131f4134744ada15702939f51144cb4a7c04d1720e2e25a74cbae42aa58792c859a5d04f4d1ae8821da0028c18c5bb2cf7bbde1165f8de11e5831ec7f90e3f4351544006c518ca1be21cced4f19efb348786fb3870bfe3a728bfefb19c4e0e8895d87839ce72eeab739c4df6f0c77dbe1d77ff62cfbbd7b6a0bcefb9da5c8c43a5814765188ebfe4cb6449e429bffcd49248b3e6d248b2dd7592e999e49138d3c778f1c5cfd4996476b734d673c4b59ee9c5e14aa6f82493cba4a9812f8be237763ee1375892ba2788b55596e9f7210196fdc71a172f282e362e5daed07c2807630c65bda1cbae7d352b65c54159f3a1ae717156fdcfbb64ff7cc8898c6a5c6c5d521fea7a258c524b3f2f20c38ec791eb69d1b464a17bff1c5b7e4a726ee308d42f7887cee7f8d984ac93d39cdce36d8239c7e572c1d0cffd5d5bb5084a0031450b174b601105da8d2402ceea1cea4e672d51960084ba7f443c1394dee3206dda84667ae6eecc20dc7f41fcf48e082e42c44faff1335b6bfd0cd228cc05825cdf4f28362924cab4c4b5365291c3396a73e20241ae3c94ef023d7cc2385e1f6365da35d7f77dd51219e56eaf75ede2b46fb98fdcf5cafdb5bb56ebb46b47b96d8e6bbdb9f65aa1dc1696da57fe5e302bd436c63d11ab4de91f7e45558e5535740ffe11ef43cc247cef41cc648a91f03dacfa9880df61d5f76883e6677e666957fd5d23a1fc9cbef7d4efcf367d6d109c0ede5f800615de6dee4cd1c72f87317f56a3eebfefbbe73eed2c4a5f6b8b0739aeafa808a66a3138adb653044ba5e3c65db3355bc4b5a83b5ce6fa8acc7516996b24a4cd83ccf551ea2eee51e6f98d668e5d711fea74a7c9795cf91ef7a7bf72e976d7ecf79565876b3213bcc1c8a8a263d7da96b9db09d9162c0b712d841be627770392bed9ab3263b2a40e315f7ad1fbba25957fc91f3697780a1d621e039d4b3ba855d2e702315875bffc1e473df73db6e5cf3d12574012dbb2cf7dce0c4e6badabd54c66e7ef9b624311c74141e18b1f04fef895545dacbad7f4a40742cd29e5c91cc23fc6df7665e2777f64fccf54dd37bb47fd91ef65be7bd4a3fe3365ae2a0665aa629e54c574a62ae62bda29f93a19548c59436751e670c23734ac5482ab48877fa61801bffb9fefc30eff74aa2224fe9962c246c627fd4ff8e21ff111a40394847f409fb95c2e17dae6c7842b77e6948a054c2d57d24755c3f7f977cfc4fef747ba1f3113ffeecdda32ceb336655be473692acb6699e3484f7e50f8e37f1f1404bec8b5cd95b9278d47997bb028731f9a1c51e6ba66575c4573fce4dec3a79fdc73a8e7cdf820569bd4d2b2f7d5b6eaebd856a39f6d915fdf43ef7b123bccab45b6ec793f9a29bbf24020d45f7e7adef7feaa56353efdf43ec7aebcf757f6387f7d9c17ebb12bef3fb3eba1541971985d79ef2f1f4134b4a253fad314576dbcbed70562b5499b96ef8ba3ab2b6dce9c5c519591fe01ea0742c516ab917efbd7fe1095c54e73b9b24a08a7aa192873f7b343a27f8f734f3e897fee730f84aa8e904f7ad2939fdaa476beaf5f3a909acf7a73d69b26cdf16dc49ad1a66b6a725bf03fef539b44193ef838601bdbc4afed815f01042c8a7a08b358cceded7c908108685d17422eaf43b0032c5c1f18369525442912af932a603192ad031738a191786c388095a6530c4a6626094260b1f5c08a11453dc0411636b409b0211851050c85c28919d09821a3461503c6770e0b9a30041ada431861031acf142e5b8eadd74e014b81f2e53aefa3494216aecedbe2451045b6f5e3324842106c68130f4809509e1cfd381597096c28e7d1df0f8f1304618636a111b346943c7ab4f8e7636084d0263462a8fdfb40e815c11d1074618418fad3049c420f5e68751e4d4ab4d98edcdf719dd747284217ae2f054b70b9817d45156646e1143dcc88b8ae2bdac208f5da04538029fa46282c21438d508adf0ac2ace008fd6922638a115a9d4713b2880a8663b52d9c1f60718da5f3f0ffb15825847b9ae71e28cf0065d403e59807caa707caa607cae503e5d20365d20365f281f2f740b97ba0ec3d50061f28fb0f1f8d1719338ccbd45ff695fc81c9fdde51f6a0dcd58e518898a163135f6ab31f55175128029d90c5106a31a9044958314ac288a2920fa240820bfd69e23bf832850c952d644d0514b698cd628a2eb2b0fd90415429628636018794204273aa40831a8a042cc8121bbabd507b23f7571c3b0831439bb0f04267708060c84543052810a5602ce18a5a639972841916276400435f000114d94f739912c508b53fb88a68b4151a40317b5b44174dbc1a89da0cb5d86c2fa4f8a0084749020a46355c882550718371632ba06286ba10a4d00423941482175b054217421c05d1040e8e4adb172268a6232411c5c5f1800a5aa98ad0ab6c16a0200acdc44414b35a2b82871b1aa3051827281f40a1c20c6dc222aa95084e6a5084d61922fcd00419daa406a108adce83060a3d0ca57ce0858b178c5a12328851ab8540e88a2594505453afa80941246386ff20451143341c06424081e8fb872a445033db0712b040088fd5b6c2b75865e4be7d6bff629511b1c97d11ab8c883ffe88c317f10fcf0ea8d0509a2464e142efff34415159410d0d71751e3f4d485b18e1865e3c4535047caec9494b51116af1140e03a1356a6d064e6c365d8a7820a229f908a2b567d45e6ffacb6ec1d0acc874049530b353250a8ac1514c9520b490a1ce1988a00a219976e2082b47333f1822a2a94fdc60064b65b1620a42288c258688501463053810aae709ba04c1ce97108038fa6962bfc9ed01162ed46219ad0408ae1ccd5042a892c8510c4bf5c6b4031e88b0b90f46429596c54b26c68711516a65bd41d59dfefa60f5015f146bbd29d32f870ce2064f80c511fa63bf090b2f173aa57b203487eca98cd89f6a8150bbe46610fc3cef39ce1a5172ffe1a629f159eebc6b4665f769d3fa1b6be0e6ee9a129fd1903e1e5e7273f77d59a676f5364ec75c2a94608436f18cd08ae24c1084db8e2966a8c55338a0dc32f58b1342e84f13fb4d6a4a50845adc04670a421ca1d579d0dc5010449482315a31c6586d2bc70a25dc5055152630aa19ab6dfd84a0f433c5beabc90eae2ff348c71428a3c66a5b5ff3d42a43121da8391c61c46a9396b7ced58ede5812bd8d56ab11cdaedcc8aeba219aa559232f224ad152a9b23432caf64999ded7e7cadfcb4fb1eb4c7b8432b5463fa5f7dd7bd883c962423194dd7f3010f43cf0837d4efcf4572a7747dd07731618d8edfefb3afcc19c74464628d3ef35cbe92d42997eafefe59f136f7da87b33c89e0b66d687ec5e0fd9bf33b2dd906ddd377deabdb21782ec9d14b2db9c90bd23bad995731d17d9ff73e2cdac67f36eb398d9692653dabc5b95eff5a44cc7a3f128ccf29565aca4a14c3132251a2e51346c2a71580ac7b014ba722d63e5e8b2ab984c4e431a2ee1984c2cfce295359b5188cba2f0c32c7e7a580b697e867808f2d39076a42462263bd817ff877b11ab8e884cb817f1948a92a6fd3b8490e6954525cdbd901612a1a54b26a7254d86f681a113f5c63f6ca2e2f89734db0ab3f8cac32bace81272c9fe34a7552bb287b45256c6425a4ecb58f692ccb6accc26cbfe760b7feb84da0a6949a82c26546bd43ce39114f28734dbba2fbb3a6a9eef755f644e43da0d69d9bfd77894fdbe6c6bfc5ecdd33056905fe9c743f6eb670e76d56f6dfdc292531b14b4d0c537d8553b5adebc89056a6f86132fdd1e94536c54a1a165ff2a323ffb7a369a574ce475f1886257bcc6691625e35b2c738fc8b3a540d9ebe227ccb3f969f3a1071510599867f3ba78ab3b8bf649f9dd3b86e268df621d9654d3aaa0e2f860676e957c1238f32419a98ab3c6f727d16c8b430dd995a36c84461833b7d4cccd1403536066684dcc3851cf4f8b21d492eccc0ec1a0a89924dfe2b47c5b852484532ba58a1412b6b60a29e62c996c5b29d4bf6babe7882feaaa664b25a8ae6a4ec16cdf545924934b6512795319e9be54852a54810a688755e32b7bf74068874797b55f44c93ecb4efa192c3e43ab37248ca499790b73563fa1d526d8a01c0186248504e3a43c21a776280bf9343342ce4a658a722cad65a8644bd72bb322758a664400000002c3140020301810888482b1502c4f56c93e14000e86bc5a724e9f4a498c29448c210600000c000000000080040001ad51244c673c143c539d79acc9e99756aa0d3fb7e238f6ef54e15fa80f308272bddb6ae617c775f04b66d98395f50d2eb754d0c77d6aba05d0df380207af70461700365b65120d5f72ff73976d610791099d9d35dd386d61c048a26d210e0a0e6d32b015628f0e5a88e6959af6cd16b7f4ff02599fd95e5d3a4bb8caa165bba3ca9b6d9fef4c0d4240bf3ecfb4ec2b077987c1d16ca1cd6ce09293090113e14b46c97448ac6d367e4f049185309bcc76c52c868f5cac40bb4632f5f98c4022758078fe6d194f4c1529e5425307933fd2ff160f36a62258736e688a9f8f9b9271880dcf0b6989febcf9b9669b7729f28f86a167145e94efc4384646292e82253cdc8c99b2cbc616bf5355f8ae75a27b884e1f0feaa8905b9601dabb753a3185305704c029bffd21640f848511a74b1149cdfad71cda0cd04e551af53f36917efb715369669dda67f67639ee633494e38ee5507731ce0146baa4835bc73521f1efc00d4c8fba9b76fcea85bdf5858afd0bd03a3b976ca65994e5a23b5fceef303fc68d6104616e8b4fa19b797c03d40d04d12134f3913a0df0a322267528d7c61464ec502ef14a45e7f4ec66e359981a326a721fcec3c3c45d9490b341cd4d0cb6377dd698f00e80e9c2e2e76ee0b413d2d92000020854c3f505cb01a5fb894b1e7ea5a4e785bfa0c5762236c23fa220e2b003a869ef41024b8f8d0658bfb8d1737bb39ed1b856595f0579ba0bd310b2a0563d30a6cf1f0889ee3032f6f5a569ce0326e22b16f704d38141540799a83b50dff42e95f0200e28a5d628ed4387e99005f814e3c647c7ec662688ea43c6ef9d661412c90384a7f086f63bc3307144173322d475dbed630689c7e4ee48ecc0b443123a5711b35471797f6fbd6410357b3d0ee2f1c71cd92b1e4ee0e871df435e0e509e9de3f1d796369deef42f121e9ab4d100794cf4a8111177df695a707fba10c66fe24a8f940c8c22ee84787482a4daf61a92c3449961d3f6902908d846f8f904891f82e579ac2ea8fc5e4d9cbe590c1dc06f259d61a90fee3c406b46a62a654688a98dcb9288367aca83804c0bdea26e5fc63b123d3b0a374745380a148a4fec58b2ab81698fd0bc5c64687576e81c414914a22a268c8996bc36f9cc8b2a89e20944de028d1e633791b96191979b3a0201854678db134453dc61b53c353b30d6e5af38cb93a49ba3edada27b79fcf669be64564724b8457a0e0664331532db8f64b520604007f1f14613ecabcc7df92be0a5c8ac6bd153ea0f446e33f75a4e5fcc5216df75d3fe21167ba2267b1bb8a505f27bc84710c46d16d9a1dda269c0091be175c63ba5afc3a7b0e0ee6041b3907c042ab7fbb069587458e985e3522aa140db27966be0a5d09eda031229a28c27d25e7c61c9872eca3bd225b416b20e9a6c133b618272e7292d960e4d2fb08a2c59e07c0acae263dcefdb57bf29212b759c333fc3f99328d9b3bc41266c5e0fe8d5fbc1668b48bb087781713040f61365af193560fd0e2a8b1de280bf6ee883d643148c87052219f918bcd744416a04d1640415549195d70b19cae478908c029dc9c302477ac7129c67e68f57330fdfc341ff764ac124a297fc92f4d0a91d78505c61ac303ae48411e5c25c324934c091a586d1b0ab2d324dc2123b24f45b4d9ca127ec38e9131a0a5f1b9bec305b2a0a444b15fbc727edf354201170a96a3854d9e4c674eae2488ac89493106bf90e3aadd2e1c5972bd5622e4c426da3113acb2be0212191e7fee17d443bb214b2c7ed77af92a5ed25c43ccea924941bd95ef2a1ca4529b057bcf6ba03cec9f2488a1fcbf8030ca539961b1455c33cb726f38f1c24f3912b2d549de71a4fb04938c9daedc345158892cff2682adb0717a66fc0417e11db75d13856a69d240490ee10e394ef9e7fdaa53311175da49213000c9a55b1833faae3c386e3e38a877fe4ec08b30409021764b41f50c3976d6a25802507777b10a12127a963da12b245de747e74687a126cdac7270cf4aa7ceb612af1dc97faaf71667bfbcff5ea86e22b3cf7ea904a291b7cae4aa05d8d00a05480748e6b48c86cafd1f256b3716006f82e72a3154b17e91648224e74bb6411d37ad152295f6b41e5f665ceca8cc08de5846e724eb850196040ea03d056d2923f03571992f44a8c1ceb504149f587bbd2200e7d5be6706107dd40e8c1ea58a8837761d433b2ea4c42e487d348a1bf14ccf996cfb7ab9535d2f8405881aa9ce8ba98f7b7ee62b30255f1a5a3ca730dd4d188b1a31ff3041ad3d43b09d1212bc824c40972d2b6593abaa08aa8667d2c6a7e1627a00802aaef03741b22c4bb3df2e9f5b700f53d34c8c7a29f15bbec444c6bff63b9ed10e8ff49148fa8d02f98041d6771b190c6f8bec7edb315b10e00ad4621797c0769665093035b2328379c0e59930f097d48ca8758eeaf84c4e0eb2445f54b8a741c20d5f9014edc313f83a77102483b87636e4617358d4c94195368987a9119db874d3a01a80b7a798a429cf3334c5e99cf728277046d626e1685b76f1064452236d297063288f612779d83f0961b03056b6c76c51e2397896afde2549208d524253b3585169804eb371a399b6d40e859674a2602b82caff465b5e7160d2a925a1d2249630df3f0f4985ef8a07c664318af561bc32a0dddb862d95ff211578284caaf4284b789c89e0572a84800157639cd5efe4e2b4e9395c7742b3e2d911b09a2bfd007e3330956d87eb5a351b20779ea29603a994c8874123891355a0f2dd8811c6494bd4e8529ff59e6976b3a583ab289d96715dc3e97ee163fd87e0476f27dc4da5ae94798eb0b9eaca303cc51a7ce2127a9abb5ff568dfc745180043b2b02e780f36733b8680418e59911fc09c238cf982a540f741dc27a3230a34e8d1eb42838c67f73f35317f9da3053acdbeebc62f075634d34c5640ebaeb84303081a0e1c00ef6a191ed44d9d131091a240c3f32d8e423e0740c3f760526582ee6018e416809d445c34941b132cd31dea83e2a3d062c276851365e91483e864973e7bca78d216f18c23f229c3d875bb3e99fccf64c471eb1d01c39bf496526103420c6dd7dc541d5895743f03a26e125456921c5763dfb3f2c221e1caf6fdea4ac4a25ed919b512d907e974244a59cb3f876945edd21673596bd24fd288fa45c59b389409bf5d74e4e9d9c1527ca398ee7b300e10ae586ea7044883df4d2afe5181c4ae3cf147fcbb1c4738e9a197f9e5fb4097e7fdd784b90d31706363091c351aee1d0bac68e5e301e9d59c013f2110013ff27fdd52e12897d207650a44b2b7a00a6526c4da0c20a15c7a903cf28d458e5445725c1bea063eaccb035c3439fb928b3a0e2b23b6a36e75580856b18c0da04881b5cb4e937a9a6b3d14ffcd6aa167c3772e5386ac93a751e9d4aa3ee4f524adf3f75c5c7ee27514abbacee5d89fd9a429cf34d1c2263b740fa437dfbd4cf57405eda37000a954e69d4ca24146b4ca30354e6ac06682340e30ae4a0002948f5dce074f28d14a83582bd2850996a76c6fcc8d00380a2b5345ac28a2b44a7886deed4c2424a6deab4bf377431654b53b88f8d2a91a2594946b7394d2a05c4156a97932a5af59aba94c92b8a06f92b1d5dbea7de7b8a06ad74e8b5aa4c82309e36105fb3c4a970a4a7e8264d62f7c9a762918866382aa58a63715d825f60d0df45433a76baadadc096baaa75d2adc473388c95e4dcb5307904e09423d4545eede48729cb965457ed28350f3bac25158cf3645a91efbd572a7303b0649424644363e59e5f1a3169854ee109cd78a64f3f4cd6e50767a275ad4f3936c4ba48dad4496406de68865cf189bc66eb1ba121c5d31e3244c2af19e73c94a2c792dbb95c48121f394be6f1b14c110896c94c4c81f8a59aed476a1436027765357d6efb1b9344c84d086c4c12ad48c8153c99aad406505c2e2debb6951993443c03883683ae86407ab95f0a1e83093054ae7b777818054b9b3e3b4b812bfba951d2caaba1a8185b6f416bdb2d6dddd5abaa9858624e8dc9a0b0083a44f905f88fd0810fe594d0f30bf11406f2e09a6f525bb805232f3a0d6a5d4453ca4c1bab974f22c3c79bca549d31e1e745fa0c508b5fc8a9908d23d594eebc8250a331f185a63713d682daa63515083462bf1e22d4f094dca3b55196b681d87bc58d491460178ac841d3ebe271d5e51b4138e54044b168e1fcc09466394b884b3140c3f4e77f51fd523cd62407bdb130c402642a28c08d925eb56988a0dd3e546e39cfcbbec35c9cf609147f5b13bb399c55ca3ad22a5605aad10fadd219891682b263c65477797b80c5046eb90096d7e72f6e083d934ed3cfb617ee1df01dfd354d37a278063d7fea2cd78bb696833ea0050cc6425e01b518997be99acb0c02ad87d49e3151c8c212055a20a28089dc524c03b45fa830afb5902d6163d4af6f41746e8400de96bb90540840cd42262407e73685420582a9bfede938a7ed1db1744dc3618a7a274b5aafb0d9fa15f7192a6dffdc4a2d175f67058415ffc3b6014eb48d70f601dc53ed16512e41b298b677e8e9269ebfd6a23249e73aacb976d3901cafa4f2ba6e0987c77d6218565633904547b3597854508420232ad2d289ace2dd6d5574b601667af0fe5f1165441d42a5f62c8dd199047176abdb701145151213daa28744ee9deea56d7811ef74f323b667667c191173ff18415a5469b3cc07684d42054c6b38aefb36b156ad5505a541a9de94797096709ad5cd8810e5a34128db1443019be53e540ffbcaa86234174fd38df0bf74630d89d0329672b5c20018d92e12a6fb42c416b0611755ca19fe20ff873cf8fc6f04c1597c1e7cc86e8e3db7f817c5ca3f0e1563444d5f7932d0ecfaa56703483bee4f4acfac2a82f16055843cccb517495e47a3408af437e8241ac1ea60216101e78bc560a89eeeba283be20a774f3ef13538b69cb9caefb7b2275b04fc41fe8d301fdaab3720d81f8c007cc3321cdbc83714969f57d91382231063ebf236d2653a4a10c01d9530b6c14473816a16c60426bbaedbb2c00e742b6c32ddd3888f72a3b6ccb77640fdcccc9a0dde57d2ae89b0e1f32a463894c511a0c10d34c1a42b5f3ecbbebaf827e941bd23768d46f5841545936aedca357290ed734be0f11135ec23da03779c24ea89d74c13620a39f8debce1d1f2d3b22124b4866fdc2ebd94bc487c1c32ecfdef00144887d00946a04ac72bb5bfc5abe6cff38de6ecd138e87195a11051d36d2c907271a227f58dbb6eee1d77b0838dbcfbf0b9385148ba950601cc9b1bf148760ddc0588ce6e74ca0ec75e7269c5cdbf3f52f51683e0be5faf7157503bb8fb03630f950649b09c4e6fc9f6e2ff7cdaf85c5c2141e343056c0fd189ba2cab762e5679a62d2f72b838b49952afb781fb11a74a6900110c048cb008829b8b7ac63ada877a0e634ccf6fa45dbc4b8c72ea6d775d4a76b5020923ffdabe3fb099b8dbb21fb98de435551671e44bd8680e6f37571a65a66cd65b2928bf7dd830212239a49e6b3e80818dee42a5a85b848c8a5a899fb43dbe1a958000f6b716c8e4df57ee28e9bb8e52acb0ce220109a6d19c21067fb9b947ad9166e8c695e48ec35772ef4b5970aff4ea0aa9933568ed312de974ce2c44efd64e85e0c9ea664d7dda6e85d65e26c220fdbf38bdaa7544d4a2e45052731e2856f75b852c27c0ea87559ae937c6bdd13a5737544129a079c61c32e27122f46c1333f9336202b1f1fd891c9461238fbf08479bceb37239b5ff4e748b09003aed781d2c4bc99b747abeb165f7b44ba1bb9969b8647009b8bda09c0ea0101411472eddad0e8e2576db66a5f33a4c70355282f186a0645eacdfc00e2cc322fca2712f3195750f7a5733090b6ba7b8efe77eb0a23be667356d61f179d823f256c4da40ab311ea4641f38c4e897602a7f5d90937913723e5b19466dcb9635f3b2580368dd0e860a46f2116fc154b54a67836069781032e59f3f507ba97443c2319758013772e91181c4671361334d17621d961ace1ec833729da495cc56a8c7bc4380b55008e103723b2747c1352924acf828a5b4b422d1fbab5d4108ae9066132d87f0d6325696b204c108e998acd22ae775d4f8e5cdfe98b7187277dad3031eb57522cc1cab00dfacc27105c891ac11414205212051068e200163811846af8aad9e10bd5ec15521c1d5659cd41269856038fadc5b11c07621637830156c17ed8638f73fec631fe13be57dfaec802058f941ceec83a867049b385569d4463e6b0700738441994352b863566239fe0b661af312f1c6edc64c23972b7e01283cd1ef8fc6ac911b585382abbe0ee0e6b0589255804700d86b62ac85d02d138918f15d575421fa54f0eb9d81ef25202ca2551660a7c6ffb926b47ef12adb5b80673ae5914e750fd5fad6182d866ad17c037cca1d260cec45d74da94864444da54d449c4286804e1c7eed9d47fa77ff5eda1b0c5c16cc146c12e5ba45ebe3c2363fd0d0bdccd15de645fea4085ded20e91983508381107a9683e8286238ac2be604d4f52e2b54290ecdaa12a25f4106e67390b34ff88ea7de738b26b7278f201fdf0274ab4a4931a92448e69967d822c47204d9dcc34d808514d7db3a119b3b98264b7202c1146a1c3e9a258a2dae71553f654885f9589347cc12f8b4ad5e64ba4cd86f84c43f13b0aa587a50438516551e4e10f186546081d981c2171183877d35f3272ac63419d6884f2127d0d0387148fe1b4f3d4037b0933eddd2bbe6074f060be1f83fb89076e2864a3d74a877621af2b58fc361da579493abb413bc0d5659bd518ecd47ec2a2035ffae6f9ac0e77d8481a4901a02e7d06e0394caf61ad55abdeaec7216a6f0fe46e81b6ffee9f1aab8dc93443372f000cbe18ccc02f33c1fd06b0178869ee456e5d93908762a581acf5719adc18bb97de73b49c7851df25915c8746da8ae0006a144d65695aa7de7a4eeb0b4a7b1b6f735b69d7d832722bd784e698e1d94730c5d9aa6c1ff656d36211bd026d23aa562a0bb7b42dff813789c69ac82183c26a186dd1501c5e77e1a8ea2a94e8f8792f5ecd91057ada4bbf13d72c286c13ac0876adaed9d413c25541c895c786d2f16416c5876c82d166c1c59cf6e1141ddbfa75c545062ee0ff7e5d63ad05b22532aa64776a3dd1c3c83f2a14dabfccdef840851087d94ab434358d611f41e71d30eee5128003b88d4a7f59da083821b66858353851ad961fda0a7c1a9d8763c35b844d8ff0bd00f2abd841f4939b85dcc7bb85b8ff6491ad600ae4afb5c3b030ef5f386a88f39ec45695b49031f7b278285ba43b79d4a9e05bd76e3220fc90c53f904e9b64665bb48fb49772d4e85f2428fa27ac441b3b2604892bebfa06dc9a487ba25cfffe872277ad8b80313dec53ccc283b66bc48d783de02e5e0f447c71356c618dccd943896659ba30c9c0b0b82429906724847c9b19d7a3af4224f065e3f6afee9f39f4333a32385426f49fbf9f419a89b17cd39cb33e843bf9f453129cd86714b122043229f1d875df97c17ddb28ebc28ef19160ca965a6679033400e12081cfdeb5cf3f56678dbcd440355015b27e57ec63cb7138e89ca0aad9f6dc0e6e20c848c4ee34dc262768cb8558f2de43a1b9c50fb983bb037cdd00f8a5177c9014f9fdaa4408960a2fbd2c561ff91afce92c814ad464cf95068703ae509f89aa98a5ad1fca6b509b5e91cd99d093ae2f833214e30da4ac872d1c944b449c6e72b5cff4012cee1c2a8e5a9c7755b2a5e97f7b5c1e179e80b3ca1314b6b8295f81e6abeb220b960d77178816d3dc1262c042b3561c4a8cb58f879fbdee3c6c5b28e686365165fc8ba90891a8525a60b8a21e07fac4ad005a497ea902e34e41e16be70e483c07f1d15606ab8f426e9e9238604faf42520f0b587d3a54e894504ce087195842915d81265e151dc0848812c4940e23d8b4384cb9efa2da7ef64f28c66df80a90c06b4694b1f09776f22af09357399553f9c61af977b2c0dd6adff5c6d841913c64e5fb3c119fb940ecc468b22dad70aae9a7c1149077a2aaeec483ab276e4cbc2c5bd461481302cebf5b3346d26c7a2f543fb6275a6c384002a4f3d06f909080c139f93d68cf0f9666510a1bcbe61a0252234843dbc7d744136884235bd2cf227e4b1298ade6ec38720d15690939a2233a041a487c56207c962970aa322f920b6f6252edd2b4711369ee0c718c4954d96c2413b92ad04619998c8553afaea678abf3c4a676d92cd3043e833a0bc60ae54a956bac1cc48370dabce2452613ca5361dd459dba315326053b9514e7c082397a3d22ca7a157047cd7469c73f35f87b58007bc037f17043f532ec90601d08b019db98ac1a234cb46622c5c6d7e98c28cc5c503f198fa29f2042919c304d419f3fc619666d861f5a1a094a76a2a0f0b14493c4328b5b33c1e091412ee1b05e2376210fc55707c0f124ce680d8e803898807f4e13c6cf0ea350047b0f07bbc327f7ac9a20122140342beaace5a2f0d3896e4a0fe6a65884966bc541e943a0790af9f2b7bc1c2553e16098eda750f038cb821d67ff3cc9514051942d01ae451b892fdb3245c26ad58f7a818d00923e172144e0b5818d1e3028507c595033f25bfb5d8115a992b9dcc66e689a2605f64ea6ac2df2504bb34b273d84fdaaeaaea8d5ed77af1e00c2c5a24d7cfc47a242115654e421596f898d2e01c732cefc9bca5b8162a4ed7943a2e457a18d308359282b7e95d43e0168220213d90b8b53feda513ad4b1195a9d6783913b2aae9003f4d6b89c5d16439954fe44f17de575b82190416361d64ee41f9234170a79c473cc7bbf2057f7b5b8079c0ea4da6b1f7ff177b64008dabff37710e59a7e2ba480ae469109ee1bf3eb7c3e3249eacf5c4947d0ea7a734c2968ec01657a25809b458990f69013eefa4162c538cce1c2e07a289517bbaa6ab07f1bafb1fff904a29e64fdc650d09e0dc29a5489136f515416c0d540a1dad3ad75514bd679ae966866764c0a9d978434426431b024764668974ef74edc6be178e21b24301c9151ac8a5558c5518b0d0413a385690c53cc34aa14574914d6b51ba69fab5f64bc76d6dd04376159bf6d9936c86730508be97482e6c5fd0e0e6962fb28d5dd7af47d249a6968347f66574ae1db15ed68b474da1c021a5b548489557d8a5b4842bd8170de484dbf77185db90d1eb8d4726da72aed07bb61995f0a310c050adf37cb1edf1baf7ef413e0a1694cd08b52c07af866a581910db6ba96c5e6d89b09f064103c14a1bba73d14b3ba69321495570a13f121fbae08bcc63a90c04c07b7a06348f8dce051f0769d3a4cbc7f066e5659e8704b5c7a14cb0d64bb7743eccff468923d31a5803dbaa291cface356853ef601cc94d1d0c0cfa299fc64063c93689f213911d32381208d693d84081066950e36d11dc27573c50d5e900a93aa016d38a42afb6c80a5c19d9ee29cec7614be53ce6b8418654be0f26d39b8bd616b0ee657490a260a851cbe4db088b9064d5ad1d7404bdb9346a39114aa5796f71ca237c232428688240a23706fd65a48faa960b0c442ab4296fea918d06bd217a7223a24e910ec211960bdd952e0c5f68d55d2908c1afc190875ca49275265d21da5d8d8fad2b1b94256c8fe65c5eecf7b0be971378d131f1545b489f508beb29b713871c37d9f32da96dd1522e62794d7c557b25744f450f59f65b093f8199e565e0db7955ddaebadbc38f1a927cdb037133f6a183af4e8c104c0cd29acb1f7d09215c2e20d685eb6ed3920a8d592da23b697ac25af5ac41c53222e0cae8c1cd5c13c700b4033c8b627f401ba38b261dd467e28c33d09bc809a79c1137ea405e7641ab9810f7bb9d34f05462436b11829be4046c360116de349335bfe7bece091095d857e8261170d5f627b1c888029023e7236859a3b4692700c018cb1a64d4498f4231d9adab0b5c7fe631e6e915ba4f5672e848d55a6fe0597f4cceb19e3104ad28b4c46360eae477804d06e650c5c83d0599a457d10deede4d8c0ae9614e4a194822252d47e04208d5649c11f154c9c6f83b739e6511232ccf03543c5826f9f14d402248454d9eb4f6f889af0e55729e172b0d9a855b98370e92411fd82d1e0a2e181e106381ab182e6ec11ac0e1d82134bb189310d41cb2e910e63e51f9689e1387429c5b77e505b9af505832a9ef18d7eddf0d66ad4c703a030d3e1f33deb66e63507df6ce77f616acc7301b2340caeeacd1df36a253ce4c3054028ed4b90940054c3871df5d94702fc7b8f61708c653f5dc0595e11555488cf4e817cd48480e4847a8b3b1562abadb43c66a85fc0ddbbd162acb8c3a3392c7f6afc1efb3e3e1aad1b814ae8ae417be82abe1c74740464ce2b9e0e494db9c12e31a990836e78f963870a94eae3d477f831a6a8c8d74d24dbe21c24c099f456c71d89391232adec41ab3c90dd84549c06777ea53f048270dcece1d04ceec5a4894536376e8a2c85951ddf4fa8377982d637ff2d1d7f0eb44fa4f273e150276c1abcaa5ba7c0d7f62883fd73e3be4e7475f5b84541828e86f11f1904e39c65dd8703c3180ef4e75b9a307df22740b68fc4a8ca03f42809b91d02f927a593d2be00a9abf468ceb229e0b51b32de60751c0fdc9e5d8befcc702143b42a5bb4e9cbfbc014c2cc112839511dc745e85d81e7ba7a081c642f8fe8c855536ae0f06a0bd5d15b9c0ed9f714521b8428e7ebc48de8c1a74072a1f0ffb966b332ee353d819cdc57e5cee387dd20882c535d89d583e0de25bfa7af1b127b284c6c80e29b65af75e66c85a71a856358cc9f1307e0c27c15ecac0391618b9e33b38cb0751ddf689e10bdd80c331318c63a4b33763a18f5431226c2a58b92248176c64c93b76344b5093c0fb10489847e02090cad7fa94602637de2d031d2c482836b382e856f4b82724f71f7ec709bf431202cae508f92429aa09fc61b209283ec09fbaf7a3ad46ac0fe0ed891fbcc5779e71fd39c0934a9e81facaf80a25731c4e56ccc7a1b751bb392119b69c93a68a9f408bce279fffee1d3031ea76df4c24550c201ef04af818c0b636e3d3de1ee894dacba0020c09f752b4a0687315a3b294cafc60647446fc0b0bb1915b34e6fc947a7464481b37db5608653e7ef2162fdb1ad827e74121a8e03fa3ef21af957decb0ea50dfd1e6d4f1492bc8adff0d86218fab433f5d04b44723bf17c53e4aedb8c6115327fa281849fb551d350e6cc8834f91c725408416102764f2871b8eff26ab05e339f111656e359c9c7d9fb20fb57dc5c67bff259bc12d75c81bdb2260e2891ba19c1541cd68b7278135ab9853fd12e5067a8f0ce738cd6881335ab3079a64c3d431955d216841066e6fa2140496514a8fe70416bb0b9d444b9df2c7c2df2b7efa5b66d790cca08c69c4076c2688c710e1f1aeafa236697c24411151ea6195ace8fd530c106e2179031b0c4561eb8c8114b23d83f17be8df94ed36e92529d43765de28743d24c0d53a53d45586f12212854abe70a749e98ed2fa92e43d219d8635a27dcf5e6e7ad881b2eff4f206f55fff8a3f6d7bc759f01f334a3fcd10315d2d48a9d01d30b1d30e9134621e42f48652b170fb010618963c7dc3d02b16669a36fb757d9ff3ca4ccaeb3589acf22d0296724b90941eb7c26ab22857af1420245e5550db692196818d68eff4f3e0e8f86835a89e6054fec1bc552c5bb37b41a39accd7054d5d5649b7e98ce945f27d41e86ffd79467492c03078e001dc9c7a6231d04a0586c18107e5a64afa32472635e2af8c5749292dc827538213733a1e41fda756c85a452d0e9f48873b552bd10f1944455f31f4e53fcdca50ef22c037ae2baa6a30c2692b370bd0f3c0223c0c0c16e7a57b3a47423672ac811abc75f05f519073ee7551679681a2e835f83de3e41d889e0e15573fdbb541305108e950fdf5e56835e76780759c03164b6c0cd1a79acff33860401b3f9603a6d8718dd671b76b93504897020607ed409087ffa357587bf5d11f1cc454249dddbd6dfbccaba7693c4e7b554cedf02809d9c52cc9bef4c8ffa6e8735fb7a05ce18b7d1fb0ed710cfacb292c241842a054c50225d21d31f44cf44111bce5fee9fce57bd37fd57bc1d6a67c5d84f98ee6345526a84629d41b90197bf7797ef40aa327379100b23893392b0d75aeea29f7769da1311c90f3230e788cfcaca46ec44778506f73f07b4455da1f627a4535c7311952fa0594b23271bdfd454e207307b2e1c2f9421d9fe8649ca2d2feb535123a2aa5567bfd1145929da551594e83af78ef617121154e20a8cbff6eb92f40aeef232e6eaec139d8a8a2662ca7795d08d7b69f0bf5445c1c78398b28ff8c2e7f7ee1e3642f649024b816471ee0f30cf10f7a033f60d50e1f965a23a946fdb8f2beebffa90d1b33a7b5f429488ae984c4a7e0917b96f7e00709ccd4d52ff63371d6722ae684cf75b4a0ffd6905110e038c229295077075a8e28770c7701bd029ae6448340056f50c64133822d06ae5b4c372c0acd7ba15e4b2dd717baa420de26eb183f08be947965bd0c634b0443e7a807f0eb68a4384a06fd60b0eb9a9268ea2385fcfc1e766807284fac661b0bae40f0da7183666af9912e3442cd560cc483ae52a5eccd602e4094b6799d26e82956365a8c16569011202ead2d0863464feec5d59f192a53c4fc350889ed4ab99568bff769f9737dd4da95e48b0efec016ca3c218e19a8a6c8e33117417bb8f32ff52e5fbf3f003f7416d7ddad2d2417ecb2f0abf97154465eae4156a29d1f07769337c6d15cef554c6c2bb0963779af24afb192aab614c9464317c9272d0d4a7dc252a1a3782a28ee4421c8432908369cc8161d074032518ab2cf76e4c8e509e854fa9bdb7401e5e84628ebf01f8ce91693a5c636af12a2ef741f5569f94a200a7b67c8e9805fd8e052b33bc8cb75b4d4d41803258b39b8a4b2b0485fe9689bb5f388b4ced6279590b4da01731158d3fdcd894611831eab90723941f7ad8674652a5e8ccea52447384dd3166106cbd9e5763c3f6b4fc53123a504af34a959a44fb14025514524079841abdf04a91f7fc9c2f109d71ede5517c0842da815ff6bb9f0d8a6319486ead0c496c4e1e20c412330de077b3e702329e8ec8a0dd55d4664dd2d0cbdab93d687eaba66600a3c567cd6cf94f006097deb0172fa68cb80c04babc11e584373557d2b77f844088464317d14017688f3721dd66208028b11592d7065c9db92672a4421ea3b51425896fba51c2721650f84f5ab775be93ccaf20a86981f21700f6da63778125da98b1ee95e892d3420248a7ef03de69e54d4156d1829a4ced61ce0053e8403cfd93bcf0018a01368768b73530e6b294caa53995d7839c54206b172c69ab80c928d6f30e1129163373734da8436f0563c058ee76e6fe933f15fd293b74dfab4fe39e202743c03f00e63f5804ee36a5ed24bf8e5eaf11d8ae99ec19bfc0cc4c3a747aabdf4d0012edd4abb17f1c354bb9a9f7786323c37a9c46e2a7ee8017767d839a83fd4e091042caafb0555794ad317b7e6629c0440899ae3c20bbece94f9c47be3a422b418113188a148b83cd62d3a5e55e456138b2f2c66874c33302fdcb093a51135127c4cd3df26c87c476f29ff1b069e8f82b4b0da7bddbc9543cc50ad230e5309b1ec29481ac6940c8c48ba0fa623f8d49229c7ad7edfeb0776a400e0b52b69f3dede95ebbe5137e9ec809100f9c6955a78f4d06ee533e6a7a4b7c0bd542839c4225281b8b77e6059120b920c1b5ff1d877d47f65f072c2c2db10f81659be82bc888395cb1a37ae4ef74dc3b930382504e3071fb6a8ffc191bb09275662646186cad6c8e472a81b242de586ce449cc48a5525a2ebde36a8fe26981c7b8bb798f9ae7369c0a236445136f8f37a3eeaefe5c32f1174b413a1af0d7118fbe4ac85eba837080379f00ad1f5c11a0edaea29ee8d21506ff657393bafef4252f0d1594afc80098aa47cd313e8f7a4b3fdfcc7e20f71604210416a141f3d004cd7a746c5834b32c669a35b8f80e6055f03520d8f50d0c41bb566a88bdb5e748d323cef649534b061973176e998cf5b360fb5038fc187a476cd1253938e524d183d8a0c19c164e5bba2f50bbe136e402c81852163f6c5fe6fc00168ac98b24066228e038eb00f7cd61599456b101ff0ecd7a81d2367a2cbe86b49fc48810cc0f8ecad44419036d6c6ec970f0e5439b6701f76f86ac8fa52e14f5e9e99b988c07772bb67234142ae95e89ce640c2d7ebe0da715a1f090290aa6bb2b3fc6d3b4c3c40d14d0ebec5b15b3596800bc8b25ca9d4e01c27a330c52758ad31f6593eec74307416901cafca7d9fe3ff8838a28a7f3584379cf68e4a408029b3caecee8d6ebb289809582bcc25155bdaeaa4d114a9a85717107303aa8782ba4c545c3f6329e7dc9a1baa443d52aba88c360376d3311167ccad5253a6a8cb52056ca9b3b2da3d1563a46d557293147b515264555a3dac9d9723a466ad525b92652d22765445eb4f567689e30a2011f593bf1cde5cecbfa65dc27a07b7c596efc0843a3a75d3e7040b733175748bcbebf6d0f4534d01e36ff2ba6505b4c3372f6f71b0017675e076bcc3afafbbb9c55ccfded05c237737191508b178593202985735699c5e7c1da7a76fdf793e5178b0cbf38ec1eb2fd8259a4cca908903051ff6d8415f1e486c4b0b618803d6f8d9504d4fa8c8bb597079a305bf06d0035aeb6c33d068eca9586e968e487830e669bc6ed12cb16c8d07c2827eac165a3ae2c88a527e22e70b22a3959e5407f366de6808efdc55c10c57862aaa9571b39670c1a658490409893a383d8888252ee288bbbf2ad07c0583169dab00a4e8d06175747529689d44e138b00e32909d6c877d6d78112d3b4b42485ed994ba851b64a035d1cab5279b57b98901ae6b31bcd0a6b47a90cbbb744af3108e38ef04170cad3dbe82dcd98e5b157cf370f84c6ca8f24ca54a3c077dd731437d0e9afd4db664f17c227096afba42d87556ef38e7d71b4003403aaf36821b3af9329c3a36ebe676b4e88d419cd19699ba91593d60be4bcb2c53358515f960db5ecf6b51f8583ab688d55e1891ebdf58bbdd7123352b0978ccf15f5b5cb5b58b87eee8d8782f60e679098dfd4d403c186816cfed02e1c8fed89519b08fc3a13604dd1376fc0d7936e7f8232d9ef7201367254d94070da7b569893f61418f6aeda175240ab10d56d7c4177116a74839eb016497d1eb9556a38f072082ff40c723b552c9d1265e86c2ca5cea6645076851ab8bb1252a17de3c230558b1a96fe5585c4a755ab322950acd0c39fab5602af457ef11e5e0c93d10e7021b783f8d9ec58086d614cc321a25c6899dfeda8a380c5b9daa772ee6921374be628b9f0101317c0e225b75b7d7c9533b7ac28012326c02de706382221ce20e504cc573f5be7650e5b09101d788c33bfa22a261ffb2669a84430e0f0760a737021a60d691e0abf737069810c0d1fe7c07b0703f943c0dfb4329e0eb05dd562872e4ce17586940242d8ce19faebfa6eadf17f7d3c1dc7290dac508e0a963fd57b725e9219b9b7730f95c0b9561f09c3088ec12903e559856cb0ff939c8c93a7fd1182e69370c541a6c7d71583efc06355d137e23c8621250bdf05481c70bffb9197d47af5a699983cc3aa2560b84219fd5cfc2ae5b9d4367700699f5a4f29c40e2cd2ae1b6d2385652c2f4a303ce3a0a8ab3b476cddd94c403f793ed9216b9807ab9ac6b123e285ec4800b6600c6b1495bbcc2e9b3106c0f06e5516f8605d7f40f356aa94cd3d9490be65b3eb432322b32e3bdb8bbe7c754c292886c5eda3fb37273a30734c4fe91864c21e2f20deb53c6ab19e8b45cdb0cf91f64eed045d7f66de7bc72a9af33e7824a37ac93ceb3b4a89fa403ed62ef1bc808be4622eaa312238359d8d47fc8299540a4dbfc5d594e49a253bcaefa7bb4a002637765a248b40b168735f69511761fc2984d0cb44064d5982e3fd2d1dbbf813ecfbda50d388405f1668edd739d85f9cac655ed284aaad481266b7b78c425a8b1a3ffb7b665ac934a9e6f803a3d269cd3fa7d5a88a96bff42cb7b60d940a04d84a81f78abcb2daad98bbe676af2d2dea0cbf151629d94896aa9e5d7192fe501c272503833433272a378cbe158bdfc82eba213cb5cd55076fcb834242083ad8d2aad87211c8886df6dbca9baa9fc74954a53bffe4d19c0ca2c8fd07e549949b12748c407a670b3070a4de0763a12856a66cb7bf1578cf374d26f663ac94f27eb93579f695c8e42e351fa854d6b920611793c184c85aad8ace705c870c3554fa4a20325beb84da902a834f6ff227b30671d0fa6e053b7df805263ac6a4c4890d9cf0cbf950af87169184d8237948920e0ef8b875c011458e61bff70a7cfd2c1028082e66c6313c02d521a69840b425a99b6ffbd919703386ba400ac441bca6e34189471d01eae3ebc061bc1d214c091a1f998c5fa91256f60eefacffe1b2fb7cfbe88b67481810e4612cb093fa56341621111a82f04932293c3bc2e9567d4da91dc53b27f4d0cc17f2e73f2e1aa9c1f200283d774f5cca9ba9a6b5d47c35ea308d41557eb813c84873846850a72bd214e9690a0150abfc1f1569496ed039ddb1996f7159b2b662994694d16293c127472195a645822433e65913060cb624307126bab7ac0c72640543baa384b88833a3a4f181a1916b7d7d3352eb6a29a9991ad4a7ade540983040ba4c2339cdc7a499eb4b37b6aaaf3e839676038e14b3c677e460486ecbacfd9e42740c496f29112e95f0e1f99a75f6b3b8b8cf7036243027e9654765231d1d7ea0e1405f09c5de501d5812a5d16d3eee8bcf2c6ecff6766c5f55e63070f49d5dcf9a35d0997334aefacf34777458749c77cababa2fbaa873f1557b7722560759cd8046ca3bec16c36b526815252268b3d3e25bf34f482532b1a740dc81b13aae6b9415921e15332bda90558fbc4fbaa26419a7ba02b27a5c06a044606936e8c1842cff9c08728c28eabdafef69117a338a1227d28509ba4886117eea411af8a5a0909354acb85d0c7011099308493b691dbf16d6d5337393e623da891e9aae95acd245fce4cfc1a20a029e5379b24caf517c71a9c96e272f98e8435b31e73385fc6d7f0a0b1594d1d27f62f0ccaa402216552c35de53379ece5e7bce52bc0ff5d04664a09b8f4886c08e54ba068e0b47430ce1f2e626e2114ee4602ac2374ca57cf19ff2f41f52842afe5c524be475c3392d604051a0c92a804722c6626d63e56e6742a34b11aab588b2d362b1679c479aa622a739a239ea8b8874900568c54ebb4c8c7d192859c80494c4a5cdc4051486290c4c1b43093a39e37a33af21d09ed0479153f18580a06cff9953ec1ced72f78ef1208c9105f6fd165f1740ffc55a8a76a3062a7c5b0624d2dd7e5a7934c82fb0890abef4fc2110baa99e1c941ba55644c6382014f55bb3aa0a5cb13ce4e3da934c385d5a49f0b045899409b192e2e3654e2a6e06a9650331104c3378a3c1bf228bd9bf5476dc41bb13306a0708b372bf79532f4d73cd15bb38de59d17b7118c6c4080a0555fda26d699824c08a41fdbb967286350a952d01bf864b4d4c794192927239faa03b36842820e417696519792e85eb141e1e788167c1f3b41114f2a66bb7d48f0f8b6a0142e6e665a3624ce96912382c4d97dcc99a8b3bc8f7a18cd5d291c069bca402e11385ca360d9bae163cad6e549827dbe1d79712bfbaac9d5c106ecc57e4761625e07bc0ca4b75cb4e94bfce5c3c2dac1dc8b20da79583b80032c9442aca542577bbfed1c2fcc3a82cf861ac8928bfe3c1244049569a31a8555c0d84f8a007c09a145da1102bf3cebf6a4a7592ef668b794cba9518548ca4e49dff665798941a51a746e354187bd1d9b1c960b997fc44adb369c7b13e0e503f40245289ceba6a9f11e60f92a8b5b0c3e73fc9855aebe9cececf4ad04479c20e1bcc16ecee2ea19992556dda93925ace4c328822c270f134c1126e9c208d61def7831b9eefdb773d25466aefdc13482b7fbbaac22d5dfa674c757fc82a6b6ca83387b7531e0351b5ce58b28442b7c31df34b8d4cb12fd3d23f02542ae4920100878bc1d0a8037c70b4f28bb38e078b1a4b0e16c7919b66370f50cec805fdfcf33507a97f0f56b68c88e9ce64480673ecb5060c1cc5befc60926e3f4946a7222fccc0655e0be44a14efce2d2a7b03c8348bdcee4b2b6a1bc1cf805e177e89201dad58979a0cb6de196e3f4e1f49497246e756237114348fe98a3e96c24dd00bc15688094f90affd9678c5574547232429ae21edec9294ad4f46075bdcbb7e026f5fdc0b5a807b3227e870ae0c91ca00c607c950ac4fb30390485966ccbbdb6b584607b395c9923fdaaa61307f4e79dd1d1abd9ed3349da314112e433e2bca4b1673878575096b30335bddb3fd9bfa66858ad61d586d6fedd54cd879473e80245dc2af207fe012e5d43546fe84ed737509631349014498e65cb8757dd48349ccee846da55dfa91f41e50ee39f49b56030176fa48454052027ac9246e1324a58a6bebd2307704a3d6509890d7f4e00e1bd371ba11a457e96bd78d9a8075a46b51cf20a6bede471d891ec7f820761b75d42085460592716a99097980de59d29dd8ef038de3515696640a51f628f21b6ff7f8534a0ccb9ee3002e698659ca153461e14c6b4db770880428b9e5d2aa5cba935a7a03546e61d77bc34d8eba993931bc712996f4fa9100baabb1e3a402f8ea1f769f3340f056dc117c0571f64af9da57787719d7a18a5b6d24f48d5d6418201a827d6658419efc5232b27d0213a8ecf73aabb9417dfcb29e2d45fcb8a8a8d7d53a65a63063535bba1b832a5bc0120821d31c697873887ba7f8d4398cc06729a72aabd01011d897d6e66863e2df3db7e932b0742bbf61a02d226fe460a7580bfe0913b3a3802c438c869ed9e36c4a82b02a547d98af191c21f43280b8e3f72188cda45e25104b0c10ef0e21bf9a8f2cd5af9f476acbdd12398eb1d75bda1fc30bb86fd9e7f66134c1e750a4ce0039f390523400e1b2a9c3e75b0dabff5babd367b9d3f9fb4a1a90b8e75f327e356b64f62643a4e0303af5091801dae18f3245ba534425479855b384f7df9745aec10ca7cfce1d5402810293b468ff41858415b6edc6c249e5cf709ae8db3d8e8f67e741688ef7eb3ff60bf338d9db20b1e78121daeeb34f0c0f61f7ea285409130850c0959b2e93c6142512b7b55eb1aff7a80a1ccb147e4424240de651fae2807a9e28b969877089d5dda81f2b10e48a1f368d92ac8512acfe72ce0cebc2553f7f3e2da2c56084a8b84b3970882bd315cbcce941e1511aae469204b1c43185c13019fb49194d2d8d88eb37a2f8b84f1a388a111d746ab32846a9a3b91ed673144c4308b33478173383714e48d981a242173b2c47327736a6ccb62e358eeca171c5b5b733587ca34dbc3141948fed3f3063774c3cdddf4666fb8e94dddec4637bda19bdde0863777a31bddf0663775c38dde507fea1ffb13dd0d52897813ecf8a76813e86198953735f74e30e11a29d18847c46fbb7451802172d34a7a5cd9e8d9d1da74608819b97237b33c2ec304d21622d32210d8ec8c169b2270b6357e0bb6a7893dff44870b5b918089a384e2eceee2fb3426045745dbc4c70a933bf0bb66342a20a7b1416e8e32469ab087e5d01a388308ede908187e2e9ad3b6ad6f0c3f127b7f4ad33e08f312fd4532d747d34e3f7496a888a30be41b832af919070c304800d6e604d91baf6f88968f1599a8935ca2a490b79cbb643d505de137c6d88c5998ea3ef083ba764dd1097143c8795bc8aa68e5240bac38278558276e53f042d41232d788a22c5829cd222be4a828d6aadb969c8c35a2c836a2288b4e4a19688bb92a8c75e25b852ba28d6821c0955a592749146d281363d5b2c1aa452aa2fbe4836d95def982223e9b2d92cb68fd83c1b80ff3f8333a0a154ae5ebc0e4847b5d7616df30e0a704f021834c028e0798d1d0359b66b33ae9c72838e0de81c98afd1f4f203cd5e49a3e012b292f9a43db1a15721b13ca44fb7b699444cc5144653f8681b25c41aebf18a2a2017c92f78bce1b89a552afd9da56d78e9e76d5dce11fb7905141c87386880af65de3a47dc57e9c7253b2b743154e6b4525f2d9d0a46666a80e931022b3750717aa0533ca6cf4b8ed5a348c40a3c1360a745ce0ed9e8190555bb004cbfc528ebdeba17cf117c5715838c158b566656a7f6ec3a7992c896821e9fc8a8b60ab2181c54264a1a7b52869cd5583094716de05d52a1e62653b402df49dc7a93a5ed75e93931f0635d6f1da46a90d5f0ff2540a1b6a2fc40de6642054ef23c7be461a26b0a20fb2038572fae7139afcf0060cc552f24c0c91755e969dbe182273a8bd3dc05b7993a294a01a5fc5e488f25ea1b9c00314a513f989c5a77703da2ec090b5abcb7c3f3482c100ba5be7c0ed4d6b7b76ae7e185d6e48463e03f65dda53f53f80d0c35c939b917f70681d1b872539f2ff95263a7cf5f1e527566b439e666a720029d380d15f0385941191bb0f3b0ff4033b0dec609dc6c4b8fcb96c4b35a63ad5fab66812a25e9387a2baef4440b2a2f3d01b586598901731a2d08e491530805123bd25f3d0f2881de19bda18829f3da249e5ad9d5dad08fe16991dcc9c126cc8b655761bfb2c5070938806833c83674a8e032993ce5187d52ed0ffb41c1c82ecc04d112042d765157282540f05d9c1736a32bf574999651ef6e30005c3493f0de9a220e1f9421fd8ccaa822a917e2e3aef3354e2e466b043acd7802ceb24c27a89c2ff3aa7d73c2b4a4f7c3f712f25125b50b3ec1c9ffa334ce68935771db145f391b594796e79123417d87d6f95cb079f177e41124d8454dbc3d19a8675e31d7a6a33ead5d62db598d1cf54ebab897aa3307fb5b01dc34a1a1abefd4a0a24a13c083c437f0cd21ac33e315f8c677c2f3cef2fba8947c79197b99dffab45d4e037cace81eedcbf185e5ebd5ff06b8ac17b083a442a58d3a6505a109eb62714ed8b908aa36963c0416eae7e638e47a9ca4dc9c955d4013834920a7f5e0ec670222600aa08c386573d4dbf02e1d66c6d1ce60ca1918a066d8829ed36561bf9b1a68366b0236aaa30311d12021c65a6d61070bb832a341e449f665875caa2277348cd12c2edfc8e3a30354b6325fbe6505166fbb02b5181b83a53a24d26850690f96652fd2bdcde2e141dab3935da933f0d52667998de87c7b4573e159d755817427cb7c89d0159fd15691eb566f594869e87160a320a5905472064ae02fff278516a9372a3d3d0b6f4c0c6bfd2ee5ea7af83c6a1d3ce939e0d85fa1f9edb10702cb831305552157b8ae42060d86eabca327b6aad00dc46d10601945f3a1f9a278b1e959ea3def8521f8d3800cc102590a12c72bde8654ff90a6f7deee552a5b94a739eef3307541508c745e4c77fc9d5e4184fb0e967bdadd74ae2cce7dcbc6522ab251c0aff2629efdda92399404f6d8c6117537f7f875bac9afdcb11fd287a9f78b691b86d7ccf4bf1757193ab5de9e3818364c4e4c20164a8215981038558b9c554435646cf59c1a1a81abda68e4228489010f2d741ab800669c8ec67997c4982a5d885db167143793350cde2dc614df9009914c2cd60c6a51edf4d6d85dab0b821058ae885311ae1f49f18032a280660f59e6610702f2dc8428043449989df38351bca9fbc7d5b8b24cd3f6bc3944b50c8a12bedafc610d1e07df37344bed3580ec2a84b35a77ff00e7ae4966546ce36177a5206ed3ecfbbdfa00c109f7e47f199b7646a55abdd105141a922370e36a7e63688fb6830bd88cba1a48372ab03e959a17428458320c11f4cefb3930439621e44d092b213b9d02b61a124d19be1847441dd1e171bdda3ab30d95ff9da40c9272e744f0022b85d302cfa97cf37e190f468efb902b525dd99acb38cda3889c166d26110402301fb5422790c179a494fc3451d589f24009d0bd6ff5a866735079b96c33c3f59d8556d3d54db07fd2ab52cd2af7bd8af6695334cc3f2a9c3af7d3e0d4102e9638832207eeb9a6b5444e020b306f43f9fc76ae3ce684be65ea293e765786f1bf5eefb128cfaad89cbeb574ba21adcee36303bb9223942f4474c804db875871c7768a1bc9214eedc5697578032215954703ad0adb204464f3d27b39bc4469e8a895efa9ba9015a32811aeec67f2c2c0f85aa79fec284e3656d9ffb88d8da52eb31adce346b50de1e2d55c12ecf440d2d85489763993f070e8bbe90877ba76b89a4334d0d434d69177d56614d916b04a08d8e853e9dff0a82c341e4951c69324f82b2df401de48e32302017041214b09be093031dbfd0abe946fa8740b9e4e896500710bb180db4a5414a942701e57e2634899888c4ac80ff4d0549848e247681695c0fa48c7eb86e1ca7fe7a0f21819e6555ac9d9c260973e219e2288493aa9a7c906dd1ee0ba389c6bfdff886930845ff5b7d258582dba28238329bbc0849d0c64540a3183c94e57ae602c20da2d0f28485eb09cc7d80f4569c3e7cd63480b2ad6225c38aaf4a208775c27f0983fa081403a9357595880b99987042c23e9e1772160c8286d723ccde3661009705c3506869a4751b065b5c25bceb4e265333bf13f8975d76804c5e5c955d51c3418082229e2aa2e59c4921bed189a1495c3822292839795ea330ac716a4ccf91f4178650ced7dbf5322815f724896fcba590fecfb85344a86bce9f5c6b66c224ab7c7365d4da34a5ff1f573eb7c3c8fe672a015d16ce5808c36e364e2c19c23aed54b3591d5f524a4c0e2b65cbb2a6ce8798fb95c110424521bdeca718a3f977599e846110a6ed08cc5cfecf5fb340782a2c3ec9923640de0faf50fc4d4fb45196832b1896c1c079c3ac08119096d6aa24837340531a6cbd39a08a347f85910c1c50ad4611fa56150ee882a7ca812913990e5d3a6ac9e1205c96c59febac827235498636988dc9c80bdd20ebc9e2c0f17593a1df8b43d100d081608dce7cef8bb97525037b52e9af51d2c62722ca945452ecc7abc1c990bb3aa0ee5bb87b9f446aa4675e6f2f6dd2f71d007bcfb1da959f37f9d132f164ebf5409cd9e8800492b96bc3c3324e061a768c1d5e39861593f297e83ec291ffb6be7931738ccbe9510fe48b8543da5fe77285845f4c3aa4e49d9ee0184a090f26137eeeea0060c7c5239deb6cd514b26d3d691c7b7d3021c04e8f6a81a41506bca36c7325b8014ab8cfe7535a16dd540f5df763da9c3e09de3cc988a17d9789de67ac345f8b387e1f0f02cfa976a25746f19b7a4eac56ab55470224210f9ff30155d15996d3e9d3ef3d1f2c91a2dbef649baf1a12ba16d19c5eca206ebd402f571c5b331749e4a00718ea4413cc2960de5eea205f71625042d3a362fc5b2bb740d2aedba8bfe855e92df526f512d65be0ee8f4971b6451ab09d01b2c1675a1a8dc4bad9bee8c681a59ec02dd8a1ed8bcdf446829fa7ff026dfbc1ea0bc489e089163508b8c40ee4258d5f1b4d1048e175e72eef78381bd4cd067a5dec834303c3e4e9ed7217795f874db836ace5a302229044c32def21ce0f52eb75aff3a37f01bd570b48a1be9122fe23b4beaf2cacf7dcc3e14e1dde8d7f2826fadb4daeafcb5430fcc2288cfb2b7a0bbd68bdb55e14f42230754d14da49f1dec0be61d61c2b796fb5d54706fc4b2ea2bc1a00136832213c22b427e6910a2e39eabbdc202ab05b878d2f2721385e5e7178c52fbc84ec6331c07ec092b650e67d6cbc9012d7cb01e64c78b4c7fbb621aaf86e72935d3e2e7f630abac43ec3b6a382eef36e9711450ee3f073065fc0a8502d1ada4676c58226d5265864882713100ee3a5a3b1f799ea83c711f912b1508d7f8f69cddfcbe5e9cb35108149d42deb5e3e759d0e4f35ee15daeeb724935772460d2b6d61e4f6cc341ca5b148c0fa051c23b78b06ab2472c297d39fb401610e7d6c929b0ffd2fe09c45b1d12248e9b2320ebaf528689a037ef91ab806cc8e293280d46eb4a0b454263870f33b920314d0cd39f9b875b763235a2c7f71ac00c99110dab6ea0b2376133b99dab53684779781ee2b9678e962742ba21689875e26e8fe95a8b90e0b350a5d8c4d50e09b2134065aed7250329c590659594375a26e10d051aab01e7917267b78b1d32ae8a32ed404138936899de7cdc0d7af25aeb852deaa82f0264397e494ae5c9261dc41e675283fae5b62efba40078312e423c944d159996ada230dcd508a04394c15868c4ea3094a20acd2ef63a36c68ba1122ebffa195207204090047577716438d0d16d7d2a9c4b1d4a0aef45d6c3672b135a66a987255ab7c60f373e23ba77a2465c23a864f16d889832ddd625d1725b8b509242c55ad4989dc3ab98f22d26df74f8d3e318656da6db29654009d36c48856b552d06ce18bf33a6dc02a8a8d46f42fe1463387018a37201369acb445e0007460e290bb5704b1eddf0b476b445b83f02b19fa1594b971d0e60a6cb551d3dce65d47c71826f072a0de4d7a1202c32ebfc3a798cd2a6bd65545e4c11c78d1d32d5d5eab6c0c62e57067ec14c84f40127d621972e189e7f7f571059223ef004b810f1765c1d6507faf09e1efff0c6bb5b08651050e38a09852ddf10fdaab380656590da34a12cc72e5c474ffe6aa9bf86a67e901884ad06ebdb0e4ed93c1750f05eadb3fdfeef36212e13a0d47bb7c5b25ac8005cc9ff252ebf4e46a050e0a8f54a0753b7fd54c670b38f8c476731d30daa2708c07229a5e13164e3b6018de805de7bad0f236c79c06840535c3069467bbbed3dd54935c844704672dd6ca7bde7a10388df4878d4260d20fa674bf759c816511da300f8bb89485955295bd8517da797d0a26e774b4362052390563183a5a9f702b7129acd9f62c17db6d909433d638968333697aa4ca0002ef1207ae2eaa7a4ab70d099e9e15d5518a2bab2a45a0c3338875ad074146e1fb49ea0b12f2546e5043e48c5b183b8e999db053b005c0f1b0200897b0cb3315066c773eb90b37a02e2b470908e3905c40969be28a26740972d06903f4c70e3a3089b1c4eae4178d2e825c387c94f4b81436b8e227acc12edea713b2802bb664969b51fe323cdcfb76cfe35c888e95b1b474383853f252cf0d9af3885afc15923c2b3bf72a96f4f0b62cf3ac09e497bc710af24cceb2508c5689d6da7b37b0342099941ccf0fd8e1d6bc7ca5131df0373a85997972912aa34e8e48423d588fd0d85c53de147fee089089564e202ebdea492635815fa3910be80ab2fca43fc9c06116e8f7d58ba9c26434941b66e582ec24fc511e2be9808631401423a252ba0f4d525ca1705bb2c3cd5e7ee8bf7f1ca33d89d1c80650935ba33e77c9461a8843fc19b05b8926310afc13ea9677ea734b53e16dd9b35c2eab67c4320ca1afceb3a488309ead26c6178a6f1b6167dbafec8b950c30c2be7fe8bdefe1854cd3ed114391bf50ddc8ac46644487bd4537498ac56445dcb15deec382c003ddd0c8a6b7bf9543fc9fda40160b5361183f474811c7a89515b283bd341e8deb54ff50c136e0c1d838708f0992dd6928342cbc8ebbf20ddc8e68db6a736183ef754b6e5dcd71b52113c9107b82d440f3a0cbf961d5452d1f007bc8191f7c54b31ae0e7a5fbd40091950a2e38657040cb36646ad143d080a97bc25fdc953119d705b68c069d2120d4888c73a4a2d6e55d46bef06529a83d32626f458e2ad813919a4be67bb3d9e669e21e3a28a1a43715cc459f75083af7f517d7e4973c5571164bb1c69c7f0009c04897dc517459c3d114f587c2d87f36e49e5648a5fac0b4ef596b1fc93df73ece76ff4b583a89903b29ab3818fa3111164a0ac1e103aa9a6db32b10f47349f0ad2a501c7e58cba46cf81f530c2f70c93abfae75f629d77d9b552f52d51a6fdd70a629e160d5908091ed7510b4c5e5d82d4c057fd9ed82d015b849b3e1980ed7813302ec89ad4c05e920e5c286876a8b08763e9cfbaa882489be7d1fe69d154e2576beef6e3730172e0459d169b8fad19069aaf5927b8b7ce22c15cb319fa40bd5f3c3ab2fff18f708160188841d789120f79b12c01b188a6dd548f016941365d5486ade2f71784460bffa3626e2bffcff3e285fe8c18916de5b4a491ab799aa2a4a3d4197745555bb8c9d35bba83e195b23aac5f1affbbd0226fa08e7a9d259d533d289d4439cdfd638a4d46b4ae4a36f2df4a4de652ac798b513af3a70fc58afb263af0e4df853a7cb366b73fe3f05b8ccd33fd10838d12bf4472c0cf74c0ca40275fc962224f5429e16b83e1ae7bda69c23bd2a5af3ff389b53a58d30143b50f2d2dac1eb9bc3b82fdb26554e021162c1d765693a9d2219d26e191b5cd3fb8f0196f2f1d61f408021074fc10599ada3b11f3fb82af89a69e1abff4dc9e485ac9814108fc27afe77b83031ddace0a585741836303707e44fbdfe1d3ebdc639aae959f39c2221503eb71c2850be79ae8522a9a506800efc9702a59b783ccbe86fe1e019e65ef3e1e6a748cc697b990166010aae2ff088a32ecb71b9c598efa2eaa89796c0b409439be2aac7d94a2fb242a554b6c89adfa1c205b59440c7d0b22de8568091deb2b3965eba2a39fc63214eadcc6a0553dad15660f5cb48a7aa37782edbe8baee7b652d676b3a70b93fa542e58cd5429d386a29151272adc54276f9cb40a5e9029cd78748c151da90d28eef4e7c16a99008cad6e6961ff1c07c8a2f57e33126504e46866e5c8dd015be46b9a858a8a6aae85426cfb2d375611b4df511426f9368cd7b9210cc844dd0c1c97b0555eeff62100c4c3335cd7a99ba84b6fe513f43325f5178cb6ab2ad832d9bdaea87094afd7207f4fb5e3a9df91f1c3a4cff5754f161298018634d4965b60eaae7499f2a8a729d72d5fc0a062cabb721e1b5868f17c8bd29d0723aaf4acbc19f96d51c49047294ec59d9151ca1d56e01962c4b3a88518861893542830a20596de2051db62aa688d78c7f4558b68605043dd3cab6f6474a4683d4467bb94eeefdff0c6ebc44ef3d3446de0a055ebaa7dc13f93a37ea46cdea990d4c7ce0073a47d4ca59524824cd45f19606540674a9a71a2056088bbf057341c9c5306c85280de80850e99dca218cf1ecc77b11ff3ea890afe080fa5dac6c63e8667dc25526d00fa72a05d40f7a118151f8d363ec211957df38bb0a738c84e922f7a653d0a1b74ec986274d6972f7962dc519255eccc83138ce22d68982c99ccc7aa35c38a8207c5d07a12fee61020a306c5d269771648e693a00040107044940f86183cc06cbee7a9ee812b8caf74e77519cdc4108db3322060f49fe52251063ceaf22b3710e45ef21e34a4d690ee224b707aec62a2ff9edcebecbe039a029c146e7556ab8ce9c10312960dfb82f157b5b747c6e9e5ca03628bd2f924c0180358aaf5ffe875c58df69a6e0b10158bb16d35577ee31c8253d0d8ca2e571e77ad9815eb4490c7ee2ff41cd44c7d043eeb4136df4c4e6a24ab859db9c90ba7cb3496d0301536a73f117985b688400ede3636c35bc0a8dd68ba688b9e4e8b00c4992d4f290d4e0949e6e8fb37ad7199bbdb9efc1e03d9effa8b292cecafdc3f05a3d43994e409b4c08e700dd03ed99d199851c6d99d0a746d0001cc1b951223181e637a9004cc9ec2d1724c69478b78b028c24748cd4df5ac9b169b5a86a682e3a7aec4c54a14cc8d431f8482fd6f612f9822aba44f33e26b65595a22116416d24b9233784a0da5b0069f3723ae82f9291fb593088522297eb33a359745a22669e586439201f5085fd4a7c925c2bac836305a6b78babb82ef0bc3b07d853468b2e21ae6a71501b59f7ee466e99bf3a81e697bbf98c9742247699b8ddc88330f7e4011b9e43881a793d8a3cdc1292742ff4f6fad10a5d647d7152404c3a1b9e50f0fce1443d91fca703747e64ce84b2452f0d4d3ea73bfa242f68d6ad12c625c10ef422573bc49c8216ddba15570588a4204778fc65a15138562be209c38458d895e4f1938dd939c058305740e010b7b0542cc2fd5461294239ece47a220e320ed9a95a0cc30a8e788868180a4c267586a69898aeac6d167cb3745c644d9a73cab4c3964a36b0d0bc038504eb0f0c0dfe242cd70f3b1f29ad7f2219637cb9c878e12bba036b287beca8a381dbfc8c801ab509d2b66db88cdf454e24934efa8b7c0626c75e0f471eee34c3effa7bf602b5b36ce2301a9671dc5a0a4e84178fee43ce9871076b4f8e10ba748e4fda782651674847be5da95480a195b2673c0ab7f549bccfbaaed10779ccbfe9c2fc0c085cc61e879e8f4c854805594fbb94782acf85a8109face45764f80f2e6bbd2c2a6fb815972292692cba9aaab2ff380217b478c1dfcbdfebcf9bb0a8e158fa380c385400613ab78d6ea9e7e4d6dab1b66d8041c7b96284db9c90bc0afd474b98c90e357584471942d909d27c82e4cb4ddd29999a3ca58637a7e2504ef1a9c279e356a6f9373e35665b5e4dff6741ad5c4b3239910183c5659fef9de141a02f4b22e18f102891849c20ddde7efef435f1166ee6174b73ee656ea82d8057e747730846392906df0f6743bbd4a2dec6d56df29b14a59912d8eb1cd269ca188a1b839e13d2442050640a7235cd0e05d1101922ffae0c1e58ec76af50120ab25eaa8aa60c262dd8c788e20eb6a6ed4aab885b75b1f8a06f444ad462bf2f242ec520e680b9f16d32201fce4b14a8eda6c8bd78a1090d3483aaa3b46e0eef8c61f276bdd125ccaa2a4ff4fe53c77b8d3696c623e3c8e9b706104d04a8eeaad8061168bca565e1fb3e7058fdf26bdc34295fa448dea4f95ebe77ec343aee890a189e58f44966fc51ad7c9c1ce07e63c9297c93aa31bc5391d7be746abedf7c52c74981d28933206158fa3a99b7c50be269c5f9742d24c378f619aa5d09196c8c0ebed81bbb04774e98b99ce6c34e699ba7338553580b7f466199066d3f6fb9fa5a901641da31b1e602b10ef8715b70a06955e9d128b0b382db9d1cc4a67f6d79e651a829ecb7b29dd41cc1e30c6a523591e6743169398620a31ad335ed27b13befcc5d2d29ec9f10204714556f167b5fb6261baeb1d3e0094ccd47bf144f4e22c1d947e9a34320363b61ec9b56a01e1fdf2fd4d6900ca98d52ae600154fd91972272c702ade70d7948bd7c0a2b419f59df027fe42d705676da2b183fbf245301d78f17ba9cace711d28ed51b70043f9ba1508a35ca64bf029beb23299511464abfb0a49c34f2a2a2fc27d81f84c0f60b168a18da445eb1b76b22a2d900e7885e4bb020026434cf12bb4203e4007c2b8c627361860316267ad3cc7d85987e071f184b6643813073d6ad9e99989a240c311b4ef6a0d7be123f187af4ed18d7eb67cd2d9577129aca938d14e7a94c2604f324e345dca41abb93932ed5249911c98d0bc63cb1318e1b8960836e0e8386d1f6240d2d29c3a9f4b29a917303e745b266809e7c3eb09a32e52f460c2a6c74b7b8c15def711ee3cc053506f8b8248cce853023a093e70cfa25d42e3682171c537f0af44456fe0e5bf7a0f664c30ec22bd627b531797ad49ef70c111fb554b0bc8bd60971e2a09d8ab2fd7e89c732235ef0c840df6605149ba67afcc9ee4bf7e8b0687a4aafd2621fd758990b8c173b1c6caedd42aa29e3f563cceb1256458d0afcbc5871f5cd7c554489ab931a350c6b1253df97669e85d4b22dd6c34a1580fc81304c2ce8c32a3f8036147d4c84de891a3ce82c3fc098e0a92871460cc63c6b2e9e3c42443b785c0a6396e3d37c47b07769617c92193a26b2df45f8a07380e5070c06933ec53699fb85a8ec9292aac8180898886bc66b561d10bb8e9c8044e55f1f6f2ca14807918d0daf912578438683809fcc62f80c8f58e9ac331e5da2b4411fca55c866d2dcf5962252b6566a7fc71f7cb0d157f7a85acac61fe52c93d84cb57090980d066c4699ae0ebebb6689a5d9901f6b6c25c051407492f0f586d41108c9a7d944b7dae38ac1d7b628a065988c90cd9535bb513c58531034446728511ab603ee1e012e7abdc22144f8317e4ee35213e288aeb15659b4afc8121dad0a5d439b4bd196e0bcce6ab09a4dcfdb01d9c35879702323f98b70032b9bfbfb4e16329f5fd465321fb64c333a723420c08f2f2a3c8ad087f0dd3fc1ad09294ab904b493fc27c1b4f60f552c420bf74e848a0209b7aaf78cca384ad0e1a129c198040cda1b263282d36d6011f46b858e50f27b111fee7635ec3ec5c8fefc1a5bb20ed130fb89b91245b3cc22bac10f68338997c6ab55a9269eb082757cb829501e90018eae8454064015ea506c9e1dda40210a0b40810b2fcc0d3194f4b4640c50eeb963c054891570a0c349eb4c1bf2cff22a0df382db4e8617cf3996ca738f3165f74146f2469194d75010e68553f05c1a23948fa2c9acbc077fc2146f74e65169a0c9bdc7b71a6bfe3685b3f63191cae6ebe42f19994e419ed59bb8fd4fce6703a33e0842278752ff2f5f0a4efd74668846dfdc56456e99b2314859f988048ad22e20bbf46c9e0057f70e6a86281a35cb0d9685947f7ac7110c2af745245b9fb9bf3ac71959a245bce61d24b4cd9dd18443569f61919ddf977a40c651b9268d53fc3b06922e153ed88d9e4c3a96667e7737c397ad4faa3b8342cc825b85ba2b91a359b982eccb92dd7579c4135f89b903d2953064e3ef6031ab3e5970aca8aab5ad53ec78363ebc1c699b87433b128cfff08a2d8ef63401cc284759a9c9ce3045d0fc72ef48611138ac81ea0c086fb39071a0ef9931ba61216431bd7affbf9202547d7bfa2b1eb2b4a609845632e2b4d13a6bd15f07728bc1d0398fadf6e6d6a61a3b52c0455bf038634129ae2fcba66a0d9389a096c3f355b1a49a9150c26eaa6b9249c856d56c325a3493c62b6653998d01b52f0d553c0c5131ac7b90788eb8f3a9df3c18093435e75ee1de72c8e9f6b95726265d1fee9ebba9947d420b6151c4a09b90ae19e808e882ea37421ec1a4a661896c33c16dd4c70850a2ac468892a5d1bf0a05b644e3fbb5f64503c7d9f364069583f97b242e56bc3643d0a4643bf1767108adeb0526acbe4fa0daa7515718d7705442f842ee9b2a425c8385bae9fcf0b76286879446f0a24b71008466a4d6b51ca4cc3984d2932073702b69c7cfe7b825e2521d03655eca05a53c7d98993393a356a7421827895bf1aaa08a0039621e8e313c0529a200ff39d0d01e6db34a9dea1f25738064c4de514954bbd16a723f193631cbebed66ddce2ff51a108aa086f143bedcb66422ae7244d0090788fd0d59506f9d980f3c6596092a56ba110edcd8550472ec8c798e2ce558d54c307218c7cdb3791da3773d52eb7916905ad306a7dd871c45406c1b2163ae1455f13cc888ee6086b6dbe14f631cb118462bf463372b73e7c1c0db6b98e52a9ca88f4f21c9a17436ac50d65f695c652f46c2d75c2969e94547d234b22473340d1e8f8562b001fb4a98f9157417ae82c151ccff636c1b6407567dfee24feedfd4af1fe83bd5f1465b3f5462c2a30591c7c8049f0485bb23083af77746185aab2587b6f1821088994251900e8663c53c5bead87da036859f4ad85ad58e2bbc7f1e68b37522ee83516b9152ff630455b54a05f190aaac8adc047d4e90b50c2fd47031c7326e85dc09747cfe36ddd3305d1c7e07353ebc959efd63d1bc7426661742b5c280175664d7f9c05074779fb46e5eaa1571f728ac1027381e0a21eb01904d55f4bfd7646ead9c3cc6b4f01a874c93aeb7a6286b59343900e70a59e0cc23d38c9ae49b5a898ed1dd77ef749d45d9ed698f21ba4b5d3128a6346670e445a8aeb4b60245f855aa7f2c31a67d686f33fa5653f2162b64c162ba4b6c51f9a6f82063632a9cf1f41482a19ab89bc017eeda7a10f981d0993c5adb25025e48cc909af45a6f0f8ebcfcc56de33594318d2f0e92d1c7a4b8795dab397b2c8ce3e4c0a95b729c465bb3d6e7ff60e20e19ac72a243158ba3f086beba888d38ab25d15027834b622d61575ca2e7a91000dca745bdf030bb58278250f181962cc09af0865219c28b0d56c142c61e4cbf0590940add69f4e0e6aae17582833cbc2477142b6c2b90d11401f6e2db904d7c8b9b3686f8cdd0d9adaa1edfe42044ac8bef43ed0576527a07051cbf19cbe715377cfd48f1661d95c26be0c22b76f319b3eb6e785bdf00ffbbf4755a7138bf070ae03063c90b60916b6c5e8d1ed72bb8f7d18d954baee5835f01242d9759f83718c37eb87f9dfa45f9ef957ca42c377a7cab0241ecc57f78e48eed4080972fec6c7fdc57ab50a6bf65ff18f17cb5106c25a05dcb2cf3217375c680ce945f8ae77207a1a0e660e96128b3ed717586c8238f0c539f67f9f658f2e601c82bed1e79877ea4cc9cffc0e6bbf7b9062830fe3b4f89e875353c817b0687b70f460e9855e5fd659c2aa551f8536de9efe0a42b6010dfe3d31b2596bb8da41337b4bef6bbeef64c244073853e1de34985657dbf12416a7348bc899240b712f4c6c8b3f064325b748dde6eb0d912a77a425e79e3937640073171d7c09feb9dcc4ec22c16d84121aabbdac96136fc76ad4d3e1b77982a4ff248119dcd0b2f28f6b4fbea547b5c2e940039cde5fc06ad226bd9b26d072b674fae0e6add680a35b1d3970badeb628bab93a72d14d7a27306fad99fd3923baeefd828a6eaac589a53c7a069f14e7ac935fe0500a8d6bfb78ec837401b4452a61b19577d90566c5e6eba1011f5731bb015e9706815540dbde8792f04534953dd8cce0a8f5c29bebbed19e275a7bff42e6081ce95a3c45844a781eb4128411f1cf39ae8c1883e3a95f64b8c533a8a44dac75a7fb1cb4a03131ba5052feb585c23071b55984caea03f695ec91e80b33a9412424bdd2b20db24509a50d2557e761a7f3e760949e9088a31330c937864965f59f482476529bac6790abe634f7d14e137737115967d3a4b7f16ec414a856eb5d367bc964559d2860da648c4219a4e96955194135539d87d872fd8d0d70c0a3412ffa8471a14fac493d5ef4bee8431b684569576d3995b2e2348cf851a0687c2ebbd7b95aee4db3feb5aa84c48e9704dce03633b65640521da395a31a2e2208bcfe81ac6e7109979c4daa356f8ab665b62be465bc8ed28362c8471a7fc892362149731df1a3abf9a5dc247aa92e89ea6c6d4a6493d26f76358154af8b0c4931f2dbf911cf839026ad44aee22efa18ba786f871e13674beaf855c901d9c694386fa99671c4acacc36d43073e5b3286b79f61ff25b457e944bff1234cf73de7f9a9db4532eb65be4427a2c58e10ad325df2416d3e1e93bd00aa39e24a0a9fa15664ab8099fe0f22fb636e44f8a8408ca9ae747ed4e5c0187ea41a1853ddd1aaadff6df9ba215844caddb0bfb39a65f23b2f9a6d220a72f4e10e5efac1047b3f034180db6d4bdaba0a8d0025edf12314b1aa9d6bd7410a5cfc21a2dd3ce772b2cf67a01fe4422009b6ba5a6ca897a70887c1f8ee94b3559373439317dd33240fd4d1193fe54d985df37e62d964aca591750f846baa98f4be521b3127193948b1ed05faa467a9b88a7902d1cd54e206fe796a9211d99c4673a2c1e844fa180764458a5b6004d0e59fff95c93970c828cac662c7a6a33c8cdde4c6b0ca8c71e2217de24540711ca7a697b088faa5f434a186123d4e18be85bf745c8a683956f806cb45bf09aa6698552f2bc9dfbdca8e092fba7ef45c6bce0070f0c4817417c9592157481080aba11d571645ebef424c83ba3faf0d03e0cadc00b0dcabbeade82c84252d9c954a493f2dd92aac0e4c146e4e5dd6097066a6156ac8672988c6f33a1c99f0ccc3c40cdad43ab71d9c8bd601cde9a1b679ec54ae6932c0fd08643bc8b5bfdbe89a5c4f758ec167c4fcd64f9a155266dc1b40226eea2b0c0bd5cd792b2700c53d0e14763496f3d16cf1820dc47ec4be88b0ebe1a86944fbbdec623565a2cd0c7dc2aac9360452ae3f4efd7fec372ccbb2e9bdc91147749d6121971f86604624303bba9bc25e8eb47fe6c75d3cbdc931acba4f00214b455d07c72c8e79044778aa890c079d9b6d8928978dafa444ac9dd4ba701430d332ec31f14d79b9dcd2c5c069b102628e38bb91f2e139df08013f750dd564756d519323296f49d7d48564dfe1d84bedd84e8e62906831b1a81b1b89d3aa61f6951ce3875e13e78b0e819c1fad2b2891c39bd01be64fc733102e98b0d6af622cba43de3bdff68bf4159a570e70502a8ab7e11247fea9457efe0bf28233a3d2d05940def147379697af96e5f3df300d300bf0d906d1a262eb04bfe225801e0315a33e462f420afe9ea52d2960f530ba935902394067c2aedaef0874959ae0ad1c3169fe006c49f062ca03b92e5fe3803f813041217617d8f3f4a20615f51cf64950da08790ea5e1ade3bf3305bf20a9786584b1e7d354fbc258f98741d730f20205c606fc76dace829e8bd72000fb3c4592fb0d0566b849a12f2c3022be7b393f163d0c06fbc90666de84ad24912c9dba9bb01edc8708884b41b5a12b7a4cf0e9a0e59779882a88a6202e9c557b2600a8040c00510d919a64d034aaead17e436a0fc548bed91c742605d0a859bfe320bb9aa2dc4c0e2d06391487826ae25a825f6126a847d5605967236241d3650f53e29e33c33517e70d072ee4141d0f243b9988ee21b61d2995d159d3a6610d7130efbe86d3e88b7b89b43b4fb5af60009d0cda245df3f186e3e5b98931756bbfb83ee162d51909837a316257dc6b8842a2c10e761cef23074b4656443f4cee0c51d468b835805ce26e4078ebaef8604eab7037b432189a1df361bc390d4ebba97a10ce8f2643b632e1435f9ca2034cc54215312de016583fe2c20ab09554f7d4fe6455657432b4b4d4f9e4de29710004aefecb2672adafbf60b44fdf1fdee6ac62f1ec2ba6ab8127f20de4f8f56725d862821fc0824b6778ae1cfdd9b87d51c07354f960e28f7156efc612150fada0bd468a33c74a609cf834fa14c8e87a48252c2f20ff5d097caa55fb9e7f8d3bf2b3faf9894b2b16b21356ef5234a55625c580e37bd0e9d60064b41dddacd6471a533f8a53dc65489bf11fc18e0d2e87de057ef260a07c3830312054c4ae22c7a31f2354a2536e4610ea12d7832c4886c34bd889172cde8c6ea78fa7b82ec2eddf58c722e7f7a840500f9f442e2532d56bb7c1bb986d81f8920f61e686640a6c6a8850445f3278edf161eff27d207303855515b44413452d5e06a2fbe9470f10cd18b8e100f8bfed08b888b50ddb817e06d1b69519b2804775345312c1e4ec05e48ad486b90a6e20fa8a95debd4d41609ead42ede58072174588d4d6aac65b24e13709c9af6cc0ba1ce73d3b46b62481904a6fcd935ed5871db45d286bf4b8f7ae210a7dd956328532a084dad5aaa089378a0b563df6f9e2ad90078eb58497c69e0427d89e919c4938587104783a92ab97f451c42e03915b195361e4f9eac325b7d1efe6cc6c303b2c741c4ecb1ab27f3a348225e6eab8a4f1bad4e69230ce2e825da54d0c39431d97183155d37ed77bc82d2bc530666f7701fc96ac0a9a2c6270767917deb27d4dc5c4cbc7fb651ed6889ade85705a130632ec19060962558c4a77a91aaf81187ae291369d259cd7e347748711614627db9909729d8b285a44f65c7754867e49344d0ea05a0f61bfdd63ec8b0a2fd6a5da1bc8de7b46792ec98dc2585ffb44b354976a4bbef57b060c6faa57998cd065f0f7ddeca27ea37e6ceb9d8281e0dde9077065ca3f3b078a3dd593a9ecae7616fd8fde07552c7e38e5c4fab8fd3c96e0d9ee43205c820818a27f8754454a9f12970963085f9e69ddea52f4f325616ae642fbbef2ba9a504b473a264a86d8897ab8a9d93321270b3421db13242c8254ce09badcb6ba27aea788e9e4c7d60610e44865d5ad8e53c45611a196c110b65c5e3f7ee24c775d59cfe37c1741ef0627989a8baaa64ddccc1b64efcec532d14b8222d75807c2be4e74430824b1f4996d621c1bd74172ac894de2148cab0851164caa1581848ad6925c226c710d58db5e94a084a59270208a9bbecbc8252278744e072c815a22a8a6c395abf26a3beb8a5ca695bde4330aebaf4a6a03938e4955336bfe4a8cc37778a47454086122512725ae15a9657b7303cc4c4a9592eddb4dd4b73287395ca2f0d0c71192f1c470ff7c63354af4d26f3d7be0e67b369241be2239d963989e1fe9eebd8b3c547f12b942ce489ad257a78c1494ea600b8e7f9b05eafd73ca60bc36cd56888fda7016168b85aff96c52ef23bb76fbe4e156a2c81af530427c02ca9085932889689e3514d144951e9a5b824920e440c85099b67bc0cee322b60df3344b3cdc22cbe30c08b79cb7e381f7e9b3d6900464bec2b1eabb23e0300d6c97548d42e0a2993f89cca3061b19ec6b9082fd9f25dc6ea956cde25fc47ed8aa6b17abdb1f1b55f7475e825de3edaff56142fc07cab82e0a85cbed1765c21ce6fedba3cbec4375cea848426d85ebe7508952b905a03e42483482b57e93768b0aa1111f986377d319ff74e7f8230185ed918c4a78b6577c92da260fd75601c7bfe4e617572203dd6929b9d2a573ab83070669cc3bb3b35915c9be5d02472518cd8edf89a439deff955a154d622b08aef80bd2c8aba342b21af25956905b220f9524a52a585b8779d6634015988b0b59009f6a5f1c9330f4d26bdd51699f55da7decfa718b232b26b6ad15e2d5323b622395b1fc4300d18b4f3c49319d4c589892b6223012075ef10cc13bced48ccd6fcf2b11d7b708f38d5a9622224d57b92d25d91b01e6630e3b262e35c5bb23d0dd0cf5837edc8d440da46f99995ab685197be43f88e81fa0ebf3dd468ea826bf76f455aa89dd71116e76c4ae0e61d4269b2e11fe02041000207010200386890c0dcb7957929a3eb5c91e415f0aaec6068af047bbc7f892b6225fa2eeb9867b28f86b319532cb5b272d055b8a413412976292e93845012ba14d7542228851da54b3215924287ea2a4d0aa5b14b71cd481bd01da4368b4b787a3aa79f5ef3aa7a904619600a6580d09beb788a5846360c93181d9cde438e52bf7e5541518920043f7958ef0024a1b10563ef9c2982bbecdf2b4fafe206fae2c8e0cf90f40d109a34368becc2a0d79bd5f8763591c6305e16d82d8c25eb019605408deaab72438d8c5489692541cad636255c85fe8a3842cf5c92edd8789512290141629f309a6b32d8061c01e0230b25064fd0c9d0aa74a6b631974945892f740c313cfc74d60a6b07c700054aaf21c84f0591a23449282413da806ed7e7cf531cb05eb2c92d06b10ea06aca72509a45920c90bc51bd250103f6f786dd400fe7206ec716f7a7b4ba590f39782a76334ff307a1d20db266886547650525f537f8ca8e79107d155d3195ecc3e459013602d7b162ddb648b911c0c146c700d8e8c3a68046b167d30e868a3abcc36846d9809eb8346b712c8564135aa98faabe4ccd5547927cc6b2505f1c025f548ce8511d76551fd6c9b257ef73fa09c44c3b6899c98aac0def2e55ae56bc7bb2e5ce28fba6179445f25dadd1dab3a6cc46534a53520cbdd5ad586150e4474dfce4b97e224e65a7d206367f85d192fef5a77eda170354024697d6cd23456992504c851023db26348609add7881319cd325474562cd5540a064a62576cb089e82d7a1252a6abb272b97b0dd78db4e2ad12611a10cb9b91aabaacaa12860d88100ae646dd10ec7335db7ea4425edb11816511a2a17a550a67551f16171951d55d0cafac349caa64d883bdc80d2d4debb97615162951a27839e54d2ed5260cb43104616ba84e3c6154b38caa90bf7e6a2552bcad3eea8da6e5a1f25910f4e91320752825194309a452642d06a580e86a8d98c2a22993c62ec52591e21006795f772a40960c303277030ee2a3ed52c55fbdd9072738ece1fd90e120def1452d5008571015770315e4f7208fc0225c2726cb532ba065c493c36c228b81d08b971b333ceb02b4623e976f8326da16cbd321f7d25a1fcc836002faab599aa710d054db0a2cbf8471d5980da4ad0302ac5f5dce01632ac2534efac682c5f7d115b21a43246c6986b379ea89384f9a7f715d5e5ba26925356c553723bc9151e524588b04254459322d83654203c20f50678a22760643126cc58c940eb288110db13826d986583972e38c35074b899a46ab30b06186a0613f2d33a17d85f00a40f92b13d5323d39a15c3339d96300770f155812a96cfcf72a1637e6972b343e6662411bb2b06789f356a651c8b453a0b375ade8d7d4ad9c08b690bec5374011a69a9b2c2d486a3d43b302a9898d9818105db09d9097428c80415a072dccb3deffea261855a052d5b296a0050da686d00c1624e4fa8a66446bbaaa9a465b2b5aa5b9ad27c8ac00cda0041876b25e5f123023468b1c2304aa0d679654206015a70359ba385d188d5d131c060dc551b5566c1592ce2bd981baa02c04f06f12d9737f55db2630cb59c9411906804801af711805e015d3c6b7afc63e63dac945e0283fd1d846daeeb6b7dc5b4a29654a52067c093c090909a524a347e94c211c0a854232bbbaa8e252a96ca39603059b6454b069fe55c2a68967ec5f177bed8fc444ed881873cd8e2a690f6547a652d9e25cdf43fb0c8bf628cac3189509051b0163a2169cdc49c19245ff264ba5b2e5a2890905e619146c32e2faec67aecf70912429d7a7e01910e7279407a1a0fc8d59cda4ae53797630fbeb67b2bf709124295f44a27c0a9eb91e848bf85f18fa09053b93f6e8353b9b4a657b5dfef68dc8bfbe877d0d1bf1b7df7926753852f9c6dce0649a93e9e769e3d67e5cee711e6ff98facb93c32259dc77f42138adbc1186cde84f0b4a19fabaeabdc5a8e2b95fe3dafa5a5fef7923f57d9dce0e4e8b0328d39ee38ea7afa147bfab1057afa5fecc9f4a34fa61bed60de1ef454fb2beb46d21e9d3e7ea20fbac9f4379c4c3f5365fa9a4da68fa532fddbd564fad7fcc9f467cb4ff4635ad51efd4ae9c71eaeffeb1aad6568e4fb53fca3a698e82396097ba4a98d1fc45838618417e8239283c89db6e2d687333ecfc99d3f9ba796fd373ff6b4c713b3985f71cca2bd9effa67fc49107f6b40bcc57c763958ffda43156c799810ffd6b1ed897d24c7bd0237c9866360d471636cddc0cc71d3ff95fec2a3f394cdfa8f500fdddb9339a765fc34762fc8bacec9e9f68864b7ea2ffc556f68f2d3f9966e0dfbfb848f31c89e9375137d18731d99b288631da3ba775b187bb9dab78ecd5813193cbde11c3261ed837864d361fc9306d06cef2a81c1579280fcd4edd3dc776c60336e4d896ff0fe7cf38a3dd7b3c0564e0be5fa934e903091ff027d6b4881419a204101f482cf1719648a67545fa44c4a6a47d4f119102678bd068bf828fd170927e995bf18f7eec6299fa36d2cf661aca5c1fc66d5b3c02e942c0744755d6348c17d60e36a8727f111e8d2098cc4f669969a0cddd66101792e2faeb49e99e17b1e93ecc58f62ded12a5f637662defb5785af62d34da9b9cd75e4bc434da6b10f7202e7af663e8ed471d2e844db6c5e3baef4a59b783c57d7ec24dc7ce662a1962c1095c742cc2637547af02e7713be2c4c2139aec90edbde4ae3393824f4b8d97162ebc168f464b8d1a35620b088b3efe0a24c11b3021884187207843087803488c03b0f4efd5bdb45c0e803de204600694e8170248ecf736fc157b8c19f4300efa6017b41022674bbbd878d98887cc1cb189083c82992929d61abc589bd94abf54b21697beb4d25ed7d2b7e75f5a7993cc41a34b6cb33ef5bb15a5f65ae0ca7570218adba2094d4cf993a127c63f6af15b09524a48630665c6458965daf3b13303a90f2933e303facc4364ae31c21ca23e66da6bf959bb74b2045db0f75f812ef73d257b26c11b334210046f7811080cd608848f7691b8a5e3cf870c842ef343bf025de88752722874e5d093e08d1a21e8223ff42078e305832efea1aff046100e5de00d9808447fe85bcb11e2e28d96987e21761401136f70331a843bbbd8653d1a0768694283010cc08163010b0822881b376cd85080025e5e502817970424a0460d0420e000073080015a5a8000a200056061a14183000418c0004e27cf1380007ef8210001802c33727c08401b009000c8f17b401bd8718eff0068a3eb2ec79f8136fe7314628bdc86dc0f01e875bbbc4c43eef732e4fe1d1f3c43866310411b3d204bcf4420fa2119b20c39c890e1431c7cf0a1872e7ae861c56765c504079329c61b62c45071838a4a898b5229a50d2929286c4041216d41228d5aa3d1c91a4e4e446a108942690885b8261cb7a161db40670081342d342debc9b26b867bb13260d84586eb8a2fd3b0e3cb34ec0e43eef8320d2504a00d8f2fd303da68c822f300f8323310ee701c2bcbdc2f3353ba3dbf7f14df2796321bb5d71fdc919939c2c595207cee71fe9cb467f4cf3b87b37978848dad7fe1c219ed8f838bb47a753a3f73d04fa621a2bda0c0b5e7e0f290d5a1e75352e9ee93ca1f62f37c6fa754ca98e51129b1886fe34781ebc94518610972d63fe3dae57afc5d98c336a6044bf41d0a5cc4448ac47728702eb8820d5ab8f85f08bb98234ce2833c3e70723f12dedac449fca306fd25c43ffc1f89f6dabf8b796a451ce1e1582201bf52963046c72b5165d170e18c6fab38e02a0e5cfaa8b6ffa84a9bb9acdd7e5bfe06ee739dfc170707d334a47b779baa48f9ee5eab3b7d29553a9a6b172486e11787af4c4d47967dbabbbb53d29599afda65e5471f351dee3feabe98f32b5d10e8df5a8e14fc350612737e49e380313a6eaa4fc41ba6f8d055b1a83b9575777aeecec5fa369b7cdd8b838b39db128906eedb74729cddb6a4769b8efc6db5ad9ce5a7f8d126c51dc53fc21b9b8b7c7819a3ec33b2d3c8eef80352b755ed369dba824d675bb2b11cb5f1907ec4ca9149bcb1354161f2694378eedf781c557972bc3b579378636b452046b88900a086f251cb81421a3d10b843227d77a3a074933a2070c7490178a9e5f801456a3ab229e79c3e3bce3927d4405f911c4446ee877f22809f5de9b5ee87cfba007cd7cdf8efeccbe850de87eebea81bfd4a477a95ae3fa5e3beb2b656bcb171118100c0b7f2cd82fbb69cdb24e3ff2a4b00dd05a3bb5ef429fe0fddf5b933badbba4d50badb93c5e5b94cb8880f01b0719123be3b90257ecd01f76d399d61de7248a3083dd25f89e279cb6997bc296121e12da7bdb829111271f7d558d22e1f8839dbb69add1d7362927c20e6e44dc996b3e56c4ab69babdba2682f86f076d35efcf81b14edf252764b9f2560d1a32a774a2b25387566183e518caa6ca921237f95494bb794f3aaac96529246f5258817296b759d0a4607f3c5013723e78a834a1a6d39571c0147f69346154688d1d7d16d4992cf133b8a60cd5a49a45a47b542ef06c1f49c5977a4dbb5cacb33473d4ca09199d999ddd525edadba76d05724cb3acaf1a2ebc6d32e261f48f890bfca84a7d6aa43bab0d6efeed1a8bb7667353143321a7dad1505a5d6ac26c71fd57a773a53f9c5a43d98af9dabbb3b577036c3d512b8c8dfede94cba3b97c9b5437377f2c62cf265d2a7581b0ceeab3a5567495cd2f80a23a872cc5fd411f52c218b2432d023e5b5d32ef2e2e9085b7300fc7e9b8a30456ae414b5351236e83b922babff3269af1fcb9de3b77876321bee9b3ad9a30b816b30323072fcac95f9e4f8655e54d2c8b4b38434aa3fe36bbd2a167d8a2f25be3b36e0fae747f9b789cecebc52c8512ddd2c618a8dc7e4d1f82d8b76d93c3875e692b9ea996b07574b4092479d8c7c998c3a9eccab943c3d4c5052a5b78b894891f6f25799fc744b791d352f26edc90ecbcea4bdbb13b35cc2cd0c7f67422c90610a2e954a4511137f6a3ae03706d2dd6f1b2b0159e2370db8dbb247f50a233401e621b5520218a32a4d4be421ed754b1933d8a3e022a0c7b0a7fc444da4d7de7febe467dfc35ffbece55fc92379e8fbca759ce5284c47ca1ed9923ea1ce75b2dfbe3e0d8d66278bc562d5c98ab15a8815bff6691ffa5ded73b5cff5df8b0483becc03fdc974d264faed93aa5165102722e2a8ede92f1153f5e9c71b8a533b5b06ee3ef61ff4c9747b1a9aeceb831ea641dddcf193cfc6c3aaacced42623e4dbefe15fb191fa5edfdf888d4adaa3dd636ad66c459df6e85f94464969bc14c0c42743f81745464afb178fa3ae9eb8c5f605c8b66a961a3baa623ac2df86250f4f266517597e91a51655a525b103b3940505ca8f7e7e9438379ebf80360c7b5fcf4ff2a5e7c5449e56166d11e7e68b39528e70bc893677eb62f62c5c150e046574d07c4dc8f6280fb520281f64fef62a1f83f3feab2b6d31a1e79ec6f42a319f74a11775a6a72abf35f7fd33dc7728f446b02f3df7203ca352c4147a9518aedd2f7d0f0d9b40df8f7de84b46f8df9f017d8cc7261036ddef81bdf63deec7c04562eeb08ab9af612349ee87fee2222a1ffa22dc971ec66414addb91848c12443a992aa9a0c4587aecb9a7a109fd7d950fa960258e2b753026745d490ae96be948db41f3e98c1f79469ff2281f82b861d3e853f01130c63e0a7e4f42c651f5e51309451e7bbde4b254599b230f4f963da993c9300dcdc9d3a7117d1d61196bed75828d2499d9f0092e22c235c9fc5067e41a493273b169eb3782f95fdfa3dffa671d8cb9b3839f79922bc19809b394928686c6fefdfab30855a7fce4e3b1a7938f753c3c95a63e7dcc881883bd8c3c7e927f75b1c74ff26da5f2a3169ccc8ec8c36a1fc9843cd22b42e89e3982e1662441323b2214ab0885103b8ae81d450401fd7d20d19a2a0348aa47982b563a746a3c1020b51cf2415d117ddad1dea7f2dbbbf6df4af657812e30902b411ba1772b7d0c9c0dd91064f187f9c5bf4ffe5be7471c893e7d210770f90b651fb81ec080c0eb47053e0a7460024ae4f82f4838e640156838c377f57c1cc8bea3082ba1ac8e8378e96878303b2eb5d7ce9339c6857b93c87e65c708ab8c5396aea7f6a93f1c3233f41dcc1e9b5363add60b1f9c6ae318384831ccc3c07d5167653b687dbed3f786415c1257163b0f07ff9ec8c02a047b199212ce47bb38e8a34e5cc52dd8cb264aa125a2bc93dc4ff0e7a190309c557ca38e6b11cbf8ccee1e5bd1e776a50ed4bd9ffc439db57e7d7dfb5127aedabff5835d12ce2efc59cbe9dcdb6d1f75fcade5893aeeb7c651fe5e93fd6bbcc6888a638a888feb72ec4fdeda0f41cc27a6f8163f84ef8eca70922047c01812a6a1e15ef434db875e467bd07b92d1bb297ad945affd8ce835ee451ff14c68fbd01f89a958f41f177acf3847a1fcf5d651a0bfaed87ddf99eadf47f9ac33d5acc77d94d73a589fd499b0bf4f7a5067c240dfe362d26b3812811be5431073cc308e02bdff8ba3b4fb7e12d35a0e199aecefbf64e71ef4a2a7a1d95efb50a8737f0de4a28e1575fcc4dd1ce89373933de4ee33053948c173a6e08306777fcc62d6df84617189bba6f22b562b94d48e6b3e57ac7e1cabd65f0e2dc8a4ecd97920e0b3b56fdf5118863f6d88fa92beede2539be1f4b65285e742057070d239a5cca4a4534a7991e024a94c80a4734a29e90fb19936139045d2395f3acfb5311b45737f051f73719278bdcbcb0b2efe8521b421e90d493b19b054227d3f46270518013911b19c784014a221fa408823400804dc36006e890d74da8280340f2444cb04a08520bb3f64432e16802b02ec9a818de0b200b848602bb6442aed6a09b2a4259753863cc1943e7811e93db4116fc8427f05da88df5f92f2bdbb53ab7fab5f381c105ffea55fb51c944e772aee05af2843953c4271192c3fe47e1468c38751bcb1524241408946eeff421996320c40eed2f5b1bb3e5eef5877e19b55267214327d8672ae940e2184f8833f5fc64b202d1942d81efc18071b078eeb145c38e3fb24f56367d7b3da998cc81e7b1f19f601af9f1f433c5f0f5bf948cc9198fe4b639feb68b0ab0b2e08fcc9433c43037c47e291af943395dda71181804c1fbb72080433a652a9d4694e7f9be55f9a6133d2e20813304f30afb74777871ae8c223e8dcd57649bada2ec9d34985fb99cc1e6b41a2bd768afdf548fc4dc2b39ca39470202db74ba2f3717520f130ad84f7630e7fa5abb9106b325096bd45020e12edf281966cb1ef4fe26278019cb5598aebfdfa404b9678468b149e9fb8b0a39b0bb34e2d5808bfbb1b22ebc3f4ac21e5cfee6b9152472e915fcb12a44e8eada944ce2548a9d344cef8b0bbe5e53dca956cfd0b7f54d2dff20ffa13675ac4b473ee9892ba0bd15e3bcece499f3bb8f0dbb540298d4852385ed0d8c152069480d935f8d7b37806ee8b3ad0068c528857c42d84e1da7e93b551272e81a858d313ad6817480521f8c455eed813dbce0ffa64a0bd87e9f7aee4a79d49bde0e3f1e5fbfb70d853b04c3ce019381fd006d4420864e50ff64cc1cab9e1fb74172e9cf1d554a6584a06a91020ed01bd01958175cac1cc2e6c424af889da0ec6daab6baeb796e6644a2dbd418181ad10fe3847451bcab3f3599b690afe5af267895022d1a654e2b81fcfcb5f8c252e447fb61c353defbf5453d3355dd35dd35d63b5eeeeeba6746f5dd734ced5b5ea76cd24a18c3c8bf6e8c9898d08dbb4f0e63dcee33cb5d65a6badd843ada288fe56513d91b16917aaf2a596a34a4f559e7e28148ab38b8fdab476448cd95eb6ceddbad6e91e14192dfbdba1ff3ef49f373521dcdfd8343a887bca75cb6ccfc9eef947c098ed61ba6bba755ae5a8eb29ed9d110d518abfc6c93df47d46f4efcb0ffdaf9ca356be26997f37d7c9f4bfe9b3e292f4f0f66956fefacd2473df447a0c844d24ec67ec63b84812d217e90197ec93f0ccb542618c64396adad848968d64d9605df65bc8557ea25cb696e34aa5acb3d6b31c32d7c3349d5f644a9bc8943a91e9ec82d29b2c2424f4221c44461e2ea98b797642483f3feb68ec5fae846b91649e99d6c91bdbc95526ba3a99e327fa59276da48e9fe86b9dbcf1130d4d24ed51d2cf0ffd6c392ac6d02775a49f368e9a2d6b39ae54faf7bc969669d3729464f989beb51c572afd7b5e4b4babe52818e3337f5235aa4c6d9ec75130a667e2a9aaa12f59d6725ca9f4ef7922c9cadf4b1692f2273f491dcc11e54ffe67ab5de2d3141c8298517ef43639f2c6843ff9499b4ce54b16b564d15b47d9178944cf390a7bd1df18302634437f938c921c0163ae8fd1c95c9886e6be7d1aecb5bf9d85bad985fe0818a312b93fe3904826ee67618651dbe47bff955afca84d6d07cc315aa18a243c990019569124498e7179f1fdc028aeb51cf3fd257600c53fe4b7a663488c43ccf9364a1efddd3f82fc90d8f117f18fef325c88e26e8c5a11474a3d6408218c1fa77b0fa44fcb50421bf1f2a2bbdd732e44e26e704675cbca31c72aa6d0c930c37ce1111cac620a9cd61c10316cdba77e8f5ddc4ba7f4ee860dbbf691185b0a173e9cf1455597a3dbe1a80e9ee49f760cc093a502b2fc872cf27fc0c922d205d607dcf7f1bf68ad8c3d8718873beb9cb54e21261e5b9ebfe5894d44c43c3f66294ce03f44662952a61e3112d764307ab7e0421484f89312b39c7429a57487a5772be419dd3dc8e45dc685d53a4fc071db553129658d4bbc39a78c4bae0b476ec3ee83f72057a689c6a82ab674a57c5c4205caca5f528c508e2215272b548856328c4b421c06e57b19863611e80442771c8270c2aad53a062e7e9dd6429941d245c152ae928d31c6eaee5ee78a9c5ee392ef208b3f84105eb3b68c581f5641cacea2bb07e18e64da1ae10d99d139e99c105638659db3babb573864e6eaf6ddddb174efea9c70d686d78c75425a1350279d710917bf5e9ad5ecf5526585b6832c1884d0620cfb0bfb2a7f5ae7daeb5116b976812fedf99c8ecd0859b06b4ee97eb95f5e8306bc35303aabf56bc6afc02abd31186fa93dc7d2b908a5c38c22207f52ba949eb5cd2215f19217eb08dd0fe05ec5c0c507225f0ee1f79ff7bd388d0cbd89a5cf985e5f4ab9320b703355be5e769f17b89d9e56cb0b2b52818373cece89bf5abd560c356c7106e358f7492098b3b8677d052ec2014098cd096729931e4123e9956b0f4a2961c6d9160cebde4f306503a16cb392a818854e6615453948f7d0e4200df7393fcead4accdd1d9b1045cb8161508a96a964f0629785ed22dd5a18b19412cac83a425ce9238144c68cf97fa58bf4cef186ff7bad2e3b295d4adc5106c0dd318cff430b207af2e45f218d1b80528a4a3dd51a3d28a5f4c7bcce29ffc258fc0a3d87d72ed0e5e6909b4d91c4969508c293296343e148b54668c4894eeac9c42eab814420cdf24030e2cd28f415832cf07d7228db0c0fb6072ba8a4a964312eb672b9e57cc0608558e591417f761243af00c84ab5675c90e525c3f816a2e847fcce6d14560c438116b2c0f781930ea1f41aa148cb21bddb21840e5fbe60f583f525f61776124ef9433ad7db29894040891d3ec4b23dec2bb6ed611836f5899623fb6e6f883f2ec32c70fe10b6e47e093f62dc749feef3b259ee482ca5acb05e75568b3f7b610c8fb41cb24ae7bc68e11cc91048945124dac94986839b3f92d0a537fd91c03b5b28120c25936de0e2fb53245cfc79bdf8743b4b5470f12b0d1a63c638b8741f32a8e9b02ff13723637f71703e433efcf9127bf0ab1b380c7fd6964add09b89751af0bbefc1ea015197726b98832b2284bf01dc3fafe197f362e8159fea4cd7074d2b63de8f53f295d4a1a81801f5132a841e869807192960362209d93398802ff8e2e52a93df8362543a9b794491c3f20a5142d077c5acaa216b8f8f3cb640c37595b7b258b5670f1bdd883c3e81176597bf0e1c43ec0cf9fbc24908cad21c8e9dcea65caf829fe8d04b0f6679cf2e759bf5e768e517ffea57456496bb0ba85003f60b4c6cb8c531099003f789025becbb7944ad8fd9c6165f6cbbec5f0edca7ba9d33d6f4467865e9c2e7f5a3a7d7abe328bd0860e982364890fdff3bce9799e5f5e3dcff36a9e2b2fa8820837d156e18328664e8d30a29873c0093dfc4fd2879d108ea63ffbdbeda2bf272fb10be228c454a1984b5b89f0c520acc91096993577762f0fe3f9c97b0a7aeea9c5c1c1b9a93c35aa2da4d50b846df722f2f3a35d6ce2dce0e0e0e0709408a5f087c21f0a7f787872fcf675daff13c8ba229e395fd4c94c4c4373bd0dfdc566b2bfda671fc233f67abbd3a9dcf77b647f4f8a98442993081b1163228f1627b1a7b92e667aef7d119ec1b08c7632953b7b23fe1a36d29f3dd7c9c877834e93f0e128fb254c67c5daa93f1ff2d019b1a75e3557bb3cfc7234860b677c9ecaf22dfc6ba4eb37d28236669e54bba0970f49a2bf9db1582dec6b7dacd58a5f7413edc4eca2c5352ebb970561199e587485ec26656eabf545134eb4ba689b9bec66b45e1a66a7103dd79232b6b4da3821da352c475d1c5b9aa8c5aaa1160b1b7d6c392ad6d4b46a5a2d9f9fac93a323755adc6cc59a1a59c3798c5cabc5b55a1c3685feb7cfee452d097fb0057d346b4b255117736c59cb719ca893b9f66946212c8361d814aad81412d1c7de88f6f52d3685fee48fc488f0cc5564848dd00f9dfc8cfd130d9b425fdf672e8a4d216c32c2bf7e8f7eecb1efbfb667cdc99aacc9d2e8cb7fb93e6f9332abafbda57ff964383fb1e527da822d1ff995b6da53f648cf51132e9cf1d19e4c7be5e1c346d5862d7f7266cd544d9b949f7ea6fc91570e0e0e0b47fb119ca21f9abab22ee6f889b2584e34f14517223cc21cfea616796e9129f71f95412df989e65c3884735eecf5a517138d51c22f272fac97d2cb64d19f9616cffbe7b81f6b392ee6b8b5399e757783b2952eb2628e7de1467e9252fad05f3f5925f9237f680a572afdcb9f297f588eb296e34aa57fcfeb69e55465c91f9d152b74b11a07070707070707e782312b9d90ebaf2e0813a93cfa9813595127ee6439393fd147fe645aebb3585b80a930c01a2da06a8bb9539ba6dae692f9fada85fe7ea53f8eb299aa59236bc7d993c5aace62e54456d45985f01777e8374e0fab7178ae8b5e3c2836eb92889cc751363d3799fee7ad8c93e945f9ec69ec834ca3af1b368db0c988ecebcf645f719124a32f8282a19fb21fe119908d21c1682fe6411dfdb8a9335795c562b1ea65b1c230b5985bb0b660690a731fac731e59037ac9aaf3c825293f62cd1df851d50fadc92724c9e3a88b4958e56d6c6c6c266b87275fc97214b59225575287beb4b1b101a35d8404d9f290ca274f63a6a30f753a601e65126651c0827cd25914a4328b45eaa4f3f8c87bfcc74ff46b2753792485a4c4aed141a3af2321292c9689f4cee3e3a8db2ea5a72f91b44bcad3972a6bc29fff64a1c97294e461491ed6bd1fa393b9988606f4f569544c242c936599864da4ec67ea67a0edb3af4fc233f6511e051751e9a4003dd625197d4a777f1c7563fbf889a61c8592f2ad998cc0fefe0cf6777b0c7b4d76c5a3b3cc41b8194c17cc9a27e61353355590c5a755d29eff5439ca5ad50f6489dc139c0da7b2fe1b15f08645128158026d6cbf41d128ab0281d128bbcaa2519b9229a2283dc121d9686c138e8b2e81bcd0be80287a03ca01e9683fd0467caa051caf072bd00d4032003961414d28b12253994a65f6247fb6277b911853dff6ecf88ecd34959aabd5aacbb1e125d9df22d9a8c8febe4521fb2381028cada5648a28544f9490701b4df66f62b9c8fe2d2fb27f4b079493fdb7d592ecaf7d014ffe4c4a58640759b16ac23ac1c9e0062bef012b3b08470bd9332bba6cd5de92f674dab3369b44bc410a6855d6084c888215b4a02a7125aeb56d5b5422538e8231166b3f72059cc55627c7e6ac56a590ef502f95664faa549a71e6209fede03d3d55a994a3e84d2a95a237f4a647a5a7f39ed38e7dc2aab4216cb62ac832a55519c9ac0adab019b6ae50499bada5d39e674bda736b457b2e290e55c1aa3d16d422c3fc81b2c8fea0250d4a398af40e634a4c382cda82acc8fe209d1c9c0cba01d98054fe5916594fbb88de3f6b92b5322e3ef3c9505bcd70b21ccf74322b78b2af76b225d97776a2b5b4b71c34dcb7b5b87bafefae7f0ee1997b0e6a461c8949b2851e6a3cb417857e8920842c1144d67e8920b2e8a1067aedbb5b8247100ed8fe3b9233abea1c44529c1b7a73e328da034b8f90fde90dbdb9a9c95b978d4e409d2874611db7b58e603edb4aa6981840132840f98e9f9c86060317b04013929052564056a0099791fafe51e4e3325e5dcc11f9c81470f5b5156be53dd17b240d1a15dc1558898202d8dc00ab5165135512052d81fad7c374944dac6c0ba81332e5c4ca0048b2da799317f44016ffeb5a401b678036d0006d34699798dda0cb700059fc6597e500b240d19e6b01bd07dae87730580743760378f297819643eb8d8b8ffea40f7afa3fe6fffc74d6a76507b41cd2a75d626ea8c4f799e2cda73d7f216cad76f9e88d17edb2bdbffdb16034f73734b3710e607f9f4e89310ce129ae603cda29da739a936f681478a3204a9ba6daf354769af67c034db8f96b1614653422d2957604bda156c88e5ad19eb51ce7ff34d594a6515c0621141273b6012d47467b0051f5bd62f72664f723f80a497baecafe52d268adf9807e9219cb4ffe37d9c3e03e994243f69736120a680349a3eafbcb54bbd0c828da0536f19f3d8eaa58031914369883db4a035a8eaec2085260efbf2a8581db82ea8ad56a5a955d75b6229f5e75fe329bfb99cdc545ea5fd8b404113f798b7ce64e9e990d64c103572f23ea9be843500f0c9b622ad6fc94f2ea4c14df5895f764ff11c41ca4edcaae1c356feccaaeec2afb23e0e6e6e6c6aaaccaaaac2a7b0cb2da499a3ef9479536849541566b8e4ecdba0323dec126ca04c808850eb66fc6d66aafb559d172944cf9c9ed8ff579b984fbaccf8d0ffeb28abd4cd5222a5bb889b92f53d7c5d27a5c6c4a4209bf0f637a9ac6d861dde5607056de81fbe84d5f33900d5750c2165ed8a49a88a93a600e92c9959c70aee64aae2c0de414325ffe13adf9447c227e594ef6f844942f32ce1b645a64cf5a57fe329b18650a66879f7cd5b13efd8fb3690360a636997fc179feb695cdca06a4f17539ea208b67e042f9cb6cba9b5218b82d5cc11d217b13b24b999242767a93f560b342629bec08d0c5aeac8f57013dff6bab802e4af2aa5db22340cfdfdffa382abbf193bffbf88fdb818b78636dab6d353b66365064571db88722f32f3899bfade5457b1ec4881893d9d881b33fd6a7bd959c41ac544ad2faac321b99725484a72853255b855ddd64b5dbb8e893cdaa7863db0202e1ef6d802c77aea08d086d769b1b6f2dc8e2ef5f70317f5b6b6b411b367b06c50f7793d9b4e7ef75e0ec8fa34c1fe3f9c9ffdda7b43e57ca6fb8cf2db307ce9ed9e3194ef62c2748ccddd8e9c0c9143cb94cc90cb160062ef2b682277fe93f571ef1c7cd1b47cd1b496fb23f0e3b6f1c659dc8a5ab89ec5f4c3070994dbfb51c572a7d660373c3443c129990472e26fcca24e061bb176627e04c3c40afbd86bf18b5d732da79ceba1cda6b0fb521f2d5ba2ffe88efd17fe0935532a4c21a72f275d7403203490d64e2a17da0d7fe48bea0eed301f312fdfe1fe80b354dab9a06fa08d268d6e59034cef99def15e39cb156fa5736029b83781e52b9621881889d1629151710e2920b8f885518a1a6083f19f45a2bc7a745e0c9f7b5afd9c53efb1b33ecb3cf184c7bf2b54e883870a0cffe0332caf7e1c3b4cbf6327e7dabf1c8bee2effe8d5670fea1cf32213a608651b6f54c7273444b75c5fe3503f32e8dac45ab01ca3a607e694ffe902deb80398828e4101c4979c17d702789eda5fc9976f991fd7cf91180364c43641fcc04a00deca54b1026724bc8b2fdd472340e1273f3c0912736f1f03070e49e98761ffd2c03d27d231d0fdb01dac378f6cd1f135b8d8838afe9e22172f6504a29bb1ffdfddbb7c62366ddda675d88bed69988d01e7bacfb8e64a8657888387ffbacfbe68326683ed6993ea30fe31aedbe5186130319e578b1bcba8faba2080f042619e618d77c9fd245bad5fe9b9fb9a6bd667dc2e95acdf0ac7356ed33ed417f5d0e9c894728f447b2f6fe37d441ee61bae688f1a13644de3a2111b2643f44c6eeab9ffdec7ed49fdf8345143b19e68a4d3c7afe7cd91d435d6888180a75261ef1431fc29f2948ccf347108fe40be937448443c41c0ae1ecb92e4706fa1bc3c8b0fb986862ebb4c71aeb3ac34cbf2344c43032844fb3ad6bdac1ac75416283eaec8230f1615f1f763fb4cfbe3bd3101a36f1c091b3c701c3c818b2cc20314ffca37f5a97838e1949a3d1a8bb233765a9555e6489e91fa5f48e81cf5cb928906c4759cede764046d9634d1769e2c0c5945b6addb50e22a18dd99716c7c6a4949207855a0e1f621fc61f07a7c91bd2fe76a089bdc55ea398d3fffadd81a28c9088b5fe4b74c1dd07fd8ffbedaf6348d4d9893b4c3af670adc845bb4061718422deb40b2847e87ec7286ebea8244798fb9e682f0a5595b59636d6cdda6f6937bf3b3b676c8d47a469cf5a8e2b95fe3defe503a32588f4ce25c5f697c6c42826898947bf7d8b4d44f463138fced9c37c244f2d47dcd9828b351149bb60aaf844ee999b61356699c3da0e0375f6a78df961f09365fdd975da767e12cfbf346bdbadcabdcad8b40d8308048e406210ede23233198858c47c300bafbb56a9f2676b07e33176d42ccedacb5a5abc186b902ddb28f50864ae184216fb30fe14c7fc1d91d9a3014b2b30464b9fde56b5d7b4fb89fc59fbf5bbb35fbb46d25d29cd8b8bfb709fcd1a05637c403ee30d17c6ae6fda8b39345aa26cf7393b20704747e71c918bb1634e6efc2362c7e289b63401a80ba8446d38353deb10890000005000f3140000200c0c0704c30169401074c97714800d82a6467c561b08d32489610819430c2104004280080c89cc8c860d00262135c6f5cead1bcbc6d49676602fd8255111ca04bf0fb9b456d75b0739b5b52d9a0582e94c9233c290fc2f3de451ac95b354d9ebd028117983e990be265ceec3fcb3242c8065bc3c188cc84c0c5d7242c894e6904ce70ba0ebc7b76ad8c6bade813fef4c514bf6c93dc11b771e7a110130ae3d4760ba0ff11ec95a6d5f833ea836081b66df3ecda64c239b396222f981fa57a64970766c6872ba37d22b2092f452138173d5be7aa9903a37a973800f07be9d2ebdc0881f1f762e6aa3689dca1462c7bf105137c339607c7106ac06ba3c7d93b57cb1285460c6fa81fe97e2e0bace6ecbbf2a46722c95fe29b62f5bea826f133d1fecdf4250a9bcf4382a97af431d238ed457e9a2e7fbabc54759d9994d5354cbe0b2a513175e3efd2eeba6ebcb79dc88180670c0f6cd1a744c30f8fef634ddb7025b4b8ad90fa0240cb56d5f19849837c17ded51503d0fa0d6e86fd85869e3cce375a4b05da1e7eb09ccef8d26971c8362bee85a06206a49ab51ddf9218938f02e78256888bd0bf094d3beb7564ae88ee8b0b21c19666667aba066cea7616ea7b0f92598df670eeab6f95a5f95c70000ca7cc8f2d693ad132a9055fccf0b508215465bb31098387de8f51e7a476234e91b1c4c6ebfb6b2793e13eb70a0c16cb3257902af484af04e433d56c62350272560909655a018432d348d78d1879344f9aaecc4995192a3ffba2ff005852d9e7b88284d91d66290008c8285b209336d00589cd6c2f7fddfe8cdaad9d17119abe91bb5797e6b40d3ae96dfda390a018b7a958e9ea4e6db2364d702f5f29e88ab4218008e56ffe0672b3e4fef48338c53af8e9f93bc94968a1f0c976c6ce5b8984cf467b49540dab27716e28a09ef6263ff53a0fcee6ff4b8d16f61eb4f84208c163b2ad71cdbaff9a38b94d0d9339a09ae109a4948efe61d0bda61d59bc98918942403f0f873bc5d75bd4cb13f3e21bf928e5d684b64b8e3e4eae0c2ccaa3812198ee83b3211fc806218c9ae980df2daad6ffd10794be85c3ec7f642abb93a8c2e8643107ea47cc772bb767e5e06fb31e595f02b68370139fc01c6b2f37247649f45820391b309d7758859a84be30996488f20992e880f2009e7401d9544db1a4e972b19213cd2fc9cee3111200db60d33c369ff35d80d411595163373a8993b338a898b2434132b7605729ed828125aa8ebad386bce837dcb8487d6a793547015312ab85e435c704a65f2f911cd78460bb09679b25df18ca354a7874a50d12806271e34b9166afff4ba5f5dfe605782196dd1110836f827e62439d8c608c6ef0b83f0509e5760f4c43059cc1a0dfac306602c28aaa642a98630d867cb05b54e4c75d4cf0859d1f2366f26c0e0139f6eea74f9125e2fd2e70bce6c4f9bda76b6af50ae0dcbc5fd607502e0a44df8263fff3f81915783954ad68b2b8d93ac9307b69498352c8135469395c0002a0a8b077fcbb90bfddeb382d3ca470a7db5c36638061b692fe53cdc40ffe23dc10c5225dea4f95104204f5060123da9144879f39bf357c296425476a94580a52e31abe6347e8d051b7c18c3683c0fa75d19a23662389af19451452c6347a6e965e948a356075c5a7ed07f5dc82ff5126f8b68fdc2c82ea5c75d2727dc00f145fc586441d292bc1bbda8a477a1919d334672a60df318ca315bfa3df303bd66c179f2334973bd4be958d3ca695e9b2cfa8aa96aaae42f10547e5497729fa6b6ce6578ce68a9c67a959a6cd415e7ded328bfa05d65da343b4311679c48c488d480d78d01666499529fb07b6dcb87a9875f3cfc1c44f94740be8d137f6ff6271740bf351e85bda45e4c8a955157d2e4369fb58c7af8de519a2e39c8d39c4d160e808b2700fa559ce905a1ace8a9636f53a4e60b36999a6121e82fba9afd6864c78ec849b741b4dc4983de69d4ce215d21ef1312542c3ee5f880df9a1569ecd8f512fa13d22f970e6f130217517a251e8f9e70ecdaccdeef47f00699941b95a8e7ff934e89926c2897caf194149bb27ddbe5bd55fd2432d5866db124e854f32d9e2647c8a15faf5e783aa2401553234594b9ba2b0138f22961baad08575195b45074b2fbadc4521d74a31066319a641c6bef4f860033574f07908bcce8f259f379e9048a7c3aa05087c6e582f68857146673fd03720f54a3b88f0c3213156e2727fb64fcf1fd1581be6e2a8bc309ae50865419a7583d54992b065878ab573f80ee33d913660370845202898cfbb1fdf9daa2b30d6b3e0a216808007efb1ec81df0ad06aed49251defeb5a8c08ab75ff7129925ef5aeae4932a28c9082f3c94498e9cee1db9dde2551b06221e9bc5814a43624ea296e5e5546a570bfbeb88fd8d536a62859b2c01ec0ecaf0cbdfe5734b94eeb5a8c64d4a4db062146bda8f934ccf9c845fa729327c1db881744a11be095bb248b33ba878d13ac1c98f27ba8a501633209e757702f52e6e2a98ae0c36e25e35a8fca055567b3c2fd7cb7e1b953e73cfef49b7f16c418243c4f343e69bec2e592278a16fc186b0962a640d4aa6d80e5185e85ed2ff2da9226a8d0477a0fe6f561862b7f3ec3a073dea09d458cd60a8c1ed88c601d55b7420cccc7736c053f12735b3d2e0403f70c8329e646e945c680a7c5542963d8618dc5c53b47dec500a222b8a303b0ce55e9a09338bea74af2de11fa2d223d12520990a98b69e83ad8bf1cfda995a8689de1dab9fa71f42a3545471778bcc3ccc3317ce0a005cd62ef81552293d143c38cf23ac4bc516eee87a01a15a4509447d05b4d4582340a8b0cc2b070c54414144c4a89702549611e1827d06420375082b230c5b14a1d5b85b1bb7ea4814ef24374358436b8aa8bd7410bd2552c009c3f73b450784ca0c068bdd67ec18fc3637272e8335c622b5af1cc8870dcb3b0314ddfe136c86429796651c5606683da1740e56c7757d17a046fe22e46e5f2dcfc5121de13d1a8df95fc1807d8a7f01c9dfaef0bfae6d7e87ab0705f0f9b540b0a25e2a1bd81368b24662c92a6f1be010d8fe82e06ff2e1b09fdf096f1bfcf442de8df45581fa4deb67e791ebe8cd79961e5c62f20d378e1f9f73e8ea40b6d8c97c3582430fee95747c4f84412050d80d60d1c7933c5e1397f8821429e932c3ab0f3ef1ec54a5455d6cb0d08d49d4b829cfc288b416da28895d2c4129f5ec8676fc08779a8ef02806442e5a18e43a3842c66be53b72ed086411e5b7005f5c696a01cd31511f0c59ad0331f0a9e260c2500009c0fe5e1982a341f4170f05f8e23280199e9805d5c051d70021a9497e09bf11600e268664718110d681180c072d97f192d40190b5a73994079c27e8fb7dec4be5c2f73e43827272239d8a034a50d1e00b96fd0070fced365ae2ccbe8bf1dbc36e12a545ad39845a1ef4b87a8ea493e9983d7c48a6cb1040aff5aeeba0d9cf5567fcc1113bf86d471782b6053fdb824d00d8113b6039de5c4228a00365c0db5400e8941d099d74a3b63a9275646683ffdef4521b3d0a01e79d8106b14af2428361c0a2207d726906ff4ffeeafffe6a0d69000aa2aaf11e99bc00819b0b229c3a5ec5516a0b135ac867a3ee46ecd63bf6e18258180f9f44f73f8667812274ac8164cc8bb31fe3146e4e771f1e455f385057e916ce4d69f718c44a8c7d449135fb924883a290631e6ab88b9dc761cac2d3913aa95d85ce1dbf94e5393dcf410a4ed8a4131c75ffa2097cbdc6c4ae5aecb6dc8065fb7c2c66a2d646419daee87e930304ea0ece98dcb7d365974e5936fd013ad2b7adeb87d4dc171a1a88123387d6b9aea0e2a37d8fbc021306321079295de687a724a2bb7b4872835832e0eeded9735d3dab38558ea0a21f8d626d2c2630eb98826bd748ca3e29c592af4a3c1199930db7d246e694a2c5659bf92812b230f6865f88b73e662d5c72b43090978f68de048be4626cb1e4a53121b1d86f2625ac5ee23e31eee385bfe511175d27e3a0c0406c0b13d0ad4c4789e8ad6ecaf130228c2e1c7681a2490ac802c86fcc950c28596727f6cdf3cbe5029fc346a39e212b5b7151eff77d457719738801a60d45ac696c8c9423dba242a440300a0da977fb8230e9b205502cb7abc385f192d6ca88e95ba532526f250d4440f7df568609f89a2aad8e012609b86810c6325f059fe8d12963d5f543cf3a24c314e101d57816d248bed15a036a11c8ccd0208dfcba63be41e7fd3dc46f324130861e66b4497ad20161366ef616ddc2030c8e67ec2c19be0f28207fe196f63e889832e94b5d79b70f199b211a2927df528364c9bbc0b54f8b366daa429495c80ebb64b3ff61044426c286a08b9dee4647d453534ea9da078aae9522b17d00353daa0caf3643853eb744322f4da2bd7a012f2e5c8bb85e2a05a71ab3f418eb9c390a7804e5886e77e7d9028d3e69403de6fb9246a24c4a0b5dca7e03b59ccb0bff9fefd75699d00b4920e2b44a81a479cb8a16d046ad64dfd8bb1fc054ac0dee787346bcebd076f2a082746a34325c8bd0fc4611d5db9d78d808182540e88e1de00c7adce97fb2b7a74f25c04019bcf2cfd98827addad603c8c18a8bdf0890a10b395818caf7afea815aac42fa3b434371b8cc2fdb03f8cab676d7f44a211a9f77542f603afa884f071bb23a084846ce005fb4f2a5b557884e8a0e4240198a62bdb8e970f420e0e115194a91c504f6d89020cca012ff9a3c6c63382bed0cae468bb2eab5bde416dac037297d5a3da68c8f5fdfcfe0f58dcaa63d25de3f4943dd5e8f246ce898da930225a6b2a8f642a617e879c24657acb0ae235154f5671ccad50bb30a2bbc7312e61a9ffef3bc83ca3256065d601df6ce5f60ce59dd70d24801a7bca2e42942a3e4b13f6bba3db0c9c622b8eee96b0e766f1cade0daf46f20652d4fcd3828136b2a594880502b7e556093223cf71c728880a6d12d97a8fde4cb81e9f48f1cbbe9b39926215b9b011c1ab35b62c0840690a3dbac873359a2cd7673f21b864c7ac8007e0586138e410456f999daae88033ae66daadaaec5767d3cfd745cd9e77c65867155c0d3f2d7ac7d303174c3d0e59132cceb49af60bdb6b69f74c4d2bfc4fcbc12bd8f24b2794ba1b10eab7407e3190c77105806c4600151b1996b309b00714b27176b4751d4b9e408ef4dd5a1a5b065331883d7577ed18ea6e9fb3a935289c6c853b6e54cc693c8e67ec38ad796482e2976ddb9c200d0ec92fa3c04377e241a4521e8a013cea28546a4f585e852c418ad04da23d702d5829fb58a62642b68fc0f6abfeb90e6d861d1656ae2fbb35c375b3283e574970e0f39643b2cae4343006f8a2aa7d44207ace748f6b2997eb650a4f06c906f70fc220bf2238d84b683edea4293c0423f48d1d0be517bf130bd8197bda5cd2651b9a82e9821d10ff696493eaeae6ded20f5394d7d9ab0ece34bc16aaff063c0a687fbc01beb6e4fc79328a09692e8df425017cc206d1e6a51f8f3fabf3e7983dd600edb754df7a53b6c44565c8a1ac87e0c384515e414c9aa328e646d2bd2fe0138c99a35200055ae29a8cd1a6955edd7340e66d1cf2e41776934b20bb78843812e2b4f221ae09ea85705e728fff0c146ff14495de2aefe025cfbc2e663ae0de574f69d5900ff955a36a18ba3deb7a0502609a57bff00731668680b21a3c8d52e198111574dbaff79d88ae0211c2a836a52d982985cee78ac376488a92ffb00fbf297cc212095f1383131933f26108f9ab63d8c6bbf388a2a9bb8307176abbfb23c412a4fb7e55e0274918ae2a5c714c3d18477e8cf028c751c1e5287c2e9a676f629e6b676cadc3f803cc28dab96b06f513b62b9111e2ea5c1741d55e42ad0568a705c86c281008a1f9ca371013cb9273e4afac9eacd4cfaa120e5f701a2df4aad8810d6ce5a4f1ee0b47635c4d151d02a8f522b7b5025472def6f11b743be70091dc46007487a39e58f37c20f6290af2aa29b626b42e8995828a76d4236155901cc8a10a289b6b5905a9e4143dd291eda56dcfd2f9536fa01989f7bd3e22c8547a63da2d76d3596fad2b0416a62150e0dfedf8578c1cd700c3b75634c28600ccb2fbfbf9f9aaeb3fc18a04088b2468866acb2ad218434fb3468a0e920bdb8af6275b61196436796dabc404fea81d95c388f8d80d211da9c0ddfc599a73713c7df3079145e34ac2502f45b7fffda102b45bf49e544218bcfc5ab907c39909130d429af7e7e0c5f241eb7cc68d8f11ad309d36c74d443ab41c26af9083af4f4784d70e35a1f547b615506316a4d3b80a01e83258b7dd69f48779c58549f532ea08d231a29aef11815a084f908a737a6cd8b79e4ebc9d77251bacda43083dbb5c507542939d8f775df02f44f3ede81d76af8e8bad7335564752092aa1739586e51a5f4f06c4b770a40139ab84b8a0d1b3058ff075f897114757b2554f6a6eb60360c737cc26ff4d6dbce7f97386e14363790fe7e2354044f1042bab95651e557a911ec78c8d5634dad584da609f45936957c0fb6d398f9e5a78226f83bcaa2cf2772d94b758292b3c031101255663b409a2c5836a7d57ca22aa40ab1f5fc06ab96230ec6f59791ef0cf521829010efe5f7115d6b5dad60048f492b428a2ce78b9ea431b022c9b130bf45636dbe4b3542a74cc8163fca2c35057af272a87234a16e7b1a71675552506c518388221d22719152631a4e5c50734cd4f412ad5a0a80206e0eac1402d1710412bd3de67fc0848fada8cb8013350113c197f927e6d49f7846b7e4907a67b19473f83677314d0096c5ec7116e01ab672e855835028b19f2e10f4f1054eb9d1a0d2de308166a04a0e800a2a5290ac0d3b92bdd2ffda6873030a3214b4f6c2aad43c6ce73fab4bde2df46e7fec26fdbbf6755dcf5a078fde34103fd19e0afe7b944d0e50d4adbf566d981a456e77455861e697094808aacb3c3136d42d9bf5b271476c86ab1fc635272184a82a099fda0740b37f5b24a0d191533320da836dbb478e967c94540e513a28507fe81aa95ddf63c8df394f96eafcef28ed1f620285a6c75b565bc76a35a3074aaefd98859015c79cb5c5a88f41f774ae2499e26bf0443f1c0a9d67ee93a5b29d2c5db22d0755c23f38a133b20b48663360ab561cdf9cd50b243871f9e732df84b5746c5ae698e45b8addb616d00611e76473653e88745481b8032121521766cf4fe6edfcbc8718e39427b1c63097566e0f1fed551f4631e65b6300254c1714f6af841c4a11f1c52728e768558e22f23313724a2ec4d93c5d266455a3e470fd068e86a4cbe61db9bf7c1046a5fd438fb0892a17b29b717aa031531584dcb74366a78cc021e68d2347b48a184f80f475eb2b4d15323fefc281efb991967d4363a4d3a0477e3106f320d123ab33fe605308c33e02a394de328f5afd10558f9c0e5dc258eb73d799cb3dc3bfeb9592905b55e39c90052b9d598c0b8aee6b263486e25df9b27b01f4496d66cd727e47388abcaaf25b0bd91a4f23be0e5a314459906aac9e328567e1dcf8ee2c963452841245361b58959d90d75c595c8834c0ccf9bf373333455ef3b481d50dccc9d21e018bf0ed89c005e82189b552050762496b2e843d8b1150ad059ebded7e90adebc728ba10821e630150bbb39b6a22127a4481082566c1f8d92dde1533622e4e475ddfa1b66c2e2ef48ba224a40099f9603fdb3199f9b5c8e961eb0ff6b4bf387033e85175b084b6e7b192c363180f892ec3ecfbc67652e8d09cca1fd1c7bfcd6fe65ba7cda2ba2263f6690a6f59a3271a599ee8bb44731cbf0153a615471a56802b3e7865df485256a38c163579aaae3670160fee106a6e9d59e07e39b1030ba0c24df98058bfe199ad9cd29b4ab6294657cea8349fde6023206aa17e715e52cc473a42a46f3751cdca0e18bb0aee280e24b4f176ff9866ec69440bb8867d5e88ea8d75af79e54df86d15bc00f460ec66e556e2ef71ded6d6e464933529c2e296f201769c6d52e96db5603d6bc3c99854e4b3144fc41e1ef67c1129c2dc39137677941708967c3908a9007a48a83173ccce59cf2acf13aa1ac1d7d80a5deccb6af62091aa68c1fa766248b114a1a16a726f37cebd2c9bea144f91b499e5f977022061372a6119bfef467a5aa1fa4a375f0740409f60cc51cb2692285ba7db8fafe474b404c6d400a20b0561a185826d40e2d827d2da4710a6bb0a4ba1155c3b0cc83a0f3886857cb9b99f75de8e5ce5c04f2a846932a36155a200b80ac76426e083e3ef1861e81028af9e9192f720477c4f1b19760790a51e5d0af142ffc5acf29c32c674cb2a9e6e8b88ec11d715b4d9a9754f633b16150d713c02f9418cd6ae423ca9944bef4b32920f43dafa3f0333011b04e26630aea1da4fa824c43e7060640426660d152d462fa9aaf21df13a12e3233b88a1f06f59b66d3962df4de98c496a9b801fedd249e250d52520ab0a532e8ba4908737785363d5697a3440e4c2e88a125c6fdb07312e1ad66ca78b06761d88939e3c7c686a20e66f0ff2e1e2680f5eb06d0568a453305be9973906749a563488edb6df1684629cf6c73837e6727c6016d4ad5029de0ff7cf9b40da8784cc2ddc9ce61980109ee5c45bccb0892ace14240d4342899738e9cf50a78c5f1225f23f2c861235fbc3529d41bc2467e2f7157b70a1f218893830bf5e913a351d1723c45f725bd491750d372f3991d0b799defc92e0282315ae8362545dfb3ce92c35166150bf0d5bc2d02d045e487c4380246469887d6e076013a7b274eb2a1d4244c3bc973259e8fcc9f33388dc2afdfd138aad9163dc15dc641568dc851a29fb61387ee92ba8cb8b188c02149fcbf815cf55f78562b4aaec2f16603988b2a7c26a82f9d93d2807117e5580def8925242964e1e7c34efb5f1e7e3e48a87c75341117817cf086d23fa09aa7a5b588b880be5ed0b8414d092b66052b362a6b90b168782d85a9d4251412a9e3f58682f381fecd1d23d2c6503d00ada875a35847b78ca4e7c3e489e40cdec94c414748a8d4bc99eed85a5d9e0ade4e596f80faf630a49f5841f95dd11025774994dde9b598c9020c19a1e2825ecdc7ef6eac957c5e54a4e8b409949657c3c33faff2f52cae9222e0ff5c096711f096caa623a0643d30bcd00810826e54e066d0a9bcc6c1917662b569e02178c362e049e1d27f875ac5ac477ad82e68d97350b0cb2e7be128963dbc33d160c99a612c484926bea73b6949ca24089a407e587e7b730dba90fa36c4756b88787c032ac6f68ba3758e6b7fd983f19b25a7fba874885a3b4657b1484b57b22d7c314681f69e83fcc6b7a0d98ed78b6ccaf2a7dd016082909d2595ec77e07914d42ce1f6a65653c0f742fc3cc2c4061f891e129b524e180878238c7c468bf370c4503d39e189e231ca7afb49c220e51cb2bb72dfcf7f7f304547ed58575246563aa0ba9812fcde936e7ca5c8fed1877781c6d7372f2c224ed02b05f1762f31cae94c8c559d43f42450b7facbe5e77bc9bdc195c18132d4bb4397d8b98f0ab78d5458291c2b5df117f7098b5a082930ab432461181a510a3bff9572a85a19534472f41a64589dbe7a2c081df842ba04a658263fa7894f6c0273d61f57c43ac9e6eb055871cc626077e0a75626381d5914e239efb165547dbec7a0537c3412edc1ebd0a303b59adc1eb137775c2a34f504554407a47f9d525c4ab99057a979ceeaebc3ec193d0720bef8a5881cbf31b360b2701be5896d6ea887625cbb7613714af7b573f17788cdeb4322e3d2884e53df4467870a978ed25702748d9dd27a80371f604c3ac6e238d1e4e5708e4528c34c916fc16b5d48c192a64e9536dcfaacff32ab044736c0977f29b8dbb0abf67a2a557e9f1b806b37560877ac94ac7bdf229e7b692de15c0c3d57033bc78e5ef6688fddc22c645074f0b319bac2fbc38d7cd4d8db5cc8cc5492d1b72a096c26565d2cc86a9dc2c1d90e091d5cf1302a65308e3de14523f37d2ebc0a44d9eff19b75e06b5307ce2c2b6a0532f5f1bb20526b085d3c53f1129ceb60cfbdb793fe082fed310d53cde7113dba83e8ff8784e8f4c6884a901fda2f2cf54f7a47ebd4bf88ffafc718082bc1a4a8bb0ee6c55e30048df5b74e2f6ece7b42564946b3a4d67ed62d69452a855e99161fbe94036ccde33a9dd1bf80b14d8a0d3232cdc3d02cc628ee3e257a772434343d3eeeb6b2819d2e4d258c5d3e9e7480ee710cef378fa0272977227158e8190c24bd51a55e3643181d539d68c01db38ef0e84d2b38900c5fc0954db89f2b1b5c9ceb87b145777d51610241efc351b1baca9f2fab959b1ab638d0ea22a5c8b00101dc3eff3ffa3210ef400a3ec6c3409918dcb178a0e645b3935571745752e5f651a66e76d9e8b7361df507bb270ca0648117b06525eed193d32545d3327d2111fe636e671395a36ea6ecb3858806a6eb3940b6491f05dcbd8cae0c8e8d246a52ff41270d133dd5b80afc55cf760c7461d089b35c0fb5da1ec8f0d065f573eff1210d6731829ee64124d69c39ad0483f3c2d23a709f7f7559690e88b97b02710d7b604d85bee0c0c1eb52351dadb799bcdf7755f52e77f0b42ff131efcb569b556ad65c7c7f9e9bbf4bd64999abdc37a8a9aa0811699a3a996422e42326ade8a0e4a014e31d9f2e1983cc0d8a4a695242abe7bdfcc96bdd7c16206d39f15aedd8c582e1d964829e38131a2636057ffc5091fdb0bf4177d5320a4d35b5354d75e64251c60d53ef70704d2a36ee2ffbf35cb0dae0081dccf419a17e613922554dbd5c4de6821228a57d42bc20092be520effc08464dd9c8eaeb174aa83bb34c1c1b5545648fee85f22ab93961583144522e016c0c8cdf46c0ae9797f64ee729ed5ddc0980d78c228fa7529ddf7700d57462a26e6db43a4400fe80dc38d0ae3a27627c2b5ac9889e0dff2f9af2b506714e9edaf9f064663306da54a5ac7ba6955f5268eac30f9960da0f441c83fc8fdc72d5bc1eecd816caaca3dbe4a98782ebb8e57a890f4c8202e6478f9542046025e71358bb6b0884dd004de7199f603c4d24f6a0523a4aa4fe633a5ad97b7254e4f5f6b76062907174548e2d8495cd14974a7a585904b5f034b97191309dcfca640a39e40d615f79470728382bf50d29a6fd58ac51a4504b59b488a5fe4c8360e8cf95f670069d4ebaac894b4c92d33ef9918473b6bfaefc9c6ce495e81863894534fc8ceef5263145fa450996ea58bd63c8c1f82dcb58d86a5229533aecc50c9a15579d584eb9a671a80e9cade27c54fb11dfebe5f6ed971d793a96554a07b6d8cdb5a2b4fd7fec1cba4081b9ccdf28849c59a2c86b54d6d9dc3bf1188ed9fee513b3fd991489ee759a11b172f19178d446b9ade5510349b98b40678cb5c5df240ceb25519be824f99b94ccd08623f800ea07251df0901849e8a2d55f90d0fbfd967dc5a6f6c8ec412afeb6ffa4a43e2aff50b84c46ac99ce9e12b0523126d46b1372be42bdabcf2c1cee8bcde6cd5127323631a225b17535bf2625e6146c5513537c6b8a7e64f4bfb518c3657c0fdede091a8bcb237b0c2848f690a6cf9b8db9692309d8aff828ae56c770a34332b180d290e7b3243b128c98a9049847b21c938f3739c1b146c63a9839a17f21bf74a9606a53ce1feb586b6d5454dc56ad2b9f257c04e4203e4d289990f73b0be32a676001c73f2dc23102b9e616a24acef03649830ba8d008c05bab75a703820f708c6e9050f730dba8d89804d3a5925d1a441b8bb50cd78a7115721f309e85919c744138eec06dd99d61f62ad7f52050738840d1e0c8c440eb6cae8dbc07f2b688d4e8a2155f9e27ee5047f67156bb516235af1776fb78c9d788e47360f6d15b1ca825a3bc9febfa9c01f818d059060eb943c9109885d224de36a49bf34520541d712a8fd4a266fc6d2cefe95e976a4ab81acd3e41bc81db4c9d338c39f7ae633fa6ba6ea640184cbbb0cf8e3c1fad8c41d520bd70ee47c1c398641a0a2b99671406fd09409689ad717de78f4c70677259a2229c9e420ade052b9474dd7173a49371120b720d677df7ba22ce3373f3530ef0302b8f1003782273bc4db3a5c38b935a6656e98baf3100de81db8ac5121ddc7d7b1759b00a2d41f9f9f01f503cd53b6ff2aa4122319e5308b868ca3c5ea7085e413f3c580d40057bc22c0923fcccd7efc5d416a14061e750794cbae4e2a039d66a52e4080c1e8327a94eb4f568b719f9a3c4f2da24b549dd0be8e0b36a2dd793222d09398fca3f98bb4163c2e5f7065a5df7408260e0963d64c38c698496cce24177e76571dfce6ae0be3f2b85de160b8bd83efe0e3967065fb198bfb3c645e39bfd13b6e942fcbdc93ab25509696ad1858d5839a498b41eaa6cbe7c47bd16c28236f4287fa279c106010eefcbb3e47425bfcc423e359003ee43b989dc84ebf3d52ca43511df466a4bb7c88023417727b3f3f63bd2435379119607399ad5e54ae5a538919edf1ecf9d4a7cce151828244573e43a439236ca417e8c2ab892a9c2ec887bd0873d74af2c77462a2e0ac528bf5197843e30a08ccbf497355e337b4782bc8841a10dcf91220f64bf0f0851a4f8e3f73eb1da60077f22485b8bfaa70bd01bc249e952a09920be82bc0b52da35581a3c93a1a6d2521e84fbca9449098dcac7d164a1be8ee8393f475e99c5a0db8f749804b0b6dd810106f6be8b939da5df18678c320c4fe5ce7d45aa2b5877d3a72da2585918239161eda62f5b53b5e4318566b7959073303d4ae8e55e7fb0510128647d114389396c6af8bc07875dbd463400809f24f2b1cacaec72a09b5ec18dd624a26c7ab13cbe29dc8e46c8df8412c4b92e019d3cfd25e4e4d0dad59401ec3ba744c8eade023da5742b651182269e52291dd1020c51ae8e40acae01fc2591f5ce641a72c65fb26cf7dae2e1937043d0bf184fbbea10c24b9d93afd18aa63801cc67ebe39c1e83b0faa7caa7c4fa18dd57f6e18dcfb318ff48d6aa682e1f2d87028a7f496b6bb15cda5fac4870dc5112e73047925312b750f16c961fdf01ee14ce57d8d44cc1acd62d6b164e75ef6c356d85365d2577cdf3cdfeeb6346354a346435c5be4d6900fad6d01af5a5f15ccfad0ae4cb1cf1555b137e70ab7c741b4fd1b364ab9aa52f3721e95fadb1244549e5fadcfc4e716346a102e84e14a1a7da80163944f434bb51649d91c6de0d461d33d279302c91bd54821bc886da58d15a10c84e1fa78301072fc909f68efad1ca9a9df12e175cd9d152e48c16f861d09a224ae057259739368a71fc997187a51e55d277940d71db0c214af56af73aa3300cca7493ab0762b53c01022d174a7b9b1d15367c328103f2b92db1d3b9a1c49482e5cfa3b26927ec57428f90bbe51f3fd199a50570b17b5962e1c3e97e8d0102758e6e5392c4a6da5ec7c20d65d47cab92f120492cfd8661474e1d05fad15caa77d57b662127a465e2dcd1587ff2b41a4c2568165a97c1a4611de52c3750b39c9f614c6494621bd0e31109be2417db8dcc9193d018859174000c3e5a70bad0c74956555914a2751481ec80fd53150fef0710445aa60c628fdabe868465272430cd30b3b311a6c950bdb35efd5f243b0927e7abfc464dcf73b0a77f083f812208a8a3059c310fe208c0062b0295a16de35fd61f22ad28ef9cea6eab061ae5c22905c25a5cea97c674cd4961d2787dc4522f663d4f956962c0f2efa50256de897e524ca496d82932069a9937425bc00c82381803bd593f5067e4024a76a5018eb826d67fbfc3cc0b21281c556cd18b49fc244029d0d8b1e2e8642871e070dbb55c670266be04271a63db796feb3bc014067cbe289d932e0fa5ec8df78176632ec2aaade08d29bd63a16fa68424688c5620edacc5239b7d86e12ef85ae90cab868849904e5d167d4787dba8dbaa5b6d776f63a222d4682507e8e6d47a80ac890ce14a8861f0ebb40cc2bc474f66eb7bb7b8750beb1e0e04d7567a5ca77b792d2b903650dad5d32f58790f05ca1f058d8411217e4ea7836fc747be2bab9bbadf4340ae07b5015e3bee71ba9ca07a090d6f69334161f41165aa03092a03f3a124c38a7eaf38205da2f925203ed837e40bf7e672c49271652c9bafe56648c60598fb1d394c07032dbc4b1f697f5bfe7cb00a61b563de0f957be04bbdca05ec5e2fd7bf92525aeb272f595921fb952331d12285307383340d5c4034dc32a10044af5dfee6ccda24fcbbf247bfa30381c7dc0b16465de242b9144e66d11f8b3a1f2cce4ae59c6fc66ceecfab4c80d0150027cd6b7a967bd606b650ad335281fd4f532384725aa8652893764f9acface88d5750e01fbe16153fef3be659044ae0733d471417e5235f30f3e67e01ad93590760791876d5f92883085b2c9998e192b87d7e04e53c253522b3cf27b39b1489cb7271a81a55013ec7e7394d309806aae88d977d8f0a7038e8b3aa0a9f9da14cf8fd91394398c9a96ae0d59969133269dfd02b7f6527abc2ff9bf70ff20ee35f68b19bc28263897388400d58cdcbc87cee83496bbb17441455f503aa4f1467dfb69096813720fc3109b016373ead86502812f643d3d5246ece3d12531108855dcb1d71f6ceea3760303bace862d930a27d1e8212c6adc7a6205eb38508699b0085b15e09cfd232d80d65a008b05d64326d96ba5be3e927455931b4dcfeea5f187d689745adf0071f7df5cc628eb69e1709e11f98e9ffc86c5d4fe1d3d9828ede9642b5b4a2dd2958f6d37697594477df25ca86a5ca797ae08d0ebf220be857d69ea3cfc8792825461abfcf37260e7463d442d6a44e90d070ff75e31433d61b85eb105e50135aa8ab1307965048f297602303d08dae1524bcc8c23a72b2c3865d4cd769aa2583ec1f765a88c4c6fe7b24ed9e495c7f24d6aa83d271d84d2d17fbb12af2f4739a15e2eb081c09db619297685d55444286279a88d38b698b1f8c445b1f27799a2e7064f5eb2b9061576687507628cc576cce28645f3d202fddb464b633f1d0b52081e070595e03d89aff820a26c9d1d714a9e58321c784b2e94d40f44a40d6e7310a4b8d7d8fc72b55f820c67ddc3e979730a728afc562b59704c589b691fb9bc721573e095abdc599824d5549ca830af18197d185ae734fdfc6bedccb4c156d982e519c44dfae592b69c427fa1b4a1f9aac5579c633bc6e0bdc199569ac40110163a5e9c808e87c160b02c99a5c52f19cddafe9cf70dce1b6ae5696b30dcc406b268539b5dbf089ad9f457732073cc0b70691d16061a94ca461b40204c4c4e924be698d86b099c4024f52ce265e51887461a4672544eda5d828ce4f68e0ff753b9489529f8a62b9ab5213f0623a42a83d3f8b4bf88570165a085381a5d9b8d0bd93deca7cbaffc415cfffb9535721376a8dbdf790150293e91c346a9891603871dae258608e4dae00a210e67069c9a08180ea9fbddc9c7ee8f1b2952fd204cc493285353ee25e9c9bd8d0da5e1929bd7a73c5f16e4b8d82de0452954d2d94c1e123d4a0f141128d42647283a9f71581147afb872a659323584f26a924c01806ee49248bac43b65177b46c6c66526ecc8ecd62470d5c82272e428125ebb5dd8799ea963bf83ed20bd109017073d0a9ee7681bb227de235b0de57f3c230dedaef8b066fb5ce9c28802d5efcee2ff88d06c91c2fdc3f04d92b906d0534a7a22b462f764a81b95dea04466c18cbdf1b357f25a3cd612cf41cb095e91549f998d78647d94c1a1ae0cc86e24601a8e991d3920a171c8eed9f1da4a1e584e890b6286c73824db8f74eb578c1fa8b727a5fff573222d68caf2ac4cfc5e3050f8db05ba6c576ed8bd93cc4877d0b85fab66c9a47dc0753b19da5d6459b27e9d82e296196512d6baca7fa650da70fac8389092cebe8ddafba280479713644547c061006d99bbaddf973113a26386f4b0dbb1c07e8fac13aea2a5b785a8ad810bbae4e297c871759b2b6d3263b33bb4a96e87e4c09bace26190f0dd1730b825460851e92dd220acdeacd1432de0d8bf0426620bd18495f64496312d865d24388ad127b2dcabe9712e581983289a0b4b7620be766086893c2fc6bd8ea90bf74b99175cba7f0918d6bcf03f168b95923e0055d6e956201282b67a3bf0dbece7901c8c49214746a0c187584f2fa15250ed4f2102c06d2e492886b8f63332c214c96e4a3998676f10a7db4b0fa78b1883403105ca3c55ef4849538602aa433758571d5b751c66c90cf0b1196f2cf3a83b7ecee7af50b0979be91ef6fc78809efaaefaf074bde22086338392a748c059916c43d601f45a19831bbe6a4c04062d8ba14af2c7768abe8ada4b332c1aca8ee6cf05dc52bf7efb710343413dece1f1ca288a742cc4683e0ddba0d1bc5a7954146c277e9d51be3968801d5529ccbc3190cec5580b9ed8dfc341b3064e1d4f23402ac95119816b570cb5c3ff8366ad97fc706173bafe497dbe68530df9921eb7e8573d9f4019b8a05006b69b1b34294250403c28f02316c11c133d174f9633cd068da9c6fcc8ef87a714f2538af9f3307eb243382aa709d66218e4b9d3c21d7966a6d7663c1bad5e61361018340fb5f1bbad8f9c72a917afed0651d267803ee81b4d871213868db267a02f66b89347e0e65665055c40122b7a20dccc68fb71a1c7515f2e37c01b3c5c3b87367079eccaf5510e8edaf581ad670529c290fb6bd665918147784eaa59da3a4ba20dfaf22a2fdda07ae4890c9a2909d6a4f2e650d659fc1c520033766d5778c079cd1ad00639187e3c77513bf635755ba20382e9578c6fbb1156a4c2702699c1bf6ec412f14e44786066f9d4a575330d07581369c26fdd3c952c2dff6e619d3ed465227a6ef7994f57a437f5a896b2bff652f4e7b101babfd68051afd212a3cad20f61513f52078ba6ae158c924907ab656c228ba6b381083721cb617ebe70d64789d56fa3854310b55498f476492abb52afeafa93ee4a9e82d51dad5c3caa17ef4e4598d0980d7b2ec98a7af48ac4dcab095322c22ef339c150720482f0efc391ddf036841fc0b1c4f28ff6ee0cfa15eac87d2fefb02e7494dff719b8298d33181c9f6a8ea751908e435b27b0be1cce1ad0203a187c7a51adc5c41a3d4a9558798f83e0c749e265e755ff9b8a4b7549f539cdcb498ec4c25e358369195b343baae489353ebbc2ab073258783724711a92362f2e2a297589e5e5301f7e6ffa60b46dd104cb40362e61579f02bb2cf32016468075a315bd0b2f1704cbf95988390c8218619002b742bd45a37a4199bc6edb2afa67d432401e112fb4f2c2ed05ef71ea5c1e8b32ad06ade5157e7f50ca78a52bd203ddcb41beeb8a95d6bc3e64d07dfbf190f804c69ba959a2cedc61a31be2c62cc1098cc2130447e28627c4fa8a514f5b9c295b656f1973f72aac0347f937c621022278bf01e12a05dc82c1858b191057db69f73e2c0b6b88980a25073279f6bd342501dec926847b09e84984296ab0eed87fe1c1b97acb2d50244daef7beaddfb17a40d3e02c3ab03b18ccbdc9190ce19c04c951bf708cbb6b78798d1a2b6162816b81ced7ae2a65c4b91de8eae0fed2b7fd7c0fd8a3504479b2d9bcd53bae7dbab5a6628262d63e045ca175f9ca12b749676cd1dfe40c22897be3fb8e47122f79efd9abc9dd05ceef8963fa3305ce269f685cfe1272c52f500687cd5641d092d01df67cd570df7773e22e195635b7e174d3cf4fe6c6d970adcb58b445e73aa537a9b3a1e73856ba8253c78d40a53de14eb8fcc11430e388d5779a0747d0bac88e1ac18ce4b9672e2dd7ae752f009cb02e9c165673c0b76db5de87df4ecd9a67c40f47890e33fb5013cc908e3507cecbb8b4079f29b29f84228b3bc86540c17528bcb628622e7f7e7dbf143382a5e815d529a6625866361ff7f7773e762597ea1f3ea6dbe55ab61dd9ba57899b2050d7a0f6dd6f0aee5aee19977b2ffd92ef994ed82fdb289b88bbfd840100b1a90345bf85e34130fbb70c3722d82a692f50a758caaca92993af719bbe2b71eacb63ecea44e30d648f271bfd91177c943929167fc8d96fcbcdc21e7570e39371f00830226543da484b0f7b4c24971a4421b14f0b87ccba2fdcbca3d84809f996602f57baf97201610ab00e418ae422500e54d92cd56ac06f257ff6b2e9fa1313b9e6df44b3aa2fa7961ae0713ba4fc559111e5f375fd704f3ee8db7b0ee56b46751a7288045fc119729b0cbece893a49eb1a549ff9aece72cb91e19787a2e04dbb651e6146755231cebae819ee9424727e02928bfa7ec581380bd9a5b64333dc39f742b3e5abeda22f322d0a15e3c0f88819a102f1c7ad6238909f524dd3b44b93d0e78288793e98b35a46889e2b7bc822113bb7b4a38576fd2ba11190676cd6fc08aba22659731b31eff22714fb52975b26062091a432a1f8330b7f928bf29bd9eb839093f5d4e878224f9a244c7d62f4034ef9f8470aa4368f9a54141bcd12f01061e0e69db40bddadccb902ff4462af9013253cdaf0f081564a239a32467bfa9b2c565bd665f92bdf17b96996ce9812bc3af12c04ebc16b1d067ad947a7616db51a47e8851e54c94825d35cf5197f3b2da55f7568c82d5ef4051c48dd6054bbb051b8340d233e204d854a21868d4680ebc76ef30bee6fc3392eb0d7a9efe6e13bb34ba5a5fc980c93c2fc2754b37433d088f20599a7fa17a0f8aa4fa67e27d7608af1e8f7c544ae5ba845814cfdc6b0d24c71e746c7629fcead5207f3343fa40d0aff81fccee99fd656a90d3983486815a646bad91566274791e0288e4913196149a3e23c9ec90683a4b0e3f0091150413479cc11d14b9319d0ee02d03fbd4e28f48c43e8005af50cf74e7c5442e7d411ee2b92fc6f8f0e8f8fd162840e372e219598c148cfc188ac30c0dc904a09f356aca9a189c0978e0947cd989a17d7ea3da67559d5b1f7d2fb8379a3aa144d43d97051a864aba173dc0ddced3abbe5808bdc2b477de1db3744f9a831d46a14dc404ba841448235bfccf130937fa500ff725798ad6bec577ab6a36f393c51d82c6a730cf0c6a49e02c85b9c45b8b2e78bba77a6456b30b912d8d9693d7a37152ba6b72c00768d12c13b8226062252614de546b55fdf0d932f8bf71b80fe3ad4961710e9f9552ec5f75dce552e57e17a3e6e5d60365a8b5d828bd94bee0c0948aa5a211a63a760e57818cc2f3fe01a0544a9554d7691de543cb0d5dd347698574ab2c6117d174620724a30250099acdf741ca4150889de576006e1954cb6f53a2543af073f98d77651c49eee86049d03456c399c967bdff7bec654c53c830dc4ebabb5268f0e01294fcf0402723c1ffd6f15b4abaf5cfa95bade5468f69162260e948536abc4ab9614bbc9a8061a9c55ae061abb541fe0e371ac008f5d38948bbf4c7c205178d7a6eaa64f902f3392bc784bd530941a3ff181bc7c8803efc84c761cb3c3bbc0213a9dcd0e54e6d34bb439a5b0e71d9e527bc0ef24b0d026708afe0d1f8ae0d5ffcc40fcd61723756b5481445a71bf90f21322be4461290a4c88904f2b24399306a5b9fa9a26d979f87a552c33bbecc7f15e2d9bf175080015782054c640a5db0c0b14dc122cfcdef9da69c2d3355d06060e9832021705ab650365bb4baf888066009b943205fb2ca1034490ab0bc899ae11ed89f522358f2414af49d8727ba3ac51828de5482af109fd723fc2ed910c5f6355c14b605e8e80ff5ce4f764d2462e1ba39da5ca8c8e594e52317483e84ac5fdd15afba709078704d5e87f48292e75eaf70721540e9f51d00e774f5b5eb829dfbb0818963fab7392068c16f9541c4abdf2a679da729264b9584366992b9f2ed5ee34f5766f9be3f6375081d300fbf4f69fa0b4101876045ced1c2e5e100b86f1af8504e55d6d6b3c28e6b01d32b08c81bb48dcfacfac71285b1ea9cdbfaff104a9c610be0c3ec01486927ae6511e7523bcf1521d39b3df88126da50f884c83a368868d3bdad5fdbb1045a3c3cedb551c5713244ba3cf13577ba43ee16d0d071110c84357c2dd47e772c24a39c56cac5d5014b14bd61c415707337f2c1bfac2a95b7533dd63b913f4639ed4db096b98e99c35a452f9982264cbc9da3d13db85d885c776cb5923d11f5dda84f46d14292e41cf52b1cbd040bfd9f729a59931ac0f285835596449c2701670a74416d0e0fc545a783473f6426d92ccd11b557bfc9d36b60421c32def7856bd0ec0ec74d6841cb6a38dcfbe85658775a02304696f0e45a5895a0ba96e9c10404f60e10fc3e41cbc679083bbdee9e0ceec5427802794882f35959006fcf20fe0a0ced536ea155e27825aa1fe51909218478bad830ba65080762a761edb58c70c5896ac64765d033b08e099729fe71dc835d72a5989e29d23c4f9b26488c78b524041474e4650fc94250964469c8605b84149e8cd0fca162a0924324ea76683ba4b30b2ad75aadab6a77e5e424d5d16e710451b0bf7e541a43f9cc99527b5b98cc646685b9724cf158c093e392a9a573cb933c9d69af9a2d254482aee50184656f0dbc67eda92482e668cafbc1a61f42a38b3510743dcf6b91697be80ebaf63855f34f0f1498d0348ad6d1f399904a9a38c612a5746ee91c30d13f40b17a76846d3f159310e7c372e984f83bc0a7b15ea946240e939785bccc6c07de02050920f60eb0275b32ca30e899de44cf9adf868ee319ee133526ab8f6f1d93f725a8da26d6d5f8c273ff524c09443f142ad856ab6adea4aafa6d5d9beecb75d09a70b252b4f755fb330fba877d9b6aa7583822336e3f3b8c345830a9ae90347e25ae3c58d440edb4c88541b050180815bf2e7cdb835de49a67af5ea2a513eeefb077a5800ace4fa6a418be4ac979e3935aa37de17b1bf9bf31ed7690657170daf6aff518e38cb7bb4beef55dbeed62f137cc1a69fdeb0321a931a49b7e2d11bf9a97f89c438fdc640d4d8ca39050a76aca4d14db9d9e2e304e4925c6088a5021b92208a4c059d4124029657b9f1579eee77fbe15b16ba1df00ab456e198825d4918eb756184c4e6dd31d30e39f30c32f2c74ec7ec56661ad306b92fa503df315ff42959f246b265ff91f51ac86959d57d9f81c8404bcf2104d777bee63aab617097a6a1cfcf1cec0d2ab8cfd7581096cd0223d2719497e1253c4b0539ff4aa2da161676083c963891de170dd2d2f5f7967cd0451bb265d55c0e6ca13db6fe1e6ed202f68955df765dcaca7bf91dec2ec9cb99c9e022249d272482c3938b82ab2ee2869698e8ffb47f6982c77cb4924df5bee7fa57f9c42d4dd1d0621eeae11c6438c7c4191da1d65d71d52c4e6c78bccbc2fecc9d9de1fced33f33e28b9d93df08c0d629e1800fc3f1a4ab51f85d8a005bcec98c0fcff7a43d065ee084cc8d48bbec3aacaad0840c94cf15a0afc117abf24529019f848ce238b2c8cf67f3257fcb2226c044cb65deddc639cefbf69c62033df6efe5123a6244a7b5c61614477c8e3a77b7a87aeca4826af82fb63c771a3957ff1b93d197df4dc86c61afc90ac800822140694090124b1306c463aa602653e2af6b292a9f486e56ec728e3bef8f5b7ae615c5f86a41c1b989e8186e3023dae5fac9c31320819a18cef5e3a84c4d16c044c0705059965990451ac97ecc67e672382a0b06c6fd43ad21c80069352835bfe7d040e06c94014a7cfa05ce8fb7af30a7ab26e81f4e114dd59f6cc8545ad94fea79beb3206e0c2f5394122baea4f8c0a6b081421be3dccd199452feb0db7467d6cc5d4d6fcba5847550c225d8314a2a735e403968f4dad74dedc816478398ba0b9d422850355438b804549129c97e84f344cc33f4e7c5dc8ccea58489e483698d9d24936d43f78eada6b87cdeb0b8290c64dbb731f4076748458da8ea9123541a650e7881d8f784f1446bb177d91517dd2d33f84b3d8317548589105968205e0d2a09133cb4f6566c57ac111b662dd9e60707cfcb69c063647b3fae94d12dbeb416df31124ba84ea397a065b0a62bea34da7d076b2f431108f519ad0fa959a57826e3b82deef87cc16a500774d6b599923847b2de54a4fc4bd7a2fade48c28e2bf78f56d00ffb5f595c030e7d3659cdfb348ef5f352e3a163941d316b5d7450a9a330a4cae51fc6d429aa82f68a17e6c128482915603c88de5b8ff48798a122baf4b36b747258b979cb5b15a962eec1ef78b3cef71665d95b77c1999c52b678cf1e170fb5ef0f4257444a3e5e69d07f068ad8a1d5b6ed55405ca128371f70588e2ce4ec327d5b326217bafab729af2251db59cb70b0546af8c331844c37a011a4b4eb1588bbef266bbee66b18b35f1fedd02832965e10b2dfeacf9a8a30be5c2abec00dd9f09fc1cc70511d7a6f860ee207d7dc19152758a829759328d7e1562b265cd5cb7d4f2871ca8e365af0e4aba90084c43e3708e8977ad615aaba542ad1b510bd3ea7a915a6d0503362e019c9724990c8a902e531147b6514c380611d9ebc91c61be686cb9f5a595055feafa9b63935360a6b55ef824f95538f6b8da35fd8f2f9c4f8cd4fb79008e9bea8d8fd871f06b8e51bc065575b42c53c6625387e2f6744d3f6ab7750ea4ba2dd244e712fe923c99ae0ba30e7684b576c3d7f97a55a45efd4fcb3969daf21f77579b97e7d58b82f2a62d51a24a9985c02a6b8dec23aef118d25a6a53b354a35f5766f54b98a612947755dbc2c9b43f4bb80f5330143c4883e793589b1a1497537033abc15bc6f30f7133dd355002738d9efed1aa60e54403902c0be446d56ae292d5b10a9f0fdc7259844bd6d389508566caea1f3f6f35777ab23c24d56182d6369be42a3debeec853152c4da90b627c967978210ed12d01335b02efe102a4170714929236e7760368d2d499f446e9c1771fcdc13d077b9943597eaae90c4862ac96a8311bae184a6dbcaefc0e389225d7244dd10e5c3ca4acd82fad721b2e23bd914914a4d1eca95cbf099b5d5ad220901039832e477e1d095dc1c55ee5487e9a407eca36eac2f9e271af2c7e5bbcb4e72b8c0ded00b400068716201ed9e9ea46ad6e1b5157859d389ccdcfbc4a0792c73e2611afff309a7e45dd5ebc4250b0a9cabb494fe2df7dfef2409419934ae9a322663b55b8c4665b8a15736ce991226e1b2dbac0665b0515b36cc9b122663b29bcc0675f0495736ce9a122763b29bac0b35b44157376c921a1b8c56f375e17ac0ae2154037ffa013ac7f0cb8c9af9cb912d52fd3f4d1418b73c20a25bf68947d74aac775866f99a729791de211ff1ebe2f017031fa592b598ec80abb4552ca1f539f9ff227d9e7ea9049e51b1385fdfd16cded567c392483266bb874cbae502e8a752efeb2b7859bb1d4bec8a21fcc1dcd42b9c3198ccfadf21f26904c8e79124fb85c4153bb373ee67e359621837a7432c64d88a9eba24142ccef321251d63b77830f6312cd17626b256fa3bfdde7ad2774e076a26b9c73729fd2c2b3e518f11abb64587f0c3b240775431c065d3f7dea7895352b28abc2c83dec80d118350da54082ac2ea37cd43bfe05391fd2126195156f34110143168900be2427c68bc8f07be833f154d6d3d0f6e24e326d9e6e09318ec4dece3c1a5c148ca18a80d5315664e5dc2ccdea998b9ad070821aab4b093bf397bfd08c92b9bd80867df99a3fa47c1dac3fab9dd101035a850f53cb47a7847d848c726b2488331723800d6bda6d483d409574d242131e6cce33d2bea2e70400c70c5253c1505c0153616ecb79cdb2f70527a17ad2f7b61a06f129b772b31357b8c155b64f3f25d71f9c3c29d5b59ddb13af4f3320342163451a7890554858103aaee0facd674d3dd78d70ee305e11747ceb4c7e728adfb18acf6eacecaa26b591d34493a1180074bc9b660827673612f717fd100e8e8ecf26285e0eb22116a88e40be78a7b0b0800f8aa396e8e2db7f90f1c82948350c4ada709755ee654a7162e8503a6c23205c586c3d7c6b1c5abf92f8a081374dca4cba4f175f43cc7712c53ea9a3b9de1e08c0a63cce74aabd0bc5246b79ac09bd9b1116400e17b4b179a80c1954163a8671ea58ff7d975bb40af891154b9ad5cd93856968a13b4116ceb086a2e8fe7861d731af485ebe252acdfce59a403d5baabdb3271cb652657acbac6d1d421272bd1a0be55af23beb151b88f32473e9a6f8874f462ea3691164e99eaba48077aeab041c66996615d14cda71bf3ebdec092e5e476dc10b6aea58c46b4aecb9fa8d2d4225cda0f1acc216b29b12d6e5698243fc3db36b696359dc33abe43bac4629a23611c507b67bd7b561eaf9d247361b5420731500708b4e847fc73dcb151d20981989d111060ff59d6395d604f9a090a5aa82d7f7c4f8dac977740fe856aa86412bb33e6aad456f2f83d9bd902d5ca05b85486d67d7f047b4146650a124fdec09f3eeeb7f3bfb71b358b1f8335d5cbd55fc9ca2be501b08509cdf0375176949ceb1ad010d3121a61e645aaefd5b0f31773104b1305cb2bf098e9810616c509d4d80929936abc7668d643cd3bd5fe1357c6031634db0696de89473909d1adcb9851d5ef3917e243e28252604b7c554b4858721c9739a113cc9a35aa7e118e2db4509857c09c16fb8730f5c66cf688d05253779cb444c2e8d58fa75c11d51a7a26fdaf33566413f455b8b05a75ed9ad4f19c17240259351c2bde7e287402fe01cafb2017052cb4e99ef091f007b62e0c7c2e1d190f02b0ce232f5389fb5912070f75a109202d97f8598ea3855d586e8d04cc3bbd66dd3f80c881d2ee19c4cacd5e3e6db0a02b0361882ba534dee60813427ea8ec4249484d4f4c2daefb2f5e947146a50be52a2ded9a4d9494015e38073b9cb3930f517ca32ae974b205e9694e005380d7a0b4234c7920d1c75f3ab430545899e8bbb000038d452106540162deaa54f756b565fc546045f5b8439d7f9b0014c3d7aa6764b1fae1d5d9a68f0f8f8c0a9a8e03c78994f22e35e42f0c7c8c7a08144858d002a816edb768d4ec35cb969da3b216ec8a453421664058d0bc5287a3f54fb5556ef662191abe0d6171945b31f245805d7424bca4fa1701d2f0af86ce888c246db9289c07124da6c4761c15413b0e8ad6a7ecee580394c6ac30ad4125661623339b51c2a09c0ebd6ecab50aa40698244758efa7b512e6f296188864d426f498d6e8b08da01f4ec226ec0b38f80119de74b1cc04d907c52f080449dc394865ce0c249045a2f512b63452c393ce68213549c9263e3bea09acf444cb8eb7ec2f108c5ede0925171257a48c03528ce0027d91e01800c747e1fe129ca3fb64dbaf681872b6c083c349b4480eece8844d5feff1f9b2eacd953c44ef04ef153b6428d8e43d01de0aa5bb01ccf04d3175dccbfd0cb51b8007052b890f9fd48ab09d4e2f8d35051a6ba6ca46804e4369985e32b1518a38b5a458f9e8fe6859725a6e4c18f7e2451a51c55905234ec230cdeeb48ca884b02cffdb128613910bf9f0f553bfe720b7570110d03c139149c12a21090900571845342f04d6a19caaf04ab83a5f029ef4802a863e6e8aa642a3360e9910be1f312dedc4f3867f977792089e531c15253bf7a45850db8a5ae5d2701aaead6d4a1a8dce49b2c134b5da8a4aad4b7a41434ff3558442139618a91ba5efab90cf80bd5dc6e6d0e92f036dce12f4c27a5dc141f22299fc225e40ad89a00774187c21a747a9f42f9e61de42ef6e371f6209a4bd9f553b81e853d85ca9e7b115545cd336ebd622146b7cb261cc921b790c9376ed7a8633ede9eeb5fc6aeeab0cb36ce1662a24d58ed94b544396d06050725f4492c6ade35d8ad89dd0b3e50c962a323623f7b4e2b485de8c2afa5288810b84be852c39505fcf8a21a5262c11d82994fd5bc7e6a73edadb44fc1cb61c6a088f0d116bbdb30ade6c878402359c760010669b7e164bc3b81bac085ff06604edff80fa362e9958b2b12a26114b716dc27052d8378ea5c9ddddf066b14ed24257feb5a325192670c0c0e5c4d092f931c0544c4e06455846e400e3ba6094f3c2459480ec1d6ccbfaf8a6b66591936c4f20253cac7491d33ac0d3ceb0c2ddc18a47af98ca267e89b7142a49e97ee84c3c84742a0e6b6290a2bd51f7b9553e00069d9f49acfe90dcee4fcdef3dd1dd9745c5a48896fcfcc7bfd1ba87d218c664c7ad077a6653d7942270638312e7efa7c7de320a183f4d53dd4881fa32a728d5e308936a2719a3ffd87d887178adac38d4b9da257ddf28f4a7fbd2de36bef7f0ce3e6cf4cf6b8edbad4623b0697be65b3e97174f3a44bb7af3d9448f60538a2293406316dd31e9b73825006c7cf632687cdb30e3b0e6aaf2b052c1e197e8b4f843e06a48d4bc363e693f23c0b7d976d10632c87f49fb6ff1d6f34633f44dc7a73e7a3d5e74316423ed85a6659a09e9a77b1741787c67401fdbf3cbffa2f9eefdfbd6d5e642f08737080b059190254fd5ebdef9eafdffd6dffbc0e99560c4d56975d75028b3096b56719c5689583c93f9c51f760e714d0f10c5457cdf8e4542daef1de5c6df0ad58929d44e907be328966536161905dedc04bec4c07732da7c7e76a10571287bf1454e9d19da4e0088729ae0cbffd9c4a15aaa9a9085a2610d765e42c02392ac0de18eb1fa2d13f8ac0e3abb31e349e7057f3fcf4840631073490e9823bd856f2fb6c75c5993cbea59c10380646320ec8b7dbf8ac3188d0b0149735afe6d37b7a00836f859b255104bc3d8dfe81b156bbd1b2484a429e643b4e31e44b888876f1b681d92f2e64f7fbef9c4a932e8ef7416c5384ec662ebf02cf5c6c4ea397bdb01dcb0067b0ff94d78852e760bee689906164b6410f666f71d2c7a42c2b812b3d4a2edcb79df7f047ab1ce7d7e1818f4eea9368e1c951378044df7860711e7ba9b80c0c6db4c97499552c9a9c612bcd66480e0d5d7bedd542c9b5c8b5f2bfe2e95555f6c36b89f68c545e2b56a3eb7eb766d56f269a127e3c65058f41053ee52bdf05b017f96dadce6a4cec9e42840612d6248e23061960c5d231e79142202bec4421c34831bb72bf3c43c5cb232af8a6660e60ee636d5e12e59c01729f652c269b446ae5be1ed99639b28774146d1091c2bcd0a1369f47d63d0cb93f024510e31b443f78bb5c8467e6c100791da6d5be0eb892233469a9d1d43458a5240c1cc7b4472edb73557747938d6afa592b01d7281c14d3ba556cbdd861b8902917f98b89ea8c9be262b15f89e087aa34fb3695d91c662c14df7490e09bff06b6be5188597ba327155210f664b9b3684f765c9f8037dfe839a0ee622211bf85c2f42302dd10109dc9954a7593bf72da49661c13db37640157e69909dd2c0b956f3b5b2cfb0fd1f0d9c8d9014bc02c24edf45b86e0ad900a1b37c298d9a70c0cf6c5557ffc19c9c001e44fecda973ab238299aa93d83ccc5c145655dfde57ea2fb61979154ef686748e2e911c9c19bc6fc479483d2705f378adcfd3a08d72fbc4c183d242a2e21e9eda98e327f4ea8cc3d9f7ac1ec879ddd41dc65d47c813b348c54cf08f2cd5470f1f3fe2d4e36d8fd459264adbb31bc1f85dff69801fc0f9b45c6f5d8bacc37250694057fc0193912f0fde5f122e7236229253323297f7089ca5a2ee9104943497103c977dbcda0b67653beb3cf623c2a85a412e484164993da140f2ec4bcfea99281f7d41207c317a52fabf3397c3a0235d90d1dc84c9c7dad9cc8e68e288f1e9d5c8e4592d0db313f8bb81d9ea86511aa51a659c4801f4a497de7630069f024c690034447a86e08e05921f420157607b4f300c7b46267c85d47d4d8274882b12d05ca7d9b1579ae10e629db1430751bc3ad5ec66d03bf386fcb81e66f4dd0a3d4e8cac20c1638c56b968e3dedf8f8f00314085b9fbbac1dc3bd8036502ee9ae47e2ca51cfe8fc4cfdccc8911887895c613dcad2301e22fadfb42fd7e9e097e77bce2b3f853759feb83a15a23622c085e62239c95134266b1a2e18192a4a18942aa0a683e9a8dd29a26bc3b3cad0a82aa205ff61216567e3bc514993def6d537efde3ef821b6759658d9a57610735fa84d58859da8180ae1601cd76a4958b90a930b8f07f2050916ae63f6dc05897659197cb5ab2d85c8929b7783a2df02de74e97d74cd8bce4f86d8c115b47dd4781b718726a13610ff4c824642b83a32f814357916664378fb4f938b2571f0cc8f9146a88bbd8fdd912f220e649369840aa95a30674eb6d8b06f69ef6a5a2793b76a8404c7c51d9e42d5f5e51baa28d3ef1ab1fb1bdb91323ec1fc92f90664b1d97a2377d5d202bad506e48167e35f8579551c501e70c100605718a9fa8bd5b71234c7767cd095d1eb4e6bbd1d4344d1741e6a8343379ec5cc85d44cc9df018c49df7d70fb1975a70441e70d591a62193d74c55788140201b4cf6d0355425401ac465b493385d7f1afa67210682b3ede1fea473aba24d8bcd4e3d074c5270c91777ba80df5524770370ccb1400acedfb3f9264a0ce726f665894f8b60caa6815f0bc30354a86ae6d01be482fccce99c4a205862fe69417c67f118a8f80e470aa01c95432899f6748d7099f75ea0ea12af9f89960ad7123d403c223f2524f03bdf178f5c5855f06567332d0ae216a7b711fd05f2812409da63a9574bc925e289d638246569cd45b3957c986d006a5121e6ce26a08b76a4afa72cee1b36d5028ce0fb11fc05bce4d92429fa4f4a33205ca2474f62da202ac217518dfdf2776913ca288c3d0ce9aaff86f6c30d9fd22034a85e33d0f86af7dfe5da3d15c35401a46421967516bd4a2f69287008cf2057f11e168f1c7cd6be1d4c7ed80b1633df1ae8c86e0bdb9192fbb496138e11f263271f07c55ded11759598b8f13fe7531113e3dc31fa908d7c35337c81026b3974ceeef58a2bc27942fbf6482cbd48034384fa87aad38801aec7d1b492f0649669014720e2150a47955bd3e9e11f0cf475565aac5f37d2f03a3c00343d03a07e87ff64dfd756eee28155c034135b32857313a0fc880310285c0f3308c69c52174db7c5f1ddbbe217ad822bc1158d001fcb917b6cdd2b410a019f1ad8ee3f5fd6ea32a68a271141ec4f2dd22674a0a96104a87ca2cb5551fa79b27688ef5908835ca641b2a214ff6ca96f4f92485bec7b328d2719b23de8c237c2d80b4552550d10e2c7b4bceb1a23e4b8aa80082c74c186690f25110d5cf40cf20b72522a5ec9666be2896bfc467e1dadb3af9f64b367a0bf901529ba4143fcc053762244f266b3db6db5c23a76aa18954a331d6e152336402a20612e6db0304fd5fc4802229892bee4630ae7d0a8708a7122fcd111c811f990b96610bc2718e30be3959226f41282ad5a31bf78daae20a76046ac5fdbd11d0c9b20e60952f816446d015bc42b454d21eed2b09559838178ba283c38babc9597e452ab8c7de6b2ef68e8e5932e212b2e3e6e8d655b839b4e9b9514ec098dd8bc596afca96c5a610d49639c45d5030d3734bd889c18a7d331f6323e8005eb3756ae743efe9bcccfb46e2da92f190ac3a457a01b2e7986f4a90fe7ea68a26ba945566d0f194b50d56d25e388fd6144a2ddc8dc5dc699c0825b35189b936d0943adbd996459e1c89da1d83f351376e6bcd125c40e9c76603f6fe5d9b0ba268e9ffeb26c2e93006c84dea01574b8f38313ceb25b67bedf30530bdfe58e5fdd2e53a8052674d766b6fea6757927b596a28b2dde8e1f845892a70846ffa8f09e1b334ff29b6af295d64c393cb820720bd63915de0cc1833bbeb3f70a4d3336c5cf4dd0002095048f3aaa8f2818f29eb0608d21f49651da74cbac7b190c973b73a3894a516f88bb172989df366ee4cfd3787ca596cbce9a31aea01f102b2e1ca73a406c56443913464c7e850bff5f9224d062350f5161ff2feee742521073eb2e6e5afdddb63143b17869f0afe217978bbbda1e365b24b08bc6323fad1bfad89a7632d6b9d40c528a93ef6f508758abe5aae90261d9d07129fa01f533f3733d36b75191252f1c527fee6055b0fe849a5f1bb9ca92e1ac7b57a010787d819a341683233ca9ebe8043c5a718b0d38da8891d5122132f05ddffb57c52e1e239c97aa28d1f9ac185eb20d8aedae7d54945e2e7098a2e2714dd165cef339f80118951bcc8913dff403fdfc4a7fabed13f2bf5602c294df25bad4427bdca9089df2177624b158243e08a9d57c052f6684b9d1d9021a976c2a77e0ca717422c74ec4b5ca0c72fb06e3aaadc3a0a3ed15673d1cb16a1e689b23e15557a011d7f91a5e9b1d2d65178095bcd8a2eb3849e47c8f2495cc90bd4b8152dd828ec9e429ca411d4e8aa7d0bc1726f9bfdee08422ddfffd52980313f4121ac5c1b1099bafe7bd1c7466d5803c143d6356b8a4c9aeeb4bdf2a12d9a24e376c7c1b9aa5106466744286364246a233e413e9581b8d1e1cac7254c2618cdb4b844bcc7e4aad98962cf860ed64eae1d5d9e8070a2f225e20d2677cd061c7b3678d07e70edf4d20cc419152f8d6c30b97436e0e835e18b4af34dcde5d310c1726f451a75eb0db0df61851a751b06d88cd412c6fa23712f6ad47d88216c222d4feeafcae275ea66912e94c738a24e51d56aa8b2e616639f4e617b68e16ad06437018397a3bd40e792cbe6f041fac380dfa3c14d3f6628aea5cc150a11d98bf5c206fd04627553d08063cfd48e48c7ed8eef0f60e9f247ec8d9fde0530971db43d71d887e0540c6ffe4bd7088bfb70016bf5ecdaa8c1a92d1a0fd2aaf7f2df55f079a653d8e688184e8c48ad26620ccfe01418d1330ca728e89c964482a841747f82640e5eec3245d185abb7949fcc0965b8cd8e8afa0943ac18b81fb5434b4bd2eacdcf39716373ff4537aaf44d9c3cec5057d1edcd3d145623cab3a3c597e01edcd9430aa7d98eaaa620c176a03fc2fa9375b9b9c8ec39cf55c0d9df2a10874fb11e0afaaba46057008eab9ca2b91e2d89297fdae550eaa64a1252e3a1bec5299d6527ba6bcde8725bf90b45443193cab91ceb0335e7c9538363da6e25488936f967752979437b5318af4203ccde738375df7e01468d15223f225ab91c883791f27444579b4b0703902b74d9f527d281ba412bd4d62ac49ab2e4d8c6babae384506d69bba52c57eda8a27a4a98164c1d7bda612bc5be620e79c38e8ce700a41b4d746fccd9aba2bded7bbc56a66e635cb94e155187111af63670f171796477ff35e035fda5ebedd3626fb7e53dae7136233c532ca9a977f48ffb89baa76cb17abb277880a6f6f3e998e2e9296ed5930be4068064b4e53e1ca0080fad9d3e36e0e53843d2a72d5d0de38e61c9a69e23a903ea846f7991d60e439f3e7ff921eaaeec6a96b62929d2f413437680813bf27c47af868f771db0339ce7e4d53741eacef6635dbfd9cf9a40f220b61eb9357c6e194c0a45ad458ed94eaf6903e949b41ecf04c6c4b07e85bdaeca49e4916766c9564330a680d2c183f9b922a006c0a106549a949bf5c9ae90446c5f9c0fe672fac7e2d563266dd22c7d044027cc2108c94b4c0446ca581d104a14a64fd63182c103da85d1a1fd43dda2434e8d64999816269ddb269c7602b873690e8d270def078fad4944f4023f843641785740892592e6d8472172b996e5f86d882f80168bad3a064e53389f645d5b1396e18831e58685a0a363d2d7cb62ebc59f639863d6310b3ef34ba62029b8b985847b35418bbaec1a15500a85edb04847fc903e6b6c7157116fa5f3fba29d2f7dbd17b461c51c47df00b113ec177541ca6d338b2e9420e39a1d7cd25c7db40419011eabb1f56191b92c8da602e52aabb7edd48ad1a3bdc67988a7c80e93045b522a7883204ceb8e218da4a9dbf013dcbce6801b508ca2b404d329c5698bdf67d87d04f50b0540054b79c671498827ea9da6ba853b45ccf9d0868681831d9f976127eddfe0b7dd96c932a39138f8cf38bdd857270b924231b80496f544ac49d0c3b1a11fa218a717bc3b5f62e0a1b816bd378503ad2c0e688f07ae0da6a8a6b563172f07b12a031aca8b16d659138901ab5cbb1eca9ed6ed97d4e75a64bbf75c034e29fc0e825f859049169198894e5e0e65c417edfc87b4dba2b2ec61ab10ff4e795265ef7dc3660d27a7803758bda49380137d8f35fa70a91d480d771d1ec01538394baaa118ab05105257ed73d2a3360bb5e6ec1249fa1ed9a11e44dc70cd9e77a69d5526cf7fe95faaf41284b2d874de86ef07a215cbda66a67a801539801ef4a184cce921fd9659112fb14b884fb355753b88bc42e415693d3f909a84561e0c9599d661012f006940a4839d2d89eb5a03e74bb5ac41d8fb3d41c46449c1816e39f333f6dba3624f901953c5c8165a1b02d0d1764cba862e690f7eb941b790275920c766928e633ced8b8acf8266855a8ab058c46b0fc56a3ad84c98a802998c30af18fb3f5a986d61fcaa3dc5f354270a10c9c763ccc1935a69e351ed9d305f164a81080e2156cf0cfd39a2a2d1d647338c0c994ddc4e03bd7023f6070ab51a107998fce4a10d426e4a5a052cef89710ee73ad795e550dd0e52dfe76421ed21f91a8160786a720c66508b860573f75fcc8ebea60840893c10af85159f4ea33caebb99c11b3d2b479bb8a93dcc81f67f1e764e773797f6c1268fb59fbf60f9cec84843eb4dd2ce23bffebb36629234d68c0e5963b8aada8ac4e4bccf56869c8b026cb9ec66b2295bea688b0fc10ac0ecfab4fe0252c4c44aa5884d931ca502369f73d97cbaf7e7156a1875c91cbeafb1f813808915e170af2a6d054e6aa9e85a03e747251157cf362bbb8d30528ff2717993b444ec0ff818e18ea2d71d726e4acb070e61c99d9b60899fb4f28450e34f86db7d205acec23bef3f728b59da09c9ffe96e44a67128bb69f53a3415a809bcc7387444e1d957424aeaea52f52543e3c04aa7c1c977550042dd906077ebda65a6c3adfd4795c79becd73ca483f794e8a2205d1b0741788f62759a76943faf028459b42c21e3cd3ba2847503e8536ba6704a335db44551166b86c976c7f39932f2af203e04c508af6cc2af4b35422295189f937cb23802da084bc1923858017ca03ea06be1689fa0279f537031286315a2fd7fe1b719b019b21169c522cd5afba1892edd68cbdaf13623dc5210e9828fd74f945a559d3172d51a8794464ea7c693aaf21ea3d2839bb76e9419b46a330a8e168b5df1e09396fa4c48c70cba4400f17b1df88323e61da20c0ae21f17fce985882dee0d9ed35a21c838d1629917f2a2b3673942f50e991587f633291c10a397cea0fb056ad707e2334ff38d28bfd99cc5be868b4b7c6de42ab6535f6a261be0d2abfeabe3f8290a12450f509f02f9732d53e202ff0ccd02c7a6a617d0e0f59fcdbdeb25ee0ec3df09d40374b653c1740e1280cabb5c1c59850d41536ef9eddc4715c0956a66c1b029191bf1cf1e1a249a344b73c9eea3b37e93428f49e64f019723d3c06b797a7f6404a54ff4a96d77a2506fe870bdd3a2b138ec102c346eec7da853970d6aea206859b9c9fbd37d47f0ea0e81452474c6c5698cccae040cfc47987c81ecf800d87894cd44cf16dfd96e515daa6faddefed195f8fe4f2dd49ca4c10577f035017ca4f568edc390aca0f28e102fe3c91244dcbcf52022c4b2a29dea55f75747a6b35ac8c5011cd5fe8ab9d5cdb8564b77192de8622fa74c3790c2cd20e3f601f95fbf7a2954ec82a2a00b52bc66180ff180457390ea2a5a7b2f6c02e7428b85dcdf820a91a87c561a57d8d79c2f26c0af4a9505ffc4cf2d6042abaec20db7cf2c71ebaef3717282498ec8f7e1f7a67e8298223d126a3c67e0c80074e7b0a057b562d4f83e3ed10e35100270aa3f73af922e0f80b9ba938a6b48d38a0f5d9c71880c92dee30f7442fc7ee77b8854165cf5617048eeaf65858bce5284f42f52e0ad126883108644505d846f9b85c52988191c81fbac7a12fe334ad778c16d24728a6660a009b01efaaf1e88985ef5afaee136d73d9bb068905bd3606a26fb199c25a537850e2a9166738f3a6ab79164b835baf170b463df253157363fd8f770d8adf86fd2f7500eca325db3ebe39b7dd61e1d5b2696d2ac49c6f6c6efcca5c523650ffa345292910c503e9d2b10cf7c4804ff4e279b6582a7228bfd744a78eb71704f20c085a5e40025b7a6f0541e04746d6b9be23ad99126b158f2e44194b6edd1f65535daec7075c31ad86cae83e103fc1f04fa075b9753205c594d075571f00a1db01c472ab161394eaef046428de298655568bf6197d12485498c583c44a0b5f647a680c9088f9052a2e3cb947b7179b6e1ead605b786904b4eb5524ec84893ddf6eeb6e59652a694649009ca094109f15d739159a9aa1dfdf5e3c734c71fad4e8c11631261c916f491446cc33d508801d67457063a61728537670388a73f2d0300fb74b3df0f3fb40580ff68eb07003ebdf20780068497d30f041076b2bcc9e3e29203c4f7b7a52e5f5d5c32fb2f9a10955ae91587face43f5b3f473fdfdce7dbffd6014c1c2a77ff16c3f95e5d7b4de4aaf9a4f25a52cf94b2c1cbfc9e579fbf8ccaaf9a58f9d6a5a1d25caf303c0a7df6c66a546fb2faf61925bc0696306f03dc97f79c8e9383ddb9cd3539b637a9d78d9eac47bb2d2b4c3e5d904c3daa88a1c0bc7c9e7f94cb9c8dc0e6923e53e42f9e53f3a6a2bdda38c40e9f25df7cc1eea39ef0372b9b951d343d5c7ec51caa3c4bd9c2cded62b93e9310f525b9226d457d4773a50b6fb1b5771def41ce5c179e2fc64b71fa70178e9f177dfdc0e97efbe7b4d0773f71b975e7ab4e4f1904f6db75d94e905a0a3be5ce27ef54d5627de6fe7767c5d5e00dee7e3d60f80f701b9f5a991951e0067e3c522a0ae7ec66a860be7b2b58ce9fb3f9d78f93766afbd39277783bf7b6eafd471266febd5b63dc6f1f874b6cad99cf82e7fd36de3df38aaeee0ebe2f213a85700a03e6fa55f5ae6070078f0529f1f7cf8390509f62e1e864d56cbd4181ebc93485b6ad49368ca24427de80f6d51daa23e4851a5518cdc910f9367b226cbce29bd722993c87a39f3657cf9f3e3ff0e4a676466666666a61fdf27f49729a557d68397bea146a2e8710dd01efacbfc1efe43fd63de74f90bd04ce22fa81cd7f3be49e5faffa432af5c9f56ae7fb3caf59f525ae6ab535ae6a32f2217a5b5a652ffd3854551651257cbd59147055bdce84a2201ec23abe533984df98b7f6d796529a3bfdaa3bb5cae1715aaceb008a82889ed0215d8baa208f880c003b6c882357dc4e6440ed8ba1d9b0b8f878f1edfccf5842c7bbd544ef4ca21e912a81358f3a465e8e4be1b8954faaf6a426c4e145f50a11321fcdc6ffb211d5d2804a21bc4854e8490e46a32335b572493e2200870229ad3c8ab4872672e742204a3abf9f0830fd64bdf90bbf94098c882d968cb07cd6ef4056bba6f158c5c970b9b304474b51f7ee07a4001a98bcc8bb89e1447a4afb83f61ceae721db211eae939e847066e46742ca0c6a51f5bf59b2eb6326e7f316ea37a46bebaed47adf4bace41353d0ed34b21eae97d30bd0f9c0dd337bff49c63462f477645462d236d0ef7f40df507cdcd914ffffb417373b8977fe250deb773f9a3f7d1b87bcc8d477ca8977ffaf64e1285a4e5a987a4abd2332defdf15b5ccc9563179d4288a6ef9507530901a49fdfc1d99e4a9da52236a85a7c6182ef7a32feb42af5ef96bbae69cec72b95c99568a2cfe1714ab0df3e8937e7969b07bc19a5642f774b1ecfa842a04e84249cd055090034dda9d5921384e1f7db53cc88c929d0004e8275448609f3d4e7f01381f99cdb86a99889855b92b89bfb8bbb863e4bedf90c84a35e9661716034829a5b4b1e16cf41f80c5c60196f8d4744593679c596cc1b2163b49ab15abd6998479228fcf687626994984601c8b86d848a18a178e128e2ba82a6ffdf84b4bb2648eddbd92cca0eb3f5f3fdd8bde6c3709e06e74aa7e78b3251fa53bd3c6cfa15ffa69b3176723ce2e519b05f5ca9dc75fdc5971c68a4494960ae1b4705eaf970236fa7a11893c9135a7025e2d990b2808231df90b7663ebba27b2c7ba57a7846e09b086be7fe7a47bd232b144657c02fb2cb324232124177105461f0e285f53ed88f473fa391bd4664db257af8a906db3208cc3c17283369db6332a9a2e1bf4d5476dd42ba396f125a7a4b27bd1d77cbd28ad3a36212abf8e1cd4a8b2700dc01efa8b8ef92c394aded1b3e76cd911c5c8c8c8898afca58988889245469e0cd884a8f21960e433d4c82866db8ffccd4853a316dd06613a1e59377dcdd7f6d3abe8825ab2b2c76565b49c8d6ef9f839aa1bddcb1bed175f8524b3439474afa47fe7424e47f7f2e5c2d9e81d1c6d169435d18ed02ca92863405764a585ba570b6a0fb5147fe921199f9988965a109588281111953666dd0a261493d503e9cb46cb67baa2261772471e7d25e98a20bf7f7786eed5f009520e49291087db623f9105b57b3aa196e117da68d0cf419bed07cef0871bac8171bbbd63bb873d704660ff9c1143b45607e19ff114f98caa5f5adf17cbc8a8fb75455a94c85c4457c45d91d0ebd574ba5c4d8dd81a305d9a8f1d3e266b460635015a92840af6361f08c35248bee46b02f145dcc02631b0913c285e4b82e35ed332b0410e47672b905b7acbdde06e3c7aa726e22dd90fc8d589b73e06381bf599bb01b9ce7e406ef7d1f3be523c7d673170071c9245d9fa636b8bc57e330991045aec1025dc678f1171962ab1b5cc477b8eb44ca5b4499357d18b88cfebe54ac28a9282f20488d592c104f297ed87421c4cba660aa00b64409748a220200e48da6ab53850694faf38d06ab55a2d97aba76562ecc0f66df4455f514847f44595e075f8b69f2734ab42228338990fcd928e482ee20aaaf61f3532f21921d8938c5c6bb50cbfdc8c14a99d5157d42b2499ed5ea58fa54ea87ba9a0c6ff3a24d947db3de9992cf33623fdf26a99ee497392a7764629a8df746931381b59935eb945c2c28a70b2cf827a05afdce10e773892018e6649453ea9aa5d49da455f96a2532bed1025f3b31f35d35aafe9cac9c922eb031b910f34e137087dbd5e530bb2d5209b10957e10f9b5e502225d3f7048f06055cd6a9e66c1e8e15ff4a052c1601e9ef42fbc8fde17aff23e27aeea993be2850dd5dff80b8fbeaa5bfd53fabad53255dbab66e9bf9ddbb14496ae06789d4bd6a275fd5df0b0643839c0d518b82bd755725dffedc8ca66b455d98aa86c44db945ea5bc2d89bff8b7781b90b705b13ce9d52624a50e5d7f88e3c28338d18325d39d27169c540b0fe250da8238b4eb3ad664e1419c6a5d8a0ff910082a117d81a052e992b2094d042c116cf4355dae5985ebf309d7351e9ff18f5e8948d6e2a26bfa2c6bf299915e9d3e5bd22b1dcf5ad9cf8552fa4ca8579ebd7aa53d3df297eca991bf44a1622849af1cca915e913ee3f1178fa7fbd1d77fda92ebcfd9afa4f9dc57b49b0f8411018bfbd1574b89d5329f24ba445ae6eb8a5a3c49c4e341aec83a7192c554a299d6429a1b0b6908d6f46b3cfee284fb7118ee478d88eeb7fd6c4d2ebc5fe673fd49525a9b0fac815a8b47631d19155d1211ebc2fb693ed759194f7796d2d60836e7b0d7b08c05f52c28a323fa1087443a6dcf9d4c1b277f93f2dbb9a597b293b0fbc83249ae888ad6123323cb066588484a2a0a295a2fa04b281005a2405480600dad2da2a25e491eb9fdd72db9de51719d3b4eca7156a636fba54a56f2481e22d427c574468a798c13a99004ee2222220a4481e60d025f14e8055234098eb25fb700d6b00df8c707cfb001ac91403b7b0b5bfd65a865885d1acac54180cc84577c047ec212f0cddf87371fb9ce96a1989e3dd3b7d7a3ba57dba357de7947ecdc95bf3487e4d98aeb45500213d103349797c8286524d83b6787d0d0dc2368c4f418e286a6c650c90756f8cc5496067310f1a37f3463de1290e30fdae48033fc999f6eb0663e0359e2b2c79b9619e2a6abdb9876881729f88250b88e4dc96e553b3ade219aabf051de88b93402a4be494f275216402851208a420e5a5c52e5c25ce86449126e8435a68fa3b85af60363f124ccf211eac73cdca47ecc73e3184f0fb7481e0b0f48af1cdb34cdbba2e7668f2db972bbc77878b8056b5cae736f32712c8f6d5e8f1c9b10ee5b749c58e2078f90966f2aa449dfe25d5eb523cb216558a774e26520a6a225a78555ddd89ec5abb6b7395f8b5721693b44c9f64ae8efdc94e52434a81f2c621613c1b0d3e97df84c5be621594ca31811bd822512f699c73c1997035ecc722b0711bd62165209cbb3b0229c94bf7cb4575ff6dac7589a5e71cfd015df58bc6f45b3ea6fc1fea3417d4b0ecde650218efc94bf3cd1f2fd1047494e8dff523da47da2e5e5370d235a2cf6ff284b6b20d1b208ec33bbea1543186abfcc561edd6f37dbc9fba0952878ccdfaa87713ae67f7cbb126697f8417b787c86fba97140eea7bd4ebcdb431c24fd9b8784e767fab51ffde21a119a5d4206b08887e481ec736c8fac1f6bfb84fcb67ce492bd837552e8f8083a51273a214697e2edeeee1e8db8fb0bc688a1f191bf73624c8c51c6187be530feb4b05750c6196184915accd2c4f0f7a0f6689938c56b8b0b9d2c31e273703111acf9d9c10f920b8d5ce847d8c80c2e3432c585309054fc05de82225f4191b32005559c481514dcbee22c233918d1a1df60a50d56ac5cd86a3842c3511a2e6c33c82b542ebc52869e62faaf89585be82edcc602112b1089d2f25f4f81270a52e869c29316115a46f0a9c267c985ffb5132eec26fdea2b6e03e147c9cf0f2ee481cd34c233fcbf3e72e17318a00cbb58074ce5c246f2e23f2ee2e13f36ea017ecdf2e1bfe6e9d6cc0f2ab8a2f463b40cf6500a1b59e1a35ead9ce728f6dc8f8d6ec656d8a67fe00cef9f4e72f35f5f49856d980a217e0603d578989755d8869730110007d558611b6e42f341bc3c621b7ef10c9937c0cb2bee6cc3433c83a33401c2f8138006ab006f13f307c80284f19ff9d9621b96e2e3cf443c83a97051af740065180d70e53f80d695f13701658030fe08f023367a7920bce973ed4d122ad866fe24c00a61bff66720b6994610606b2c611b763181359c030813c43693888dad096ac23693e70096e6c536b38767ccd8d9e2194d8035f3051046886da4157924af44619bc9ca02ac99268030fe41581a4206b00520808d91546491acc233b80cb046b681a9b08d34ea9f5ea1c17f861d8014182bc37e02b00160a2db2e7fb11f5dd98f56fb03124a3fe58317b3b2de8dbfd0683060c080e13dbc0fe31de67bf07af80b0cdb3ebdcac18397840f2940965079429ce896cff4b9fe1949ebf8338d700ed8357fa611d2b347d248ac6599a67d36895c7f172ea916a7c9f382d6e4e9b94ed298643ffeec3feec6ceeda32f7bd2bb152bd79f450b8ac57474659a60b27a8eee09ae5cd7bcac5b27edd39ef49ff6da9b3c49258a2b0595eb5f3dbf035cf97711052cb8bec922b62952058adb0658e3768030466ce35778867f4f3c4195ebdab7a7b966bbf5dc4cc4fe6919b905b89a62caf5e88a3f46ae3fa5b51e492910c67750bf6ef9f410f130cf7cc12e986705eda779b4c8deed1c37877e04c2f0113729bafc7c840aff6b973b914905cebff3e193cb1636fcfac8e5c7ba50e1f34bc6a2f4a0c66cf783af7a9dd2ea6489157e0589279c5c6184050ef75020899b2152a95fc5dcea0d38a2c7904b09f23586124a3843e32f1ee4906052feea4a1f10467e04e08b7c360c9de1ca0fc395cf55d42fe6ca181a2dd32fe595d234a4847c0a101d714f911520b5ae64b8e2135e68ab55ff4a7e5b21b446fbbdf297938e31bec7d832b8db0b73e670ff1cb0e8babf132db304e338fb2bb1a2408e9679221a099dde23494d51876899b64ea3571ed3efed2cd020ac812d8870595cf7b427b7e50a2a5cd475af44c472a3c772851aeee9ba972ac1d5669dc1d5b02d7af5bab7f5e076d7bdd315a5eb9ec90957236dd1e3ae7b2c4ca45c4ddba2b75df75898a0e16adb163d8d891daec66dd123c9e06aa52d7a9992ab75eeb93cb95adda2875df75878e16aa62db618821bae76daa2278b5c8d658b9d0eae86425571b516f75c9a7035165bac60b85a8b2d7aa9eb9ee9cad55230e552fa76b8db1e7412b486bbe31c5f5a93ea9c82ee422757f8e0610c67661737342e4d0d1aab9691917a016137374338d4a3c1185fc5e264b14db4b4d59a2c96a2d55162b4a84a1149dbb85267ea9c74af5364b1a05a3a3474452cba4e4bb9f8189cc8850f33536a050582516bf5285552914592a83e4ba2fadc8aadaee81559afd78bb6642851af3297927fa9e5332d3e15a5a1347d42c7c05da14613d595264b23a55aa8d45eea40babc49044e96cfd0d78bd5faf9010014687ea9a88fc42d7a1428a8574db8c9ab2b7abd5eafa2a2d7eb1593f88c74692e9fc11e48062d168b3e11519ddbab29110d03ac41bd3f1503ac31d570ef4fa9b44c47f4996e8cd2f244cb63af794fb478a9e559fedb7e7aa247af26443d918aa0de443a31caf32a40187f93e7568030fe9ce7578030fe9de7517ae53e34a34a515b31b2fbd9fde4c9823042e0019a72b5de260b0742a84a608f8978b516940bc4854e808e5cc8f5201df90b7402e473a1d0854e8210850e4aafbc1bba93354b302584f4c5bd48464fb4b456af24a40fbb09c9d2cad8dd2c13bc05d1a07eddab93d232def5efa6c01a283d83bd0c0bb54c7f17c54afff6b3b97eead7151901258b0f550305f98b7fc602923172cbc922f21379228ba52db1a98100272f2198e3c5e11b388a5a3a16a0b1132b885ce8a40a2b77fba1725f2e745245d0d578f4a03e452d16976761e981f5907ab9e9acb27c4688c67a027bed8764af84dff680f560c281da5ef384688f7de7699827047b16a482334489076a5c950ef9f44bafda91033b88feecc5b7a77a2c875ad58deeb957750f734e7ffa9dcb842018f5c6993ef3589d069c21b48368ee05869705654d74e23559eec5e3a1bcafffe55f7cb4704bf7ea9ec8a0c618d42fb2da83383da4b61f18d44f12c92845ad3f5dbdaa1b0e6afd6f23c2e959c573aa9060768812e69796e7d397368b1e12d6c4483e34ab4d00d32840a5a0ad0ad02790be208cf780026e709b62fb611ca7e2444e0461a4ab572ea52c228235618035f4678dfcd87412f98c24227a24d9cb97c1d998d2932e09f383e6b2d524510ff5a946b8231c15aa238ef5713cd7b7335cdfaab0799ef7df4604a25ecd282beee943d356aba14fed9f2c96d19cd29348cbb87ca41f0dce68ee58f6117bfad2a35baf20cbf84d7e1ef1678c2b3df8d38b8f61913de7a7888989894245920be3422854f0dc26545c7eccc89d8f558c1973d6267cf6a69dd9c7ec5f5c9dd42dbd4ebcdc94eb0fe5fa3bc6c15ee1e0eb258ff3a8a73df5b65e49ce7efcf1b72d63a209b6923fac08ecf9b539d9b922b0e79772bac8de50a7a533c3dc1fbe0e07e92e638fcdc7b439b1f9490e8b71a7071ff3e4530a2594c11c6b2c0dc6f830a02bfb0417d681df00ab64ff51f73845621eacc1015f0e55233964e433941a39a5b53a92ec6fdabf7099683792439eac0284912f655091f03c75f994d2e817f9ddf254aad621393389aefccf74a7fc2fbbf319cec8217f913f27e56c4cafe42787dc48b302ac79790528b5006762e410dbc8906bb8529ae14a0986bff3637cc68d64b00de519f2658ab35652f9a418199ec3158651ec254f0bd69598cb758731e00aca80328e79ee1e278948f628789ccc2a9953936c230614b912f4dcbe02054995db91c29accb922bc5fca085b5ef69adbee446e1e683f38fa81162ec42e33cb8f9dc41050e5cf8eef31aefc1df2e34f2fc66def93feed4576958ebefd4d6ce0dbb9b7a1bff4625cffe82161ca652450aed420ac0902e44208f3f543c8f235f9c90be1c35ec96819c836e0f3e77c3fbfc65b10befe4df0759bd3c9600f32b432bcc914442e44c3854ca0410caed4a0363708e1138faef89f0c8abaddf2977e5714f2977ecd7eaf95dc724f7a8af175cbf6c86736f8c24f4b297eeda58dadd5eaedf798fd52a96a3b1b99d4afbe7cf9717b5a3d6cdb5ac6bf19d77f487d6b8381365108ceb8db1515f6aa52b91fad4f5b868daef6244dd334cdf4b05289f224031532c1c892cb35b8900953f85c8cd341b78ce3d15d7e8db4d5e62eb1472be5e86b259a715fd855d38905053d5e8716f6caedb7759c8eba99bad74e2c1d8ad4427a8d05c97e9c8e0ec5f1e8aebfd6c2a2b94b1e6db155958ebedf137efb6aa96e975bf2e0f723e6fa4fce06c7924a875f7fbf6ebf21b762d13dc6aa5718fd137d130beabb994d4b7cb06ec11afafd1d05ac297dbf068d287d3dbaf5332a8a321e24b9351742d94195ab41234a5fa1289972eb5328489a5c7b2114243f970946acdc7ae96ba5ed04773355af5b56d42f1e45a1afaba8f3bf78a465fa639296c9c9be420d1a51fafacc1551fafaae23fb5a857c86832fd9b7f0f0c3cd5e484848688330588d1abd6258c3047d0861ea7fa6af9f659c0dd36b26934ebc9485850716961317a47a2696ffeaa35eab3d542fc64579f24ddefcea9d3e3eea14a46b98aa6579d2c993cfe2cdf8a75a4dbd72fafed58b977af5bd6e9957eb56f28274f7d6ac09be99fd5e6539d9d7a7dc8e928eac7af1d6e06cd4a79c0d596b8d5ef1d7af5af5e263d9c7b89827bf66b546922bd7f4154a922ad7f4f535968d7af5519565437941bafba7a71e4b11f54d0f9be04bedf747bf7b939743bf3ec6ede074509b7a7183b0d12dbde6032bd77421141f10dde77e6e7fb7a2103cc62d79f233ac8405c9301bf2a9f7d88b5efd70dd4216ce46666ba0b608545bb608543fbe393a7c7352bdf27fa1b180cd2c58c812aa57ee570b808c5dfa9eb828da2bec3501446f148b66c82296e28f984a6baf9c87fbb547e552fbb55cfe285918082e308167894bcd5f484385ca9429512e94cba61e9c9db9460d1a32b20c86f3105f48958bcd85a652598b5496b56c28542acb4a5bead41115191d999a256548e8150494c4c5d3fad1b1f2a38a12542830e58828444011728586262666b5fa17c2b453b3aa105191d1d1cb256548280828c94f8b87d66a7271c9b2971717972c2b49a144b5e806df207c87a3d450158a7905a5e010107fa1accad3fa5145092a14987244bf10d12f43f48b8e959898f717fe525fe64df88dffd5b834f14e0f42988f8f50fe280e877f10be4325a245311cd4a339468863805243ad144f85bdb568b08694c19ae9f245f43c874ce039f23dc0e0a1d58314375079a1111531576977cbd3dd3d42254c3a552f77778772299d2edc53fe5229ad5d741777996ad1eeee928594d165741abd6a6977778992b2dddd258b9437344a29a5ec5394524ad926e9ee2eab94188d8c524a29bb2b71728b32ba7477979a94524a27b94b293d73777749a57477894929a5f4e92ea574e92edd5d4629a5841f63949021a7247477972d256339fc655e19e3ec6ee95d08e10b0640e15205170b87d2a8f1840dacf85146215aec191e1cd85486d3aa000dc6384185ef5e0687ca47b8f0b29153016b6027e9eea6e2f6d36e0722830604c4b91a1ba1c28777871a822a844168b09f78e1cae68408ad9f34349b6194a657bdea58fd254ef1a2b97f1a3452b5c365ac5e26d0a0cf28998ff9e0511284e6e6e8f8a5bfba3b3858e611c11e054a82d04002441c3bb7396b6e07cb952f915ec72cc320623bc5621402391e7e31c910264686eea5396d10bfd242e9d18810227ac4d07077b7f1bd8a1e8543dcbc5a53686d1a0252ab8c35105ae5200203c21ba595468cec4885ce0491bb9999b9593233b39c2558d2c34040565cb92e173ab182e83ab1028a154d484ff2204e0f2820e570d0cb401086f4432c91463c3e1fa189cb895eb9f482a47cecbffe681928487e5b6ef112e6c1304c8a0f200cd330a05e2d61205ed23240415877ec16b31aeb96d21ba28fbabb7b09205d227dc9766b93de8bd784a830963ce46c3cffc07836d233defffb0bc98464a56ce37c700d28655efcededab76c88f56f2f0d6cbd9aceac68b6779d58b162f5fbc9216bf73318ff35448d427b292a742c2a47ad3431ccff27b2cde7bcb3d580e82611988e193cb9c8e17cff23cf8c8be5ad511a6efde64a5f7e24f5ee524d07df6ccf950ddd0892fbccfe54fdf5c114dc49be3e25bde05e44e6f3abd0b8f927210d1e27d3a11e5b178fe427f723cb06ffbeddc93f6376d6a8010550aa99eaaad11b0f49da78a4ffa8cf31847f364002d0902faf149f263840a9f96f9188802404bb895104d8c500e2236ef07d71f2c6a24b2273d4f8f165d68fff54beb042b7ee7f40be995334b739159d13e277e4bf1c1ca015fe24b96134264e46c48193f20514a2925ffc868e5bff3172acb854eace0c1ed41b2cde27a6496be4e54c9c75eb2a792968178090fc12fb9d343dabbd40d345881275491e4c6a794461823b2068692502209284434492891048d125489244abf840c7f0200f27299615c1d7bb9053ba1e2e1f2a3d84608cfa81902615a9eedf783e6664fbd24b207c236cce219fe3a6cc3449c601be64109611bee19026bb805ee1fa48da46d71f28d6f3a4de278903e6326dcebf4c64d8ea30db92fe6ce269d5e93cfd92f2ba25f6adbc6919ee3a0cc7e59b691788377fbd832d973966d9f91286763abda6fcf4b366e72bf96273191a8975b075d1226a5a58d7aec5b6c37caeed8489f91acea634cdb67f6d3b17df65946ca9e64513f39d26736277bcb4cbe656effb140d9168cc3b17d0e09f573239158586c6ea859446926a7ad95c5e3fee47916355bb231a66a3fdbb6bf6952866d4fb7273d895a66626f9a249feb61b3975fcce548cde1207d0eb518e97b506aadf6cc846d48cc64db482479499f91b48d99b04d66495b0f6fed3f9d86dc667960378fbdfc747a6ecf3dec9992fd62dcec65dccc7e590f9f29598eb32a1cbd651e09a39ba791a865263c43fe8d3313f99383a61cc23b246fa9820667ea565159c65dfaf8926eb07c1c240be5ef5c4ada69210dce54920c77eda9f779977ea6237b19b91b998d72b59799663ffafe4dfae1dd690bc033bc9fdd7533f620c09bc52d5299dfce5dc0ce2579cb708cec33fd0d45fb74fc65014814038daff6e974471fb24ac7ddb9cedd987f21730bd8b9f3313b27f43e1ab783f01dee43187e86d2b4bbbbbbbbbbbbbbbbdbfdbd0b51e21beafc1c3f20952ba7b0ba2ee0c7877ce446c8520af5832fa1ad5fa284527310d132b4e5436a63846ea5c2078a4dd0e251fd626e8cf119659451da28a39432ca286594514619659452cae844e8d820d0608c4f0621088ebef429f52410aacefdb88fac4824f2508e468e52bb390b1ea0b2e0bec6cb6537ced18ce3517a6aa290e3a6979948957295524afaf9df76a7fd7e14519ff4d134df443f1a59fea3974e4b2f977138ba9fb4c8d6d332dcd3e9d9e0485ef62eb42f3de52ab7b5e6d3bfe9ad08db947e3689050faef6dc59223d8bbf6952e94b251676c77c6a4b9fbde974e238eee9fc8d876d688f69ebc94c198783c5539b439ff49485f7f1e54ea78c9b9fe2e6b7c0381cdce74c163fb954769a2dec176fc6b1c87c6b526badb544ca2c3d9dbe7a1b4f0bcb639ee9bbce83372d29f7f3f4f3a627e55aabe5bec47d3d7ddd51a27f529d9ef426ecd6d263a65a327d7338eae794ac5675b02fb262bf944add6f45d8a6da0f043b97be66329d3cbe5cad2f6fada76ddb8ab08d6635ece6d4df2a764d4f792ee98feee7ac2b23b5b57ef71d8fedebf3ad3df549daa67939a5274dd373dea7c3baa5afd4d39acb01efe94d1e5f1ca69fef9c0ed3c96671a8aa1da69f3fdf6469af68f5b6875ced6cc973e272de8fed6e762bc233487fe35b11de7a2e89528a4d4b25abe42c8a2c39b2e4080c9a5c78e542283eafabb1b773a1cf08e1672b8390b6b60cacf4478ab321699c57c61d59057c5d1e08c31fdbadd068f43bc5304c2e215fc39e7a41a4c478b213444c5002d605c1ce85d1fb6c8c8fbf57b06b10054a144f2e84d2a2a27b438d34c6d06899f94e95c0a7895945ef7b158148c9a1c648e18bc74f02d6c01829ab981b63620ca5d56151cc12fee26ea8116671a81d848203175cca2d49040dc668436de810d05acbaa69ebba5289e3368fd2a3a9665ca9d3485bf79cd7d98f776ea9fbafb31ff7256fc8c536212a29ce2769944208c395352ac86424dad592a6953c46593baa91b212f79ac7d9cdfb76eeb6953c0e87f67488941bc9a393b3c7e494d13bde58c0ed916e2c2efcc2cafd77dafe6bb1fde702e3c2f8d03108572518b73ff3faa7005e62703cdc56dd7e8d21cff8504c3491bad16ebd6aeea7b7cd98016b20f38c6871fc8c1b9f590eff673fb9695e26e373b42a1dd9b37c523633ef06d9b954466f9e0028518b6d98cd911fa7c5016f7cb7b006c6703f4447321e54216e42099e94e0b6ccfc5887f4e24ffbf16f9779ca0d42a104b75b8a673173cf7aa2fc4e77d48dcf7273e2d72ab8cc77360f8481918d1cc1280e339f33a331663f4950e36731736ae9cc9e6699a5988c241468da94d16143d87066caa6fe02bb6377f46ec660afa21434188f00616862d3e8d58c99dddc04c2cc9edd9262734efb75570a9b276dc94666e4ee6efee0940b7bf69c324a197d48efc8a6b46364debadd23bf75a3189350e319bcee233438132401516286e8d5cd4d8fc648f8f913c2f7869236d1206cd802cd630821840c194208213364e618992133841042087f44761cc431f068a179519d1c547d70be785108d0e04caf200cac99391142f9feb263949595a075182afcbe2d036177b777bfb74bf719dd1dca8eb109642210e1320a620b3bd440450d2dc25f001755a1f244e8e53ac246200ccb090873040d9a1808a34ba1c1998e57a8b5577d04c2bc8624f1b0b9ddbd087524cf215621f64cb3582c560b07560368b06db4766fabc176b7d46d731834d83210c26e9f14ce401c69bf6821ec206842d454c5a8a7bcf90815181805c6f024d47ef87000fdee9146afba53fd10fa4daf78051a3389415ca9fe31a8c277cb44bcfdf773da0119734a29659cab5e419aa232e0a07112a0e6dcd039049ad6095169badd75e68bf90856995283688826ca131a4241314da89001e45a1d619f183fccd373e58551ca0aaa680a6cd8f208da0dbefdd37df66a7a958892f83f71f0859f21a1fac798bc022d6b526d25a2a471a42208f8f25324d478bf17fcfe22157fca65ef7499d341995003355c2e02ae8af01b2d5b6b637834137cab65d9d6abfe5ef57bf4a5d37f19ed17a5e73efeed48f83a7dfde1bb17c333e4c708a1841c8f6855f2e153da3230b59201a5068cc3eed32be903212c00cf887fe3d023b4dfd2071a8cf141cbf24596dc202e84a2822b374efb71c6f1c05e7291d7e938338c2717a5dc7ebe2c82fea671dbfc392556fa221c0fed62240e0749c28bbda4196703db34cc23bdf4b2afcfd1c845f7c3b808dbf063dddf8985a95c4cdb36cb72fb6fdb66eae93596ffe9f8c712fb38ff7d26a6fbaa233ec723be7c281fb35352c92689c3c1b27dc6f2dd73911614c52ccb631c8f0dc36c8bd550997c96ccdbe76ad293972f53faf252deb29f1c0eec495ffd64797886fccc8b6f2af5b78dc93a5b350ca354e3e246e9671a677764f1351aad4a7bf937d8cb1fdb8ddd7ff14e1dee3b638e47f69d7516c29e2ba3fd40b073b1df7efe642ab7358f2f9537be2cc236df8fedc7f663fbb1ddf80c740d9b4fb96707e94ecb457806adfd0261a641a864cd3685410c15cd8c0000017314002028100c074442b18040a609d2ea0314800b89a050705a9dc75110c430849431841040082100004400666806510254ea8157dce7192a6662bbdc92fb2047b1707b2ee078822b4b6b26311493de8b37d561c2c865c143a993b5bf4f7ab3870ce7d845459a8bcfa6cfe579a41d3ce26abe2ef0b2ae5e680fb368a8c83c44543e17ff5b0902778156e938a68c0a2a50869f437d0f3eccac6db3a6b24803d044fc8773f1854811ecb1632ad2d387f455bdd9ef0b9592ffbb1128e8a0bbd19732e62ed357d8ca8f1a215c278a172b4b78c55ba74d8b08e1cf4c7bce487d96c4e53f25286ec8fbe26d2f7a64e3c04b0eadc32a7fc99cb52ff82b0fcf0d369ef126303c06f2ba630d7608463e7cf636dfc5c9f93abc81853e0030c5c5e59bb7cbbaa4d18b5c45dbc2ddb0d0cc1efbefd893375ffc36cfb95f8d23978fc7a23441e762b344e632b7f74e3cdbb35f726603866c112d623bde047aa98918a5e2e116d5bb92a32b7c53ebd49e9b34071e15f1cabece56e85b31eab1ddc08c1e09407c9f073cc91b678976218355c304889eac391226fdae195e987ce6ea3b2aafb090749adc1f2096c7a03a9c2123404664c8ad3a8f533f63442f13c01d5084b20ea3b5b5e81b82b667c86c0c3129d980b9af9b6529b082f4b86d65deb688a2c862efd2d960ccd81ccee9652075dbcd8e08d4bb95041b1a09933a3001c53d05c67ed97d66d248412cab17ad1b095ee0320fa9c382f6bac18af37d724ded4e129dab60fc4bccc80c61ac2a1980b42731688862f28dab5fbe1e4784aadd73301b7d6eb511519e80176e1e8f07492b48a3f2b753d263ac10e1ac2f70feaa61ee37ef8280d0fcec5cd629c8edfe4acec9c0ddc2dce02c79365af36ab048c90664c9c1d5c842a38965754223d08f0b8b6701865ffed9c8a27cb0cc5da4136672fc0d0076683bc29f8356c62cb5ffade1977ed374e4c9eec52d414faaa0768706fa32b20d826239e744ffb9f6a69aa0a8076c0f8c34fb5f172f119d430d74ab6659796b97a513d0b57f590f916aaa393ee3161ef103bb2e51a27b20a1ffe119d732506f15f8dbe3d0272e658bbc46cab9a20d1d79b40cf84236916bf08756fdd10bfeff42229e91348a0d106eaeadd618eb11177150e9bb99be8d0b7029666427e89149c58510d98627375ef8a22c4e0f064e6d4be2744d6c095c1f6c3397ee98259970aa97b81c9aba086876fb1e05724fc1b751761fea432da9f2252587de830cc8f3e73a17f97f27c746934a54b8a7f482ede7078fac90f92c2b6e95d54033e1dcf228db523621d519efbc047675db35a520da251438ea1dc9a3b4a0b7b4c0821331b801d7c50a1c056c224663b327c8f1a554c0625a0aab5ea01f6b98a97ef94827504b0a53095268407412876db5f90e6e0c78c6f0f5ef831284cc7d9e3cc6592ccb4f8a7dde4f43fd39db8bf4c81b69273316bdea4c39dda6d4692905cc2bfb044e3b9f2673ddcc1908b44327104e05734f1b97e76ef9f158712e783684d55f242f7a0bf87b65443b3dd1eb6d5deb2ab821d7a1c61e8ae4c3450b7368b41528f008921cf8a99e2b4074a22a3e9ec53c8ed8ed4043992355a3a123a2806d20bfb44115f026838d543746e0ba0e26acd502dbcc61f7e0a09498ff24c1cea48100d70eb61b6b0bb3c165c45a335481f014b65bab48cd3db1c8a91823f5a6050b8d86b88714d92d6684ffd3823f23cc2663b8c21994b4b054cba0e8511d147ecd6c60b0d4a51b219bcec089d7f54580bd3979d663dbcc68a6a22bf0ee0a0b167443033de024a385cec674da9f406f8eb7c3f8c0fb319d17cc0dc55922ea870f953e4e3b6da08c8102d424aaacaa909ae74f634c3103562420096a51f85a9438787a9559c3ed1716058f9005e53a247d1505a6b6129b735fe247bfd82398018454747c1925f568ae1d4ac2c6c87909ab9ceedb9ff432244844368849fc57a6fafadeecf3c7c6c26fc2bb6fde0d60a47d2aa104ff2e8999db09d018982ffe6ab554bd6a7fedabbf276a2fa5e6aaa2daac783942eda36bdbf6efdb9d8ff407b92f97e9108d9e212ffe846c21755147e99fb1cce9461dca3a5efa8a5e3d1374b8328ca878551d0b964225109fd134c79eab3a2b1e6da6c88ed80050fce30c66d22e8435735bfd7e7bad217882ce547ac03ed649587af7278dfd1c5d17f0388f48d5a3e826f8257f163dbaf03d035f034cef48d0ac2ca567cdb21063d7d385898305c45e519c969510b860380607e8d4ed97d3ed17222e51de3db2538ace4f53ebbd660886ba77b0a623571139e04eaac03ec8dc7e2ae25395c2120953b3d15fd8152c899830da385242cc77910315b0f590ad2dd300168138514fd4afa74b3ae96ec052ed96eb55d0235d356663cfd701afd082790dec7001251cc09f6372d7b69ee6ed187279b3452e9c5d0b30a9050dbc4135100c6b651e6dfceff4f6f8d88d7ba367650894638010c4722d70c5778ff136a2274c349178eb3a2dace82bbd8e2bf0b042ee00ef01cb0b2a86a6cd3d3cef8bef50b21cc658c2aa202047e1d9492a090e8dc41e29eaab901b678052278919d8227876825ade2f29fa8538e4560e64eca1e3ccfe74e71204392f612348747107d274fb774f9e4bceb5a92584884ddb02054530551c950ccfdcfa8a0e88991e08b2cf41865501042af95f9f28e1c9bb821324312c1994589e5a531297bec08e2405ff4cf69fa02d645a586c9914e36afcf80c452487a4a1921636d42d4675e2a13672409d835ef640cfa2c3fab31a8129a0b457e78895e3611a0e7a3b59e143374ee3785bfc6549a5dda01c58d7a06595d071e1e4ec9e068147abfc9d92659db1ff6a6befd33dba38961603da85eacee91192f47520d6936ae864b6faab425070fccb9cc3f90a2631bd735aa8a850a34c9d8270bb487f3fa701c631a596468f7b644626bf08af704e4bc363888c48a91e2d5be0c9cbdf6db640fb42d8941bda09783862d857f12542fe2e24665db891eec10b83d3e04a206ff03561ced8317ca9d2a45b396ac0a0446af44158a43ad373fe583cb57725553c3b3e50e06f8957d1b7b7083963bf05a42a6919607c1f2b60f7ead938931017e63b80594969575861af1e7703e5a20a4e4ad00af6dfe7d9431fd6ca2a6ca1c6d705b0f2b84b6f4318c5bfbdf3f8ecda256e028b2f132796b985616b599cf3c85dcdcdc537ee9c5e1add1548b4195ace45592ba25f790cb08b0e67d481aab2685091b69ea43bcdfcaf9977976d186ecaa84873b5aa7b3f53ab6e4bf50a1ecc5774a8c8cf2c369928a48c6ac2663ecdc4f7c75996ab5a151a9f0725f1272ddd832d80345521282a0f21bf663913cb6186aeaa59c7e091052019e98c843ddf48f0ad2373f40727b9889c65c62a0c34b9654002614ac617b1d7a3b7dc04a6fc1195c8f897aa10e515d5a6d4a28aedf3fec57ee0f70e81d44a5ff2d044bc9471b06c6354f9a7a457ba7020349ecca81fbc9320f51c60ad17677c8b88bb5f39024919965d1c3f13a97ca0bd9a34fadb47b0da4a9980d2cf51e68ef1dc29ffc5651b75da6a3e6fcc541eddbf9d02de50d0f0367b8f81b8ced7ff318d5f51c3e049f32cd5b5f43eea1c0c8f494222bbcfddaf867b00231e4035403fc9a8756eb0719600ede90e74e329e46479cff7331dc6f68c9b342879229035676dc8406e01cdbb99b292b9eefeefc4b22fb1a1ad2fb6cd6be16defb6d6a35101c3afd143c51be46a926a2d7153259c7a0e6052c059db2feabb769a26621953a4069d40909458f2b268db18a2e2a124d53358ee88c455ad1bee6a7fd663498d3d5061a7f44e863c617080d569960e6ee71a3ceee0a5b1a243db15a1ffea857e2da93057fb98b31f5875b638d640d6cea7d349105ac160f294ef9c8279b15db8013826256adad4bd48c97220d22a509e20e8573b6510dc23b779501e113e2861e28dda604df780441b72d2d12e53966089639a995b1d0d31cf10bf84690431e082812431542218eadbf1760710bff92055cbed76765ea3d8f044e20711fc1d4a660a065ac6449af0d4ec4440ae02a38cc20670a12cf2e02bd8111766103e6f0fcd2cf7b42103bfa1aaac34768fcff830183b8c53136c88d184304350584d8c8b44931c2c1b3e8dc588f55263d08656c76e4ea3db5625cb3bb3e544886776f86202d84b30ab2e9c2f8581270e082b2d97caad50223f5aecdb87f09647e124aa88fe76e87c301e9b054248901905a4c1699586b45d336f706f537b1b039c03ff54f0a4e22bfc016c4da1ac9a25454ce581741c6f2d8cf2fd512533468b0e08c3373db58087fe033b0b047147f69231e391c31416c465b9dac23bfa0e17248f821454c1cb49ade6596cdfa01ef4b07d94b5913022971caa411b6026b62f21e1ffdd33c77983a707661ae05183a58f9a8f4c022cf49021b8a77ab936e89d663ab9dae56d1ec05d2ef4dfaaa65f98e8811769321475229c1ca7feef2e16c93f4a893724f3f09955d36241a01f54b8de7567195c7409e50b379a0f50f0fe803c5fc7c290e50e924d77f81c8619a1ea1eeaa1de2ea05b4fa04b3780cfa252caa3134500c1359dce693aed276ef3584eccc8b4f34aa9dc47c15d20fd22b461d3e9092f3ab22458e99083dbb73cd6c8bb01eaeec8e98f1ceaf416b660173675e67ab53ad03a0a4614efa9c5f66c4e6b700eeb94dd8ccf015073971c49f75c27be7fd5158f293c21ab364904c8f6a031018ad54bfb5c55015d70ba78f50ac61768770507f379d584481bed784a05013e26cc97db3888ef07ec1678ca878fb6b447387dba091de52e905420889582ce799c3ac45e7b462f10ad3e943884ab56975133b7c74ed3b5c3f5b9928f4fa98b840fb69d3287fc8169123a1fbd0f3f22e72ac9a747dbb0d9ff3e4a2e1a20959a48dac7c853b9ab1732436b3d087a5d53c53acb01ca6f7557455b3152bdf0b0523f79a04ec560fd82cf61b5beb89bb430f4b772c40a83c27d1a4585f773fc048afa2edd07803c78f6abdd6fee4f083f54352efe75ccc1ae26a07064d1e87822691da02665d13e08fbda882f01adacb17e616286cd1f1dc0fc948221e7ce62911e742e307290cfe3ca4ab0794b91182dceed9bafe4bbb2dca0f4c1f5ab4470f332da9d0b08d3d4b7b2a965e7bf3d4c810fd9b3c1d36d86fb458318e3d1b1aee61f67e1410f4670aa9a26c9f8ed00a416c22c37519429fa30311913e4165ee4edcced1a8443039f58ef5e73384e883910ff0f6b2bac67a7cf808952ddc8d4f959b98a68b87ee7018567bf33e1d37521f835e962864f9019468d586014eb30882da2b17d5e3836c69d8eedd69fbc1fabbd370bf56392098b7c15a5f75e86f9d3147b950207c8a22ecfc01646769f5e29ddb09a7e36e033e6b2ec3280dac0c46842d5f218438226e3a059d91672e3e1526457010305a8b77991fb947d8bb75642b31df6362fa66ed48b4caff50b954f32136fe0997a40cb35f49ed0e730b4f0fe1167eae2441215583ceccbcbe21da580421a84b1326f9c87787877b1604907e8f5e54e1e0a7e4c4c5100ce69d5afa62a9a37c75036cbc89b9ed78b999a3497367571528e236509b1276192f501923b13a63aa9bc500996644ef55259c72b70651c34b39a50fda6c97135a16cab3de94cd757a3920826a220371185ee3921869f8d3e6d6af01f71499107dbcca308030c62cd18ac162f863b1a38e8be2a8bc82885223b8fdac9ea09d22acfa2f4d7d4a5aa7e51032c83c2aed1bef0047233e947e35f2352bfc91b528d5c0964fec322db2a48e4f19189bee4b4eb1b5009c4d0ea5160a1cc0936a4408109841d6e8b006d9c3a7f4f59efee3ea9f23d4db05c7b43c809db18618c984e29ef363fd1201f630bde8934194ae9a01e33b2ec4559681d8e716328fa5d4d378868debd7c9d69f8e6d879393a76178812a6ceba8fb5b44711fc39cd280af49b8aa305792a1eccd3a744ec51d2f7456efb3d74b34b85ba8288818139840205332e01d5bf0361350826df69789ae2e0eefff2d11f414b76d10f385c0fdea09d38c80d21b43f8f6310f04e8354aa34937d841152cec886b6982478bfed410e4e81a3937843ad1183a73e8943315a3a10630388fb4bd49f10e6a830994231e3f19a95ea7d37cb74c2bc5aad9675e771452c77fb34bc702e3c0339543a1a40ebd324b701d13110c60fa8af2a92cbf43345ede9df330e86cbed9ddc2f566e4aa100c55fc15b2bf5b903a12e3287ac85f090ee25c0566b0693faf58eb6f7d4f754433e9f477f0dc6bfd0fc1621f324fb7d16160926b8b0f2feb1d9ffc868afd5b6d6a4d3d3c8e595ea8aa703eb53a68bc234d40fcc5439c47f2036dae5f49829c8911ee2391ebc23c1131762e9a1929c5d61939fc5e8705933f316e9afe2426852b55655c10329074840cac60b26e0bd0807e60da21a5ff2f2cb33f24e15b23a7b9ac59632139f9f265242aeea14909267f8388cea274ec8c7f2bf60d5f707b9fc5203573abab0990ef262e0d6e9fe031545115cc9ae22d280fd7702a26989e55831d34470c3740c2797df46d78b93a706308cdfcebebace30fe31a34758517aba09a3f2629bee25cd8c0389930231898c3fe7247788d1f43dd6272df8b0dcd63bf84833ef1ee6ec840e0358437bbcf673b74812a6c483636a1182dd5a24a5c34caacd4febf18521cb4ae3a1cbe0d0c5d8ffd7d9133307e40ce7cf212bbd746859889bc2d975d6440787e242ee12a9076422f8ff27222f86b3415328c2764f3079dc8e62f67a5ae4822b0a06f6cf125c12d4b4df65cf61308150b610d9bbdc45ba405903bcff79de19fa310cf1aa9c1afe194c46e2870b30943741aae25158dfb2ebbbe7d257427e8a83d7f53c8418c9d5833018f9293daf88fef6951ed73e2f61354f8780195094ea93f20056505c7561e46b055ce8f84ba3b144dfe2b37b8c515a3fa22aab372a54c71e1cdb337e5215fc59ec6e3769e32db262a65f27519dcb0321209beba5cd8b0ef9962146f3a5a160c17ae2e493288793ab78ea3b5482bb72760347a2e8fe62eea112bcba4f655b3401dfed1fee6e940632539a5cb6fadfab1e0712e528d939b14a02685683e5aa874cc4301299503c9881f2226087481de3cefe1150a69b66b2c524e915fc346fe04741e2d99561c193a8d0e602964024cead2b9f540e3ecc414bb9c272725118ef6f471c055e0f646e24d8f8af25500b9c69f19a1b8e56d921315b24ef4fb5ef1181e993735e23728668d425700d3e828b28b26d3513adf051c1d2aca2d476dbc79e3d8c8948055552893406e03366871c75c1580c04a23ecc675f728c20cb69b39d15942a6930bd1ec9110c2ca734d6500521d3cc7273d2fa7bf458d1721efcdf64c93004b3ce5514fce2ec91e874c8526d17ced31ba33bb622a8f1a7b2b37a8cb0c3d662e0e47d9bb3f9e4daac33247619055a8e30da6acad8102aaacdc03f4954b0504488336dd6efb11ca51d0e774c53ac1d81c80ea2d33e03a89c36ecc1f0e76b0237df37ee2c39dc7d00c3f284f4c42f82e0cc00ca2202306c44ab1d23bb229cdd2e05fca125310b6ab5c7048b1a857e50ec948e65e7918aa2567728b65678ea92cd7f90ec6756e01d4370fa89dafc220049596dbcdb817227d2e761ffbfc885dd0e6a023346c398c1587046b457683438a59fc211bfa2bf3d360f75d5fd617d0f0f77e89c5f388265454b20580991fa7a3a1032d81e9ac8abdb5c70c8392021fe24e4c610d8d472628d3c51e138c1e7eaa4a1a630d703d5eeea1ab7a09b29bfda40c2af535f5599baa8017347b3765f4ec0c2aae954f889c0186e8bc0db0228f061db0f1a2666d098dda01f513a9207716cfc6b113c1c5d43a12bbe0791cbd829554bb654d404894e50649f39c5f5f823d64fe07d81d31c046b42f043b21405653875c89a2d282d539ce96e06b8ba55435bd670102a6eee448bd1ea7c8fe13b4180d6cc2cfb42bf96742e4b6489ca31daf9c96b152b44058c2cc5390b8bcc46fa6ce9edc20fa22b016df7c028520558854c327872f557d66865e2c4fda731ee60a1b83f5611ff1355d45120c04502d3d970cfa86ed3f6ac2b5e072302e2186cf77a9313f7410662fd87f2e4c41c54f74b520567c0fbc787ff83f3e380aaf0fa483ebdf4b2316aa3aa45e380ae3a9c5327b59868ffdb7448821d45d2b2fdc36ccc5050b1ab5a85ebd0b344903364585815476eee7fca584e3e04c45bba0d221e1a702b62c0298b702215c83c57ab1aeb00a90b302ee9108e01b543ce0c43a2340aa83e6825316403d92e086e40fa719d6f3640a84fa1c877425ab33f30e1249f5059a30d0041534682c58372090f714a4e10f8925268b488ffd22d0da8c00137085d48d8a11555d67a64520aba123ccbf2c427279cf9358a2da0eeb4a1283f7768248b3c25602ebf09043f23c973c35cbe26da69f22f189f461cd880ef8084d0292ec8007870202ce14f5acb9c43737b3f200a9c67d871cefdcb22e608041f436fbfd3ab76c3864b1ebe3c63d2d01aebe47b1ada4013eb50bd894fa987b72756378c8a3d3b0ef24d6ced42f91d405946ce10b6091116905a62f44aac541b4c0042aa077e523fd24565d1ad5603042ca711d17561b152afc1d50b037d2c18b446b436fa3610320172dc1955fb866a841dc5a78b7ef39d7e4efc92efa5e74cc18cc0201669988013ca76fd2831fc39439b9f6ffb474d26574098b236565c699806899b1d842908e5eea5783241843a66ff11a07a4856e9a955313fa2d101629cfb4760f9b29fd24343ae40c43deacbc01070af6fa8cb899eff11252cfec6bd2984adae5ffc84ac252f3870ec36b27e6c649b6544804e147939d3be3ca3056b22eb045423d22eed5f742a760475aab6d09c420a14de2fec0f8d5fe27b1205aa2f8ea3455df6b5c025ffd98dd1278df74fd01939bdaeaa1631ff31fcf433933712cfc7a318ddc195d4d6186babcea20a3e5c673435d6a699ca1f406d93ffb955c264f39df9481dcf5078757e1a15a993189ecb36cea008640c7982213629a740d0b17470809d5883b1f088e7d7017adfd40e19fa0a02c2c77cc162dd851465505ecc314a2792473c1329c5680f7ba78b862d25037904ca979406832a0ca54f9356de54825873e08009b125296f1bd8fd5e40f6a87e53c6374b175f0c3c2a49a20a9409a9df0b397fd959c00c192191ceac2fc43f7f5d1bd70830efe0a284e8c82e42e1189204a47ba00127dee4621452735c7091449bf89cb0ad5f2ff0443230d25706086c81bbf322954e673a56f506d107766403211e86b5f88bfbc83461525a098fcc5836021cd16ba6e83d4521f627d548b87759fb7cb7107fa4c9528bdf86c8550382e6c36735597da7d4ee8d965b2825148edb4271d0ec286d18afcfba31145f6a54f8889c2a66c388313e700c4d74e8df369f235ec18a2e9c8ae3e7710286a7df5a1b6d56ffb2d0a52f7a598f624798670a181796a1ee24fb1e1fb936a64ca7a3342d1b16ab5cec6a299c36b65970814f28036c2c44a66dd680303c3fa51c0e7aa6769aac52585530e52da0085516540c024d38d1d03fd63377d070bc6e68e4dbed603624c530d20bf67c973b586e122182ac14e4993d048944ed66a8dc6ddaa3a307645c88797705daaa5039b5334a461a33949d28dba6117f8dba70afbdf04854ce63fc1b038dfbe4c3e78381f956c06342c8395ffdca6618167939310050d83e9724281c5b9110089e71e3474fded4bc8d4a856d63dffc3645cec5f41f09a3f63258264053e1999a2eb25b25cf4e37225a161162c205a2431d70a4a92e1bd2147ceca3ab1ba0ed8653a681f4641119ed3bd70b9857858938b19463dce7e578225e99889e48e9868f8a9a29dfe0667a363c9d8e98900a57f888fbbc4958aeffd246eda6da7ecd39ebf105ed5a56c9ab96d4a566a9f0371851a49e00d1647e7c3d1b20b6948119213f6d71fa02dfb2d315aed08d16b69ebe9548918d166858ac934b7dab5604837f3d3cc958d039d63512cfd8a8940b7e442af8f0aa4b76d52b970c84340eddcd76a7da10c42afa2f160d8df44fb60e7749c91b71d16625604b112c2409b2156c6cb682a9c81920f0baf65ec9d5ae675a9424036804758afdaa331f3ca23b002d826e3554da048b600dcfd2f3462fa84d489d3eaccf249f0ea079d2be4c273060a253da764a197e7978cac21078f49b708f8da9ac1de014f6b320db2e119c36438caac334c9d91a283f760b9dc856115a1cdc5c925e12bf276005072b2186fb7a8b861f568ba9e0c8340cbb96ab7f7c8de117bb2f63d42cc32532c50d13a1e7702cef62332fee9956f6f3be6826f54ce7bf8d5a2e38fadcaf80f174c287abed909d460579fe9160dbcce5b3eaf77031d45a5e91f06a4f161c887d786aff002ff1a6dea6ab32ed08189b3b47aad74d6ddf50b2fc124f02539f09e54fb51bfc15002edb03944ec6727d11dd8a1972795acacbdfdf5d82e0a91ea07fa23a714403a5d0b5c413cb0b1ab6b8fc76879f90c56eb8c18349178c3b8242a5f6e3019494f4d0c2ff7da7afb5f106d1e43486b624d354a620ea15f95245599186f9b2380a3bbc159b440e73fe993550b14b00e375ceb1782fdf1a8daff5b2adc4b56e0fa6e714d130ed1b9f322f3c4ed4f9624144d67dc651ca1ff2f902a1152fadfbf66a96581665d9b72f6149e069091f1703c225e2d3491815373077921544fa4f14491d4309b0c2a2ff97d500ac00d554a48a6f25544433a293394af1d19d32b8421d758c728b3df21e14b285a5df668e25eaf11ffbe4eb0128db44adfbe6a40332e76f1aed933c1c7de323230571584d425b6ff2030970461ff1497d19f8a5caf467b12b2087b51acb2a490113b8752a0d8dff087a723779a83626dd5f4e823e48a27b79c6b7935f1bd878089aa59f68d7015b2d36da50dd8b8074257de126ecb0b1012c9344f46ef04d0b8c62fec2ba8099e893457ff3785438eb0a36e25cac84ccf44b8d5cca5822e9c089e43b8aa2001007f23d267186823cc1fe82bdba366bbcdcbabcdc67a410f0fabce19de60307af1b3a207dc2fdd5ecf77a5547b534da698fce94ea1a5e64203c85c5145f99c6fce3effda09c4d16d6c93f81f7b590a7ec807a7366628bd197fa0506ce6f18ab4b540f5e449303d1c1ce8288c706faf81f64032d851e1c4f032a787cef4735dd1122ec5235ed327a627e14e36bbb1a55443f16e0c32e75ad3f5d7d39ca0bbf6176934991175fc4646a323697b8ce6c7ba0298b91b0260be8a90c80caddd82e84583fce969eb15eb86030d6b746661d57a314422d07017c8ff6129c8b99549c3613706989d6de7e6cd9bf44ddc89858ad78da1ea167b5d56f7bb55fafb59d92d150d8c4e51fafa810382371c8d9a3db93acd602029f8daf0d65f5b89342ca17e72575f3176299b89958fd9e318faf87c0a4619938eb18a8a09343b7c2c9ca8008df93a957c9077c604aa73d26a2fb16d99e33f61a0d8ce33bef129b0c86a8a3e9cca86a57a36a0b42651df1140482d3d3672c6131219da30f75e7c79b38acd194df6fe6db41bdb222204993894bc45a8182767481531328cf3de638ee9033906e23f48ef8c36988e673dceaa54a1db89d95f5563ec9b7eeb482027f005edc62be93f65f08f49a0702077ff951264f4225828756a127228f8b111d67922ae892c30f37da53f024b005ac01652a74f13d64b1bafe1b721cbd378ae9761e91b3499e1c9d9758fc0b800a686db9d55e0e4b13428835c63baf7d5300324a26d9c5990a5682f63bf3b7dd1d51542c598c5bacbb95e25f1d14b9cde7d0f4e730e71243ecb2aa314400a1b7c191ad8e1fa66df3294fe4321ee17ae10f824705ea1374d5d9ec5f47dc6ae3640d29836e27f852d9fd23e0b8e24b3b81f6fbe015ed16ebe9a784f08849632744e982434f10e417fbe03da762adf0ebbed7f5dfadbe35cf180fe886f60339651ffb85d7541c093fbed97de16fc66596555fdfc2c4c31da270801a88dbc853cf71c03913f516f669f5c6f564bf3719c8463d5d3ee9ad9048831eb5436407b88189f5093c7ad6d36721a55a94d390b366ad594b532deca060d1db7b2da50a38d77f94b815fb7bafd26bc3143993509b9b69992c3ab5ab7de709782c76d953e5502c35ac82c1a6deb2a52ff950d8b309f519fffb4df84f2b33067ad3dcd8ddbf15978c4b09847c9cbc9b751454359eb118ca5f5007163bd63cb3fee750e7f8a35ee1eb37c0464a8980bad5d09dca7ee2ead8d7801b0bdeac0f175a13758f695c041520daaf06ec3135e4c76c7532f5d23b6c5336f20f251d28f3cd2ade00eec68cfa3b22df4d01424f10024c2f197a28b218e4cf0be60eb14b2beffc91e9daa2bbb233494ca385742b9b39772688d62c58d3ed50c9885a8d0d6410ebdd08a44554a85069c9cf3d37e09e9d672a66189639fe4f1c87be2a338fb7b37699dbcd3cf9595ec74f2f05cc15160dbc15a618e8f400014dd052dfd1520bba9ef893f5da4b214a16e9074ba87070fe83b303b66c9f3d35a20432639be2d194cf3208c01d345752d292382563d31438eb0f180851796b47006e938883419ee0d2fadffadcbbc9f4e8bad58e4a3ce2e55947bc64976e6d56ae49c0e366547325d7573d1527a964ec918b63e3bbe807c427cde0f5c84795a500b032258d68fd52b353493252e79c4194ebad98b05e981717946454295b8a1c73ad0a89ef74e607a0a5847eceee8a37051b7376d2b9869efaf23482a449bd43a7379ba41ccfaaa18ccd63e88085a757021da83790c263616086cc1048d618b52188b69f53cbb593f9bb0af56336dea972a563fcdbb83f808251bf7147190583df21e53916e30a58c7e584bbfafe27646ac16c4e7821fee1b91b867acd37b67f5a640d83afadb8c45703edaa765f087b8f403d82a2a851de5d8023df1804bef1e6a6952decae661c313fe516e12c96fca63e9341236d46ceb1585cee9b5e0790ed343663e20a6aa5d27463f3ec1cfff7ec92df2bd33538d631d361dde475593ea483458df6d1d70166c139b5bdf410c42ca04bd873dcf11e932420e7db3770a843b5d022ec02da1bdda2da63fc1448e85498a95b32c4a9c18c11082a4bd1dcf7fb51e994f83141cea5c9d777f61494e37cab1428dde7ef9fa953d16bb14f6c936be14ac8e74c25d7821bde00e9ce8b11f4bb6a33f0ac64b24abf4252a49b9f6c10770a8ba586dac1da109f58cff9180e9cbdb5bf78ce300093d9d7e24400f8aeddd7b4ddf37da090777e093100ab294408703478d78421bda97afa15f1724d4270eeb31638d510707fa126a5b49f30c3a56700c8280de2c621085105130dae72b1e5b4e38f6c7f157deb7d18d15deb454a5f8b31e19ca378ddd4d661b2c9cc75b6466ad07d939e6ae8b5fb4b041ea275d6d816bed7a2c1b755419b83c4927cc6a6b918aa159ef375f5e0898eae7e51b65a709583768da278f9adc782526c5cd74ed97540000d7410054ccf1196faf7534726944c42ad98a9f6940dfd8c7d5117898e56a91621b9d9dda626ee899a54f32754fb824abef16addb0e1086a133dec094f96898265902acc596390d9295af0dde6ba5d0264d11c6ab03e2ada68a40c2f80d73cabbb1022f43c9f5cef912a7ca7c502855f5892ccbf772f7458d72af9035696490bd6368975c27d2175606156c0922b6bc57381965558707babaf3e45c3e46fda06426703e69ac8f4d7ec59890a22d8f3c0ce1bdb904e13fa09178c32881718b977da348313f9aaa3030920bce1da7acde2651e17377db7b71cbe0c883b75fc7425a22023406029fa5f705c54d3fbfe6cc2b2011d3e06686847e57f652f18f8eb6a21668b866c0a8caee83c6125b1ca92cb912e23da81858898e5aa4ec6a1e9115bc7d97c3e1212b60ccaee2706fdff29aae4df17d877fb15047b15cfb48c87acd504dd8998b5a1027c41796fa2aa13427eff16cf3875ba58703a48b519a3883eda1e0a00f73490a5bf664f2da9f014b62ca53a344037680f977c591d5ac5910893da90a1938e8042255cc9b3d5dbb590516d690ef4982aa972e7d5f3a9df1d8f93aad0f0c6bde1b5f5609803e4d0a68bf3f876ad478f4f872d1f66793c1d24c57e7bf6dcfbd9d1758251f8925c6ebb01f0a71e290d657bb8865c0d182114c6625ba0ef4828faad0a846966379763b7561bde022ac942e4b6477559f2cce997919b2f317c96ddd8f407066eda2a38d7e809d2799434a4f4dccfd2e8d2f019e0af678e7e50caa1c0bb3bc7c31941b427b154a8023994dcbd78965e5c69d4c333d0a98d4aa01c577ede26163d94bd7e0f2d82984050c33eb5e46eeac2f8ebad22ac56ee0df39b013dcc2b0a0c1b37d0a0546f140b15dc9c69b117537cda2645f3aea96cbaf3202ccddef448585decf4d7d105f13c0313319bdc9a3675a5c469cac2c650baa444e9539ba2487668e9e19278db56db4f3f8eb221a2fe8f90ea2f1f93a5614df1214c1c8b81db957ed137712f13a5d7a991f4b10821bd587337ab12adb1f43635991215173c475da73220f62ef2cdfe3bd0d446b05b2ffa3906820132dc5b114824b09ee3bd1905a7366691450adf67ba07a570fa4629321544afae7ca2c0d9c6596c0a407a7465abb26736af224402e9bfd98b293e6d031779907933e8c9e8d39e1ad7c4f6c946e18921377975af50fccc23894a80581438d6f83fcf0501b7be486f55e2f4a68a186882ec1f459c579bb1adb9fc19b7423af4f300b6d5f2a52f9c5846d589d732a8908186ad7c9022bc41c60510acbf8773d4815485d21a6f25f73702e41d3cbc5702cbc4bd14dec9a400de95e73a2dbe691bf7a275c991940040db4878f1a8692c0609746f7af22c395a4bc3bc25af83d70ead08e137f173f9f9c4d7ac842c4f7edb76dc4ec4d8c606e4d9f0025fefdbdd725aaee6d9de0345bf7a2a215780e93cf105b9d5ee7d165f732740fa6c3be3afff63e16451b8601a3503ec2924d20d36cca4e494519595a29fd8f592b61e2854e171ed3ba0c17e6773ed5688cad4fbd27c83ba3edb6397bdfcdab7212030b6638700f9e7712450ee9703abf895ec2ccd4c3e9e838b985427d96c5abb81384f69e53154836a4a0775e85b1428d70cbd38e3512e227586efb845df35e469bb449e11615a866c8c687cb2fc52980a69e2bfe208dae32cc26b5730c35a4278047e9ca7d32a62f4ddad7d9d3dc9a2b606e97df3aa437a40a570e773b9d004adf203b993a64f316fbc8bd3170b5b874a9b675fcb645100e887206db8478afe5c3b83384229a126ad6a323ad26121485e636afedbc173060d85a5c94cd7c0bbcb7ca46d3064653c01e0f4a9bbd4c6b7ec63ba432771677d17b49e95eb3e56fc38781c01d7fffee9156853ed6a1b6041aa03a780117beac1d27d3028a06e377fd2a353bc573973a83eb1a7115e05ae101cf49a7ffaa4fbaed5a1c57be731ad88dc4857704a24184098c4b4d81df1725ed4a6051f2277019a910504b974e756e6a0720bcaafb4ee4e20372f824946d62008387a65b57279b206460211034b8d5d22dbe2be22f846c83d3141c38191f927292f9204b8dd4b54f10754ff83518b1b6394e7c29b9e98f05f838706a382847ff0d2912b8d4b25f113173c86c97453376a18848a519d167c1cdc1f45588cf05acd0cdebd6480767e55d141d7a9260596513d609691996ec8d8b2300bb785ec9685f4cc39babdb30655806594ae4af39b816584d44287f54969fdde10e0e2293d9b46f4701b13cb998d3f8be71644f7a9a8980774753463ae67414edc45e82b9f4f8c6eba0cfd187a8b756799f5d6f16a5e19158342bf90c5b4511815523cbdc09244f584f2df52cf47c690710f58e7e29f12fca45353561dc991d700c0d653670c17b975e02904686d34407ea86b93ebdf19ee103e4d94a85181210792afed85acc0b6619aef4fb0dd83549945db4378c4007e3b443a010781ff9814e75748778ee092cc52aa6b6d0ea7116fd9f3fd8dae3e24885b1dcb0859582a84dad65b07ea60f46e3d799cba69700663bb52a3df63fc73a2c8e240e77d966d703a7240d50e11e37971985cf4685d1cf5c6640e8d0bb8d95b9d9d93322c71da6eb051fc754f3ab4091f4a7bb02e739f535805cb4bf1bcb5e08aff3001eec09e47136ab419c66016183946ae45c7b72a81a69167995e8c97c8335e8c70bdfc3a85ab24e0131f53c3f323246bc76d6f44c878d974a41ae583d66bb95f14ef8101c6d23591b8cec3a4feedcccf6b68ca2510ae671642588df8198c913e5cd4a09579e26d4ac23a5ff2acc4aa6e663eb39853d6de98532e49805aea19d3a74b2d5b8b3aa01e0d02534fcc5d3371caa789471c61804b135f9980185a439188d7af027710203853e3741e423eae1d96fd4b1000900b917d29b7d2354bababc4e35bda1c518d4a061f1a4136b59c82d375cf90fabe2cef07d18e06979a5799801283d49aa360f36ad72ef612c066d87ff4dc7a2fbb41c8af865cb78c77f5b410920b5890b4e419c51137632d5526b5a8a7bfc89fa67d46624174e1b524d0e603ed215a3eff7b575a751f9650d777cbb09e72c32ee8691f1ccd7618f232d6f743571cd80b54d448e356ff528f5745ac894dd3104ba488c26d5dcbfc5c714e25334837af61c24275879f2636ec740a56dd55b27ae7f9f89d15f1d1254913f34260d0b3daf2610fcadc1194ee6e44b75005a21ef185a25d8eb1898f0b59f258d7b9a6d5c9aa2771589cf471f85ca769668bf4fe7d8ce45af30b645697b37d4c2f67dd65ed086ecbdf82d1977382fd87c40b548202db274253a326e5317b663e994abfdc8023d570229a80d27e88bcdb4e40ee729503f0afcbf2b85367b4484b948bbac7b0ec265c41618d21541b91029efa01a4e5fac1e11a716ea3f45e71dad17ffd0dd12a7745ee13cb0aa31ce0cb08320dfb5317dbc5b95dcbe3808c83c2d94ba1966980b12ad4b4ae58c7f03690de52aa95af86cb16de710779425a5c6fdb74d2790dd004cb01bf1196e9d742361106fdfc02af5d23e8b5fa5214d2981bf3cbb94d4c1e8c9e11e6a7b4aa89d065755dd1bc0ad20d50baa701ae645e220b07e1ebf334c2825076fae8fd01ff426f60af2f3e9e576fb4685ff9f8074334cbbf4126629d89ee591846e61267d64ef7e047d4a51e077baecf065013b37744179cb6a131d3ebcf330be46ba95478952fc2972b39cc6d067fb99c7af4ba8dd185c267ae44a876e3615c78e02adc1109f2e6b42edef8d9dce28de4f592f24882a1585901296d32720a5c3202c60dd14e504a8ac508c0d42038c947187ccca5980799ea7690ce9e9c4cd6e0044323c141816554e01765b9a684da8677151de9f459d34e99e73020ac6c4e3253778b5f7fa6ca5ec8c4ed66d66e51f3e5f9448a12764a08a203771cdda67c4bbca7dad32b008c3a4d0aeaddb984e8db2d18931197cccc8ea9c31bbccbe0aae6fa9e63e14766d4659199482b053c32a03f91815e9c6d4bc255625c191b99a7ec39d4a9350b6664c0af3142ff2d01a27106a6a618966fbb2026b8cc2338584cf0be5a763d8fb232d2a19ae59959446282d9b8303867e0de850d1c54c85e4a53762c0979d3c161079a347d8bacd70cb66382686c18c4d026fa56b46c3318a4d60baf7eca391c1ed480d4f52bfd02febd65b5221e45a9699a9367fd7181c651bb51f7400ee8e5add7b77c4d671161f12acd81800fa0b8ce0caea5cff0ad5fac413be2c498a35d6ed737b137a5fcc55cce201ce585ccc641c0dbe8dc95027888552082232c3980cab3edb061c0f52988637fc60d0852a6b7023cdd81f00a54809bf3f2568f8fe7d0bb506928c30e25de3f74ccc773c78b9008e9c8ba09dc88620be4a9b95a0d0c8fcda5976f3e4e2157b516344324ef84b0462a9f462fc43357467a9716905c104d850207e1f678f49da51e90a95b118cd308dac53dff408938ceb98c3e62ca2bfad137e80187a73d3c8b37f0a07be32970729d376acf03123698ed43f8e36661bc4c522143627be830c1c2501050ea767b280f6286678bfa23d3bcdaf69bac5047a0b2fe349d634ff3a0115308c7fdb2a39a5b92761e183d880b5cce25663f6e0e5720ed890ab53544ffd0d5de368551eb7d7518e9be43945db3b33f1dc2de950a4fa12ca24a6c72245de8bfa53614a16fa9724e12616bf452e5ca1a49729658c4de5d1c0c1f70dd2d82719ab31fdb2c0f63ef15f40022bf74f807afcf2f273b259ef4cffdd662ba9a395853ec4cdc5f9872bb51f4284961fe4c4bb0822d511639569225a5e00c284e2431e41cbb0e3078a240360283a2eba548af4e9ac2819e19e111971c1126bbceb70a850952e4e9dfcb73c5e1ed62484365bc79f0681d861d5b188e1ee10ffe1593d8c8d2015db9beda3ca3bae48f6eb412edff72a8046140708d6c58f3a466b6c76faa3f6bae70710ad325c8217fb44484f4fd601290cd73b86eb869ed0cc857101b3572ceef48a58bc12afe1a53d0805be1628c64e4e8ca27f7a07a642fef7889be9f0a13303ce8631617b87fd52023253491459674a1eb05c70e1399d9ab04971e2971c064b3f1e63f8d3a8e1325b883f440f6b9d2c0f820d8252f4b5f9b097bd1ccd208ffe9dab7d34d7d9e3ddf9a93cb72351525f503cfa000c2f5d91430b4e58e454cbad895f282b48fd0eb4ac07b50a3dd56f0a2950a17d124abe6b6f83e9833e1777622ebc1772f430264b675cd4537250290bb8774066c04c79f60339b464ccf0cc8a4ecef11087b1b33be314b3ed54293f3203c904e60b37135f425e2398c31aa9e10e2ef071f8dcfb32acf5e21dec19b28025605d122e11895add7d8992e17e5330b243904801638a75d58bd04e188f17c637e95ac09b8bb1ec400563abfe58a138640f6f1a7842c03595f97417b0e1b3bedc4d4843ca247361803145a74ca41ff3a48fa2b86905bb697150960ff7368be2d823cff1627950410f27bcca43ea84b9d270a8119c5470b0b30ea79123699288e9bde3d954282001fc8eb31a1d4d9cbf422a2d3da6f3e0ef3ca29e28c66bc583826925c8e446c5f511a4a40e628b181af9ba96cd8808ca7d1347c2baee0bd6feef0426f5f422844dee177ac663cc067a8f9fe66993fe9f1fec2048d7bd6a1ab44219cd87e654d3cf9263f12a898c4314fb84f32efa9642f43f330f820877b70741553ae4af72034b0dd83b86f912dd79f1e6c528f7f2a48dca747981b585c257a910cdbb9712b1168fc2d22b69592ed503649fe4a9b0470f41d0322830f8d0f034dcab923722131c9f753cac8b34dc10e69629ba2458079edfe70d4823790d1250d5f2731279014e458192d04efcbf40e6d56e25d19a4e5fdcec3b006ea6b31bcf3089599d4102cf72b2741303cc003278704f3f5cc0e9936180bf3e812a21455a7a2481919bd61b28c950aa70567a843e24845d9a388d990486adc9e4e93ea3738471c145bd84292b047894e5dddef153521ee1400d48e6d18675cfff4344f2c19b84c349a4867767f17911bc1b4f5a3ac302b4d874b2e0228cab8503e3bae9d8854b06a52fcb957cbbba351feca8240b0a78c3c99332a9b344085fbc5346d43939683c70dc40441592940d648089c8173476b45812453321239177a79e336c7d122d67913e470c6e7fe81ae044c93013b1a9ab1b6ebd42b712fdde97b8520e2872179314a9a25254c8548a54d079ba4c00db8b2608fa02d09ee19057c25675c44f214583f955b21a94de1e7091b6afe7a41e3427a3d77331e841a47bd94fe2d6027ff7ea809ad3da8648bd29773e78c5159b6b361b4bd6653a2936b85ce2716d239bc2de7453de950778ab0198008a6c03abedf9c464c61cf43275cbb0ea878c552d94ef98b1ce1e20d3aa90b1cc2793484e2644c5680d8d1f1e7b9d77a065a63b0dec26bf7e3837813d4eb7edeccdea2bc04625311f5a443e9bed31baf9b4d821abc149080bdcfe098c62a110f7d2e9b1a89e8a71448fb75bc01666fbf23f25de42072ae3f8498a5a35d272a4ea63623f3254c28c309119390ca363188e5435deb1cd22d3445b91c9e6d1230ae671616400008b978ec04057756db33397327987d80d6e03e1e9490808335e425667c75c82f502be8b7758141bb6a7c19e8a54f444a9b6449667926169e8f8102da6a5ab0638535da5b8f3a343fa337221f97303bc58c1eeeca0115af39cf89d34e764a1b6d91b103549140e845662401bf09e53f5d43737f04af90323e1558237688985cc43f831431507f9127258c1b5bd50837b1e7392c828a4d481701e91c9be78f8aabce0500f3fc6d3ea24b76dbf8a184bf5e39b114fbb8fecc60e8d9a4ce73634606280fca0556dec5038bce928b4216b391331bc593e254ac1f52d6e5cfcff6f61b9c8dcfdeef94192e16dc63fd72c049a89e4497be3734f8c33abefa7962ba6e5e849f6aae2e000e8bc2b537b17e8b0653542cb867dda4cf970155c7e467e8c9bc1d71bd89e11da0a04c8c0693ad07943c36fdf01fb03e668723af017c677a90f0db8d087e7d44d0f3ef3ab0b391f8c65962be2ffbb620fc9dc32c70d29c4961b2c5e3b80239d463a4f53f3c7e8020d2a57ae8ce230f835e7882bf4a229f61e1cfcd763fc333b492235e62180cfe87d694a132f8cb85940029f6043c877184bc89a34cb835543a6518f7510501f2fb5ca74723c8fc5be22c263437085f427c65e9ada4c52d2ba6bda8f45d2007fdb1076b184f3ce031b0eeddf5e6960b213190a2429788795574092747d3ed2d7178cd4a51a4816d71f5911ff11071642f241a02d2bb922123a0e344b810293e0641666b79f459a6003f4c89ba0d81a9fb1dfe289393078cb2a6cd51fef88f0bd7b2e2d7081ad2cdb9e4c34d5b10a7eff595c4209b09e02a3a4b09f91277ec9f5735ef753a726ae925c66a72e215d01dc037356eddd12f225da7ec1269e54717d3fca931c8dac2a197d3d687411b069540dcaa767d5db1882218e025d9e610b161663b746d81b1cf120760b388a6bea9ed26b72a883e368f6a2f5cbb55c1eaa82bb4a158d0155328d0fb06feec717e034adf7a7d3c294437cd25628bf9ea04303af1a7f6938dbbfb126037dcc457a648f566f96fcb8c40c9040476687b717831cc6ba46e91e6cfcf5d2e02a55c6b9ca8e2fb137ee21e294060a3e4e471b42c2b7cbeb16c2a1836be3ec5257af9cbde4f4024805fd7ff8042a70f617d5200d8021e2d11b549c1f57abe27f7444d5ac2bba7a2bc154f9a9df780c610412a403026f2caf7e7c3c05c1e00f7831cc0e0ee6f0fbb79b5608d41b5beb684b09d8e0f4314fdd37a7913b6eab5d23e657b202a95c046cd116da0ef36237fa083b07c9ab2feaf92d70a87055e6b43864eca4303422f384eff50a3e7792d2d37dcd3ebee9cbe07f9e7ee75243f2ae3a3e0579411824a38788f1c224fa6971bae37a5743022af1b08b64c4a079db5010deae8ef46fe035231c0114a9cd1df421d8717b8fcbc7521efc3bb63731ae47a01fd59b129d2a10f5b199abb92a90047375d8a156909ee6625996bfe8fbb056c44ef63e894bc9a9035d195ad91a7a861e4d53b9c0c769ee13e7660476fd56466cd41dacb414dd76fc702f092fb446a73b00eaef10aa24e10b1484b2022e46374e6c0a1b6d21499008a1b421f54195a7bab0908104a74e4d13ce3ba6a6960969e78ba41072319925639929be6766d9f64ea8999f7f3f680df46709279e4068f3b49121d7c29458d14333a10319572d27a8d0ef0cc9e77f163b1e5582361fdba6d282ae2e7cf4bc770f535d9f61029bd8a1ca407f716473f1020d0caa14ee5d76a7d5fc8d6a4aea68fe2d455e608d31d1a34c0a4174fb0e2ad67698093fbfa1bec8cdebe594a17814052bf2cb54207e4449ad475633fb8044be913930e2843059be808d949ca473001414511f5765d824b03dd74537390017c8762626c056e1ce86445677f710fc44c44afcb9255767ea750b440f14f31f036e7e19c0604ee610a5d8de2d4bbc252ce60545a23f83c2da10a1aa9fb3d985e61daf836becd0102ae622a3d58efc85b39535f61085fd0edc7d85b86bff4a210e97c199028885401a2bb16c2c1df8d5babc2d6ae3280b20a90d49517add3610d0e1d613806e3732e765214b3dbae629cae44c4131afc492169ad57fed7ca62a524251f7b17d28cbbea0b5f7512ac14e36652cbb111b176e80ccbe52957d72361ad2dffdf4e9694cbb7ab7aeda5e4e01a29d3e0b7314e4a116b2db0713d4fd9c4817e6bdb244c20789c171bc28270b45d6b97808ad841e1ce01aa94f8d2e306037fb75601625825e49153614babb7da1b9fdc9c29078090cfc0b8dd34c9f9f06270f5296309c8046abbcd74d870771e119b98fcbeb95698a5ba1c288fc23efcb50c06b7607cf5966d015bb203b26172e6fbe79c21bc3848364f8ac34ad700cfa71a9ab4339b4137312c504a965918e5fc6d33a1146b4915be68eb871b3f37bfc9f461222ea148b7c5ae4fcbb5c55af97061b9eda666090905b6456ff372ec736ace6d58217de39452ed59b43e36c9d98f400fd73060d3b0d804e5cb43f73881ee9f6d285cfc0df15ffe35ea9e1ccf3a978d69f88de1c5e78512588a754376f839da767185b09cf09ac02d1a276790a2c3bc5a10188cbccc8f620dbfe0179aeaf08020668606668cc17b3672f836b4244236534d6102619354c0251f70ba8b93f220df610815882c0826baf0ddade68b13c51c68bc83fce2a61a8785e5b8d643db7b748490213499d07d5b01219493314f487b987a3832752406def1f80fa1d15c29f2a4014f3b1e015419161eeb4f312ead0b681d58ad02397e62dd0e84a9bffa3a5dc79a0ab12c4b11ee61877ca5be03d57e605940d51c90f0f6224f967bd2421fb4c5543f695c24becb7ec16d4a0b2abd7275fab8a899c642883312fa3792f93782344a0fc403f5e0c87549c13ba188ff10f419561a764c8e39ef511b6f37fad2aa1b8f153b5e4530dd6c503b9f3c5392a06df79cbf166192a938166dbff2860f8ae6166e1d11d122214059972019d8484392213d808b4b76a3ef5b515e6822198936ce35da703e88aac668209906f47ee018226b278101cc1eedade147cb5e83a8365a58fd3f56703718f091a23d66588e120306f27e3305890da7dcc1e4014488e3bfaa22e071633226873f7297fe1f542dd9a30192f480c294341cde8f658d9c9df08fd4bb40c6203a43aac5ce9ca86e2805e35c60c0e59a555c4e297709cd302ec2daa0c17ec88240b800b23e3c19b0c9b82d3dcf060850db8f34b8318a62a550aa8718674c95a88a16a68b5345a8661029665edbc4c4d32a3d8c9729d7b0c5a87213ea5d7a168a972e353bf7266b134b4ea6f277d38f58c3e50fe4f3304eaddd620c82a7c2b050892efeac3554c97f27657ca2d9e94f6384bc3ea71a4a1eaf73b3c6792bf2f49ca569280b48c9e08c78bcfae7134d3600f9d1a3ea299d25aae8b88cc47877263dec6474bef674838bdb7b679a9782db7b29dfe74e7faa397fa9352593f600b4bc687d550c533acdc8f1662742816b62cc62cf3f436db8454a1c782bc82e113803e7d77e97438ba571d32611d0c03c5d22590e14ed616c734db78fcc5be139f368fb28060bde0999f098cdc9772b84fe0462648a55c5fe520b1b3d01bc54abe3e0e0ae7e1ec7064f3c2f790c810b52fc517bd4cb22338ebb33017b7b7f2cdff3f4bb9140e1350a0d0ff423b8f12c21b5884975c8ded60a0f028160df2ee23345b94f54a7462a32ad88a5e0fae67ec00c0f6e1076baf760b6b7bd6ec4cc91869dfc72ce72e2234a315489624caa33d5bc77340a39d6320f654bcc5e8deef7c34fd582014d050b8526ff35d8b3efec8fe1e36421321bacf92404157c443674fd878047ecea1af9403c3e04695d39abd2ff05f4b7e40b3d3377ea07ff0f2d4fa3d03fe74dd69b7266738a2c0232d2b049460edd09c091113e623780fb6f9f131e318437d0d0e1af723c0544475f554778ff72c01f87e41205a575945281eeea414c808bbef83213c3dd0bbdfc1b497c6bf3b1f30231ba412a6a2dc226252e7840938d01580e765e0f57cf0425510ff0954f5a903ca674ba7b95ac687d1f756b133b21a22cee94327fe4de75b79a25ebee7f61098fdd111db5d1cf176207a0cc9cf8defbbf0b573b8a874fbb54bac3834c913a1107ee4f1fc88b23227b2e777f2d7b27ba135fbdee01a2e9bd75bc8c4b82af99ab84da0d32759df7ef20ec6bd6432f5cbd3df0021c02dff02aaf3863ee1181e425f08c0d3f100d510101ed706d03fabc5664a377ff1a4440b712b91a4312cbbd5c421d1a21e2b38569b8640b7ba1af7c3bfa2cf1386fe6f2c7745f8f30ba470eea06b79b5b1a63aab726b68e78e8b22b6dae86e65f59ac659530654d22e5e83c8089c42442d2ed27e29d8ab7c800da011aa22d730d007d50036f14fd1ac3ba527ec6f1ae30375d092cf84fb5f8932873a223881892ce9437ebadfaf423fd5ba15f7390719deba4967e7109cf6bb50694efe772c7ebf83ffb9eb54a8a03fb1753cf7bb12b80519d813b5e5c911043ac67e01045af822630f993ef1c460bbe3fa6ec5cd9c1305023120a7ed0a8ac08723409b3053f5b48b64ec2bede4b10006356bc2218a7895cf02bacd5f5c67889908f9a9e8a8e67697f4ce5c0c1eb5c2f6a5c93b4a7f069068471cab5e46d213ff500bf31539261089473226daa68119be78da53be4f969dcfab40d3a49cdb01b8b23f6713f332d7ddd63a10ed5b74b590e049c8cb3985f7a48e3e6878ff4809e480bfd4c4cbf400269ec4ec5dc8d61440d3135fd3a2d3771489565fdbbee09a4bf30a84f70bbb14f80c4f72d52093af3003335e585f52eb191ffece94cbf150f7fdd38292169891878e6d8e0c38d9a9961e9dc0f3ae708e80041c7792058580be82d00198e68be108bd2438f8ca20cf34daa4b3c54d378833c0f45d6dec9cb2d430f7ad7bbda5da17574844fee40d076ef46bf232fae065a612140dea16fab27cd9560522de497ca37a4a40790298b8a11dcb1ea9dbce69a963d44d9976f7ca8bdb42832cecff30092201e7294aba0223f312e6eaf0e3e90cba8a301d421c66290e53864d4323108bac1c88d24fb6773ba167156edf24178080a4a036c03c846978231aae29226a5951671178792b541549e0bc32a13da3cf68832ee6cb223d3f83cd37e6761837dfd8321df51e034fe8413a5a00f6827da2104aac107caab04e732417a095140f045c0b4418475619ee88172bd25e74bba718635156541dce182a4e445a6a7391967942d5507d94d276c333010ac53f80422623b2dac76269d7aa1b7e23c7328529cdac31dd43eace4c6923c418d7c66ce91380ac41541d4deed26b9c30124e0ac116d6a836c523cdab43a3f610a394c264d3b3ebed04584fbae68860234472d47502d07269641a3ec9c01faa6f7b35445fe1b19976b2907b80d5e695f7d50709fda05577e5da6b9a927f45261d6718e37561a3c4073968a7185d408cd031f1328f41eb5fcc9a51e75339432ad57f100cd51e7abe5a884c93e69226b49ed639bc27940bfdccfbe0bc57748079150b1f18570b80f67484e7729712bae38fb67cf92ad6339d7ae58236776aa59f81edaea6c18dbc6837161bb31a98669e99ee56cc307688e9029153e2b3b6ee4910bea67d7f7510fc05a37c9119f0c29338d0fca7930c7b77e87a9d058e8630ac96b0f1be1aefa7d102a4f5bef458e5f39e702e0ff7fd00f38d71d7bd12b128ca16ceb88989c0556d24e7ca43d39be1c23183470cb8e31911e408a0caf9f0adbc756041f7a6f58785fda40d1e232fd753117d15f5499553d84c7af5dfc5d4f17471e0e068729d74867b38c8e365d92cebee62468b5e61fb2c1d17a75758bfa136d4305309a78ee33aaa67800bc0ba8f685ca7bc2bb1bef53c8ef3322e5393a579c0060c8c5e358dbea65418312455dbf30a2697639ef607848fbd2a1c3d15a620452a258344386736adad853f89db046efe91de0fe5d65fd76b125e5b9c18d2b9b399cf4c844b7a543ddada7989345d81fc7e308602392e87ccc600e7624c59c079ac21f4acafce53bb8ad1590891ac3208608a47df702636bffe1a13366d7c277d3178326efa1fecd19f19c51cce991444d1b74299d99e96e6fc07ddf1ccaf902d2c58630501cc504a1fdaa6cd9318519698ab47412793078d8cba10583021e91825d1fa375e3aa1173813fb7c00414b47518632a143152f4949b626a2a281c5456baaa5a289ba53efb8822207008dc51e2b2363a16cd248560a0f0ff5ce78637843eb86a8f481289b091ea190a9f331e62bac046292b867d46a9c091ba7ca0538b9456243e7b562a828535c8feff2de1a7a9fa23d4047296b537e46fd6e9ca53bb880fc8684371ee0120a9e60c7e7e1d4424c6419651e0cc3cb386a0329667d4e990417030f9c024ea2747872b57d98b2877b7301dded81c29531367a8e685c44ada7622b61812ac77341434d1b44fbd28fdea158b9e7fd278cf34ff2b0544dbef567adae2ff8fdaf8e2a71267c6958f790ffeffb808e3055417320674567cbf46e0e277f1a2c4cf299d21643ea92ae9ed22bfd55afcf2f23b958fd81b207233117286b419b140f032d4bf91dc7064e842330f3dc3e41061f258c06da1ad6b90c74e878a2620548b21e01bcd98bd025da0a599a236e047e59fe066875de076c6f9cec3a52cd267da488bc7590da9025e6f06e76d06fef3ffe84cf1efd6f9a3a1c4ed16a69e5bbb23fb9d044e94af679d5b2f87d2946758cf9f5c1af44d5e0fe834dd980cde56c72eab5b150ad52882fa3435d4fc9faa22c94acab89ef3d49ace3599be09d64b390c66d23121ec90849cf77068a0f1b06663b630e3b3d62ffdbe9ed1c0c923207fd6bbb21030d8dc07470a9832cba948cf889571de1838fd32c776253530d4fcb38c26299b28c71e5a50607e451d4ca8c6bb2dba5d0c464ab92c812a3c258e7f502d59c9670ccc18f403a53086299f6e716667a4688e854c2c7960d00c081dff4d480d0e5338307ff89555c3992f2aa9c448b53b371a8da8ff195fd1079aba1086de237c2057cae84fc981fc6082ca65948578ca371bf5cce12b927096b3b477e2dc21857d9a2b1a8539bfa2e4a8d294d3286c404229f7d24414edb5d718d31f3fe0c1f477b470d4854542ac331c817cbd38439a876c6381ad7ae234c885d4cef11188990e9db97cb6ce012d48d28601be15f1c8848df7d8b0839868091647a65dbca021d0b20126ad790e0b69eb5a301a8a74db2623c93993a2bc8fa0f668bf0632059c5851114275ef52b5a16fc4bc598f70297fa5f1664cd6b8864e3c0c980c76ec1808c045fe23dd8bab7e2ca9f5b7b49ae797a8285b3e81faf98409ab681c0aeb7d401ab84411520afc06f1428a94d5dc10d3d07071a8fa92cbeeb25f27114bfe93465df77ebc7db528fdf116cc43eeea3214d42cc3fdd83b0675962455bd43364f7cc5c5815babb6f4764227ba839b9d107f31f0aac4f6100bcdb055b5c9c20c7a6fec11f554c9a5c2588d272703976fe7ad1ca960f9fb451ac75262c4e3cc6304704607ff1b400680268c455bf9bd5912cb9c0fe7f249d096a63d406f1c5bba8faaf92cabc591d4726bdfb69ed15404e7df8745ac28761e0ccd85a5872d631bb68c557ddf164441e8d70341771a0c6a02da2ff06ca1fae3c08130cc193073c0fce7bb240bba88581b9c3441e2d22acaccc4aa0ea48e82b5e285bd46fe02bf5b7ce863d3d06d297360f46dffdc3e256d0b349349b2122c564a8881751b70fbadb72352b7778bc2417a14be9a47b2b3d96a47c9aee5ae590413286f8cb93f24eb1b38a11fae92bc0f1743e0ec5e5663f138def4bd8d3944a04b24f7530aa5fdd26cd8adf165f425f9597598e984a087494acd7a1d59659ad285956127c2a11a0a5e2a91efe1d417c1e87485c5ac16aaaf36a10c04c78c8c5e94ea7f220116995a9ecd5ead2b000f9a97edfa9030d5801bdf5774e6cf7806ecf409f668bf187a725aad4a4c64c5b869146add7d51fab58919ae0ac1527797ad576d1cc450651dcd0b3d11c049acefecbf0195c22d10d944e7403665e0d0a1b0922a2e04e538cab5ea939986d118cfa39e5d8770ed115ba6d9df0061a57f0454e6f94539b18f2e712188c9bf6192c48a736a40b783c87a57b0b78a499d7828b809f32dba970e9d08d938eb325ab8b6f9dce8bfe25b9309eed588449b8ed73a8522ad0e4df1b8990435a0429687b03ee0782e8118b84fdbef40a01e5d0814af21d010cf89c0281cbe21d01a70ad2192f739a7df1357ddf6ac617ff5a23e245c1771b3d4c9926aaca36b9c3864b86ba40a9f46fa94476835468a83f891528c362bd006b7ae8125c27ddf8bd0f0d4e20ddfb6666603720ab8983de7522d0a6abd0088502d5bb4609888bbebab720880f29daa56fad381561938abb20b86fd04fce7b113e97a8c7b2d428e58ea13bc6826c2fda4ca6304a3339303443bfc9425e7e540667f999d5f786c0e6883cd9f08e9eda57de6de3cc04f4b2fb9a6ba35164a20bc39051f759bbe19eb83fd58f00296fe79a0794c9549be47706162e94d1545310058bd5d89e7cbc58bdf278b3ca74ac51dfd918a4c1f3761b51237c3566f684bf8e2196fc6fb56b590775e40f967c7617fc6d1006fe247936ae7b4451add7cdbcd9f9339c4abf44e3e48cc40226af0bbbb9e7acbc298d71dddc0f496ea8a31f9b201afd4d485c75ce1a204899b2ab8f00e602f195f3ebc515603d0df63f0e233b72299b4b4dc385346bffd1de9926111d1cf9d63d6d2a13b56b005135223bc00cd9c67e55f21d2f58ce0b19a6f7545e4f414613be236819d72fd66a937d4362c12016a178daef09bf6ec64e6c36c0843d98cd194060a6112839b9982872cb05837f30d29427e85fd48766c02985916e3ddf326203942f56c598906d54471a55f405eba2a48212b965ebf2c8c181e4a5d504413866ad11b584d30b785dbc7b81ebf3e1ab333984725f8d801b5b3b820547aca59f5d2657226a5f469e908f3e8dbcabb978fa140b640e6498b48fc4706035c4283e4fcfdb0c43c76af162ee3ac34710bbd1274658f6a8ad0512d8152c9958a2748349a1280c3b768662c3ebc84b1a33e1a1aa6331e9bc1043021e98246e0316e39d2df4ca11bde00cd10af0ff074717c67f67fd8ba9173237d97990adf2c1664dbe6f7855b0ab467bbb46fb303c3c34cd24bbc0ba685222aa0375ac30add4ab56211cdd0e54f61b1cfca23f02ee63bc8a659fdf7c93b851a96260292e0ffc128429c47baf92e2963e04794797bd54a5f8fdc81fc24aac12a33dbc48b92d024051011d6081a3436dab03ce8f2da4ceb28fd0d75653e3ea1d4dad12925a8b4fa25fdad6322f04cbbdcd47591f425a76205e41c87bd67fa632145c588274f2bc647c4f97be2a697f609213dedd521c6b1f81c14d6a6f4a32644e7ba8a6fc5ec27881ba185e8eb132d0b6e50bb927c70ff54ff7d02b9321fda27bea194433823dba6ddd25d304229fa40bc48184bdc4e12fe3f8bfd721ac2ed50a8c92e363ca9d11aa9d4ceec7f012983401165c6c02f5a4f66c3b79a4f63dfb41dc16772f452489b700eda33014f304ec19e32dd1101af8b1d4ab56355e7ce87a5b04b263f135b143ca01d476f209c35563170d77bdd08e2820e87952914f09726d7b4e6cbca4d21162307a9b8183e85a64bc86193c35fbb00a13dcf091b476d45936994d8379e75abbaceb7edb46d52bb3e993f52d93f71213f64a9dca8d5110b9ec5eb2aca9db087c0a96924571402300aea085f7adb8dcc8940632908b71618bd3c9a13d55d71e2e88abfcf11f70797a98e91637211bf2963994c7d8535cf185a68c6a5623b05f541859620361aff2c4874abf19c5af2e92850781f6e6a084853f2045b9ca949222131d4e2d9fd66a48eb04d94c6e9a5639c4481a3d3e9a6e90484567536534359d9ec5ba4c9406a70ff07210d93d30dd79952d7c66a37cafe557e2a0ceb60f920b6b319135b8a938471ce4a5f8f693cdc05cd4928eeb476810fb0722ca90e51323427ba4f416e6978e62b3c5a80dae401ed6be18f72831abef0f870868c7f00f92939e6f1fde73bbbd5afe4ca98ec52bb6ecfeef53cc1f2c5d257b33e15ab53c2203a0c220285a6106a07a3e9c26f2a95c2e80a5f81fd6c3b8a1aa83c053a1631af59eda99363c17481b132cb82ed215e011e3fb66916cd22a776c9c78009f67b300fbd446fa55336bf5ae641365ff7af41870951f1c1a58f894015d63d9178042b79a3545867493889d7a15ed5ca9812a7cda4654851f224fa261e32b39a3eb2f9461fbc142d1c6320ad399833193b20fdde5fd7ffd45271efd4cb8a8b2dae903d7e6344021e04cbb55513a5c7eed7a610660e05b640b65c54a3f2e67a3fd5f4e78a2eaaf9d3e2cc41018fc8505ef12cfc9249e22f3215d80d713327f0af89fbaff0d7f7fc68fab6dda581f5d647e7a85543fa3b835fc8a408d071c241af21c662c835d7796a0e613dc477cd983b818bf06c5080213b0263c99d8e4127851e8f3b75bd09153220cc0b1022a8cf197d266c89f6a5b5b4256b66413e14c27f4452b355d203f8fe110c09a483495122ed0d306221586039ab33855b598409f8c0ff7df70adf490f573d39b515f70f342873a4e13039d0b72d2af94960971d706d8be36786fe6b8a547ca6cbf3c3dbccbca3e66c1b63a42d28263b0fec58f6e373b19f1850124ab93ca613fa57640171f5e85747875206cfd3c3a5979844445965101323221b73602c2710e4122603a2ba71fa7acee4d688286aaf340dd8b5941f0b0318a0c1f06a66ac8d7a892175012d526635afaa79a61644db53a9a8c6430dae78976d5ec09bd4bf15eb16092f0501d35eeb2bfd90b0af200db08d1dd32ecf2c6078594dd8963be09874a8c628d230c39874f9e0ea377dfc7971f291d2fe3a85a96ce2809118e394adb6d8788b681675bced36459cdcc90c3354cc00fda22e6f131b63bf607d8d6d4e95061d0f291f2e8970f363203c9e0ee440c9bea3b7a025111040670c0773fffff55148b107a663083c3ad5f07f90e04ed33f83c253e1275bb636777391771579bd36050d1cf917d8ab021ebbf0f925a7eaa94d15c39cb382c1c7411bb88b8571ccac2e83c72bad8cbcdbfe0c75f01dfbf7c8de34ca13a8936be540d45eb710c866d55ae5af64fc958d89dc3838f2a2bf4cd009166c21e995e60d3a23ff6fed38182784ba4fac69dea3da630a22b4f85976be28fd76ffa8a870cffaff6e98ae66754f00e0756678a9e829412130549fae57e453def68d37e9c7764e7de87abcf450f7a1d36a1218b8dcec495b9e1435ce8713a70c8ea35915aa0b35ebee76e4dbbfd7277b88ecf9a22c246e87706f053c324304620c0c56fdb11fd797043d1e2f7b339bec7faad44974e53acc2e5d1586123aeee88db238721e7c7e8663681fb3529238213c6fa7e1e3331e124c1307951fe8411c37e1df085eb3a7f014f503a055ea428cd1631b0060c64c34219ccd086b1c2fa8cd1ce2609481789b71d2f73fef0249f02b7e808869efdaff31bcf805e5c1240a40c60209f1e67d9843e4f21ef7fba9848642a8a76fdb13f189268031e9bc2bd714edf85c3c42f090073e6734fa964f18864e26718b1f172d8f871ea5005e619a1157ce92c720e5b048383389306ea09c3771cd4fc0672190bf0619d46764efd6236d32ee084841f804dfa123d4bb91783cf51642e7ece9a7486cefd93486d3b32c8837ce152fead1ba99fd00e00fb82a5a8f707930b32ac2c8d5d3d734f5c17a327129ab086f07f76c5f1fdda3b0c311fb8b01c497a76fc9fadeb45f841705628873b0f1ce057dd6628a54bbff571e0ec0cc037f5c09fec90a5ae4b98e6b1edfc3cea0d0b7012245dadcc344f23f4291e04f95e7e44a981f39578b14ab689845717ace75a8667c0eed68dc66bef805deeff3908854040bd2af8350551eb6d6a0eb0879786377dff0257ba92345b2d1339a43c39cccd2208cf2469e74901e483845554a5b8fb6f172616397a145618caed2aeceedac5ccd4d5b72eae129f475d2651baff7590018e0e7882522aeed2a5ce1554f4c8908fa86e35dac6c043868d4588842e7c6bcdfddeb522b975c2f6194ce9404d7caa53499b4b6f52ee6e9d83bd4615124c841cdbc16f6c80437057b72b0da72bce3f9fadd4169b3edc6d3367bc0ad6a50bd1d9ee0b76cf12fe55db73d826519f7f07d900c7e4b740de34304c877ee6194096ad939ec427234cbf6de890802d3881faa6f9ce3ee55226701d8ccf812979f6c58740a681aaded9011f2c0fe6f3079c87fc7002f05024c97d3d1eb1760c60790c7f02f828b3c5ff60015aa0b5d0d7292e1d60982cac045458070b21c5eaa51697e6d44e2d197c2c5bc3db1d13869acd0e6adc3e04e4c3a34ea5d12a6a609b8c40dd7f12fb0ecf27c408b6ac8aa88aa89a1c53a750746ab392d0db3852557f3f40d59cc466abd4c2e818c385e8734974748c8c144c9107c98b22622de4dba98977845309ea20752f8ed6825aa61617c313897358c8f070b0cc46f1ac1f3ce5d05189d74ec69d870f0085936ead430463d2bd0c224562f18797d4bb455e52088469182fd9f3885e66aa6003334568cf98a1eb9b2c4f38cc342e11629fbf5b1fb1d6135b2d809013926229523d5b8309e7a354f2a52e357bb1a5309ec356f7a3d635883951b29ae891a343827673a2db394653f423b54feb2971546af6ece1fa96065a7a7e6e971737fd514e428d4b95197ecc6be80b512e97da541a9305b171ff6a657699569635e3c6d281fafd056535093d9fd91d480ecfe0b97d5869d635bf9bbd953172d3b0c93a3310f314b78c8793043cdb92773992fbebf77e6360dce5d2d77451856336531ae87d05403ec381193c818854826017c888bdd04c4453fba7c0c19ee7e96f981f1efe0580a4952fcf7f1e71b6fe1bd41414bff1042a34919308eec9bc3c8f1583c8e5423d2d0e55ab9d82e47fd47290e6a84567d777c6ca1f2da76e2f244bbde73c299f2658c7064582d3f0b423db38106d76c00f27a21bc2d3a0615e1ef4f3c947b31043bfe9d32718064fb2ce212335ab7da6770a6a5ef43ae596790594738adb00f81d485cb8873051cb94002f2c89359d1132df0f077ac600981bd4d19ff4a9192760a194011577d29b45ffc2ef9a0eb637e23d561f9db75145c19230820825fb05160b1b6685a3a5c617022e9ff10c7c09c64a73385260b079f3a1b630d099a06425da718f427c8ba021c8d963f6156e9d4d44b58d71e810d54461f0fd089c2bd0c5c66768264bd2356284b051ade347efcf376963a24b6a08c59fe9189a7690c4b9e74314f4db83983d3a6cf56698ba7affa8a6076938369344ddda445fe44ea20afc88b876ec71f0acd164ad13fc42d37c4dd308ca0ee40183a98bc60d4d7b8e865382c5e699886415c1e93ca05c359880b97278e657db80187256ea8c1958965dc835bbd5ab886768a06c6d7c9a5dd8cc76817480ec51039f033c09ad7bfad02bfa4c2918a715df619b498faa58c398f478f21633386e9fac99b2e21c33d3764c82e96a2e2d88d25d020e5c847c35fe0d7dbb6b8dce96a3b3160f63f184a3ed65549234f21b2ceb42840ddbc328466ad1b1eac2145bacd3832fc0f76d4aec6a4dc34ddbcf33917f190977f4e404a01a18d151443e0a798d0ae74041f801766d8cba05bcb1e80bf6385128469232466b1567651b77090e291edb56f4a1dd70b878c0362c6986fc0b072ce8e93953b20230fe58c969cb138629a020a270bfb4a4441f1b1a1c045e264b21f283167acb2f66e95944b91f1dab81baba5682da69b43dc19dc32531bc0232bf4f806b71b815c4eec2b2538bd546c26bdf0c204545e054af043be57305c19251d9145062bf709f7a99cd26d6d898d74ced7e98b284dd2dab4365d66a6719e67b8c362f4f111e82d18021df37eadd611d83f865a040300031db3a3a628fb3f9b6861b05b03b5b6bf5b238410b2f7de7b4bb903d60b040cc10b87b788a067bbe9a067dafcb6d606adcf6c63d1d9fae08b443e9a520aa314d7e22cdeaaaa2ecbaf42d6e78c4c4f4fe78ecb4e7b3dde92196637ea70f213d2b2acabaaaa339fabe3682322776f2a7c6338ef2ce452e6eb56c639d6ad5bb7b435cab9278c40eb894c00e183f0f1971109e1f5047ce23d5e3715a635ca0d43cec9d0d6b90f0b662ca8e428114135541f68a54229b11ada638c4b3001e4653faaccba1e3f75632a5840e68d37beb21eb006d49e66a3a6a34387fb628410c2f8a3230b6aff47ffd003cce6a894aebb392a4c857d5efb5c1b366a50a11279ea66a212dd144b74e0df612c7e97e9050b75e91987ca39e1a4943295e7e07390cabcb3c68cf1d04db94da4b5771d837ff23fae0be91966a11bd19a65413b446b166545de82316a733ed23b6a2b4ae365a4350863fc848f7eba30161bebf4897a54eb34913e6da59b3195381fa3a89b03bad64b19b552ad6f944340f5a821e5ee0449cb3e3eecc3545e8c4f73bf7fae7e41822a9c5cd1754faa60721d8be5620eaa9377f110ca5f1704a50e2cce9a02b95d99b8ed5cd3269c3929a3055dc640380fe10820271100baafca038e88001010929ed6de7bec43fd2d51edd847d33e2f864fb98fdc47a9e7d3937b62474c6d048382c2762e068419c1a0f831613b404156b699aea38f89cb3f7e985e85ee87a929c741b2911d2397a53002b3f5cfe5176b50e34e6b7c84755e0c774fcfcecea3b67b5ef62a736fe7dcb573378ab21cc6e3a2ded9bbcbe8ebcbc8bda4b838da7a179dd7134ca3a17519f9e1e884452f33daaf2f29fd1f97904b6392dac7f1fac7c547e4a4417dd208904753846c99bd8847c35382289ef2685a4707867cebcc4849a12829575894a294945b15b91415ddb4335a05d3a0165e77e7eae11903fab20d08a52c28e1d51aa4efc1d71e0881931024b935284af42adbae5b9dfec56c0c39caa056df7e45179ba26c835b8ddbef72988e595574a3af4c45bf585844221ed6153596237afc3c4c6b4fabf0510695fa563b00e59282028169b0642640c09196e326af7293274d6059ee72dc6c41784b64f5d5774218b3207c5f6f7711c2fdfdc67d87990f675d74dcdcf79bebfedc16d849758e9dab79690822ba34c6a0ba3ba0cb17da18e9f341900c801c8b256f8972e0e7e7fb1cef380ed712f1a572e3eba283ef9ec38fd9ba2801af7b10d175b6fa908ba371345b25f8c63b8be35594cb0e786985f08dd6c7b3b65760110101c72147cc8908e0207870d0c9e104cdf13b988d8a79c639ac96b2caa3e91eca52bb2d76711da484504209b3839453c6d562d139371d1e21b45a5c3199cbf1cce510408efc3bc608a30ce9c4fa989f71197f97487035312e981b0484031708e5279c7119395c6697bf41952be3f02e4e063fd749e1ba273d565c7bcd2c3e860c7bc59859c6977b07e301736995387d868df8487afc0c0c87748b142357b95b3ce956d424cce8e8a42863cce01c0378f3e870182f301e3039e460076085f08569d14273c56444388700ac13cf11f3674e9872c4d828e22d99ab7b1e0d6c42f5bb872e7132b049a944513af7d1a04d0289a0480b8c473fea50448ab4603bfaf12ea895171ff0517e877321c285ef08d3011fa1a341d615f42e2cc423004c88bed2fef043bc7332f215c391af246a014042a1322e33981b835e6632468f91c9eca53519f40727130fe3c2b8cc7a07e3213fed0c2644b4dd4768002043468c2a820ec78bf1cea43ae91310fb0821c1d5d83f384302d5198f331e6f154046163fe3d72ac0252393f133b2e368be198c374f9f361d0ef397c3a30cebb20300d7e13a1c00674c08e8a3c363000210434a19b7534aed17c663c665c4c86e613c72b89c30c7f1b40058971d3a1c000780f50193830ed6477621ecd3276b370997f46986f521e14f9f32fa2c0a214a39e470c6725c9480f2307709c2d75d09788304115d68679cc27864975609bef614e321e3d02ac1d7d92d3e46e7e023c685f095f192f5616d662d1fe08f1a0ecbe1384417d4ad7780fa34c36eee2f7f973e9c84d2a718f6adc11d2e3a9c35c15b36ae1cb09ce6e923a5d6e05f5cb2da1a0cd35f58d89ae9f17d32d98bc68d3adc18a3e54a20ec462b1c8d17637ccb1d96e3e025811e0d57a95c64eeb6c8b6be2da56ca3516c2dbd43596c155941973ce8d1d0285cccfb936b2ac27d3fb8ef56d07d9505b2e202b5e6a4b547e337f9a4e8136dad09659bd60682d9cbadf12ec638278c90dae91891871d58f1ce49f9a386bb17a5b59ee10f1e8ddbe8ff1a45dc1f35aefcdfaf8ee1cb6eb42da6a68457026d6c41a5310d126e97a3e9265b37a94dba0ab70f81224e6c299ae67aa9db4272fb1d233b663693db10a8488dd8452010107422a704c1292d8324157d8af4e95c1c2d67471a48d14f63d355f9453331bf8e3d51ac89511b842d58bd006596d63b605a13d94ba34f8950a8c60f083002891f4b10d941e2c304288a94be4f6b6c078cdd4a1a3751b757e75b55cf923b5f9d31223870ab6b7d9aefaadad1afeca6045fabba1cdb703d431b84af631822221fafa4c89bfb8a445a278713cf11c59cf492945673c23967e6639e52a8f509c27be1b4416edc798bea5c0a74a90dc240777e5aad4f7c35aed2cf3a432cf228a800bed7cc0ceb7b2f63d8dd6c5dadb5c610dc931854e9ee6ebb1571dddda51b7d10f98d89eb947841af519acb62ec40dd287677d651d569459dde651b0c42593e8ee7824cab045edad7706f27a116ac02c4642faa88552cb74edd05095d945567c97a846ef565daa11265413678b71a0a852c06aeeaf4d8f52b243abca22c08653d5455160358f5cb3aa76d960d525925d18a003ecaf03df9f8d804fc569ba8ae09691d43e62a12b11c8c6bed0d31694145bc07ad09f240761b901b1d1337da6882bab92a4098e8135f38df4edd1c103c8e27e36bb4e6a2a53a60087240400e5e4c03ba0cba5a6dcc5c5087e0118abab9a0ed08184518d1a747ab65c209fdc1c5f09d847d37e5fdc08ad148f3e34b91bae844ad3d658c013bd78db9fa68dc7335d8392c04717867f1097ed4c43617d370f53e98a782078300beb14885e7c7dc0c9b0732e8b9f1fdebddb94bdbdd8c0258bb1d2b80ef158bd4eeee3337c7d8af2180e953bca41375fb33c39452c66c5ece29dfeb145891487577d3d9e8e1baa93a547e82e560b61774f9556e8fd658e45cb81fe16af83a7785eba8c8c40413770e0a43b1464c96526bd6b9a7358d377abd9fc8a0ca13194cb9bfd7f5bea65043921b9154cbc51754f8539bdf519aa6e57c667ef75d166a57e9abdbba2c252dc7d11106b5c5b7c7c383a44fee3e16b89a87c49a76e3edf55816f7b4bca94c456b3adc9bdac226890ba1d7fa563af358eee1d1815bbaa55b6cb5dd6092a0ce771ecbb62b9bb7ae6f5d8547762ffba4a8127ad62df7b843db1025a23f9e4723b20d8599a158509c0c1ffe54167a85ba392aee5b437135d7b97e9b6155abca63c928162a767e40cfc983d22786d21a29ab988a66292c96a3b4c60dc5d5744edfab4a3f74d77ddabf6e672d1ecaaaccb80ce5f16c10e8b6d818a7bbcf3ca552c99e6b8886aceeeb3af3f0bd7218496b3ca18c5237e6793c6cd31eb8fc87a44f578843f60095b2dbbb4af0bdae4b498b0fec4278cb7cf4af2b88883ac588e85f36085fec54b6b1142eb314d11505bba94ab58ea37bfc7035476816c4505a832c2fad7195b6d257d886ad308dca41ad51415f446b01d80240992e552f758612c5d584ce7f3c8fa6a1bc18fe46b947c992ecc8be609b28dc7ef551f684277d1733323ab818d1b9058b8532e4a76f61d7110fe813d542dd188a8bd2278bb668f9d6442ebbf314ce6602ec0467058bd1c6503627c5056943b095cb566471b719b7efc2d1e078cf4d77c2448e46f47edf6d7ddb1ad19aa36cdfb5c86cb81f1c0ea7f55bb21fb2209cf60012bdc2694199731a7539ad8f65d4d198dc046a98b4d976ab711d117dcb7a64a894bdec36e45ab7ac839261ee5a9fa27cfc0e5bbcf11c870baf8cc230ec8e3a96f5b86e515990ebc24e6541ae0b623ce6752c64c4ed1ef4ee5afd07a1f4baae77865d9675e9e1092e9fca928897c2cd42b7c37541d7e520032004cb05e588023e095430b9395c97042a76b2f923aedc8a704132ebf16ebdf7a4dd2007802e3f3e68b7c669fb9bda988e97042a746ef3e03fcbce65717b08112b7ea06e30b73f5037e8b2c86ad8f040751f32f991c1b90c83e1d05185e1b4b8328a19c6e90b17182e2318c7b01dd332469dc46c61392e950be5d262b71f1745e70c5100c0704898e57a1dc7839185ee827416167ac16a19abbf4efaf52284c11776e3c718e780e1906a1d55be42a7a18f2ec6b26dc8c5b051c6b552a119b2fc04d3b8442df8098be15c98c370443791a8434737470515573eca8b39ba6555a3cf193a8964dda4301ed7e9f50446224d5268846d422629c4261724d2b444d463c7d134b3ac4b924627d1d7fba6a885298ae5b09ce49c0f42ced3b718cdd0b12cf46bce9169d4029bd88b63a6f917d8e89a133b868d4cbf5cfcbae6f5c2ee98a3cbba5c0f9d34e7247d34226d97914b3a4b46b19c17d8e78bd074d960f818bd78c4785c77de25341a85e68b9009c3215dd7a52364a929139d741696ded9113285cc11edd16864e76be9a33b2c6477d4d2a874ec24acc5372e72492396339633ba8f1abaa3b7d48b2acb28849d4422fdc27048a58cef1c8d3e1a95182b9546a349c24e4717b1b0f0107d741c3d45a3fba8c7e67cad1f8d4a27657c73483a4825d2e1e149d728138d58ec0697b833fb715d91bd2c1c41f409bbbc9ec0c142198ed6a495542523843b30b501eec01db81377820e25ee6c36dece4edc793b728747f1e6093f8f4912262fc7dd7aa30fe48db6d6d6208cdc91468ed1c61ed43e1f0a7cd4c1c714b05a825417650646eef55fcbd1d418bbbbbbb3203a742c143a8e7e9362b6c87384ac7b312e4728082254f81a4744f7a487e7c63fa0cf9d82bab9294844ae5151afd2daf4824d833dd23e598f5775d9cdb2f4465a29bbd5585fcc19ea56a311adc51f51c4e393da3d84f62c82e5ae25a2aa60420f9378754cbcfbc4846852e1e599594e7a27ebc4244bca92b9b9bb07d3c62054da5a1f1601c618e391b0cf9d0870f7ca9d44776771a7d0dd4deed472f71777a26123dfd77d3a9b993beaba879c8d8ccca76d7136fccdc5e90ec341d21aec7167ac3f4ca76cd2c9f3a0d0c82016adc1b7c08732d805a7c18b328805d6e00990412a380d7ee60a9706bc4ca5011f864b035e6653703234e0ad965912a7f7f0992c09f9025c264b829e877396443c69ce394f99907a6b5c6642ea2d9d6642ea35c06326a4de163636e7cce68ce1d45c2633d5d7d3a778ba44e69be94eb6744992d6a00b4965240fd3244dc339e0e9921e37e37baea8cc732192d743791ecd83529bd0cf6f53f23c1aca23e2893fad31696dca6d71caf32a0a3d66141bea27874ace95e21b9c96045713e7e1290f896da68d5798063ce92127aad10d4e06de74abe1831086aca8536f8ea31f69cf8b814da87ca7a8f473de9c33c6706edcbaa907b8c3707e9879b40102889a1b206a6ecc29c373b28c0c4f021ce0003537376a8000c2c6e6c6672e6d6ed85404b0b1b96143e549a6e22180cd6f6c6ed8d8d8d8d818c0c6c600363737363636d90d03645b11f7e604c83620f7e63384e11ca0fbc62d6bde90376e64540fd90fe5d3a71b3758def8cdad9b8cea898f376092d6e06fb06b4aafd6e48d8c6f9c487efa245345a15349fad4835502de7978aaa74f3787a77c6e647c6f6e7e73730cc3b989998c0c73e6b42e3a643e2ff32177d24927a54cef7e865c191924b367faf40972e52d528957e079b01ba505b011a88635452a585481341eaf8853fa94041b6c63e3f05109ee04c4e16313f85473f82805770ae2f0514a9f6e1c3e5ad1271f68be514c703634a76f150a6c733a9cf9e62256c1d9cc1c2aa98ea37dc880c8680c9c065f93511bb0061f4446a3701afce9748a03a6014f03e394068e06bc0d0a0327034f91300df81b3396f2c0252124e6f4078e067432f33bdc6142ccb8334e667e0033f302b8c384887167e68b4b8c0b0c0dc68b00bc3001c0e44207172d605ab4e4d0527232f3a199797b870941ba33f3d9ccfc679cccfcc96ea52a9a210ac9086131b04b74592f56e564e65d66e661dc6142507766dec5ccfc8b29ab99f98dba3315c6c0d5bc070357d3fd0257c333a748e08c9d3d13496b408f06febc18784a6b853f3c3ea8f1e749a561378e529680538a1481541e8d08588e90c2c303ab402bf0f04ad489449cab2da6dbe2a4382adfb8c837e6b9de19ea06653212867373cb25a05a41444f9f7c780e226e3c0271ba05f17b6a371c7652c9e3f468b75a5df85386ca0c89332cf31cbecc0cfc29db646e63e3860ff240d45cdeda61e3f232d906e4ca5897197a99b9cc7c5e9ebed1eb3263851872673ecf97b935433393b9e898f9e939333fd1ccfcf4d38c95c936991fe0106208e01bc46d5821b09e2fb10404f19919c436cf56471067eb2388cf581f405c0a81d30a8137084b81b8cd1db6a3e6f240e4b042debdf16b210e2be45d1f3e7d78fc0dbbf1f5c1876cebc08df234f2a94cf4217e462b63b77921efbe9e1b3a5b07354e24f3064909d311ed4ccd67667e23810ca1766313a6237ee638de011e6906b11dd4a58718ce0dcba5cce964377a274be63a66c6c8d88d5e7980cfec363e6e3ef3c676d47ce68ce9b8f98c4cc6bfc9b621f7e65663091872657848f9f9c956e6869e32217d67321ff433b74e9f199f661bbb2b73ab2f19fefc3cdb9395f945b399df64eeced04d08bc336f04b82bcf77c875d1314f9f334fe7656eecd6813b739bdb9cefcd8cbdf94d56f3b815716d7e806c03726d66fde1f007a804df9a5b56cb55f318a1d4b92171379b973022f8d6d41c47db64112883d2a71abbf1ad39743597b92593452023d49a6f51e63276734cfa923995a235194b9be44427adc1d79c63e9a24dfab4993021e2a914b409e5e9936b8ae1c4d339e7e38c934e9e399d68666c444b7b7c38654299b406f9fa6083f23c9a4963375aabe9373a01ea93cce12394d3650efb347319191c197b801affe21b72ad985dc0747dc4cbfc9439171df117305d1f7c99c7c9e4c20fb9a76c2673adcdbcab6713183c7d72349bc9b61f97a454c83cd1ccdca2734e49a59ca774cee9120fefcc69ac4b3cbdf3645d662c4f127032799389a469e29517c363b71fa60d668709fc36975c99492e9c3c3c177eb44d1eca439130a16ef0490c98dc0dfe5c7848057722c0e121161876c1412a5804b14d0f8787537035350e0fade06c0a7078b805b6e1e1f0100cce8674f80d5ec1000fbaf01b0cc385874cfab43d28f0a7870c09a6e1d870fb06a8224352c3edf39099e1f60b1006e76468642134dcbec88de1f609e0be70fb2fa86a2f06de3a134dd87831f04db1ce04cb9b3099446021e0c5c047854895478dc0231009cbab6fd4c4f2cd86c6e2a084309cc8d9e3c95ecf9547d33c2f06de542ba5941a91328b4564e4e765ce773c2f231323a5acb8db9494a28269449ecfbabc25f001b506bf43b651225cf801641b1dc2851740b651215cf8986c9ba1659b8c18db8b0ed9e602936d3072c8b61736db5c6c2d9e6d2d33b28d2423db4631b28de525db442ed916ba1be5d9b0bb519ecd324d9e0bef22dbae16d936eff6a0442317be942531e149591213fef9c8c3bf1fa03eb14f09fef1f46984a41ba842812228f21c2c52a404b19c09eb4d709326226061a209a6f2622a2a6da56928cf0673b76eb23516d56eb4b32042799e11be6e8a2547ee4679acfb60d6fac6522ae8725cd6622a1565a3d828cf851f82073b774e4a4d548c34a3aa90482e2fa15ea17e0c1087c45881291c84efdd3d6e0343666adf0fea3b44c2c9bc7e4a2033f399e5e7a56c188de130476c8821459e435222d4f7ae252b2ebce985a30a2cd49c58ee5aa2f9a800c737a73f75f4a7fcf5042fc17234f5c90c76ae7b32039d1ad73da1020b2655a47bcffd3aa68f26c6c5c0d71857800b7d70268704e7eca374de2a224eedd114e162e035a749ea838a498c494737ed465d6bf44a9a5d6d5dec417da75688871584aea67a3ce4135f7c828f30ce2cc6281fad2a0b028488aa8a55165f451e5912f102e91e968fb4d6d56575190f63f77b6f62f456578d065773bdab07115deb54c697c28890af28ab6a2a58506d454fa9ae2a6da54fee4e34b89a20a26ba54f1bdb8dbb8aab3992d67a5a6b1f25f8b2e524ad41e661276ad5de7bf449be35ed37996a45a2b51de85460508115dcfc8596b736217ddd4bd775cebaabf9ba2ab618c3a9aa4c0975c7574194233fd74539d263ea9312eaf12fd525a56496580effa652538e28e6dd0f22e28e78f9f1d2ecb4cf1d311dfcc672f892e3950f5d331342be6dec4b46ba04111531acb6ca0a692bd2ea96f5513d9e5a4a29a494b288afd5b76e84db6ed43aa54f501cee98c18b5abedef1892a2331da8b7efb7145ae5cae51d4eb1bffc42bc24022de82968c4c3a265e8acb4e6e8c7223ffb416e3af9a5156eaadcef83647e14629a5e41f1713a58c32ca28a3b421a594da839152da06aada92c1aaaca9be3729df072da5f4f5b51e337a2d091fa41042ebf190080929a5a88090a92a2a2c877af05152e473ef59ea30a3dfe0936fbe8a4b080f28292977329cae0acb9979079c7f33bef7282ad8067eda08e1462396530fad0f78eb5485a7a4f749a2f3213ba2f0955645ae05b3e8ae943283972d4b5d91bdd05932d1afec0a7a45f7e5e7f93a3f8b4a3a7f3dcbba58878f5415f4f531befba06fbeda8d8bf8c08ea10f59cc5255b0cda3aaa0aab8a47cf13eaa0ab6d99e8fbbe2b92be4f379eff1c553e773fb11966063910403cbc16cdc33ef6e847362441149ea034a70c5bb6292faa3b5e61dc877c60bb3ea73a3f430aba5d6a415ad652931d47924ec045a73d8f50389b61ed027fa7e381ec53a3ee06736a57cbcb2bb74bb2317ea33a269dcbb65a25a1221667ce9bdae5b3241ead8d36161961d222d5505d3787f54159414b6f8d5c0825525128944a24afe55555555f59b0a4dadc17a29a9c7d1a2bab58e4e7c7529a328eb23d576911703b1ac756aa494522a69eb00d5b83132d00bc1582191d6600d91e8528642a1504894fda8d1446c64416d9d26d2340d541dfed0c30e302f94bd80688d1a9a0664f9e7a7a70933e9133c4bd127c7f362a76247c33a355450b7d6d1a9ad15619b12d38097af7492f489c2b3ce13cd9c87a08875ea85344d3d3c909a555fa24f128a4298b49b6597b040b02a5489aa0ac85ba24f67a8442a650b660741723ab690bb55ff71dd76d2270945f23156d9558a9929da4b14a1ac24d0b42eb2a28baa985d46dc10392b292b29638c22d145d6e56a0d86ec36e486607eae8c3e9ad6895154ebfcd3a722174628d48d5e08431e893ec947199b48c7c01b81728f045d88444aeb6c7dd52aabaa2a83ad412231601d930ed4a941298d3146a83d989729523a1b3fb4264fb750377aa594df1c141b574e227308204296d8213f440f4c435ececb27e5569da426f91ea494a72be99450059683b9686c9c7fc40fb0afea0ce4d1541601ce32fce6aef098ed6662e7648008a152371b43ec80d1e16c6010e06a22956ad276b0dc14187785cbbff22a97a95cce023c62e7758c8205a1dd8440ec165f913acd62282404f60a5eefd72f7b9dfb5a95ddee98b7fa18e3ea75f1d53702cbd1d48d8944e7d0301d90570fe99968c2a267027b13550494892670bc1878ba83937251d1daf8e13aecd621865db608cb5579315cc4e3f7deeb1d087b52e15dfa907771e55bc7c5b83b840c42e062dcdd4443f45c7131f2fcd2505d5c772dc09b8bfbac0a2c07b34da0dba3b5e77a0af4894b68800a275438f101a31e89d48da1cf8b796aa8a55a973c1fbe8d4b65c4309c6e35d40b5aa9f41b753da8d48894be35fa9bda6c1ffc813eadbd255e0cf479349cc385815970df99678947137d4cef39c199b283fb1e7d6210cc2836d4bf203ea4fcacf036918b6d061c81d35afe95c0c5bc0d16d960910d5a0b9f8838b8ef2c246621c9b7fc79314fc6292a3c65396338a35b37b5c55af20088e19860f45ff4e34f9ffabd887186f1967138c3c5c69fd61e470c42685da41562488b5c72e42b51f54a36966dd5590ee345bc8c51ac8f51f47e25ba7cc4841872459717855c74888e3d47742c243a764cb4556f2167bc5aca4a653b2596801917dda20e5380b49495963b4cc78c4beb63c645d6878c4721f0ceb050c68ed1a38c18fcf8e2fc02c68b1711c20a5a0921c79f18fb6ca3cf92cea229464c475bd1c8c46308b41b53988ebee8385e8b37cc704cf709611c13c26c8bb3e92c125a1fa691e9a22a9a4c558cd1caca84653eb0732663acf80eabaee87d63e6e22e42f81c7e6468a1c9b2b09844d664ca462eb2ad88cbf216d906e4b23cfaf4292e69b107a8a56325ace5357a67114ae5db2c8f181131421821841046182384115a09345f8f3e7f8c5047dfe6cf64c2cccc174a29a38f9493499f48f67dfecc262c2c6761790b0c87055e397cb638c6788e1ce11b5e46228c7dc88fb19be5a1a5994b5c52459f774aa38f4ff4f169edfd5d7994d61ab4bd2a5920418f688dfab3d2a7ada7dc2a8fcac3e281c1d9bc2b4ce39db6c036f387693c2cf0c90a8f0aee14790aae06e2c0c9bcbf3014b9020e5f31b2e48a4587225899a44fc570fa0c1548540467038b08c19d2410d8a6a7f4804ff136d0876974f4611a1207ae26e2401e2184556192c4e58281c1f794a88125a2cf4bbff44bbff44bbff44bbff44bbff44bbff44bbff44bbff44bbff44bbff44bbff44bbff44bbff44bbff44bbff495ad315989e64f1108e74f910a2bacb0c20a2bacb0c20a2bacb0c20a2bacb0c20a2bacb0c20a2bacb0c20a2bacb0c20a2bbc3078580409f75d09f7bd16913b70dafb7dafa493fb2e6511ee7b9440b8ef3d450ee1fa481f5c1cb81aa90327e3c3367209d37897e2be87ec94fbe40fee3b067d663861c60c194d902123c6143162bc4079797161828b0b8c25c080f1e2c98b17262726930b25b870d122092d5ab420a1a5a504542a918e40228d8c301ab1148185a54a51ab880822516808a11026040cbb9a5c971504cbaa805055d40f288a32a174fa604ed90329797023843b7035ef3d1db89aee8ec2d5b01021d1150fe18b698dae8a6194d2be2885e1f0a9862d180eb4d40586c3362e8171bda047d3404141d1c707f541016a2d3ea1be3d2a978d17f39e089868020150faca7526ac37e5d188e032bd98c7441347bc98f7a9f3a4cf23725f91fb8ef44bf298dc37df7cd6e4eb80e17003ddeb6ae9139750297e3da8d16ecce36adac62054f848fbb4440686d39f81e1f092e923b58669f8c2baabf6c975f4b9af279ccd104208630faa44c2c94448ea400f790d00c39418638c0d2737cfeed8cd1d638c05b8d10727658c31c6d8b4c628e93b9ed21a5d64a2ba2077d1dbad357743588592c10a4049a84e5aa5ebe0257f457b3553d67374348e66875555c63787d24151147687e5504b61b42f84462ecb9fd976ddc9594ea500772dcab2141b9c10d4e999ba9e601a10c7b3fae2ecddf9ac2fcddc8db0e2e8842a57ba9b6a6a6dfe87ab01e70f9aeb1b95e2bdf7de63f6f9a9b3fb2a02049ce39ac7d140ec831990d6e40f20db03d263c8753d7e00a16eca0f527ad876d860ee9453b2f662e4e7d41e4d8f17234f4ddb35a9c92f694dbe470ded4f56292f0fc36766768ea5cf3e725a37450eb0b8579f4edd9b62890e57c18860dd4d4c086c4e2b637eef517e55555595c484e84b0ce7babc88804064dd89e7b0de6b3eb52c50d0e6a054af301cea15865361cdaf32aa071b3fb4066b1ca1f2b1f71f26da091872e5b08e3e565daea230cc3a6d87d6603f8a09f197e36edbab35d819df90dd602edc21b314bbf5b23e679791a6fc97f569763177f7859d5ada1a76ebf2eeaec5588e76fddd613818c871f7b24aace7b8fbec751a816a50d911ea9536daf9463380514e00e57212397d685dc3fbce3649f015d2d0d5dc1bdd141a49a4cf5ba42cf2c41dbe9167d61c6f9eeb1d39c0ca1dbd74cb316014c5045744b1c2870a8fb446a269f93b85e190768eb416638c31c68df488e58cac8fd2479fd607e9a58f2ce4d1313fb2914707e993f4ad3b469e8e3b47b0d1c86ef33e4a279132b8d31a89f4d1b77912c916a196bec59db8d3a7775d275da5cce5f1c2abd377a463f4cb6e7c47d6c8b2d348efc676bc3bbac54490ce8e06e95e1f1d8e6c1223d2218633ca94e83bbae54ac7d1ef8eac7332240b7786b464f048c7bc6df4f9377ae9db3cc942c833fabca5adf1f469960e7732c80377e091b9f368dece9c9fa5ccddb733aa2c7ae75aa324cb038fb496c317ee400849a3d38cbf409aa359912ea4af3b212c59efcb6e2d5946ad52a9f46b5495b4bc56eb5df0a40a95b4b450275001e8be9d3e2969f9fb3bf2aab0e4ba275540e2127720bd301cf80b427a18c2722886b5904ab04f1811f1426c073d3c298b774211a6639ece3945980efa39c272e8e72c7d66f0a312b45c5c349bf66aad54da99d68b0beef4c9d15b3048a7b70280e150fa3229e938ba747e18e9101ee9930bdce913bb401b8fb416da818f41481f954eb3abb552c9a2a8577ad2a96d5a217dab1aac8f7a6c5273da798c9e8bb04d3d89544373567bb1e544ec5a703ce099fadc9ee8c89d9715d29464d105a919f2c9f3ed29785d8a5ee120b57821e5a5acc136f2d3f2ab6fefc88db7ac79697dc8e73079601a305c94e42babc3fc06731d289633ef832d8b8b79177c7683b15b0fb73a25cff29c5c91bc2279453c308dcafa1f8dcbec6d8d19d9e83262642cd6932eef17bbd1dbd53e170be3459b4a140dd529bae80bfd510fd1e92a77392ae381694ceb12baa4619d79298ab7aadf7a704ea3ce92b5bc44acd354f7c0c3bcc8f2c083150ac518638807b6d930bb09e97eaf35faae867f5648dc84c46bfdcd5bef556d9a9607a6212d6c8d2bd23405c1723459d4ca629bd4aad59bd1b76a21df91adfda88ffa2bc2a1ba3bc4e89ba9d46271942c25fdba8e61180b13b7de651b5ff7eba18b9e0db9356342940989376479601ad74b7d72d7fbbd23a6b624951de8078c7d344174378e37d426aa7b6dd9052a54c7d089eda0d60eb1a85b07dd97cbec1c33196a07b5d6b6a550d11adbac060135143554c796b2521be8f2a7c47e51bc28aa93a2b526ad3979445a6bf79eee1982075400d5eded3c1ec7d34eded369ad8819aafb957641138e20c5b3dbe3f7de7b35facf64ba138e58416730e3b44e428c07b542fa42be835648dfc76bb09c0f154209b5d6d8647231dcddddb41b36f70b8259093d1de3ae8e243e1d539558c15007267e7e8ba7b7e806ea7b307b6bddb04fa59c32460879c0041844b99b2909750a3e77ab0fc91436087242174a30454f0fcc6b8d8ef9596ddba1e1dd76d8610a18189138785326cfdd2a1362400575425ef7440a4b6aa00381ea9ef800dd8d4ed103f77c7e7ec00821f5f71ef55e845406625ecc31f32284efbd18237432cf364708a3b0fa821006bcf21023e25d56a275401d9dfb30f0a07479571eda24f87263448498463f5e525692e0bb856e5b190ab18d64275f283eda20efb27d50f61d2c52054208219cd1071446532696b2a1922962a854d8c70652d887319830542ff08f0d2c2781eaa690f2736dae9bc20a69b8f3d425116aa41e817158382b0e3a1bcec6bbe2b2b86e631d9889b2d842f47a0beebc7061b6a5d2e14f67d4aa62b355317775ee2a7e5ea22c7ec2f71e760bcbdece15757e7b3b476458ac03ed469b65646fcabbe205bd576db7ca767e7495e08f6d2172b195bb9d70ac3ac648452d7a8cfc7034f577e41dfeed3c0cc3ce180ee630928b0eeaef6fc8b5669c41ad54441d62f5f5603a4b8cf44927d9d7844d6fca851f5d7161cf854d5a9b42ddf84a13ca4a7d55fac88536f295a02a6db79d07a568e8e4c2ca5d4ab721ef0eabf42caaa29ac5f76815d1c7fa1e15d1d0172a5fc9a24fd6e11b5e6d247b559e15cbc545c759cdaa7ac7aa05f36ce1c26594556fc9586ebdcb94b96bb564ee659133f7a48a24a3c71ad4165d8461b8bc77aa9f47f39a7493f859c5d7a4670b770b37f3d63ca3470ce71d4656fdc55d340c36bd45d6a2aa98b95b7437733357a316bbf16d396c19b145cb5f9531d41668e5387ac42e2eccef97731389c1df9161a7e51b23bb52823b30ec46a90b0b77bab9db5aef75f79196c98fdc59d59c6146aa9eb1319c778ae18cfeacf4e90230b70af30d7a29dd352c35717d613825d22d928ed163ac411d65db90cbe23a264ac3217766add3442eb459f4a97fe535794d2abc322dfc99b6fae81d5e23eb613b15bc5e651a65f1fdea96bc9a1bc3a0601a2ce72884b2a0c6e37831623b18144398254ab1e21efb3cfea9195f692d0b9deeec3dd81d93d4574123bd029ebbc3755154606597918cfacbf80a65398bd6e0df5513d9d9f888136ef262e0812894fa67c3468d1a9af69b4c3a3036bed23f575e1b82287df17f1533df55e7ea15db0e005df8085f8de76a32249ccccb7e501f0c12bd1c29e0b92e0a122b57dc9527368072dd131b346928ae7b92240a122cae8b820409d74541e29384e7ba27498adcad9f5cf78406403f45985a7bce5e46b81a36c2c9bce378f14ebacb28a594d245e91eff32f728a5732e4a66422da53f3f3f8f8fb81a3e729b99995bcae596f2629848dde88d304c84be5cf99c7bbcfb01334d3f4cf1bd6763dca690d6188b1ea6fbe25dd6a335f6612ac250213c16afa8fd744257204308a10fa640208e30668fe7d12021ba85c44b9f9fb662d6a268461da33ee736e441885530835684b33acd282aaaa983aa0247f7055bc08345b8446b3fbaa7b598a4b5c8f299c12c26a9d561642a5a8b97a5b4f692f4b4166384427d4dde29ada378f79e941b1f8a7f52fa843dfe59d1a7ebf16f4a0f8a0c955d1010244ad6f6cfdc4a77735392802cd95682f178a05811cbae8ca1d033a5dea3d93b45e3e105e383eff4613aa67d535a7b555ae34b7956b4c6a752a83c4f0a236108745d0e434a1cba81d58f5754ea32e56298999999999999fb0d545ae0732d51dfc1605419aabb2eb8725d941614b936ae8bc282a0c6283254f7e6a4a4c4f776d04e1ad34735264375777341110856f442ad282954154ddfaf1725b3126b5e96bc1a47535526a42f0e65e32df9b03bb319a18cdd311e5ec6f862086013f77e5309fdfcfbb4de35a3127ae7fe3e29a1e7c3b0bc1acb718d75e0ca11853cff7013176f74eef0beecc1e820747da310f1508adbce6efc63f1e4389f33b947494969cd45e8b2089d3bcd5c606cf4c99d5ef9f2566311be9d8b72dbba0b042693e9fa8f2c88589d3591d6dca3166a7fe32c6e5b22cebd084159a84e5ab06988d03bf11cd446214bad61603a9a1ab127af27bb6594124619638c5146296384909f0c816539910db7fd8009d16d731cbff05ffac4b01b767737c386b09b9963c77eec3af48ea35fc62fadf1af648245ffe2115ca453c95c00d499314608a3bd060bc18ace3d94fde8987846d231f156fcc1867bb6476b51631ef867a3cf8d57a8db6f282302029113cf113a0c0e410821844ae20e0db809456138d4290ca7724c2143235a8bcc48b88793b416e3a9758cdffb3b86e5c0cf49b1a1621510ab478f4b4a8d4644e628a5c65fd6081b2fcc532b8d40350978b9b24285af9460398a626f4a665dd7f5cb5282c147cb528261b2a134943e29c1fede519e93126239f26158a4aeeb1494d7752abb5abb20754951943c25b32b5e1476c9eb4db9e0458da15aff715d2ad2392b8c82ad591965a2ecd59a8bf47a21ad5f17a4f056ae05a7748c35b290c253584ee8f1d26150603b7d9287515ad54397596551236c432976048382b2b0885862144d9639e7346df3b27f4c677171d16186cd579694321e3312b11d6aabbe613b97a2b09c17f5f40555fa9b621dc6452c2e2fbe41791fd1b25c4a97cafae84a3cc1b05bbd5e58912559aa0a4429a55374392c873a6684c28e54218c87755855d8b79eaa22ad0edf14f8a640583f2d2482c23725dada62bd7fac5b26bb51173f9811a6215f65f0385e0baaa5946d252bc4ef948a2e6b564bcf421f458f3b58ac8ba823f1d2227d6b2397b2585e29eb3e58a27523501ccbdf59aecb62b71f1683826d2cbb6160084685425947115154a46ebc2e0c0a39a5a105e5ddd5a7eaf4b569b053fbc3747d508f94e95aa7f196c4a0601ad2be2a2f666b23d42dd941f75101a5352a95baf56e615050226cc759b9ef1516ef96e87a54fad42709311c29e34ee870b09c0fd58a8769081df39ced9cc557a4a26e9790c655d1d1d109418ef8529fde5fb2709a1b02491c9ce6eef62e9c2da0810e8410423e94b1497d971c39b273cc5246b805d383b0b320580ec6f19c734eebbff3b2b21c77a9956addb2eeac5b7c5996cca8d3f853adaba2f4d6a5a4d629c643c6a01a8287b5d45a4543a15028140a855cc470429452b62ccbbac4b168aca8eb904e4a27a594d2c992c6a07ab9c8dfd449f5316e321f3aff583ae42b6b852ceb566c2acb4a58fca9d737eaf3434f0f3c3becc06c2ff7baeb0b360d90eb8de15c401e0dff482b7451ae4abc7ea28d1ada6de4a93f3d4d749a4937cf9c911d4debbc982827bd3d34764f2779b1a29e0e15b2d84ad3881ecf5544997b3157fa645521ebb228cbb25b65f90a5789d415a25ce50a3369ed929675d51fba834abdb26e458b1e489f428f17b2440c591646af5b977585ac536a656d595386420fddb232f9694d3a33796a7d4ecbb2422197eb7d82e9d3d63f58b695eef5f3f31303b251a874cd9694490a95a201000004000314000028100a068462a160402add25d90714000f9dac50765098a6414c29838c21060101000000000000000024e5ba5754ffd1a047f595d560abc43c55c1673227ddd97dc22fd72c29fa0a85c2333aa48a429636791ca4343202a4df640e800171538084fd861a9a737a1438b7d124296d1688c26c900f48155c0d033d698b8081e258f314936a1da1bd6b86f3658b3211256615dce74f1a952da69d68cbb2ce511bc29d777db7b01aa0c20accae67456118a09659a6efa6926ccb6e24802386dc0c3bea0f18421f43839323d1dae6623581201e6359db354106ac4a766d9a18e3ed012ae20ca2b9d6762c33c03abb6b5bcc59fc4d3691f5ee64e273d4990eb5cdc016714d423e2f6d5b132f39393017dea663fa29ce90d25e14e9934d0e79d8aba69941bed796fecd2d915ec4a0da6847df56f373509b7fb85aa2054ad2ce366f5a71ec5c6138079863f6044a2d9aa7af6660124ee7635f2e8eb56bf33559eb158448539d3c7b3d0898ca412607602fce808ff1a38cea9625ca99a0e675ba49a7c26424424cfb5c8204642253e966c8a049b9a2bf82856bf935cfdb4b91f07a59060748f6d95293d50bed5e40a72216aa6c983f03db7380c91ddebaae1bb7dfc3a1247251c68dd82829435aed75fa050d60acc678030d500df3c870851ae27d4e31d2cc87c52b335c8daaa44ae01973f2c5df56020a1146db9f4caa95a0a093b0add661b08e42a06083ca6832e9efb686adc9140a67e9d666c59c197ad0eaf94bf111147b13d5d134e937dcd4a559a83d81fc723613f1518076d2c624fc276f1f374556e4002a827c0a50f0a457b1a2c8e53662c90f63550107938dbe52e4a7b8b8f429f3d7e5d58f26cd24812dc13ffa37e259939ddc2b7b244976078f0b5685bb668345b0551ac5b4e2b62738a550f18b96fcde1c4e3bab6b10a1b1eaebd010e2df050bf1e0078886774f7c63522c331603ca45a79c8537a4373b3b784bd2700294e603e703c41612e64773575d61b690d819e7d47b96a47800b67b4f47c4e8e5eb1b6f29392b8e0af58a7aeff22472837a98a8d7a61dbe19b576646cb28e4e1abb391143097f9e6572322d28fe821c4fb5b6fd89208ce1e4863902843f74f010d489e06c1e3f8bcdb6f53c8c2e618e3c3a9b1a28f9d1f5f831a90fa5d2869fb246da7d9a5fd50cd219d4eaa92fb975b60ec5874a46a4cb60af46bf0074fc8b80c3d54b6944fb5dcd642b382339c41b13b0ad3e7df00a8ca9dc794194928f2b2ba5d64377f63dd1fde5d123a12d46db80be63df99ca6b066ad3b53c5d51798c0724b979abf65f939088c4d31c0fb66fd3ca5de27c27d2f8c70dfa4a12724cd2e01311a171165ac4f8b09be58b2c11a0d0b1fa7dc537e4ae1c52eb4743d03441d015a9dc795bd0264ebf1085967418c7cb94b4676086c0caebd5dde67c84bba2972650a38b6a1b8afbf7be06a74f396062882ae2869904d8bb6787b62f5986d9cc2bfd7b01bd72208cf677a8ac86b4b4a61c5dcd11bc3253db1bb4457fac830a77d6b1a8696599822995ff2d559e9fc56bad6d6180f118cd74aa30ac0c7d85d3ba01b0f4436f48ad16bbb82180126102a2ad8d1c41a809bf4dd75bc87fafba27f2aeacedc242e7f28019df50b07fa471aa7e6847d9942495c7aad427cf96b9ee87f7b8299af8b401367ec0d377df75fbbc3c9fdde8ad2560398dc248d4ccfcc6697665df0364e7080fcaec1c361c9de2d34b16e0c98916d2f8464981b0f5b436d0cb4792c27f85fcb6903ac25c331202790663b3fb4500abd04f48b77814d70fdbfd1b285305125230f92df69e7276eb220d9dd4bdf31f7c26e0446d032801ac3eb69ed6dd440bdfd225e25fdb2d52a72f50fd443faf9a31b2240598bce05c9ad5a2c7b9d2ef202a50c257523ae38166ee750bc6e2adbd71d759edb63405d1ff2e0574061b7d0e45ce58d4fcc58a34a973860d289aa6300c53ef47c9a5b86df064e84a6fe74418e2eaed2717a23de8dc2d34c2a66b97671544e2e3663d72062bab4d9fa066ff9656ae64e580c272f3a2b358fd32c76c542ad1bfc8fabd5393da2ce4075b0732842a69056be7b33c39383e476b53345d0731043e2ee7b06005d565c2e8706d631dc46856eb00886acaf7402199c4920305b962e32e551da0ca6bd2db314689f8b8f7fabfb703747982c5bbc5f0789caa69bfe01378e1d7bd7ae2a5d4ee77ae8852a4217c0adfd5032b5027a5d292af53f57b05db7572424cb621f0f6d007159f8afad31b9757abc3e701bcd2ac4d6bd180a0fcfbf6efba9175a757e70cbb43fd847d3ba37c53310c37e2121ad0c6380a3a43fafe636cf68b58bfdc5a813ef42c51a7704b4c2a96183087dfe54bd9cce0d4dbc68a0c72728d555df1c9a71c503acb438d9696fea47586879019d8896716bfb3d689a9cc10d2f9b972dea5add1cd21c79c002ee5fa3a715e0a99a071d5b7af5b62051d8119f2722843d851dcf98749b235dbd5d6c6530096d0f585a13103c925ca0fca74811347724d25278a94106a905830788920b97215ef74def87be44a9a9aaca9e9786f5ff1c557a372ad3872012245de4ced347461e48a6a33f63e71babd9a1a2eeb160c50d000c0f7bb68a101e3165fc8ec84216371989ff4c74d0610dcc739cc1b161ee80567479e3b980204bcdf0b6ef8a176dabcc1f82e77dd43a52e0c73a4e57a48524106d98ad2dc5889bcef41178568444bd43e812468be2a90caa178c346b8755315908bdf8529b1637cfd12d03e5563029061fa32dc669eafb2bce04dc786931c20ef305285dd77b41bf9aea93d8ccbead407ae481956492af8559b1ae8e424d08d106bdd13430d52d8e26ecc30fabda8c1c551a7a8d9c07637dd258100707fa09f016bf7add77a19aef7038670cc9fbad357672407ad21f3ea7f15ddbcadbd05c3b9f13198f51a503d726a3d36d944eb495e6d0eb1796264b553baee0e098185602fe197c5dc6c316c6d7348ba3ffe1d0c30b3b01388e0911488787029a3c712caaaf3058744e090d22e25da432c234ba3b67f6c403d214f0739b01ac09dbb51f0f1d878466bf2e5ca603b4e7eb6b6a8a461082c8220c5f298192b04ebc3691f6afda1ffd0c3dbc46b14333e0a8ec1fca6b3ea9d27c20a98a6669d1a0ea4f15e2f390ddbe9893ad06908dba44b1468cdab5ff84286de5965a183de938ea6d36943bbd8cca4270103ca3e5686852e28f2c4f93f76f5d33de000c07dc646161cc8271bf0fb8a31c34edb4f6085838750c181df4462381ff8282015428748d29480e49120b294fb8b0b86aae08a988bd4e719a020394909137e71de1c1eafd6cdcc60d1bfbb89fcaba9894983e06e8dec93009a28740c0d6803718e332bad768a14b86df23bf12cb296074e01f145590c9c02b18803b1c8a0820977447087a80eff158dea6f8884a3c4c83c2e89d9f460d7d0eb57b1b5201a286072600ffae1d8f15497219850c09e25b91a93a2009c2d9bc08732b36220199a5f555e18bc4e3262148da4c9495f019064027e6d5988357b7ddfd389f8cc024b36907a1af90fcf3738c36eb98a7e6985a30f6a9097c1467626b56380cca54869afc61381627dc7db6cdde12dcbf395121332a15b5e33f4330c0962ba6de3aefc9a246ac7484e66a51a973b0436c49b40d983a9b1ac4bad7785fe6c28662644682234422c5ea47b659fc5b171e144318760e04a3216e3511b6181044440d2d46847f465120b0cb400c1d84802a1c72606b96c62168aae4ee0ebb5d12da9f8c898bc99124e4ea4b5c2b59c672d2a1a877900801437e130693a4d876e557b06d937e95f38aa0051cfc96f2e42f2130e3e192256b897dc72c4de95cec65fe0ca63e8e964e0eb24b164360df8f0abcde81800520396d8ed22ce69442cf1e394a8109ddd6d7ea8487298f7917905e084e55d173a2d87867261d671354af9bcb5c9dca74cc9207ef5b3eeb1be179ea661ca17526472262cbd0dc63f0b3e557ce9764a2d364c87ae311f612d48ed7d9f1b1d214705e2d5a72688c36f13cd69fb8d9b00c1fd36d9c6893f2b06005e4c7c22c28d173fcbec76c1bc2b542f097fa8716c57775fa789d51a1b111da66fd1e75b450f816d307ba273a22011c14d2f448f8883c9ec258806d6387bff9c498c39d08b7922346feccd92988c8a456b9307ba1b5666022039aafd2700036673576fa0b59bcdbc345da6d89f42e2490e81f9d68d2ce6986bd7b9cd01659a61c656973a052e031ed69426d6c6fe38d7fceccc8b94724656409b48000b750f3195209d08e3c2292b20a6bc0ff57abbabb1c608eac7dab5d3b329b37bb72de7b90be7cb022400c4cea904f360c740f1f44163c81a12acba81acb0d402beeb00f91015e0aaa9ea7933bec92ea359903108672b6d2e20dad51dc333cf8d20ae93c50f71dec89cfe31654e3e072035adbd3302ec8b842013be80249b155c5cd85f09be81f57e214194252959e28e9a55a5285b4a9fb51ad61b116803110436d2295600457e812326cf13b3367d5e3e751db9dfb557b57a4a66e5bdf7ff321c678f01f433cc0ec711b329792c1888d182f98a451a4f90819a0271b1156333a04fd15797c83d91eea93e21ec8b39f47c3934694956d66848d9e8027d9876c7e28001546ebfd9a028b37b9646b744aaae54cca92743cbfaf4692d01075dd5fdee824504ed88df1c78d522712c8980052ba21b71181f015dd1645146831cd8685c48dff128078c341e788317fd82ebd5d8a5d6e53b52e3652bc6b60f9adde2a5802b42405d9a5142378ec395a1fc7efddcd062ba82a7be0f26c894e2eca7bccabecfef536876ad319b44a5f5de338a834b066c7558fcaa908480f6007adf288c4639a916a72e952375770ea993d9bfbf7c0ec78b8f2071d1a1c82942a54476fbad613f15c5b06105b9a0696f255af8675df991eb608df9aa32b2d1f02b8bb459a6e4ae08bf362e9099e9e763219805da1e53d78c3d5c5a4e042659a104ec46df03c9378598baa94f1d2eece10e3e753308feb5a9ea4d1f8a363fac3b1413548299a7fdceb8ed5da3fcaf8a41acabaea56c3336e3a446252beb805f2ebedbfe43333602f4ed00f3590a1f6c315ee34eb61c70ad51f329b47c06a729516c08c52df4d5c0c2b992d9af96dc55b7f02415369c388c10643852183e74a0dc596b70f56c5452e4521747ab7c6933bf4eac616aa8dc60450bb49c0207ad1e1914cd21583888731d0a0d0ca29fabb6ba174915e7c06f5e550e36e14b39203011374484d667a3aa3ffb88d65653d2b90ca94888fd6ac1b6c286fdeee99868de8236b054da0faaaf74454e1686c2621f9b019eb4bcba3e2918c60adcf0ddb309c0a8e96b994b11374bdc27af809ef0ef6c028f3fafc8b795abb15af386634b00223c4eb711c51ba355bae1042dbc5cbb0044a5b812119ad3d197db39873de58e2f05c0edcba8a49c7c180feed4933f1915a5a426f0ed1eb46392564ae5b9ff3021cad4f4f11487ebac311f2886823614f824870aa79594336966910b642229ef9f987288ff40d7557c010a1032957bbb6a8cd7ced188ebdc9b903fc799d9403c00065dd40ec9583aca1a4f0ac09ae8b16fc4fc9e6566f1dc91a2e8f73db294b7e80cc6ffb6f76ab4234ba380c73e2f6c1e061647a5bf3d2cf898b354ecadaf451ca4dd451d4648a7a212cf3ebc0a866d524a917f5d081f5a49a32112bdee3c0f75d8531bf386f842e271161afbf353effb1afcf371cd3c2d9efec62a8b2ec41b4e23db248c06dd5d25bcadfaeaf69313b9d839131ab519761478fb502e0158aa34b4ab59063e593f8de039c01deff60e77ffa362f49035609e7fe7f04afc68cb4a0702525626afdc725df97602b2c4c7d1b807f4d61617eaa9002e2fa2c5807350faf53cb959b323febf2e5148f34592262715f90bad18e0b4ea0fa67c207671d8221fb4fa55372448b882b3eeb2c60f2beabab98507f37727762fa2fd7a7742ebb8f7aa65fc404d084f10bbe8696692014b49364d1441cb949503a4566a5b3e0c3089f247e5b179c3b97554b2b3b429fc1768087f2fb9a716ff057e1eb5d6866c203e740c4111818e8e693c0ceb4cc65348363cadadb28a3d41ffa8ab3e0d598799efe13e422ca075087b5c79306e3a2ec83189b966431b30ff4640bbd442b876d6d7abd9ed9e9b3f9e276ff957db9177e3949f2c020ea0f8e4d29b3bc328689c27956d959c3f790d9ca406ab9f01b3aa507a25037ea950107f495ee28b5c7c1b6d1d0650d7b0e4f3a87475f932e717cbee35f8d887f9524a437956603fedad516061b665ae639c01cecd2c959f55ef93e468ad35cf989f82e0451cb152f4429a515ce8a85c06c220296fda5144c1d197df7aeffe2003673a112055c632830d3e9b621ff7063604654adf621ccd6caa604b6f881382a9bea919108ccf396c9d54850ea8d538b5bb37a74d26dd2aced3a4bff8d23086c16d9540377d9e2068eb6836280425382c3ab1079ade228ecfb0d2b111ce808cd7de4d4584f30f8a86f03d9a6426b32441895ba96128a0481a117e9460844462112adfe9b9cac60a845d25596b7dae2d5643ab085a02068e3e1e720488f4fab73587716e91d0d2147e2982ae529a79717934371b1b0721e79690028b86fcdb010cf4497317656ba9cfd5769a172a1a6156338855c0e6a32af7f280b8f614f9768430484a2587bb4653e473a5cfaadf21ab497fa701550cfa2413a848cb70bd2fbb0bcb4dd7d43207174b8f38deeb46b6c88898472701c541889cb967590d3fbd1d5d6ccb2931355219678f57eaaa9ee67ac55a79c05e0cb7dd2ec6adf4cdbf4590e61d9c9da2893749dc7a53316699a9c89b4083ef235ffde953b59190f744e2b4c5519263681d08a4f96a74d7451625ebcc353cb11e09945e45a6340bc2d6d9dcfbd3a0021445d1f6471f7ac7f41623f88e130a181129e460e39e8d845cc07a3876f22038e7aeed3e725644202c400438171293b68cf6ad859db150346de8961a4dc6728b4478700dded67623754169bb03173ec92e02def687bceef2f7e4d33e68e942800cf8c2b2c19a2fa64c53fe40048adedf1776fe4742b33057ce3cedc8706fcc61ffc799c48129e200a2319024c7e889903ca96e6ead424f966506a4f582fb760d325e31285973c0173ebc7a0fe805f61cc3b0700f3b8c80d032c7c7be999218f5c54fea57874a1d7182f549705644a2c17a76108ac1e6aad7629384c8e6363984964c27734e29da16f06314cedd780fc845908faa9ecb7211bea4ada4501c6aaf46b9b83e8ab58a81b76ecbd02eaa55fed6815927409b536e64630e5cafd1e0eb191fa8f0eaf4740cd3a9f122abb066fe4721911831cc2db46af40162150bfd177b89c80b7307e0c519ede762458d52514dc973e4c3114335059f9a86592cc729920da805071b1caa80c60eb152a4aa225542867dc47812a430266afe042d3113931859edc33ef6417f33d3081b6bed1c2204da77acf8e588e0eced2804026689235b4b2843880c1427ab8761ffb545880bb43f8ed807ba14e297ac61dbe9c42b32fe89ed8e15ca1952efe6c17b278351f3416ac81412fca7ca1403f904c18a27e3d2ce3ff5cbf712ebc4dc512f19c6e9fb087140b6f1c2c20176aa7ab9d2982c05bd28641bd7ecbb3e436500a111ca72faade6541f69260027c5a573a09065c8451892d365ae65c4b78cbe0576172b78f96d87bc232735461ab200b46b4016dd07791a5d2adf17642cf4b9626d9f8b93d5269ced47fe2aaf6472ba1718a93aea505c3f9bdfc424a5e17cb0a3ed17dbcf8c88086ec75be5d9cc656bc65ef48ddfb15d0b2722d8da16cae1666e130ef18fe0510b5788591c2bcfee404b102ef90b9b5dddf751aee924addd03731865104404bd4429469f5524b542284eb83f25d83bce4716427b06863b526a22f065ee25d7be53797ed79f9673917aeb9231ba4d014049c3dc579111048378cb82e648079cb0c214f35225f62078f332a01179895e0984749507860b468b9cbd238e431b61cb095c511cb6bcf10ac1750a44ad1aac8048716ec89bbd421a0d93c904112a85befc1376d010741d567516f6b5fcb042d969501a0df160573e714848924c174c14b00faa281072cd9a70941c8764e853604e1351df50aa79565aded5504b2d3cc7c50cbc4879df5bb5abb4e2cb51bda7be01d881e051685441a5a7ea29eb045387ffda74a314b2b5f4f9fe0c973c99fd1a76329a6a10912919465783cd6b04abafaca926974ba8feb4c1a68dc8cae80c64e8432adac2d1609a24616ee347080e9785f011abbd95487f27c65c354c3f3575262f1ef5953ebc633b78b685658d73778e38091dfae64a87742d31ed8c472d1d6e1df65a728ad9ea148898e0adf599a5f24cb6291959fafc5663d91301bf638ee6b67b05a265dd9e0334759f1da2ac8256ca969d5598ec67babf60f95fd8d0951c10835cf0b42cd079d112156c43905c08da8226b881734a84d9b2eb27b4e3dd8d0d5fd67dcb9c81b90ae3dedfa2ac5a210827dadb8b7bcf6b12c68d2a2cded68e2fd8ea0fd014449640710b865c12d0f265b545a18e91d2ea130850a4d678c6ffb62a746e9cd6d547fbd892d2dbaff026df7cafb8000dbf477ef17402f2bafc9dfb1401959511c2a354d55eb676b3e96178d39e4d01d929d47ec7663a0d1d8222481bfbcfc39d079436239cc14041353cc92c0942084f2b7a85adc46458ece8837f983899ac0a8457cac7c70649822a0c0c088600c2c97996d1bde8facc911394de951d449a222f4258887be449deb7a3ef83a9904e93b1e8734183ada31bd010d45cf5bfb2f16df0bd364dfa07929ba7b5fdcb619a552c0d669a5b39ba2d82af8dde3c7222c4ebdcafc7eae4cb44492c5d345113871cd8a2c665666ab054d08167d88fb6a7134ae893c81baf2e73c5ef828fad61c3e8c01da414e9e9b358820c022cd37c7dca70c050536bbc32e2ee2a1a632fb733d7732915f5acec9e178d71d1309eb7dcb1be7fd8162d4e6db2ed5ef2c025b292bd74e36b00c6e2b84db0db997c46815c0dde390332ae918ea80eb4231f4e8a437f9f39bce1ca80bc1b86142d8ed6f31a8d00358dd7a6a9a471fec66369e3aaf58674df6ee3d3ce126fff6b759a1349f4baa1df18a6e4dc1ff82541a082e0541207d37dc2e56298cf86b1ecf74f5825b975119e5e323c69763e77378a4f4d7a20a0283d99551029af511aa8a8063ec2d3c134e74738c2a713e783742fa2092fcd0013060db714610462c00f64be9f9e7eb89dfe431b8f6854a9ffcb353a9a886d007554a5fb95cbb03a762748c3eb91ed3037d4c66cae12ba5867fabf406b3f581a5d6f7a5a38e005f62ba4c1cdb509f81cc2dc9697503384f4be7806501374800bd33a48188f40f9338e32850a6ac2a6b6bc7cbbf350fed95e24cff00c6c69b11611147f464e1d37bc91693233d1f7e3e1fbf10e176da716692153183ce5d7c798525bd96cd9bdc7f457a689d86f12b529b26409304d0e201e11a9839b64859c23160c8fe50ecb932cb40e023b6932189203401dc17829e21372f95d66fa2a65c5e15c0f93d2cf64e2c215ca48644717491392d0c1ab56339f90381716b33f6267927f1cb0e1239c92150b268505458294b18fd0dd9a4f1c8d14b55485dcceb84e1496e700d86702f9e4ef85705dafa04590ff2c017340978b2fbedaa9f19ad4964c0774deb52dd04c2e10b4e7f28b405245eddb286b9224ca12d488205568573fe94cdaa20441026ccb1bdaa435f241d9d960bbc37076881fb6c7b7a28720c6f329eeb94099732f169753e2e513e0488863494c87271ee1d42871efff9d265ae6a4b89cb715782be10b1901feae9ea0140b1271c5e59c55a7ada2c9f719fe222bc2997b7363b78a7e222360d72f2e479ded5a0430fec00ba0d91bbefc006b7f258e4c2319b39b738d2945807a8c6e2e0a5eb7eab849690c068cfe28c8f8da5043c753e0668e4461529ef13ede3002666dddf7f8158c80f1f980996b83e39db7c67bd5236062b12c28a9f3c180730c3b9f15bc027826fc6ccd2c173b5a9d88127bd8545a608c3f526f762aa717da3872e9e5436cfc39f2e5d3e969d7b40a20a8ccccbdd847c2bb849494ee987c6d354e6c6a095d769198fc59b7b30e68c7ff05ab276028fdb0552403f6047ec152ddd68de38a24b87f3b1cf8c74302763b01470ca545d27f36370f50daf5f6897f427a400f47c9d5aa032e58801c984b1f0bb41ec1c55600af178eaa1dfc63ffb66f5e12ce45d6dd32700b4aec853f255e5a9d2fd284284fa47f6807e8ed073c640e5850458b4d95f2a548e98a32249a88df90ad816d3e64d26f0a91eda164224caff5309591016fb859c7c0c956d0110165b49134cfc1b97eeea3105de5e8fc777e1dc756a734a6900f4283132dda7a1548076bfa2089c2eb48191c2abc01d404ba444a8afce0d91cbc14109c1295bb9300a8081d2b0c7be0489c9ce1709410635229536b1dfd5339d51c12adf4b944a31f0a8156c9737c5212fbdc3efe125597488931dd8bbd62d98700f4bfa4e42dc7932be80422fa50c91d5bb95739c020c23fb6b27d03aaa73bb450f19716e81082dc020dfa23723f5fceef3be42377508152b0bde8bfabeddc6a3ec27c0b1c9c23c95d7ee2b49516a2099b6e0d9f515c4fef6e450e7a411239fb4d26089e4616906b9e21c506d14822ff4314cb19ee8f4e457520769e4478b20207e1ad08b038945966c07ac4f7a1dfd1f082cec13d685a380bd2c0c9b2e30a59ca3ed69bb6982f246ae9036d157fa65cc4a69d717404397b2e23d6c143c41ae10510d03100f1dc623c27cda96a3fce5489d4b2841b4b3405e19d4e3a86ab3b840473f0edd04f639fbefc5a6841d2b74b188bb35edf65925570da3a1e5bfda92198016c9103829b333389f5725c5018c27860c6b989dde0eb18855690a77902d0874ee90bd4442dabe2eb827feeb528d329d356675c96544b32c5620a9a5fa784366608f05b1088a62a89369dbf81f141f76fb29216acc084b3d976ff01ddf4db0cdce9609fc8b361aaec3bd757e039de299ba7b0bac6b79b696aab6a42dde9c3157acdfd2ec92aec3847f9e2fb5cdab08478da51737d77e95d153aacab1c1c04c23fa32fede5077b784738a8f4d575445c3826508f884b5c9c512ce1d9d8380dbfcd1d61c25f1b58905abbb91f1f4308b40412ed92500367d99951cead64f216bd9da1b3b2dab4881be775aa300fc1908f9d49f81264c04030b09546716e6e90372c1aaa7370e8d471aca79ad89ba90c3cf2022eecad5492d63b4b0c90522d7d77ad91b610a5e26d1e665619ebeb4fe46b5c96092c465b82f5a3bcd97c6d968508d4081867e1c08a355b03dc7ab8902a66d9eb8f71ba08376955fd96ff3dacd1d07ecc124ebb72c8452eadd4113e8f68c158866d6d6000ea6e9f0156061de123fd715bb08b22bb1fc8b5507266e25b8df24c5d2d2dc2c6549e6bda8c635db30ed7c977437c42880fd8c2d53a168ad3c48ddb83a09c511cdf2276867860c36a0689e436a43f5cff67c92fac07191804ac9151f41851c5b2764f203a0d882dea4c73e82c69e7040b9efc40eae81b27316331b6b13a76968dd4c582b7390591bac715ba133a13434d69e2acb1918f3fcde807039cedc7463cebfb725f5a4eeaa0f577694fc1851adf8c979832a2c746bfb176f88c0869f5cd3b1d5235f194c48d08c1d1ff69b47ce012152a85862e2c9e89bbaa09143949113175187cecd66d2a73dcd927e57c90c953bf46cad80803311ccd65796bdf076ee17cbf05cd10d363b75dd9635a369ed2aa8ab8d9a6bf6fd608709089719c80f1d701a31c47de725318316e031d2a397f8088cba87c8bccf470d7d6f9bf5b4718c733d9e3781715b65b0e8ba938ab08780564111086b5cef86d4e8e045dcd7938429768f15830539902e6f2b83f1913198a8125c8124d13ce5ffc6a791a592d7e6f5b9aa324d9d6f51ec49a715adc6a991041a7d588d558e31a6b50d399016207caabad1ae29d3f3b6366860a206b881728f5296c2885186733a052cbeac21f54d3366db4cd40f99600f462c18280c58f44ea14dba31fc4022ef0117a400782832ae4007719442d6395f3ca920a6714d4ddd465cf606b098092037bad607da7cfa861f4ab35800285e2a1c4cee079fcb34e8cb8d243bfd707a3790c4980a06e8d8dd99e4ade8c5c886d5d2a8b8737ddd2fc711a89b9826aea2b85bd6fb28b0a9d3124c398c537378dfc5300220c4a5002649507fcd4dd4b1752095d1ee79ad3b03423dc8d559589393ca8295fadabc2615d38c02107d9db2c426de75729f42d8194b618b39707e2246a313a67b0b3a5950774be1af1956cd9d17eedab52a39a5f952a3f10f05352cbf45fa8869288811e9707da95b233f28fed822fe2d02923481ee4e609f4f6e1a9a38819b3966aefe1151913943106be6b5248c6f8975913ab9ede7054a77db8e298215f0d63dc90be0a3b82e038093af286636c1a9bba407dd0b6500b016dce09051e0b91ebcab5adfda9ee7d96ab945f0dcd8fd42f8c2974662630c84164d19709b8a15fcc26a01fd65d8f716a5991054e832d16bbbbcfefe1d9c5d439bc4bcdc51ce64b8e239e23924221b926a6d98cd462b21579d1f823fb338bf95fd321780abd646dc0c578c5559b5f09ad20de74c5e8b916265e23549a695b319e584495e0261486fdb1576f3df2070d6e0e8250f4f7c879c1c8ad1fb944320149fe537a8d127c6804188e6a69f824796419706cf18d74894dbe497897d777e2664fab82300660d60e58a30dc9bef6596135a46ceb38616b2994e481a17cd99210c6e47c534dcf2a81fe51d2fff4bb2c60fd227e090d1a7da8b6c4546175026e6eac62af0a89cdc9d9d0a3cc6ea823580544346570c6b455bc7b95f8c536754d4f62b49ef0e70cda6ef7399b7308c1d5dad7c466f327025cfd9301192322f00052127f8f3461cd72798d32cae6e4bfbfeb25071382d577ad139044839063cf49aa1023eccb74fe843667d9a3ef2d5366715c4f80d00f8fd458ebfe2ae08893c589fc4e7e18ecf32af6d65149993500325366ebb1e61c349e5c1f6d063591254afff844594aa938b4a463a6524222a10be89c286b36877d0ac21784eb655ac14a58921ba07236b61eae7efcbdd06df6aec3e0225104be63e9bc6ee3029c55fbfef438de2a406232319626276c7bf3a7c765e83d4e96464a7d4d1a74e300db65e8d011ac5f5bcc4a2ffd1e6f51a2d981b93948eacb9758eec902ddc93a3625231f020cb6f1936fbd42f8a14ec210536f645cf99c61f83aca3a31e7a0cf1a428992cd96debf0ae7f9bc1db88cd7f15c83fe09d10dd013ec3e651abf914b43c74d0c7aae07c7a6087cd718ea447e69426d26ac382dfe6a109d36f9938b5c594a06a8203ae89e00c2459e300954826047834f9d15d640311f78e61ada231f0fe28eddb1d0dfb1919b5560f7d4269e6ecda462d2752cc5c6195a6230adf8627376de83e0185e649f5d0319f2353420d81bc1fdff0af38fbb437c536e9b6aff1ee6e8b74e3de891df032b5fa6743627a42bf33f96673efc30125112eb027fd341752ac0b04814502f171ce637d50d35b22aa99715c2c2ab68eb9c4d3758222d15be72d7bbe0f1317166ecfec676eece20e7ac2ba80bfcf83e78083df28943ce706c5c6e62dfc0e520f973f771c6d203deace1df0939f991e354546c5a000678a8315f7c63379622c8a5b884e944e91b3dcf988a632ce04b1a000f5fe0751847e227219519af5cc019dbb74e01d4386ba2ee033fcf0fc6454b109e8d645dda7a140cbe1756f44cee69dd157cb5db1c0143091432738f168afaaab60f19e2bcf8cc481a681282bf73461c64a8a435d0706c69c60f869818160203587f200f6dae809ade247397a188bd2123db0e5fa0c78c58bb7959a2d9448c4d293aa4522d76dcfd632b6fc5ba0df7860e0af808fc6b48a09053e8f27ac6cd7aed2e2bd58a72685a2112aa3af26533a61845b24f9a513b3e6dcaa1a9763c819a6455cf0a2cbe853b2887364c4e912d298cc5669d5acc0e6de0932c74a4ca05b674e83d330f00e9b25dcc248d17e4585079e8238ca333a99b43ff1c80c5113a57dc1ec8dd1ad71844a549f004700eed4f600cc4b74a8eedbc68e00db55ab7240484b8f7b15224aa5598e8fc1c322a3bccefe7238085e9704f4e09d923238272b030422c1efe5c0c22d3e0885afb39eb770d0e5d5671f575cb16aab90f0f720168b78a0f0ce09a6682fbcb04264ee3fe336610b5390617c2978e2587bc52781b2ae6234756f3593ff1b439fe046de251ddd286ef546c9581d8be57eca469cf42e7c92fa2d21b5a39e31ec5ffb9ce8f0f6ae93620060b099788d0ff7500c4cf7b1ae36c3429246a7235a1e5d2e7e6f80c5efc1169387364f93e406a2129bf0e42859cb6419c6bf79fe4493e5147af72ec410c54077e22cc584e6f21425be9ae266d3c077cb26710d267e9aba1b064cfb94838c72b82deda5f31c4ec0980a471efc1c8635764a5036ab162656b1c939f5565846e0c20fed92bb113c2f35b703ef638c0d142ae1fafa51d7a26643e05b0c908f5866f52dc01697defe0d47da72a837c4d95b6603e395709f616d2926879a5dc96464d1e83c394aef5c62e8aed4da67b3bcb01f75c5add0057f99eb84b62965ed5d204837ab4660411d55fa6b4e2f95026fd8a8c4468077039e03a1619ba4a2bfc816569fa55229e5f879721bc32fa174c386e7c3a9b8818df87cc289c5de2d98b872e16edcd839089a2a100958bb295ffc85895736662453f5f47e3dad60af06cd4b6789c85da65d9c05d7ceb305069cdaeb03b8dec1533eb9d6268f488fb8327f6171cbac08cc8ed5ef081b01934a3843e47faa48d34a21e2e576ccbd5c257e91bfc7630ac43e6ba0bfd792f94c140b97df1bd463801a5853740f71e287b08dcfe0477af00898ef397c2dcecc4333f1ef1896bb3d433985fff57b6650fe1d0959d24e2f7c86cae23ea446d5e65718f3c3d141d4a6c14d3fb664713f08f4890b90a118929a2a228cd731854af9b6accf58df5bb0518a2a53c0a8bfd6d22d92a5a2110cc246b55c76cffbbf010c7456b3b1b17927322fdd11e1470806401db67bab4dd040598162e0f6434cc126bb60e71954f2d36997b469e510ef2d34030d57df01999e3cc77dc3e922a8365fa3d6de1867694cc7e7c7de583de5c3a765041e22337a05ae8858c12de8a13fa74df088a6bbdf4c2fbd24183a7a0532028a7409b97bec9c25a7e2fdce9f41d73654cef3d18a6faf1ce5374d541dc1f680873dd90b23eabd898b355ff31f5f34aa797ee4df3b7b154a89d8a0990b631cd7adf03167b3b7d4a6b66b69fe481bdf4d61c6892866e4dd8857dd2052a7090cd82c4cba87911e0f578c18b5f12fb4340bfec1068dcb7084eedb2cf240e07481faac1c2da1ea86493f42c32cf8922efaa4d38bbb0757926138645992c8ee663e814cec10f3f066b887179b2a9c47422255ac2da7f64f41dcf42c9c30a9071e117aa97ae1c0694400595c893a902e56b3e753ccd3219bd5019b0cd1be66d6d6028509431cf6906b8a3a000ca11586aed45008f618527f3d61a93d7b98415eed5667c47000d805212ea0b91984f2882cb3c2327fbf0b5f256703094b08603d48e04002c36ea86bc95710fea64da0e4c3b09510b20d5fc685cfb63825daf90288991c98c8e42cde4528dd46849c62559e00d281c555f7db591ee2329f4b93329d995901850cc56c2adc751a663a92486694113cbaa195d05886b36ae4019f3a222ace891e0dba48c4ea3670522ea302bc18cab9b8f7d53799ea79659abb400bcb836b90b350ccb356b6f1264e630dcb80decd3a9cda556a6529e3bd697c36bcd3eab462e9006e84e5c0fcf3d7e05bf9273f9eb0603ed461727d79d91a78240ed59e5d46cf42f572bb306db17ab1e7878ec0b80553562d07369a03524c37759454f005db6b2e91d46999e0ea14f4e0594999dacf11fed125a67e6089842fc22592c31955ad9933f92c5c1997dd42439886e8888f075a70226cef7b56fad5d0027d22ec4b1da926174f5eb11b1ef6363c48e639539c628eaefd79f8dc1fb311f70395624ee2bd51c876183a9204e2ea8726fe6db9f5f81d9862db3ab92867dbb2cffe8580525f30c37d4687da06aabacee54edf6ac2958dd62e59ca4a42c26096ac051e68621ebdf0ee1ec38bcb0bd0517d9576fff93d82d3e1e519e162153e8584b60f893de09ef2064b8533b80df9088d4177995d2a03eae3b5f50252c883bb4f3de14389862ca96a640ebe57045c4847bdc2c1a5addab687f0e240d73b0415aafcb1e6cfd523bf9fa8ee13c1684131d3ccfac15a86a048dd6f39a0d0fb57fa8eddd603a19fb0ef7b1225a960d4d3f78b3452936f7ef62c521c233a30250ed086c32e209f730850fd1f06985e3546476fb034334c2296dc11f8e81af6a4fdea6b4adc8670e4abe6d9457baf3111a8a9dbe05a8b8a0fe21bb1a3c19868c6310052b35fa257aaca7c3014a030d628c6ccd49d2cebeeb5c77d788344766893281dbc8488bd146cc349b5489a2c873d0ae1baca783c8a6746472a7e1b7cd34b4cf05ea609433814423bc91234614fc9b0775840cc7ac1f29cea6500db63c5da074dea95a58206bc2a354e3e97559fa22619de791573b75374b4878408dd7f5ce2ad2042bbf11cb306b3242814f9508b73d4aa3b290a0f5b12a50688b7e594c663100ecff6ebc78830f720998cc5f4f4c9eb3c89f3face4eab9e5ecb3a4659ced3ca6c16349c7eadb4e2daff6eb64417e1523caa6ed4b69585664150b0ba34867df3bc9a8f71403da07097db40236d8fda46d8865bd19cb6e6ebc71cd806f947f21cb50646ab5a27c232d90845ab0462c7efd985aebafa8235a8146cd77bca2529fc94383cb33f4b34301ec9d34d4cf607dcdf772423af7859baf5c287fa99b1eb592fd67330f4d8c0a46ca9e9324ab77e254949c3f790e89d677b536f0119ada168e20638e281335710da6766e3d9251c7f01dc37574a9d400c547693df3ea927119b2b22814cbe6615c2dd659348f0b83725e77879c1a14780b0fbb9f62f4b65ada3bd2a6a80504e27c3205a73fb9d6cc48c5e2e2a7fd808c53ee025ec11e5f6b2fd08cc50b3f7e61d653e471bd909ed0bcd49856003fb3a6e7ec2b3a4ccd310dc1aaaa26d10dad6452e86c1f5a2bb132920ad0f6f78d3a9005d03bc30cb102caa0804b9d51ada9cb897b672c9966a9c5f06cd7110ef155a6d749ab06f1cabe7946e8542462ae7c4f52b769853e4d640a8be03e7bd632dd9c01594530ec511162b59670556d68607218257564184e3b48e8e87952e202a4ad344e900311c20db1b5ce7316aca062dd90b6a26d63c6ce14de85d17c651858f244bf49aaf354f6da2429de154c410d7f8de42a32a393f43c083e117407cc0b488cb55564733a726cfbc84c2d5a0503d26c690fa93fb3c68cb50ecc6e78526f73fb6e75b915b3fd63f6b391cc3608f78977f55fd3320f85fe191b7fc34dc29703c95cbd693d877aa6a54a721dfd7913f7ee52bdf263f38ba4a437bfa29acbd0ee5d6958239c6fbd15cbc1ed41e51bf18a989de8e0f8bcc55e6dbd1851de6585cb62786c7dc754368fac14e54921679ce060994111785f15940a88e8e34237c15b1844ec483b665d855dfe3ced6524817d08d3f257cdc8357f503a15d02424698a26315dd05df68b39fced94d83fbcede317ea2a86c029d2eb828796b758ca65a81104ab64f8f698a54404197b6ec7e1ce35519da372ecff66eba80db86aa5522cf2a99eeebfcc6ce608cd6745845ba15241a7be740f8c76feaa03dfa55b28157da50d67cc7c936508749c0540fd8dfdf5f5fa71b01f42fa8706f0eb6a66bd48f926ce7a824ecd74b5412b0cd050baf89e2c281d5c2ddfd70237dcf01d6d932f554467da2a0b12c6a45bac6ff5099510e50156a8454f10ddb2d5d929f2b51af830791a90365b0e886e091346b9b3344477a68331eb8f23df87a5fd2d563c43de0202a8e7865884142a7345373d5f44114d7aec791c3b9825e72c879dfa05307200eef802e70d14ba949ddca5a2ca067ed3247868a8a88adf877377a54910232a1d72d955dd1bae4d827df8ab739380d4e9eaca4832ac281f54d7f9f9d04eecd061bebf4a419bc3191f8152240e66f72e870d220c9881cd805f0b98f73ad5463ce1857c32b7aae64fd869129451a0763006803451424d043b1db58025acd970853af7b47b7b83974650303f3a0a08b21240d691e84fa88386d670d48300484dcf34a763b6dc64243035db345320a412513e0d189724de3869fa71a68992b2f9679e58e97384e25835085da4f807de839b90a6c238a3067acb53c559e8dbd51651b8b980212ea417390aa2187bcfd59c7b99e9deda35e19c191c22cebc755b8dcfffad2ac5f135a158aee6114ad8e01b3a4dcc145f4270928230f811350a9260f4e5955caef515960987d1edead3b8eda459133251ce9a04f710414302bd10144026673186cd30a8c41eed50018125cfa9db2438dbcec6102af758c52221744cb07ce8ceb3f4d3697e0072946444aeadd121b604218459b76eecc6cdcc0d0c69ae93a38ca20b6b8e17d3e97ccf59a34c16a7cfb704c170159cafdf4680a8a080ce0f6ce6347d50a96904b7e344036ac13042fea88fc4a406ed3874ae283d5537ec86d90820a88a0de788cd49c20db04960d593a9ac0ecd6fad0119c63b8361c184357610f7c31cf184a7d11f9f51a4d879d876be08f7a42d6a59662d2094484db128c4b1b0574d44458908dccac8400823656316d81c90dc447f9cdaaf840475a473a43389bf8812e9125b38e246dafc3b44df7ea8347b3bcdc1380634274b3f1721b87e9cd443289c7e3e1652d2ec7eae526d0692711c783afee4a8c6c0806008102e125697bc7e92801a5de69db329d2232a27465ad04695491e4ab46246f091552747c9995a53269a3f0ecba225020bec1bb1a774ddd3106b2954e2501d1367d7a201ff6001560f9ffa29a2003b16a0096c09733d6a163bf71c0c9e2a205f1f117f021050c5c55cc7b979394f868edb43b06e734a13682ecdbaf3e21193895e5a5e809bf342ac515c23f88594dfb5f43edd276c5215770eca6dcb214978844e302932ec4be1f47fd7e12b0ef1524bb2f51372141de6df325628c2684d05143b5d5e7559f3af11073a7d89318df1842f79e5ea042f44ebb83ab7f348aa7ae509d0ba45eaeeaf9777399d7aa6828a6fb94d4a07611a3b46530b1899df01e604285011ac0f79e4be02e568c7953a0aadddcc98b55fdc87ca5af953ee9964f5ca5108af59b7b6b37df33bc940f94ae878535b91ade587169dc32d55bbbfd3d218eb3b2c2458948db776573bea37199c301319c21dc9c38cb6813379c9499082140f185bd2ff53e8bd7e10a25566609cf49b06ad8ee0cfef283f54e346d1d80fe16327e08250066f555fd62e3c7b8fc6fe9a75287e0d881c4442087868bd5723b6759894d2d95439644b11a4af674c5dd02b6c31e0fe41d533e66d6baeeda2aabc458cf657ebe0628681019adbd36a7200111ddc5ac531b6a85a7f989ef26c77523c4cfcf2f3b1bc6e98f6ec5280af4a1788fbf5bcc225aca6894b3364f68ae233bf142e56f3f8003cc8d620f28706a52f53418300b7aed66c065de9fd137d212fddec85aaf4c590e08ffa9da4c4564eaf1feacc91f5bb72a7207168bc1cb4945f1110f21c827a848da8e8743612cf9dce47e3a1dbd9483c773a138d874ee7a2f1d8ed6c249e3b9d89c653b7f3d178e87426120f9dce44e2a1d399483c743a1389874e6722f1d0e98c4ad554b20a074e755be0f5e231267048a908a90365ea50d75020d5414222214ef28030591d205a5e1ec8db35a3a2d3b9483c753b1f89874e6723f1dce97c341eba9d8dc473a733d178e8742e1a8fddce46e2b9d399683c753b1f8d874e6722f1d0e94c241e3a9d89c443a7332a555329553ebc64d5fab80cef0a91cf14400bd3e3ff0b3c5b7714d527b86b4295e9762b687b748a984c1abc5e79ad7b1fadc25c5a7d36cee0ad26a564f69bc6c7a6d74a684992ac90654a46a80489a289324a24d4244dd7902aa9a6298248d7343921d36a92a66b489554d31441a46b9a9c90693549d335a44aaa698a20d2354d4ec8b49aa4e91a5225d5344510e99a2616c8ac5c4c6ec6dd530d6015936bdfddc3f8c014f2a3996d74a30a0d48493c571d7a17ff747c40f68191e857fefc2a918a87fa7a0e9339c0b17242d253dbf70eb2885ae5e89faa155d3b5538b8cd8525a6b2d5b15f2bcfb0198f154b38a3a159317e5a7ea6cd3456965635f69e1a945ea86981d5fa84bc58504f39dc9388bc43cfff5b56416a078ecc3554b3b5c129c22fd604b462f50f86a80cc5f0b79079addb6881383084e16b85d3e2b2940292a689fe90ce0f381ad0048936e42462b3a6899d5d4c20264bf68278f750feff96b41be14aee50c5f0816c6ae6f1de85bcc6a477b65e2e1d14b3589baa09025a74cf861fe060d0528054fa5cd58ce4f81ee0002649a923fc040d43fbfff624539cd56a7ebd365882820269c348d5a2386c6ba3550cf11297bac58adf461a7113e85bcfdef12f3691d5187684cc883b0fc7a465fc13c1f626ba27e5a0ea698009a749870ffd61ae8e2cbff0ed07106ed58ccb6def735955265f7e327b70cd66b65bd1f98d5222dc0a8ff743935a1811979d1e147ff49c8e21b58a7216714635465f72807e4ef298444479fb8d7a9da84881ece141a6fd25c55b587c960141e23bffb5e486188b17390682a742710af28549cf809dce40fe1b18725722ad3a8f072a78277106d4bae84bf3252dc352bcad712ac14b58b3e168ee5b7241e43b153901765f498610a33b2ba30647959365d8e0fdb7893402fba701d9c98240ac65028b0645b6017ba06a572ff5aa5eba85a1527055595583f014063c12a353f9c228ada882e853c74f39b7ea40138c6a2e7b87efe77f92e6d61ddeeec47e649d8aa37578992138369ba29937994251d7fcd9c454db033f03b00ec53b415a1f64d5271a9187727e802bcd31850451052480f0c91d2e54e3c0352d21f0f543f8a676ba981af60f57b4a41185e205d6b8893d2d69c93a5ead07f67879736e4b717d6ab9362cec9039e0d6ea692df034f65e8923b63d027fced6015db861b1bc14756658c5491a2902c779256d0b2344be0b0e70b27c178f2dc055759fd25e636de84f1d4a2df1cdb65962797b3b474a76124856c510634c5acbf8be61c6aadcb7e1c2bbec972b07966807da9dd24b08dc8e12b82bdf7db077a44977a4aecfc05ea13fa1358808bce5abf47d0fe6848499871d35d883454b0d09fe597073d8f4a3ec3805b9c12eadf4359b030c3ac48ef112eea41a272cf2f2582564573b08a87e9ba7569365bac8f16b68f32afe859f2147da08c86e6af25297dc8e138850a28be3392e04ac5719a7357202bc3bfc86613c90f3d73f98f2ba9621b45b15c87a9062fb2617c053240fb306878b9d2752014800e6ab4514aa769f60723985dd185fed3e66b6f18674d984486276d4d25b148bd86d72574363f14eebad6e51d919bd09f0a975a1181abdb60daafebbf4dffb8ba0b709e30e69723bda5bf0351ab59d0d8c90065598d9a95a9c6254f1f090c31fbb5860d4e27d8c77cd9142102afec533e87648d0b7f586d8c57cb003458d8340875cbb092d1906697fd934e2b3e886064822d6340907c8bdd19defe91d6ce170278e169c845c89140e5d1248d8d2c4cd89f6a1524595fc6b123fdeb86fa1d06e495f03e23e478998c283020919279b4986e464e6ae403d42ab4b3e42e992e96bb84527f7bea3e321a20d4a071a5b0e8f3c5c15b898f6aff8b802a245f1e7aa99cbce0b62d6b5c1951b77e4674090324f6e807441640a5c00c017e27aec379cf66ee8715170758e5999c761ef11ed4b84992649cf005ca2d419b6e0cc0d8ec425f7554b82206ce076be138e85878dd679b06522c88ba73924145a6b2550749d0957375fe01b69e4b64cbc4de45b168b104bdd00a603a3b8774a80e77bf9f1af54da49a16e85dd63563fd5003228ed7d74a65c158239e82598353e7af4a1c94c30f803db03adabd35587906e712eedfca2531e9fa0fd983a331020e4e9e9f095c23677cba5ce304dd0c1a25e8b0ddb0e6650d123c38c0a1cf3dcbd24670561f48bf0a08b344d5d5c344db627ea94ed21acb6ee006d231ca3d15934886298881ee89e4e2699200410c1e7378eb29db86cb892980b8cbe3ea8ae9e72d16801c3b4e148bafb98eb37f74b2226153d2ba09fde38715889c0980c78f0bfef811538fcda5783c6e4ea284ffa07029c191acc28198b65cfc0b99698bd43c2f3b6665618782638dfd2d38c8d806599e07348542b182eeb34217e0206ca18442679cae5c875ee757523391e26ac0e3ee01a4e150f277acea393eebed8207233de82dc282fe098a8335b107383fe854ce5449c7662b9d90af071949d81ba4940ebb62e74334cf319d0849c8e729d8ec913e778a668e0c48d42132964cf0a554e598720610438dafcbc9ef901264c0406aa80aca1445c1c6d543f9b35cc56a31b5ddf704b8b241e3b977c18ab506d8debf2778c5d787aacc5aff5fc2461e2032c43e776e9bf3e0fb8c0401680bd09ad356b3c72859d2c3ffe1e01c7bb775edd4a31aa61f8503e9d07d8f28e4b89ef53ceb88de4cf417a0d013e919909e100924a681d8ecc78d606e579a43684c01006db541701850373f9b7b095b24cd441f270524ac419147231ee1df1a9bd2a8763888d53d72dcb4a9b826d16dea83d80c2ef9fdfb217c33946da0a107d587cde81c3e5cd8b0da66579a0a89b0cbcb5c6a4fb4830724c91060eadb3bb3e6767642a667eee4446b0245adee6553d777c94f36d986bdf2bbfe651e0645b006d957d16aa6588f7fdce81922dde8ca41b59cbbb8f6fd458b69f2d86c57319f235a692abcd9b0646abb9f88d97cae2c0288aaa6823939ef06bba30520e1ad97d00a52a5cb520a187c1ad0d1d6a15d22ad3680bb6a3f54adcbbd71861c2313f1892b04ba4497157f5f9af568d1f3794db93b8e0389fb5e087701c5eaebff401bb57107a82d8b7ece2a5fdf1365a01380bec46f231008dc154fa58d5f16987159e64d08bc9aa1a0b839af51cb7c7387c184857f9c19b3cd3765d30b3d9b8165af445b46010c47ad0428ad056f904023c07eec1f77739ee22c44ef7d1f9eece43abf9f5c68ba4d80223a5099467c9fe3fbdb364690a68f5eb79524eb301b504b6d2e40f7f18a3d6e03f7189f82c69f036af6ae39d97f2e6c7f65ce9708feaf401ada6a9bbc46ca5b1108716d122c21981ad81d2a36edbc0f5356e5bf477ab90ca103713cc0c454e7e6ba10b66b670138763176470676e031dd11436fded9a6067ad5763a254a00b92a8c314c395f07e9f6c8d2e8c26e6fd88647e8a82881cc1ca307c1a47f1204cad81480163627566134b4bc89291e56c0975e03bdcc856be3e69ff75e0fb1950e7fdbb4d97cce62758125f8bcb38c54ca6a092aacd491f70e504fc99a7bc1858535ae2193a8e9aabe0f0e157f7a92143b929c2c06d90f379824319b85d615159c3ae3818ded5d0c39c72872aa375eacd8f2318e5d128442eb2959657564bb8c82596612348768ead3b1b31bbf9a528562b7d0e5394b5514fc12f31b2af87e8c81dddbc42546379a90a52f71d7fb6139fcf438c79a2a3edbb41a330cfd14e5759882dafa1635a8f7e899a985120232d44a103c773ce7193916d4ddcd6117855f31229f4e37e05964f6b311939c9fdc0d918092dc2c3c885a9dc2ddca3f5c7830255fb1eb6785a25ae72505f837054d41dee60241061f221f7e029dff35381228b0c1fc2c2773989277c0233897ef2c3cf03f6167c80aeed780f1f647c5e147fadc7d6c1232de2211ed98d346c7fe292e0651011f61e6f3c12b2e7306c3f1b4a5f8ec7e304e159aae2d73769f129db941b4097541e2ba333c284b7040fbc415bbb454c322e1ee1d650f9a20c75b3bbbc596871757e3e62929a61eb909f3a57f2e8f699f8c32c7208dde96ed46b13c95f840168f282e1b07f90d567a21dc5a023ff22bc15591a2b6f045cce1b0e67d03df6e3c39f2cf0bc88ef0093545e99a5ac232b67a12d1c05479525118ca8c7ab17d825f5b69f2be6e1e874a582311749a1e9ed380bc93f73e0464f7ce6b2da2c3b1716b0d34a3d894200625acb96b48ccc9b78f36185f192f153b5ab3393d3a2922af2a65b8e484d1c2a8e5676db15cf6193fbcd45c3184430fa37479b2b7ff4853bf7c390909d7bd3ccf89bf5c5cdca48afb0933aa35e153015461000e46d48e632e2ec90aab00a32d4c0362392eb44d73408fe9410e0d0375b6882678f1a626119ff2ff432deac357361ac24b654c67f043cc5dd856b391291dd2cc79cf480915fe61c2e18f259118eb28575c8baf5b1e5c382bdc1a8036a1c1449e0a9f17e8b9591bf6e26c9465cab848483f952a1d2c5a18c5c000e4a602bcc0030c2df8793ca18137d2f61f574521939152f0ac9011a1478d9cd9de8eb44dfef75825e5feb9b9d914b88cd621cd03dcbaad6f3331969e7dbd340ddd3f604038c140335c984eee5a63caed60946d729b7905005f7f5615b8a7edb3b4ad88f2a5e30a78d7aa88ce2791ea85eea5c70fa45d4694b478e5e69f3691e2492930f521b8424533edecaf88f1fd61d2a3c6386d3d4dacc0af9d2c29b4be2845e5d969b789c8ca9250530d8262dadda22d91084b83b23951f8dac46eb04d745108052e27ebe992d215b7d40289b3f14f57337d4f931adf65c90cafd24484cce816fddc04dfa3cc1ed03cfdf7995c7ea913a5b82969f6234e07768b93b5d790d8cd765650718fd3614099613d07216855e84faaa1def6fac31961894dd982a8f6646b21535d140cb513545b18eb14054a82f68aec42c9ffe62e275d510fb6af953e9f6c6f2303542001b5c93f3df55f9339363f999fed34574cd638dbbeb093b1425e767cd9ff04a959d99a9c772b4fabf897d99ce9f955a830a4803cb8b3b5696a2a05214889dddce225414baa985a11dc82a97ea1d8779e59fd718516f267f0f7e5211e34cd77c70304b7901bf8eb7cb0bbfae6a440fa6d339311f555e398b6419976231c022742d62d18829af9c99990fb432b06957b4d16078e5c5ba324fbdcfa2cd98e4aabe4f67d0d75992ab32d0e0b686f03d3150a6d324c564ca24c8165789f222c8358ab9153227252d79e56723ba14d1bb95d93ecc92fa6db8f24a1dfc8418ecb5b6b330d7a205af0d6c8c2c3f8f563819726eabdc4fbc4159cf5e760ed5c30ba9ec21815a68c51d39d0d5ed89c680bacdf20d16ea5c14f75cc61fb1dd5ab99403ee5a8038f7fb6007d7f6b4d9e7e10b91746f6c6a1b190aa3aec14f4a43af7e2828ea51f9cd8423a507f462ad1048d238607ec54196ea342a9f26483f66b168d90507a98617a51057df45aaf51043e3f71e9e80c8a87cb490a527ae98d5ebd8f3617b4812de2ea4228445ac34d67086dfae5614556a2c2253626b731e86e99fa9dcbd303f41651bde81b9a64167dd42970e2d64fe123564cb87ca99290b198be5bf04955f4c449904434554912d96cb0523eb02007b9bf2d5a8a66df6d4786526b59eb55bbfe7bd29d03ee5f6cf90b7219062c7f508b42f1aa653f40e38925634f55391fd54dac495093175d4de58e30ce05a617b0f37ac1b41274f4ffc28e93e09ba56520599c3d4167a2dce205557106d11e20669cb52834c2bb2c325ed5568d70341cefc14741c64c9e4112678a8fcd755ce840bfbcc28a2d7a0d5c0ca96560bb6cd76b405a3b5121092a439e01148df4404c4a1582b1264a37d9f11c438a4db81a9cdbdc32f96b3a3f897228243614e6e3dbe45d18bbf05edaa6a9bf0e0b713b495ee3708d0066d097d295301d609831267787daf180e50f8ffcfeab81aaccb64b4533956c1489f52e237d09a1fc77465969f8af3dcd5dc02ac1e2e928888824e1ab1371addd01c348cc85afa854c71e57a70fdf9d403cdb4355f123d792a477a435c8c5674aa6e5d10730c3caa7a92efd1cc970c31cbd73480e17dc729b0a6c91119dcc244390c7d7e24650c576a5a55fef376d5ba78adff3e531fb055e7b278b457fcb3cf164eff28390f47489c782a35c3280ae53001d17efbd81228c8ce7badb445b3814ace5438729fa57cc6cf8ef6aa202d1c6db4962d3989b725efefb4e53a0ca506b3ac6de0049001dd890a36aa95fd70b6b71b6ef9a8ce08c8ac800cfc1d2041c103580e9563c68428c7764e9c1ff87513d361204b5167ade9aeaac4a2a7a9fc545e6ce09cb0a13112242987e804553f5efaab90630db42bb4b453eb3a5d4d21e6eb02461a5650e8aecb033cb2406799f7fd0c15126ff962074dee9983048a39d4b0b1bda8f9443e9f927387ec36d250b6d657137a3dbad8f42bc197a2cd6fd956ed293692e52daa68907c0b009e7a093ba9846615e55f81cb0f47ecec3a75ddfa13e9aa66c7e744d26935323ed7e1b65ea80a9e7ea2e683940315bfbcb53f2c97a389771ae0e67e0fa15204e4239940f0270de99ce58d65d14d978b8a3557aad1528d1dcc55fd6b6c74db7b1d9f8445885733649e187124f4c67e1ca78b5290ad97ed446318c7d3e2c7cc4ad809a4f0ae91c5864d523ade1310dd5ed0ab05f2ff29a6435f654c36465fa310b05b2ea84b2613b94452e561733221de390f725622953d2dff9d1b8c588784d83dbb97b96191f5cdd3fc7cbd12cba7a47188e2b23950f9b122a43a749834166b5b5b8ccc600c1f107e46e1be12672812fa9733f07efa3abd4874ab5f6610e4e902483ce4bcae26d619f2226b2050ba3163bec972fdda5fc068bc3152f58a3cf8b25e88716b5ca13027f43d0ad56cbf7d5141e80dd04a0d7a40d7155edc6cbf007c9b38a896fdd244e41824b75179e4e7c138aa0176ae579840617f71f7a55c9214911e6524fe3858797f055669178aaab46a141c6665427c1e4c19a0df009399df477393a50b290800995332456bc5517b1df02325a7e92a77d764049bb750edac8c858a07801e5f4024a22c0221f83c426f64a1b062e2d40a7c9cfa1b0434ff7455f5ff23480fa94721bbfd1a406a524e512c8442dac77ccfc3295083732fc007de2f2125465a6ccc68b4582ba410cccf810b2c5e906825f9469a0511f2d43d2540d1c5c68bb40599f428341173e3efcf5cbf1c0ebfb4b8ac87a5e5766e6cbf7ffa7c3569dd5f417a4fae55b085c5ae7f3090593bbe249f45b62517e2fe996d306e5ab159de675089499e30bcdd6eb6bb0ff47c9309ceaf31887d0d0aff43e15b61dd977c9b6a9bd3a0d713bd0802d51255cf6327a149a449154593a175d7af4c1a763b83741de82cbbe562062bb281f14e8732cb6b4cd5e51c06675ec7a082091031c7884c2b3aa466861ae8a893234e5189a0cd12613fae34fe0d4fa4ba573430354e318aa80b873675dda89ecb78d54c0f37d1613c11e921345aacdc5cb3cfe2c44a1813569f642a72f26fa6fe732b6129734a6602fbffb8fa64f8d48878ec88a46a9012e5de4969f2949d9dd80d1731264caf8e1d40f4c3058564826151a91bcf9c2e49924b0191e1b127ff2cd203dbc9e3031ee0ba0480b5c7c476b22f26b85f3cfd41d6cf71322f4ededd59d4dd8d574fb5342b45aa79d7d7a66ea82a5958e4978c84dcea862bf12807e5909daa73afabfa5f387fb9bc4971364f47ec08dfd808908d5f443c43611b0e0727587d853a014d78565e4e14a91e312b93f7462c459197f59d1dd5d9915ada95077562ef3779665ca3fd41c876b6f7c8fe50f4eefe6d041a64b100b8eb92c0a6e4a3c3c6ef60317023e4c59f258abe5ecabf493be976b53fd5cd6a4372c28c296ce7f4998cc8ff57729412f618e8c186674f437b18115219e8f233157f94d1ce9ef4755c365ae632dd9a88150c0e09ca7265b28afedd4aa75c5cb2d2959d5858475c8a260ea112e58f972e5ee5f7b3bb17f0cdb06c88ea431e76d2bc3d365407e48d027f1f350085eb8fac90308cd23ebd7ee5b77d096cdff657c27888a0d0077acc566047698d4f087c42c5caa227b1f5f4ec3d55b757f34bcf2322df3b9b9d48ca28bc4af52e564372ef77538135e1b190478547f72f3ccaf5fc92e450c30c7c948a18d02009383816108f6580b38304448b8722d22e1e6c4d274783321e451d8d07b81a8fb021a60534ed4ae6371299ca3620976d86f5988100906c32f2c8c082e491d62b793057f4efc0260f0e24ebbfd3de6751a4a23c989854a656e7e1dc4e79733197987e6b2a1478dafc247f120effb84090ac9723383deae32544ef460c42dbc961360bb973b0b1d9f1b3229347a7ef9cfc1d680342639ff6d05c4f7a209f15570cd63d6af1baf2996bad82c5d0d1fa455b040b21f227971bd6236ad02d1773c76b25a836145d775a709025a6a68ab261b1d6a87501617f438b662bb415de28b86babe32e653e677de732630706a44ad61035dbd834e2fe192842dbc4aadfe5ff471c29adf1f77287f8eaea7b58d48aa5f00914ce8eec9c660b04fe46b065eaae8cc5d4f642be2f7bfd0627ac3e5b207cf212bf1a088af434bb4c5a3bed525aae98bc39105398c8ec94807795f2c8ea0946c714eedb671464beee4c45a260daa3f5efdd6bdb4d3fb5ef9084809aa72d54112ec619af8bf303c44a3b9238fe5c53b8d90684d0f7c3b113697632a68119c034c09eb628c351a2945a332828c87c18809ad046444369fc833144fbd002c5e50461ccc3f10f83e646bfda3caf6a2c12e6409c6751a1308f437a68faea769f6771a46f2d2053f5cc33aa7138fac5e005480d6d59c856c75a2914d9a2698348343a60a59c92c3d06f187351bf65751e6849de95f834cd634855c2dc3f2c7f362ec2cd651f9d1df17d9770795f21c8802448e33e22c318d17d5db283b872cdd0a05536fa0c887482b13dab1a4067c9b67e19610b1715398e51c4d3836af02bf17cdfa8a135714cdc7aa009e3cced777381985b8344e32f1f183ad44918496e7d1a8c38f7e997cb6dc82c01dc8ca47c197658c64f81680b6375f843b4028784aee34c7ee353f8ab03e27cc54c3114ca37c98bb1505200443f62c967dd65b54ce501d5ad5a094dd7b7a38fa309cbbbabde90f6ef53583f17a48fe1f41a8cfeaf473dba6a36f6e336405cd39678249e90d553230541f0e1247adce92d41a16d4073baa6c50720657f15d83c83aa56ca8275c264a33c3a569053f8f95cce2311a7557a491df04a26879686f8b10a4517cb4168941a6ba85511792a1398c12a5ac5c08f3232502f60ac37882c5da7f72775db7bed13a69618350bdff246e5beb28cc59ed3b8c2e5df662990e932ebb15f472e43b8ff899ad2f4cf7d301a0229eddf099500821af6b44691778818074fbe1b271a825854658869031831f24853097c40fa6da1db17b3077cbf80bcb09f49d549a20c20a8dbb745c3a7858f45b8008b6494cff575f742f34bfcc41f5822ea4ec46c856b62370950e594ac66f9826aab0b5ba661f72d0a273dc8ad2a28a5b582fe4e1ccb0f882a8c0519fe68068c3e787b5ce0e7b24680d9ddab6cdb0c5e77e03bb52e7fc4251b68abaced26bb34c275947cc46147335a0f907ca3150dc025a25d7f0c4fcccae809b64694056e13e959a2ea4ff9e4da07fd75726c8cc3137792b981ce0cdbefaeb9437160c0ab1d7a7ec4c8a6a832664a08b8443316b8894cb55091e7321b2e63a56a301c3e8b98dbf844870f611801c8076c7ce3b62bff0c3b335e9b19c63b2d47d6d66ecca6a7cd8e1ac68a7c753ea486d7a2e7e1c52354d577c2842acea66e100cd6b18ab066e7a0ef7a61becf4918fa1bf908f1064d638728904715c942adb24af34ccc7e01bf60457282bfd3db61fd7b05c1c5e30dcf23ea60504b10baebecd002a058eb622b848663d6856d97d5bc604fed0ce4f2187bfa017b4cc37a30a613776424502579ef0f14dfadfa76a93e3a5b3005dea70a24ed8d2abd87496971e17cd8aa221d5d41f79d10aa14ccae67b13852e1451db769923b6852755a5520a251d2596581fa6b440c9f3c8c72a9b1f6eb90f5e555bc371d673c7a8f45ad20c435ca22d789058351cf15780e0185578fbe5f65fdaf53bd8fb1b07e6a5cad613f30ab5eb607ae296feb2bd6d92b6116e06867e414aa4cd621482455717fb6e916b0073e5996c92b539437cfa9756c2cc32991472036be26efbc51e60a8e2ddc5480b4265fc4d4e9acbd15eb7058398a48f917331ccc3262bca5677971399a934e9ec01126e22c0128031d38a91406e324570394de7bd91f82789ed1f29ae606a4e6bd6b0b630a65175d948b84e8fb18d28eb7383a31c5516e39c30f3d536ceba4f3abfb7aa2a9bf3fe6f6fd8f206aff9acb01a5cbb626478e9a828c20bdaf2d7196c2c5dc38cc83a4ad9df77a994557961608b1e305b80064cc2e2a12927c82916dc8464c631008e097187f4884c033ad4b521ab4ae77889b1f6217f7cf15a6a800b49b13e8b08b5dba7cdf2836aee733ee8fd16d3bea698715381f48a0c090a000fd912741b937e06223dc8b24b896bad3aacb0f67597564f1a02b39c13af047764028de2067ba646215282c83a9b6d82a16bad87510a55614ffefd7ec4f2f487e964718562cb696eae22f5f89d056ef4cc83dfcd817c0932d3313cdcfeb53494ef8fa9baf0a6a34e56e4207e3a3172a4a5ebf883da4e5a7bc3e91ea10b015db15b250319b55c566769f8809bdad5ea99e861ab33bef3f40616fedd801c17abd0197b2a621cd268bc89b17f611d7cdc30eab2c5c3b542f4ebadd7619020d90161ccfe7a6ef7ffc9e5d5f90fc97f5acf473c75de2c9176b99c397cb66ecf176181303df39545c5e56871e2875508716041f44c4308a252b98623e60f20d157c0f24d3eeed9e9990462fd8d04a6f439efe0c6b3a021ca3f9a8d6ca52746bff029932a506a2b4d088ed3824fc533b942b2fc5494c8c0bba7e772b0356bfe6e7ca5028343d19db2dc6060ea05b3b7cd75d3fd3ab9831d1f9fb4b4d4ce242a64d489770fb5ee986ecb63a8fed5e73d6008cf76cc11ca732879f7ea7836d151b3d8e6ae3c7e08654ce0dcb8e91e9d790eee308de91e63901e266c16ef18fdde92370ce58800217b6a3e99c00e05c079a64e72058d95fb64f11f1530b16f98a3c685d68936fa21eb9739fe30545f1b304a3693caf2a17d4eb11b3c92f48acbad3a8762cdc7246995d6fa71e437bf74d0ea027d5a8f27f0651980a3d81627419bfb9ad2fca4e9d567f019b501fe22884efba502938aec0a23ef2afe89c196fd947e37836ab167af57036e23042d96e1b91c0c73babca667689604126374b08883afdb50bde26a24afb476b80defe53a15d18dc5bd7f1aa761d2d26c279f4bdd3a489cdbb707202a2f8acd9a1e8d86f947faf90ba508e694d7e089a3a466e9c3f76062434010a723a32fbe39c5dd5b805840d354cac740cecd376256e37b80e23e79144ae4541ad53282b10f645aa18665c361a16e9a0866363b26025d2f4d9a61b7afbdee48f83cac38ec2a387d4f098bb01da4ad42c30b24142ef800fe1b21ac27d4baadd99eb7ad6f11b4befdd3d1204e9db098915e6164556d72cb2ac0bb7ec5dff635ee8051cb5b2248ace13b8a7be4bbc2e4537a5002a04099d7130c6f277adb76ae9d047b98ce798c2ffb0152026f919039573b28d4401a2dcc27ed0415dd428662e276ace15cef58b4fd0d4ffe598b2cf255376a7773d819b9679cb5386fe5a2dd4f5f526e654f4274f9c1ffa3407d5f72343e242d9a0eec47ac5eb73db2a5560678e38b16285852e8c34e0a0bbeae9998eb94fa88bffae4e0d6b545f3684cf2c8bfaa3e2610af6b6c9b6f266a588b80c0add7a42b5cdc3f27d678f410681f012055832055700cb064c93a0f377d0484bcc549805ed906ed285aac401a63bbeba51cee72af099cf5eca9b31e651f2a0dc14a60fe00cad3d00c35d1923c8b9b4c2ce1eac6c5f0a1b6abae82af6223678850927f52b18d2b1221ba351c971fbce79597a68249ccb200d885eeac0ed9be790c93408a3867cfbc7d362cb9b96684ab190cdbfef9b331f82d646acaa8abf133503f4be4e4f76b03822bca1fe9c5b33925af197fd493290e69de624248b0c403b3113d2d427f0e6c4a0d50236be23cbc66808b28290315da7f862b38c4b3d881291375de86f460303d11ba59991062411d41c0fe9cd8e521752437f0cf2f8a6bd7ae5c023b8f669e4bd9e1f79b3b4dd5cea33aef3190859656f6221832827363fac24b696a589b16da4cb695f625abc51b54eed2e62e52eda4581ad3c89b3411f76cd638c63a5cd6d8cb78c6eff063aeaeb5e66dbdabaf31ecf6ed847009421f614fdfffbb3193b31f8b5371e323786437efd614f72aed21d71e6e82bf39d6e07a28f243a77dbf32bb48de9e0cc457e4298fd6c8a725914c94cb2faa5a1c139a7f5180179c68c7f70eb9ed38b6ece14fd0a404b812078223069a69829c9b667b42ba5d3257fc4cf00f4013912e8a4200cde37e40f94105063be3f76b936fba48a1982c6a3bf52d93905978858173d3cd569a48ec106abe476915bbff8df3db64ce81b001800575f73582485a9c6771340f4217d5a118540083ad1fe97cf35240d3a1e04abf39b2bdc883e98158940622f299da73f2601238eb3f71e580dc9d4615f37df054ee0a9189a2a2602dcd8403ed1b2aea50bb6851ef48235dc171415af45329733515e450ba55660b3915b4fd0a2ed9d3f4600adf3b8a4c42aaeb32c2c0671856f99c0eece6758f15d4522c31cb7075db4ac3074d37a8af391d3b7d55c93b977b01776a52b4506ccda84ac50df07fef0a4f37fdad2ca8e9efefd9380d5848a84053a93c842fc96016f89a8edf7befcdb3ab2030f0b8be4e3909013cde00e5132c9abf95bd343cd01c9c7c232e34433e2ec8199a01da49c741868713f1797b20496d7e3040683f82662526564f339a7852cc60ca007967a4f7135da2be381246cb55d6da90f138bfcb03f1220bf9f77327d8627d3ede9c97d0894437834567519d64b7ccddf0068ba280d288035edc3cc68faf77e2cef669b51cf658038aba3d102e6b673fe7e9fd7c337b009163a2d097191e4febb94b3994b4a078397b8c6d245f714f629cac003ca7246d2a5a7cb36c53cce3f95b5e8f7a34b6718ff71fd91a9da2b29133b2c45333f6bd9f89e933264bcd83a611f706390edd56333057556a006b47662ce3a74ff8672c7de6b700cb5404848df470653d89ac290c9af05d4dc5ac201ab7d083f48d2b2014e1e82446605dc63023439001f95bf2d17123470f2746e13904c249977a14f9c6e52ba179002101204d5bc1cf03e517c3545263188dc056964b70d1198e58d7193b5eb9530f3534f00324f1fc9daf17a026fefd0aa2a13806190926fd4d935af05b0dac115988039492a09f905b21f72446631b8919b68ba213090f065e83192e7c4ca0e0d5a568defb44938c9f4cc0e0dd6969f8008ea32369d8e68f03e1aa00402b76ef11be25a9fa3fe5c24f4a92c481a305913d2172a3c1d1869c871eaaf2587f9cc50a8691bd5bc8407daaca21ded90e3d38e76e32dc1a6c16c50f024843be52e0770de0321d520b102f25db04498d10e7f5aed008f42b6d1a0e5a3dd57f95feea008a05127d3c5c147754bbf10248bbbde7a5073c09b2021f1db52678b1933bc155d591a1d05f8289307372671e84abac7258056b3ecb3b03f36d8f1828dc0bc5426be259c95cc28ea3d71bd63f229925c1eb3650509daffbb9f2f33ff8e753780e7ad91674dc1675f0eefcdc088751d6f0c4715964e595848a8b59158c889da3d69b54e4309409e0f1dcb06eef5390d62dfd0c8e158b158ae79cf02c47a811cd859d71310221dd68933ac1ba724163ce26719c5d9f20e9679bbff34fee36cbf2c9862b382c9026c6e98b3e264ee6de0ecdeac0b2fd4fabe09965d877c2c685704fad40ad3504846ba53209c016ce1133929c07dc56ac7ef2ce2edf946cac187739baa5063a72fe59573010ab202cb55eb16b8fbf2a064d5ac53c0bb5a069c12a48eb2c8b0fe624823f11d720f739bc4e5fbb6f4b7fcdb5a0636b3285d7495e1842f9380bc2d05c9c23640c368fde984d55e225f08d9cab703ea400a4bc22118004221f79020c65d438efb24b12793559741055ca39168a50c1842226b66a399b305d2077b5bc30196f2e7238c5f4f854d13d48afed5c3c751c2b5028cf0d6afd6602ad10ac7f2856c5f50c6177848ad27dcb8e1de35441c4db6f028b3943f9258363398914c97035544755a01e716265e3d01b9c069b4f3412a821670800dce644ba55d63a2bf345815941d76473428ac640cff7a134f6be6446e19e7f584e338f13fc2e835dd66e47f2b172ee5f4cba1438a8b7bc3e974274749681dceecf0cffe1d9032bc6362e759a46eaf713ebaaa106010660408889c60cc61b9a01030381f1da0e204dcffaeb2142e6f9ebfd9081862754e1805664952eac7c47d416ace1ee02d27a093402cfa3aae315daf1000e46265085a7e19691982c2e198e4ac34c28039510dce5479d5008b8b4520f775c78e6c6d71203e324f73fc06b0a6ebf222a0e97d6cc3f7074d4f778e630827ae8b39d2d0f4d654252d7d0a720a2980bb14e3b7560e9a67cf92d748632f5edc91e31753131c14a1733f36ae88f74f195cda0f4520e1681a7730a117039fb409a101858062f6858bfe6a728fb76bd3a9c7b8d8947af182f5dc895f35c40c1c590ca8ee0ac391a46b799f9c2650ab917c8448405cc75f19096a5b09fa70441be28b64e070340af668891c6c899de2794279912485fc9dd51c0b2c1297cf3eff8f495224dea54a082b1c7fe6fa01577cc2c04c04b2ac73264d24eecc4461808b2ed34e442279194ec19b1c30099bddbfa57e24864492e67f3984ba3f82db1cc5eb1b8c4634f333250a370d1c4bea2e3f215ed266f5d7ab7911853bc7e7c6fa60d80330c284bf7419b6206ec96125853e8e80dea182d185c243d7585e2c0079256faab097f471ade480388beb770538952aac2d0c6630445f46abd5009963eda2acc94d58300ec71b6961f8de3c49fc9970b54fa7e7ddc40ab541e197ac0c004cb2ab3f094772f52955ccac251e25b6fe655c946111369d0f8d05d77db2d5bc08f9f96184f07c45b01119b30701119ee1484f55c4abaad9f35668259759d05a0ffea4e1027ac71af589838026ce33a4375b78e21cb3eaaf97e1cf9ad351e33e80f27e00a8a2c7e44a00f7ae5c9916e5fba4deec2f1aae32175d6781ed088c0c95422be4c2541fddc49bc3bf969263e22f657e8554c07ccf1ab8cb6e4f5094c946b66f8190deca07f2944f38d72d9e7ac907f2a3302b8ee6cc6bb3b70f221f12f77c9ce0ffdbe85c9435b1872a5dbbfababd4bf83362512a2d9b9dd7366dbb82134dca223d904af7699d739df0f70ffb5bbdc35f2b2a411f28fc872e5763ea30d5c9f9e816e6aa91dab8a04d9509131f8da9a7574190bb66b8ffe88c590d0b236bcabebfbaac3cbafe380c9ed37a168827b6df250a4ee723b395653d48085054c8caf5dfebf5eded630f8e82d346b1d716c85adfc171ddda078f6323e739faf1c94606a1142f6c84e2a3523ca8e855118f4bbea5a533c6f8c2b70db4246590e3d4bd9aca23ac7a0ae082ed45a4b6083a81d097b3cf27f1592bdfcead850d6873736a2f42813bf2f2b2b04feed299c8244e9ee98b5f645dc2279cb9e2714d1edadbc6fc34b5ad26f9f6261f12609382b1c6b020a8913deb3d77f21cad2852f5f2826ab6ab19f5a975ac8eda3be8c75643d138b7140195fba2b72b79d4de098d47fbc435d15e7cf6eb5cc971f12e6428ca5cd1a3bf411827a13324f1ba37f4f88d64338626b2913ed70eab24dc54fbf984f12b891ded691f0507763d284a061eb941e5762fcb37e3fc99682aac0e8ec562d1e6c686f696cb0cd04ca9d8239a7988f584ad361e87e8ab26e752340e1c6926143035a570562dec0cb2013f9f8aa492737c8a766c37b90621a2e5e21dfed94f728e3324b8408acbfdf47a672aea59d1167929e40fafa71e2fa3fa59cd58028b6df6068467a0c8dc2fc02be93c493b0fd3cd6947b89df93dbb97a3a065aee767a86c7d94392ce6561dac1eb485ae9cd0d90fd425c20c6056c7416be84dbd3cfdc19ca4ccab3111c80354b9ac8b98239fbb6b6303d0b6b55b4a532f042310b338b71c1ba10ab440c08549405d873ab7dd8a06396f6c369d229d6a5f93582dd04dca45a6ddc74cc66d1cf76b47588bb82ddb9a1a13fb3f043273934cea9a41ca091cb9aee1f07c0b624219eef9d5e93bad89d76682bb83b8f63be55def6c237d872816c5e7039ccce90f7b9adef1611b9d9fa14a64088d446d3800630e524ff41cb19c61ae24508b34be4669a9783c610ade81e94f88bda7c26f14e4151363c98f974c9102e9edbae8e8f23be631ffbf26f62cf24d80655714601126212d58674e3f1128c55c742cd857ee5741e3dd6b4f00ea5f62a234b20164c8f1413c550ea770dbc08a99f36d60de84b50253ccb833cc39bc161c3bb486940215263f0271816c0ebe3e9dfb39d527f9b40621758a692749fedf430c853b485dc3fa156793c117b86689be83866b360bf4b0c7b745a2c60067797e41ab177d08d48f2eb33291a38f753b2d041bc47e058ba7797d9def9cbb03ef83196befacff67c11ddccc83f1ad193d28f3b254b07a83ac945cb531f8fa6524d8f1dde7715057e832124111ca40a2ef29a1be58c17e35a0f50601c8cc90e9055ba42f28f30993a4a96f3995a5131726551c0ea66cdfe500575470a82ccc710c5d3459b89451cba052613ae90540b1eda50ad1ce15c0f55e0cef236d9ce2e88d0c0c9ef397ca43186b545ba5343a79a6ee2707cd987ce92fb55716ad2f3eb48d3e33e3ac1ee8895526fe3d36144295c0281f499b1e4ab0d982703019b3459c4b7552b004ee13d7e3321b77832ac69d47ed5c3223bfde46d82fcbc1e3f3840c2d0974b9354e0181b5ba12734273086f0be8fda0b0205d8069e915cd85492e20471b352bfd7f5aa020b7836ad685e022389f1a83b760495403138d333594636f0d4dde1036486a324eab5444ae363b765140bb8a375cf8d1f255bd4d0ca3cb4e41eaefb75e3724633faa44a0585c1d47ab48f63234936faada95d9afc78a0270c70774a2340cf93498227be10379eca4e88d9e4f63df713d5fa869f1645323317db352ae853454106155c2560d0cc85bb3de7f7f32473e8866afaa189b4e570f7b583993bf896acd4bdcc3d96b85035e02fb928f45d07095defe7fd7e50e18fecf40205c70df6885febda10bd2af507295501d776aa4b8f77ce37a8d0c3720408f9cd60aba584c46b6055bc3c0c7c672b763364a8fd6ca00d85f1ff2f7cfb7904f0f7c64021959917d6f867330b454056f68c8befe20017fabaae8883feb83994a31a27619e571df84e55b2f0b393bb1e4887da4de6f69c1d7b57bae5de69f5034cdca598a37c5db3b6bfc57bc7ffae48b1eada1f988d734c5703b5109e7010f8653fa058b103ec21dd6fb8b7b5b1ea7d4c5d9404187daacf406ce09e40236c0e14055130ac408b0b16ddc0017bb0951e02aadf492a321157248b174bcf21852fd4fe2eb73df1031c383a0704914c24551c4a1b9cf699b158ec9168a7bc12281db23dc6706ad04bff9f7767e5ad546cbe2111c35b33103c1dd7a40571567f27a74f4b090c208c51cc9ecdb159d416a7017f76328b6bd26d8f4b8511305f59d01ab14d856897ac6f2400fa06f86b033c637289926f80cba108744c4aaabbb2c1cb81d59b077967cfdb808b6064117641020bf1f63b078ec6d3815b973a81a450e479ca303e97189ed9715cd4dbbafb74167b3001b946e5f81ac90b4bdacd2268a2ac9991ade2f5f882dab77c4afe542d4683663b4e626a0fe117f0e4c21a5ddca8c616ac45163821e99cb66a8919cc8c49aa69586980df5bdf7e0d19e4303ca519c58945b92e09030646321e034825da7261579dbae7a0921ee2607eecc718b0cc93c00e099e2791eebc731e890fecb222fd89bd3a389d669c7265edc810c39547685b558fc25a35dabb28bc3e0dcae198bc51d65920d20edddf388cc7068be34d9f03df3c8df41087d0fc148718c0bc95dcfc4bdf7fbc03542c544235419821bf7ddac688999351b507d1d4f02455af42d08c5bbc19caeefcac137c37fedcfdbd589b975e9593d1eb8c522254384168445ecc59ed9b94f2946d58a7f68b02f55dd8e0c85a25d96798d841a42a6ddd4d4130026cb079afc400b31ace99080569981be240708c4d713d8ed9ec273eafc9d37f94a0bacbb997fb4c2d3912d9916539924bd36f9ee7744cd875fa7ac68b9298385253420c35093f4ebddcd2bcafbd84788da35a716cbcaa0690729f94209c8576e3637cd681c151113af23792ae34653a200550e0b35586b720a2c14aa40cafbdf178e3a8c194a3a9c3b6cf00993872fbef9b4d60da4017c411343297de4daf0f578cda46f030cab9b328183708c084f10894e9ab68918f7b7873b0778bd854dc481faec0cbff2d57e762cd82324d5e73609ceb33e3dab01a285cb9ee09ecfe52a17bbbe46123019e7e0f2fb518599829dfe4490919982460bd82de59bb194d65a97f4a6c938481a345b258dd1fec85d4d6aec1df0019e1a057b5d48a55d98d6f2b3cb1e6a6fa20d120a9009a35c1daa3d069fc8830d87de36311c63db055f5e436fedd34409744c5ed72cdc471f23268f94c6fa6b4fe084fd260ff7bc909b2ef83a5f8b20e0cf443804723a223507b0ccc99eba2d8b980a1a93196e0508453e14bddffb4d19984eef2d49902a10bb0a7b14c9373d633b69cde5bf0777d98f571a7947c6cd36db613d7094a9363cac044ba72bf35bf11350f11db9b4609c7591b2aa47112590a59e22af3f70dfb7cb798f82aaa3d0ed51a848bc5831ca6629f73b360e7f47531c5ff0ac355f5d62aaf557eef35ee278a4b371926f1c42fc76f5bc52afbb0795dfd7a61c15e4572077a542ae8d86f4c2feae98ae99956ac9fb8190bbf2c83591dba0cf2993a991a252d0b3863ed8d5bc174571079cb5a21be163448a858cdb95e617d86948922ad09533f66c38b8cb10f9c5a53b6df49372d077261d200a1e7b5b214a3abe0e4130331a083f02dc02388c79d567862ddc475c480bfe0e118659644f3deddb43009000dff7d3d93b12496b9fc0e18e49898d6edb7cad39a672de1277ef7c059219b56406822175beb5f6ebad8929fc2f51e06941952b78223a24996e5afd134c733e9a8be289b5eb418cf716002841c5e2355495779550bf9403a154ccf22fd69fed7b6075b398ac679d6afaba20d019cb9bb5d5a5d5efa9d81ce196b6d5b5989401f4dcfb36861fc57bce0a5198dbf5a93acf4a89a5a20bc0279e2eb33f6595b30bc87a9760fac4da90c9124a3f95f182958a63e04a265187368f6e6cda06955ca254b85255847ae89160beefa3df90ca1942d86fa4ec56d726ecd2f673668046a311699332efeda89600d7688aa4da04b3c241ccdbf5a67f8fd80e0b1d8556b2ff00c677a0f3d9150a17bdff626a3c1832088a9740e02cf88db4a1ef03d6fec8f43d404265e14ac0e09b8f078c5752ecca1585d2b97a8016acb5a241550ddb2500567a179b11a70b0b121583cf0a6d3cc37910d41e5499394f6be8d2d6e951810eb3d493b42de462f1ee9841937d37f9a5ef959aad2d0078210cb710961ff687cba889f924c8a0033b5fdba9e5aa83d05c33ff62349e98df3ebdd961d83985548cd16dd0e7a81870ded6fc2410cb571ff98253ea1669eafff43dd5af5e91dc3fa68e8d5bddd281bcfbead8295dbe31bf465e64988cb885d16a213d0ac07cb58f32c80553e50e4d28418881ac882e6cd4ba67be5f920112d5c507e98ae19caddb17fa2388b7d17a6dd709e041e201a2847bfa2c0317b3ecc855e99a57cc5870fe313e0e8667661ac2d0131b46cd37a4eae5ce5e618afa40b8cc7b3533f42cb33c8bc044316a66c47144155dcc7476073dc3fd1695f2f2a887462abbc9fae5f6acf551cb17eef7e655f23a948f045e3b367557213fcfd9d4dda4f6cb41cba6eea51413ab8721944995a55afb3fe961aec3a9a7aaa73654155634f541f392a2cbe26966888d914a2a5362843c7b248ce45f5e1668a6e01eebeaf5773cd6a57a83ec316dc41f3e7e96ec0fca820eb629c89835d135989adeff629d654b0467641c21bba329ca329d2eca153896aaf6dc70944d581d038756354322cfb69224c7bb6f01607b9e205bba8ec2d435a19214c35acfdde5942ec0cd912da565ed0ffdf40d6224a4d157c84136f7ff5e4e365565231cac0950577d751077f1314c7a5161942651b1ca9fc34526582397f6c8c7962de7c7aa7f55b82beb80c0703c8e06227e544e4516c611920a740ebbdade121275fe560ac26676f9f431714e06a4ab21a9404abc3a3bf9edfd1ea41120758d565ac0a15d31ab0100b738fea9f425f30b897955b848430ee184d771e2cb927e8e7da7cd1f392eed1375e0b4ba75b25c1dcca8131f0f7c7144beab29ac1708671d5c2b380f4f123e9e0b8c1b318bc89f17272ac207ee979e32a99a43fc4a54cdcb641b1a98fde717185d2b663b781b0a8b4f8e8914e5a9866154348868288695dbc54fcf5e0fd5269cbb7d829dd141b9c4a3a0f1091925c746429be67b1b9194ae82c8047e21c2b49a5d80cf9268dcb47b8c799c6773991dc96a2cb20f8d1ba1a38214f34a2bc9b8b57d597f828e800c448b494fee88a3ddf11f4e887ab108f4f80fbf55193dbea08a8ed4691dbfa088ece4160fa5ccfb9886a74092230d6ee796c58144eae4b26298921227fe9e0d4c12ff0c93c9da87b03e5e9cd1a9567ec5f252900fe5b5041b843400b7a34120be0eccb12ff78fc93f46c802748de25635aa62c1d04858e3d1aee2d4ee141d98127f70362a5e96ac487bd13463fb452b9b5c3c2f34fe926f3c2fc0561012fa3aa331e81398f5e6fbbad999b499c29dce65d4fdeeb6e569fac7e8559784f3a4e2f64a80b8523e16622ffa78de06d1f8bad877a323478cc8213e364025285c974c1e96c1643ad7988c95f4e75b42cf8711a0f48bb292db2444e556a636a01a5b4ecf473c489e98cd87f3f12c69fb099acf167d3a36f6b029c708575b94ccfca4a680feb3b3d91bcf91761163fb9c7c5010c8810cb41a81c26167a20b42611323f4987079a94a11335467e9c0564260d56de5e4875f54e7df75737fa6ac1ff969d0398fbf556b7f8f014d215c2d5f4bddd1b18ce820c3ad7325f957f30c290b738aaee9300b67605bc840f21aa60bb5317fb453ea8b0727befab1acf7ca840339b265df05beda1375c8616bd8364e1fed670a2798615d7c631babb6758d6029b05bd352a8f90134f7064ffa67d5963b562345ed6ff1c99326e42cb2dffa679679f244b822b8f209e6675831726826fbba08e3bdc3155d0dc0a579d282ce42b9d56b9ebe017d415ee54e5c8733c63e71eda83698286b4b746b9dfdb5a8545298108191edadb99b0707eb13abe56747967bfbdd0d5b555725504f8c839e6232f84f0bee410ed536c6f3ac6f63ac16abbbae41d7835a6bd78e7ab64bd50a704d0ac34666506a671c43aeef2df0b4d41b3aaf229687cf3105e818d3d4d8d586407f48e88aa4dd03e636e28bab1f35be6299023b2e9ef2155f206b826fec3c1422661677ce6ca8197797573c9bb0a41915c1c482220ad06e6d24717e8e306f787954f3184ebb23657a4e10cf3c270e6d8fff2e5bd8216c18c4cd635e76d1b4e5697305b7bbd59c178d5209aef846003c21e71969674119479240e3e46d807a6da60c863e95f7d1b86d6b86d4bbc0ad1298a14f3709c5343aad886e880588b295a6bcfc7d6d35467c28cfe82eb1f45b38c099af1252633d14fc5b2622271512221250aec24e9d5836d5c7a434776137e07e3cacd7238d80f17792a2083f13e81d83e2e8c46b07890e2404ee40b2de2811fbc41249e3b7df68aeccf1e37d7794d512a23bbdd28d75884f1252484fea1ea96f59ef47e3c4c4976a8e6ff9c8cce9dee1453041c8e590753107551eef855170d1213f845e55bea28959a486718e0fb0d7351ddcfaed0a5756557225d1f2d5a66a2a77368fd641ed09bc081b69e92e608d09b2e7b30d5950e0ef92c5360b583f5bcd531ba970deb86c826d26bc456409fb133128a911c84730bb31fb3fef98afbaca2e5fdabe657a5ae3684eb4fc7fe62a1bd0ebb251b7e46386b3ad5f088e3f6700570e5c2e57ffbf217d909cddfb6c0cf3e59188071c6992fff8a2d0eba711e132d3f5f879ee8918a24233c03ce622fa5954fdd6fe006a3748a74aaf27c1a3d8537f4f8b86a8a7dc08a6a32eab9b91c5f5e98eed7da6fa6ab6a54e884e110ae812cd1c609c331c9ca8f3a259b40df335f899f242ab3c769309ba2d6f583bd5d09a14c27a7c251c0548a97f00bfa434bf876a8832c6ca2137d635e627621005b2e21e74be04f67d05eabe659b5072e1b806d74a82b871027941895f981df8404a45b1d68511a59d22493fcf03648a54012c8316f149964d450a0fbd97f1b4761515169f5115000423801409e46f2b0f548175d559e876a66f66f6c3fe8deefb29c14024690b4f50669e97d89b0ace38193f6d0dcea0d193b570c4781f945cd08cfed35fd2a828541f6c31825a644d0cacf452e3d93b9547a16af36a62e0601df2a3efa60365c87897c36861876422f29d631c1f8bf8ec1fa2e2d7c3ea8284058a3bcd63bd6754ba63496cd25f86bff80658b194539c8f15d992f60cb0ebc2ec720556e3226235007fac268c54bf48bc300111b8c6e9db06ab79e57c3a51259ffafc15edf1f5f94fd8f4f53635632c6c6f043a2aa4f9dadea4dbc663c960fa7c4ebff3316d8a52eafdba920400e53daa06e323756c5acaf3d59db080ce6c188a0ac264d85d74216deaea4aff0f515147794e453e9bec36df15a259db8ddb66077437fa98a663c2418dcad45cc187ade36da415406b999710d1079e7feaef1c4cb894a53a616523422ad8f2fcd93607309366d31ad9bda87f24a2bdd29e6a121e970247ff3b9943dd695f7834d2c53ed113a811460a580db9d93098a158c03f9935ece9799c879b403e7778f38c020acac43b0958b12452589ec118415d4e738f7bb6c6c8e0692cb4423e614c0dbb6bfcaccc4824b1ca827d48f3fd2c94f2e645d96641665cdc9feb79ef68d978cb3b048e20991908e5b1c345a0f5a4a41a74733213483d8c034a4f471c2afa361dfa1abb27f4a63c061827113975c7b97526a4101b3a1310d05f76085c06a26497c835a1535bec7608021ae3064a2a5f1440ec6d504ae93cb36e780d726341b3fe98f523b2de7743314ce960dc27b34dac947887089c1c85d30ae8e7498be890380708e5a300b11392b8be82d6154974da76870505926008da2eb2851a078d8ae583c1022bf4a74f510b8170e3a87ad568c25d6fdcab306a458416e5e4965daa7daa267f5f02a5896a8b54698039c9c8bd878aa3ff09b54381cb8c1771c63aa2d0fcde69f22ae4e4d9dc8579b87ed5c94c9719a09422828fbe522275273d6b63082c4d3d1d72754e4dae57d82ea43929270c9f23140b67d1abb6c0e8f5ca0e299411cb05750222074e802bdf5aa83ee9b10e72a10a682ecacd8d536b4b043f8fc8fe7f34196410c38b722432d794d5601793186716b1facad817002c3135b9e8617046b441aa7d024dcc1a28359660e39a174be512f99d66ba1cc075890d16f95697471f31598fdb90303bee563814710eca07e382045e7880eda6e663b43232a89ac72148c77e55b3d93f6a7c23f8e1d4b6d0f1b35ad65730f50676b0a64806830d40446168085233735721d596282e2b10c501a693d6698322af06a11d44951c350847fe5feca3c449d704d665f019f9a08f6caf9c78fa84ec57af1d67705167b4c3abbb3b82a9b7b3b608a7ae2a6faf2378694f2961c2cbbc1263487da0a667cdda614746f6b718f20e00688687c51c540ca5c5824e21875d9560bdee91d0f72ccf1147fe089605dbabbcc160e4532e206388dab885c410595f69ccdf05e4ed6387d63ee68d3d0a9b4859c23167b6ec12b7608536943c56645b0a2256db3d07edef0c099cb95e3771c1b93464df9a17e036a8b4269bbd001b5431ef631fbbe68238aec1bf3c084b02707c95f6ecc2b20107eea181f2d87828c5abe1fcd1007b0058d4a8b7064a65ed398c2750dd17152467d0c4824b17f29a984b15100644368c8f9abf040831c891481cd5c87480a9613d73ae9befb59e0f1c8bd9657d7b99cdacb201758e21d790c57e21512157fd3ec14a2236e49d03cce19f998a2463bcd4aee20f68ab2e11ccce7c7a1676ac3cea6d85a2c5cc595685556ff4f3b8f4ff021ff367b23429f0226205c1b2b4d4524244229e06d1444bf3c786354fb358b0702a14712575027f3a2b5772118b609917975766589859eaed80ea05e10b47920ada72edbc97e19025097b9bda1075381d98a02bd5791718ac8a1c2c3e69b4a56c27f55a865e58eb5938b5f0136efb539fdc6e547ca3b139eb7deaba1e058212a5fc843409acf8924b194c6bc91db0a57da2e3285dc32ec22144419a1bf3756dfdb52b3ce609147d043a9dffb65a30da15a703e5648e12aad345be17799589db92c4fec4180ce34bfa2372d4b2b85152abc8b61943a4b16f018271fa8b738f733b0f972ba8c3be7aa14c187da963ef1508073bc1a254c2f84622cdd09fd2eebde5de72ef2d654a32150b850b530b42880e46f6a13ca77fcbc71823bfe52d2ee27ec31c59ba21129d1cb6bc080f6991524a59437af2c351cb472d5779ee1f25d13f021a61e13233464cb82a4e3183d668c727b77cc1941c8e7e728f9ef0e41e35c9fd3ea5f44f080032ccb7dc099b521cd59c0fe5ef935f651296e4506412f6c973da48bf2110f9ff53c85530f84e3c69ccd38c3167e84ff29c138746a44e86993047f56b23b0301f4ed894120387f684c3120d1c3ebe27d39ceff2f2ce1696d18ac8de193262b4b08c564496745f4adf1f1099a3a34838742743a6ce2d2ca3159145c2ca2e3834e243a61bfa500e91b0b2111f9ab029a5d65a6bfd7864aabf92bed687b9fdf148991993a9fed18a08f52c1f4fff8c49994d48a6fae90887d4dad27f35c53c1fcaf3ebfb0ddbf4f5e5fa6f4252c6ba7c942d319e05e6f42ba21fb55eb9dfeeccc0219581431b94e5c7c0610906872fb413cbf25f7672ff0bf82a4252e6468ba1d67161b5b45876463c3215f3ca4729730305974cc52c8a534881228794c7848378267dd8c14a97ebc2ba932cdfbe7f406426612759e2703a6db9a165d936a11095c34d482877071bb5843826d97b37acd8880fe5eeb99ee2286e9484a708f0023c6a394a67bb18787a9d0b4e5ada6b22b01377ac8546addc9f6d116b62c3516bd41aed4899b8ea1ff14819fb6281c2b2937bd4fa011a41797d41a3a03c82e5feecc6d528361a62d1616175b0566e1650ee9f219fdccde2ca2dc4c2635f5f50071bb5640af605d9d7904b2b862166ce9c4d82106cae26949af2155460e5f83ed661b11c739c3294e3155384f28e1caf98320357e2a9ed3730ccc922b0e4bd48f4dcaf7c9ec3584a9e10cadbbb3b7519eebb87a44c0b099d7698efefc3c4ac5e69ef4392226c5869cfea15fd285336eeb17c64fc56faed5b688aab62fcd6f2a4f7aee86bacf73596ebdc723bcbb89d4b242fd61adb419dc5cb8bae8c5bba2f1f5d254474d4cbd70f070e17e93e1c44b8883d2284ca0701f320b61f0e200eb92f7de9553e1c3efc209893bd9787b940ccc8454e1fb3ca0562463e7133de070a476d363e7e3734dec6819e38aaa17c39885ef4e500be87c390c310c8c92aff3df8f5e3bedb30ef7dfd7058c121d77d0f3ea8f2e0f5a0d70d718a88deaa702adc13d685a4c0e69c3099da7efbed2b0c8c3624f46a798e7b50e545214c47616030d785609f0703d3498109596bb788b396f7be1b26f2493fbf1c5a9ec361cb571b3f5f3970cfe110c410c8c9302ffada1ff8b5ba27ba2de58639363efb7250c12114bd7d1bbf1c605e043e0c0e45b8a5bc2061d9faedf15e7441205ccdc9c3477ae8f7ef617e3746d23f1f49e39eef91f84fdce33df8fee1f0a9fc8d8f1f0e2a7f3f7e43605e0517e11ee6bdfbc2ff0f71f90f17e1dec5bb71ddc7512b0e278734dec69bee907f171ce6e4ff953be43e0c0e73f27dd165b9614ec65fa5e7e1b7711a1fb38dd7be1b1bf887a56183c6d7b8be8406fe82588bbf33c6a721f7ff2ff69f4d0a077e259ffb8c660f7295f71bf8a257d5384ee3b4ffedebbfa8459fca0f5dc185d0155e44c9f10a2f9e6c5fcaf10a2f9a5ce1c5155ee86491e7fdad5f4371540edc87c3f7a2f7de79feba0bfcb87df5bcff1b737f42c0e79e03bf172d7115879dc75d55e471224ef40951790ec74fc8875b4ac7646afb5afb8bae2353dbc7fcc2b9c00a29196a0525f1246fbf6d614bc9db1006fce76f45fcca69981c1edd2241629ef1335e7e3bc495e3e834841d848388db8a3ce8e170c68b30d7525c35038ffe06dbcbb84278367d8c2b846797af0d45cab868c3c2599b088b9e7b113df7a22fc2fd07c551dbbb8ebd41781679cffd0be7850dc233f8d575866e83e184ffc070d58785a8f203bf0fcb2f88e7e122a2e770bf1cb53d71d416e43a2bef7d83c1fde67133bb8b445f63b9a738b0db3bcb956c9bca6fef3a958379ef0ad146b8e71ee60e9146be3f01f19d9ebb9e4f98019ebfdbf9e5725e58539bde4da5f72f48a924face22978f99f46e49a43b737f2e9fb9b47cf605696961f9ce2c38ec3cc245440f7e3f71950807d183a2ef06c4c22b835f84fb98abcbc669c17e8f76396ac380bfe886338b9ef4dd8439353afe1327894e83e8bd979c8d145d3b7b4e433a7fdff97bef864582f00c82ef52bcdf44bfbd0b791fb38803bf33f822dc3e8edafac751dbabdc76e2a8edc1db408efac91b188ec2810d7b28ff346b68dbb677b99a681a557d9809ddd961c27d4e7a03dbac6f25db47afe17e7a4d7deea9d770ef794df7dc6fdf0d778448bfc438382899dabe848ff0105fa6369f3dba8fabad83f276834c6d7f392d40e906c8d4f61c17f6e7360199da9efb7be27ebe864f5e864f1e3ee9a0adb2aff8c43d3e71f8b483fffc1e7a0be97ce9bfe1221ecb60a0c2a5949ea32475f79e1a6bf4ec7b9af8b483fc7e22b2314ecfc444e87718e7347fe57356f4714e131f21d26f55c007c2621c1cfba2efcf59498cd34364f494528a87a02f3f278f709429cf59e11e2b535a58b9f2ea2053a2cbe3be4cf9ab5cf0f690a918a3e10e92297fcc71c13dcd59d19bb3aade77b7fb7985e821324f1d9c1f64ca3f01136840f73cc415a713e3def36c9e6e7d3b1d4febbb7df3797762213a7bff5d20bc81be2344fa3b8c83d37d87db8787b84ad29fa471fff4870dd471e5758e2b7a7b15bf9bf8f29fcd75b2865fd91bd661586d05248b1ed0c00825bc747456f2c6951c42e6cc213aa7b50d2681e4cfa89a8e32d27d8d1a1296fbaae538851cd21c9b266a41448ef1bb91b4eb68d78554f380277764e79d6ae5baae8be2d3755dd7755de53c8a4f1ebd895df75de77d963dec75b4ebbc5227bbae7b8fe2aafadd4b569cd9be7b87d2d18e76b4a359e7596091bb8e7befa7f43c0fd37a810812f3f4fe24449e84782f3dafebbaceebbaceebbaea39aafb8a4b8eea3eabd1c9e63c30a5948dfd6ddc488c611ba019b2ebc0023df1f1a5ec590d89177c6aac114a9ecc7dd590b0740a1b4421e5d0cb5109cc67eb266ca5ec65ae3b51ca3d4c2c737f031197895080b829a010cadc678efba823030c70403cf099410e23169943656e86cc3ded4e86bc7537110836943b3baee24e42b2dc7d963bec398a7b8ee3befbed25c7fd764b8ee2bebbbf85f56c0b362c65281e65fe4b9dd250e63c9639a1cc6d1cc7f964fa612973400ce93c71e8ee49887b5b4771cf7d2fc17ec7715cacc1e1229247d3a24657d59865322c128b64383a0c6a8d33da38e79c334e39e59cd2fba79c53ce9e73ce19a78c522661fb183f24b9381545157daf7778f6564655a461a139c8febe8390ee8828576547853fb26bd79bc930e8e81dfe3eb27f7bd969c8fea1ed97b70845b1b0bc04892cdb9150e22fcd0c23559a133ca0042a64aee7920324c04600a592fc972894e4c143f620a2c38ba7072fda3a1df7cd84ab92382c09cb552e52c6570d453b71996884579ca2a73501283f048173e2628c87472daa870f01b0947e08227a31a69334ab753c4a5f1a17eeee2d93f4f01057fe44e0e8e8ac1c9f807866e2d56f925e25e909c2e6f845fcea1b001de34c0b993a3a39e230088f30ca85f1230262c4b93fbe5cc52fc8c4b1a533a94162ee18133fc6449c458ecfe53885cf2b2fc0c6297c80b297e3143e50e49026e9e967c9710a1f9e864d5b45759a18b1f78ef84ee3ddb97b66ba8e4eef88f3025a966553cbb2a9651aa8b1699aa685f021358c307288a3a393dd85b84e6e2c63cc7c2dfb82b47f400052c628a5c7e81ea3dfd031befbb78e395fcaeed9dddd9ab6d14debce300f47491414f937340e690f47c9efb7e94173e722fd3e548de7d4b04d0f1f2e4357f223bd22042d9995a07eaf616fdb3a2deb68bcf65d8683f0ac651ff6cbc75b8669e08e8667da492dd3362dd2083f73345a47beac9fc7c5e89bce36836a9341862fc8f63c6490496cad533fc615bd7613307a186b7a4de321432f38dc9a27c0ddf1432e0c3f801bf342ee8fbfe1d27c902bf340aeeab7ebe36feecc0be0d6f001b8397e75757cbe3ddee6e2781b2ece821c1583a8ca90105119ccd5edca62b096cf825c45791c8584a8a2298828f9b57a87cc845c60540a4b63afb9a4ff71fb692e7d1f57c6cfdcff1a2ecbf7b8a6f70bf32daefa5c119582afd534d4459bf07c4b686a70914f7da8ab69be56a44d9ae64be2dbe91df23f267a877c9a56963fe3cab44996b8059b00cb94beeeb8323c0c17001f7367781d3786cf71793c8eceaa2b04cd329820ced026628c4945c5da26442f9ff2885e7e0c34acac7cf734dc4e8aa3e4f3b8dd146ec745a3e403e0765f44947c196ed571d48ce1bebca90b85b81acbcf50011e278fa8d38caf996716ff6e4cef5f901932cb0b0fc3adf131d7c69b2e8dd771539fe3de781c17f59f0992689a8f67a769be25bd8389a6a13cbd433e4f123b59e6ce5f95ff2df19664f994a7a5fcd4fd5ae07215ea65e8b903bf7bd4eda010bb2d1a25dfc6edb0102b1131467e8ddbd1b81dbe9d94def1f22cf785c735bdcbcb177c71c8f2a70f599e7bed03c2f233de469a2e92dcc15cd5d12568f221b2cbcb98d3cb8e5372271366395598db59c64d12e38bf8958ce72490593299c5b81d69307d7f426676798139e1b0b329cc7999a183f9b4e40ee602f92426a5afa59ba4f445fcaa847be8d327bdfc22f4599ed4f459ee0c8e9294fb6ebafb1342b18767a0b11da42c9e6770950b0e8760a12dcf83c6b0601e33386ad455a1f322cb57b961c785b09b42965c745f64d97dae23d3877ab8caa6bb7dc8872c8f195035fe3f9f1c69e48886e89c1843b895818513914dc3893cd8410a74e889c8ccfff81f18a762210694e5ac7256dae7acb6cf59c51aa14b2bf7cf5c6d898d5feb107c62b0a4878f1e269394d365263bfb197c72215cd101d62a4e01841c04ada64f8e144527064a2647f2d8abbb4071dc9cf9998cc70c3c4a9cb5f13b872d54b1694e1e6e47ae32579ce9f6fccb2136e12757e9b989e4406881615f3edf4472fb72950d8ad21e3599b09c3ff37d22328323895822cacf6ae6735675925cbe80a48c9ab8e9493e4f96c5516ebf8375c954c292c69979fa5ce3393c5fa4702658f9324f110512a46bd49a71256c6c020d729853021e64534797af84253778ad4cb748fc24276b298b3f0082c1930c936598010135c1c2caf4b5c47594c7755472d350c9214c46810d2dcc55271b208efb82e28cc437c41828139f8644894f42e43f930c0fe14d563df373b2fc9c1c3f279f8614317dbbb2e99b496e26d9844f434c454ef5a3e9639ed1634f3027cb5b24befc262721d19b7c4ef69e1cbf49d6a17489b8066c38f2c1740f10d492e3145128f94980026078c463c5113e7925472b8e60225701e4caa69f5fa38ca5336f8099cf6a8da5b483c9f96531f117f40575b04e8aab9e0653b0aff9f4d61a6b6292bd8d4b29a594524a39af911ab9cedc18533497ea4dbd40e4978ca8420a4ce89ae1b086e94b373c409e38946fc2466a64ce744f52e3b12f77fb92f289257dd825fbe24caf9dc09eeca825a3e4ec6dc03512854ad30950a40987a59c71c18e5aa3246c102c299ae6f633b977154b96b246d64c609b144dcf996627659648f7c997052a0aeb1f1a894ffac7f6942a49d2487c921d17996f925564f1a444eaa490463c527e42e69bbece5b7a27d9bffa970309484bb7408ed3843fd817b4c4e698d191ab9190c212422bedab8ff7968d56e468c5115fe470b493fb24df871f4ff33ef8f8991fb5e4f7f0e369be07243e7ee6dbc7cf3c921f4ff33f7e66062399791fbffa8191f41099791f8f84e67f7c68f349e21d68fec7fb40f3e37d98c13edec6e3d74231b09e7fbc8fc7a1f999afa31dedc3114f0e472e9bf781440bc0675f5db57a1b463b5266f56dc369871fefe389fc781f18a7473e4efe1f6f83716cdec707e0f6983ebb486a3efb6ac35ddd58021b8e5aa7f9daaf3edfd3fc9ab741fb9a977d9a9f3f76dac186b7f91e569f3112ed576f8357ab4752f336e013f77165c3c7553f777f7054ffea4e40a6fa6db8b1288c5af6e5a49ff6655f24fb0aed6b75e3ca861b57f9c655acc127f9359fbd66ba44345cf33d645f83717a88d47c0ff4b5b007193ae05961e04712a0d510d107ad95f64c74a2949586bb06378bfaa0b56a9616fa392e6c5cfd48f261bb72bf0d101d4636bd8dd3dc211a8922a8d059d5fcccc5198206138000b4aaf9216638e172ad6a6cfcf3153ab6121289268f2bf7db282e93a4885ff5145979d213a1f2f6359ff4b5d693fc99cf59fdb83f7ef8f8198c33f33e1e47fb1f9fb3aa3b71c6c90848cad8f0fd2d2d2d2d6fc39db9fde31eb051a6244e492558970f1b0a12d94364e6e9671789f699fc70d49a55de701ac000ce43af2636f969070d1399c14ded4b96ec6b78d49229266c495bc27242391cfdfc3a1a41c9fd3e6e5cb9dcd059d45d2325727fcc3e4898490d66fd8a26669a1b5735f9c78d2b1fa61be72b8a0db2af160aed8ed0948fc75596095771b9dfbe6c944af3fd09894fc84c58bfa2c12d44737b8aa79a87f2b84abaaa93f249dcc15cae12715ab4504c35b62209941c6bee93ffccc755864f9e7d0fdad3ef21fb99ec69f6dac7d5c4e1c825b18d92dd93fcb81aed5c110e82d9b0853423e2175130b1051314dc808bd8aa3f7e3fa84441a7c6b6489d5ca3461236a4d9c649377ce1eb0b2f712875aa8eeb7de08cf94c38aabb09361cb5e28cb7e3aaf831f0b88ab4c4356a12674a3b961051fd3cfe0bfa961055a311c44b8146b0651bdf3f6ad978ea92a9e691299aabbd31675bb025917dfb2f2ffa1955a791b5cf7d37567447ad973bda192571d3412bb7b3f882825c1566ae2f0bd16759845b0acc51ddaecc356a8d761c55ba29dd307ee9eb5cd2c455fd7389ab3af79c2e47f58f927054ffa88447ad2eec8d9d5e527a1289f44d1e47f52481cd5e994f0645e68a332316c4991e4e344d0d71e6643299623ec6982f2897280f058a332efa53fa628b3c1b2f954aa5a78e2a7dfc5e5e4824d2d3ef86d4e349b7f4f123957eb33b5266d412bd9d3fd3092a85f2d484a2864bc38f6ecca3d6a8356abd4c184c28e6cf74d2039542a17e94ea315fd083347d766cd8425f0fd46549e93fb4d9dd0990cea4cff049e6b31d45d081ceea44844886a37df61f900e36310ea99581c3520c1cfe0987a80ee644e6b600b560e1a87e1a3773c598fe2e82a5505c55fab6b165ec0e75b92ac6f7d326a419eb1dfddd539e38f3df4f51106758be9f36d134aaefa74be2cce93b73cd58d36c42221c524b229148a4a78e227dfc44a42c8cccf2a54bfaf895de2565288f4c75d37c3c261e4c22917e7e37a4bf1d43463d79fc3e971d2578927165f81817007fba33bcead2f07f63a63c5226737d3c4d63777a87e93917cfc7735b8ed03bfa67b82d59c4987e00dc16196e8b144775e6c2f1fd7627c7f7479b71bc09c78734c7efb41821c6b0943090ce2d4131a6e513361cb55ab07015e9fba35f1cf2c8d3c3212acf6fe20f86e83ec2a15dc1614928f605958266961fc39396df328f1b6e79070e473db93f83e14816738f64a69be386de031c37f420a0d40dbd071e74e386ee936ddc90e60007a7a787de420656bcd6f2db8712b77cadb131e4fd41ea64f06b8dad2cb663f6c422fa179777dc42b863457ec0d57328bdc427d34b794fa6e7eec984857ce986a66f61b113e6a7e3d324bddfd3fcd2fb9bee696221f24b3844a2834427cb37995ec6ac38fb06207aae009d45fef34942443f71919517e18943232df35758fe25b4f6250b0edb924c9ce949d6924826ae853ad631db3177819553ea8f60be7e24c14cfbf38ede7445a2d7be9bd19ca5596748c26167d29b7e5e8ec321e94d25d2ed4c22914aa4d19ca3af3fc2618e8d145dd32d527fbec481cb7674e7c76f9a9e7443a993392c3c89f4e1a825e3495788ce1617994360bed66a73203df726538ce9b90b44879149f656d30d453fe34b371c2293708672d8f2226c44eae41a1a69f99947f5c2fc8c1b526028b7bc8c16dc5362809ad459f508d119c6c2bcfb934a5f8510c1c8f2e55f64198e5a26d2cb6b7a130e651dcaa59fa48f9f10a9935ffe850d5ea5f4676c4fa3ccfc16c8029534065bb1a986419005b65c15556ee6b384053fcc5cf255a2783e884f2ae0a6727f0802277975e02625d0126c758cd343c4fbfa3d7c3be10929ac80043a3aab2a8b78adea33d1615955dc3b780232258b78ada24c354b0e6921e808ed84288384a85a42546d5f4390e56b3d852c7ffb3e6f8f12148266ed4156479065047770e361e3c6f40f6b7c07f6d86e1c8d840e72203a8c2b42228af732d1170ebf9f2c7f1cf5c455a5171a82c582845eb02c3f2856f4f282b77377019039f71f5bfa10e53f19ec6b97b5ffa81d1e9505864a5581f997ca5dcfb2e77b922550c6026449190772f7f7777f4d1d31918a27af1c831c9f07a99a9ea4c4cb5e48733cd10c3299bfd1c08695757279f995d3890d09c56042414140dd1c076e58c549e6be02c0afe0b1193c1adafb6970d937cb6e36cc64be67fdf455aeed9226aa2cfbb5375bd23c956b6144ff22e2be8178b6d89d388a53b99ebb056401a7b8a03a916bab2651772a1395a72e29bdcb902d9ac4c099d009673019d8bb7094ccf3b64efc80b46b515813c90b1b5696e9497ffa7e718f30b7f30b4c7eb931c350eeebc75926e33f99cbe53ff52573d5d8971693f92e0ff3f185eeec9462ae32bd24fde9dd4da49797193266d0982143860cba633d95aae2d51aeb8299cc7e77df7c73976f90526b4ba5dfd901dd55bc288ec25d96ed1fc972487754beb628b604c1205864f0abf54a57e5fb03a2f38c18631f880e239f3e7e32428762e3df07c4b30a7627465cb8eb99eec4994d89387322011371062c81099a6614e3438a830c0ad11a2c6902858a07b25e597e50960f13e2f962ae6f48da5755d2ddda8123620c123146bebdd3e59edc63feb0f0ecb7b21ca589c0c260d7e9a12daca9871a257f68e61014ca12bcfe32aabbdab5759e713bcb88794696e179c68dfdddf8cf1b57dcf5fce2f2a27d8d1717171777790d4d236b8fe94e1dd55817bad3341dd43be4bb7c067354d3644f881914628c76448c87f953cc610673a1af38d3d92b07b2ac2c16f88a3331fbb7a4c06a4296ae7384dc43ad8538b38506a369462fbfbbd0aa0e035d44ab565ebe73a0fd88f60fb44a044dc3bd97ae6b485897d7647c48bbc81246b97879f914087126084dd3f2f2699438d3432042d38c82b2a452b27c213a85a3af976bffc287436719386cfa6a9acaea1db936f802fe5602b518b764baa413cccb6d0159baeb22f71bde3605149805b08b5436dd67263d094e71949c4764ba53b326368d524a290ca6f5a651fff90185406ddb96d8dc3530060a65ae6df39f998153402150089c42844a1844742c6b1a7217575188eddebfc290359135b1695afb0e180c0683654d801a5879807e6596b809d9ed575765a0476499b93a0b1b66aed859139ad3237503421e880d512044194e5459f4a5e1ca8a31ad85fd9c35a151184cdb9690dbd61add7adbb44d6b0ac5d2073f2c65d50359994b6eddfb373e75f886d86ddb83b429edd6bc9572d49dc43218a574270a3470399163d08ec8728bc26e4b80d94b6ebe8d6737490fedbe76fe7935fbbc9a69dba649c15625fedd835f8262bb07bfcab07d5c16ecfb8f97ad5e88a9fe184a43eeffc103af81dbc0a5f01d7811e45700805300854077e24774c086953544450ea6d01dbab3b39335014a1df9d23c3b3d5c371053f2ab07688ca91d1c632aac28d8692d2c7d49d1047dd117c80259edf29f28bd931b7620ffd134adb5a62ffad26408819cfc0fb69e7019f46bd2d5fd60f7de5d26f3dd89fff88fab40ec4e5c450397132d7822063c90628656c24f0e6be4a7214750d582dc4d0366f95b14ac7f63fadaa2b0217d79ac7b10e4400ad218886977ea3af06bac420a263f4f5ca6464dc255b10a1cc4b2dc5992e5575796ad29b9beaab8011772589d645977b2fc0ea43bae92a1c762aea24cb8ca976421364e835ce518e3ca92feddd3570ce88bd24f887ff79545a917717cdadebff169c3374421dabb8ec9fc8e4671fa721588691410d70eea6d89ca6249c1ca616505b550656555d09a004ec186916521cb304b799b12fb28140ef0d61cde89c87c1b5402a0d5c4271ee2aafb47a6e4e7ac3aae70faa7bf1dbcb2b267bd8dac77fec438bdca3e2b625bf510c9de7b24d97b4ea3787507efd075e2ca9229306c631af4f2ee200fca01d2f8b0220913d92f909bc9f45c632c0a6ca6320b1e8bf5053099f20055224b1664f97e852d804a5cfb6e65f93ee4aad8abda9232d3715877bc8bd3f6f3bdaa64878aeb578c33dfbba71d5a67e5bd87717a35f109fcdac295f54e5aae8abd8af95018760770de0a86d530d8d91736cc60ac6c7bf921cd22cbf7570f351457941e777a288872415cd02b08c43ab9278e2e7344e5f02416ecd317a5f4455ff4d53abcac051195b93c6bc1122e57d11d8ac3c381e3bb59f95a7778f4d2285408312608140831464abc09d9b0b23a996855fe058bbcddcef1cb4125d31badf88016795399597bb7e1d55896b7f1ddd8f86e5640254c32299e92ffc277936542ae5a1192997e471affe91d2e539faedc4c88e566b0950f3358268549f6f5d2289e92ef3f4d439fe21877b47c164490ab3aa2e8bbe0d047f843974f5f5226c35589a7e4cbb771da5e3453569a48c823bc03403a8f28065937dbbb2bcec4950a82b07e204b0f64f9a57ba47326c5550ff0327d961265a11ce5e853fc002f6f185482bd173e4abd4cc320f236238a529cbcfd0b9f9099372cb2d65afb363e2116b3d8f8ac0db5e78a68bf711864394a6aa5ef8652eec62744c3a0921b200b640d65d9c577e3d8372858fadd871ecb110343ad395a91a40a394699f9fea6efc6e30743e6840c56633b1f57b52a368afb10731f56176c20ce6c1c689a8f33335e7eedc0114d13e3613ea4a70fb9970fbbd0fb481f8256b4c2b2f2610b8de843176b6a99ecc3971db5363db2699ae65f7ffc726ac4346abc60e386f48edda65d1413f03299f86fec1d336ec695beec4f029d65b4d2127b47e8528a094d3915be6018bcf9618d7c719cd13e3e8d380316f1abe834d40dc418f9daad1c8831f2c15b8d8831f2fb56253cbc081a11df1455202ba2e4c7ca8a332bd4657db28cfdc43259041742a6afb865efb7b69060b9f7b7f196ab1c4780e52a25aee25efaabaa1111259f4a535455962dc519ed3d969bb211d1bfabdd1310f0b5f7d3d7f9f57bc8defbf915fcedca0cdef8f1109f0003234c9105108460ca13561fbef57a77bd56259575041b7a2cab2c8985ed3c2b2b7be641d6221520b8409ed77daeccfddd780a925cc10a209d55f6194ccab47d5120c494fc2864c9842cbf2535426555566555566555566565f91e934f51f14e8f7266da46b9eeaa6865a4a293238d21680e499b3e4b28a184124a28a184124a28a1440d36967d347b6c4857e674d113d23ea93671666bcd339b389384296ba82186185229f9e1cd6104ca3c47998ea938d3d99f0b45a1a90a214889b1878a0b6c48338f305a8f0da78e1a303de9a65dd947b80f82e6eea57cb0c19875d86e47bf8dab7e664d5ef1f291de327ad49c360e7548c9502f53fdb8890d5972e3f99c94dc47809c98e36b2db0e1e438676da1a341ce45ed01c53d86967a99526b4ba57f14aa478f07c104f0b081d2038847f4a4141b5d95b9a81336a4e08c594c16d870aae4e8ca2eeb89bcd9349efdbd69a4c6c47db2bc5ab7ccfeda0a6c48b3873979f68efe152f02692ab095c58bcd12bb05f498e764f2f404a923753e1f4a29ed6032e6aa4e4ad7459621f589655d501f0ac59c378ddd877c6cb3344b8f86728fde26a2bab8c1ad903bf42ae8d03b84886881c3871e9b21c0871e85211f7a13807ce85200f2a14fc94cf06109b98f903b68001f3a12b290ef77285c75c3f7fb8fab827cbf3bd9fee643af82c6860fdd8a99fca163b1fad05f5115800fbd07b96d3ef41fe4c62c4f710f9b2a58169b1b5c255b8e1a1255120411a543d3c81d224d2399903c07681ab9a477c86f7965696271c1d215a98fa32408a28ac620a2a4943c4d4379e492a6f95c54eeb44826248f4bbe740561d6cafd59d6a2adda7221de24c71a8d8b783e9df30dd139bdb9134e34a0e3dd5560018a8845115370f713c81bf3016ee24b075709c05fa468bde0558325e2437e631de2f5417eb421e228efe1281ce6303f2b95ac0fae925407228e7215223ac818a30d0f47390b6c1875b821dab87b0f1f886411abd0810eb6c8ad3151638db075727b0deeb3ece79c73ce39e7ac91a96d09e51a72b4e208a05ce9cf4b2f90e9c52c4e548eafefa314255b669486168741644cbadfaa0aa458810411667731e0e9e0611d9eeaefef463e9946e86810cf0ef0aee9f07b9a13a37e90998ca97edabfe11f622a094cfc3075e897cecca1d2a3827eb7cc7ee6ac68f719c8596d392bee713091ed29c6d9f049c3d4b52999b45634fc988a41505e32a2a40c4aa664145212a25a09d591dd1c6cbe214299114a765fd690320e8829f956a07d8106bca59ecf4c8a0e54a94479a07acc50ca4e856aac11aae864f9b537adcb75bbfe44e66e8cac02f33229343ad7695b076aed5c27839965f760385b9b1a961f3aaeadca5a7d395a91e48baeab5d2ad952a97a5ad79f11ef06fc4ec347bc6f4a7fa0112c23325857450e728de2055a5716509c1ed2386efb193262c09c5e4c25924b0bcb684564553250082f215496e3cc8f916bdc344aadad2eb193be69aeb15e10c3635ecaa4c49927645a34cd48d340f8829624cb8f21f6ac4a0683c961067391e2478a28933d1153b2d658d2cb242ce9dd4b2e47f91251e52da8b1a4cf5955bf31c6644fb05aa05d20c33cf42a83c954affa12995f670f3b32950991c06ace45d3b43816e2cce8e5bb174db3f2608c20836084a08b24baf02107432a019f4a99b8724d271bca9244faeeeeee6debee97df4dbbbbe8b6129ad05a344a0a8ddaa29b8b6e2f7a877c96db478831488831b277c86fb94ce6c41e806514c4b2cc5ccc9d94120636a42fd5b707d1983ef4ef97ff101ac551b296aa6ff8032b5982988a59085008622ae6955c591ced3ce66d7dd3381cd62428fe0ed3eec30a7ebb04c170717953dd3c4a3fff7971b80e1c616835dd27e36007e243dc60e9ac7ac2ced96bb2075b3eddacd66bc8148428432042501630294253624dd3c1c0bc36e3c5f4627a79f709d2925d70fc0b7377e815c8ba59cd6a96b93212c0bcb8d0259683e2a769ba9733ffc756f98fa684d55c71c6411e17130eb5df4c2e1de4d2d9e56eff723dc364b0d3674d724b76213df8127c973f32493f638446dc27c778d2e3d039ecdc38822e376630bbb880df41241931ecb622b22a1ced1de1872f5031c550e69123155350912bc9ebb8986c0dcb2e511194a30f72a4820a56f6cf87f93830c456d9fba743865132f58e1a92edf21bd278f013eb76cdb3a6cdeb6d315af2b62a4c93b76d4173bf9c20a6e48728193fc11359d89132ee8aa9992b0c9805300ba010d885ab40a1cc5110599055a0177d415159520647ac4af877e36d2aa4b10e8774e87503e7c0214de1aa03eba0e36dbc663e37727c5881526fe335c79d7fe366334b28baafeee9b85448a6e4a72e7d5dae25533a32251fc7a5372e0d92290965f6c871a34c79af6a50ea43148e5aa1641ddf295c59927e58c7f5beb2b25565edf0f88f947965f93f9f861bd6417427487ab70fc00d0810e378ed53425246479094c9a44cf616c7531cd2181dca1c8b6b713bd975dc1e1ee24ac77757071d384992faf39378fd1f8e392b916cd5a3bd8e1b57dea71e497d1cdea7707c7d03a4de4bbdf748707c7d24a9f7707c7d1f52ef3d921e22d9e77824f3753c92ec73bc7c03e8f8f906c891e3b347a2e3e723c9f119de41c7cff721c767fddec755bda7ae5a069332d2a5832d2983fa1b2fbc8d8f7104027db71bef2baed7bbdecfefa17ef61323e92192213939ce1e23c1e9e90123a93f1f490f91fadfe7ac90787f727cda617ef6446686717a1c13c9fec3383a3e7b9cd42aaebc8fabdadf9123277f1c1f57f523f845c1487a887c9f3d9293bfd743f63830920f9f1ce3f8ef71fcf7d9835fc5e1fda4a6e719ac54ba3862e9d55851056fcc1af5baeb56702efc0ade85f4188ed7b169c15dd411318238a38128e3bd2391e5d76e6392da98b0e82a7bfa7abdaa73e1310d96b960308f69e0edeca0e7fe6e549864b3bb4ceaa7ae8e8ba3bf52cee338ce5b09c5a88d7fe1713cea757c9224a9bff1397adeb8aa35563bf9e7b82fd88092e5df40a578b2d471e32a47eac615eac6d58db8ea4be44712201d26c6c9fed3fcfb08340859da57ef906d69d380601c51797f1bef4fd3c0689afe7963a734970b04a3065d62c75f006ba0968828bae3dc5320d020c4182a849e120bdb435a88334e10d16144154d42963ff472232c7dfdb8b80e3295b6ae53c1f767bc8c0f2907f361e77da015b97cb8c2d232fad0a57637a8c2dd1863ac6d7c7f868c1830a7175389e4d2c2325a117917e83b65b351feddb3459e5586b7c05dda4b23c1867487be624cd7bdca534a41ffaefb5ca49fc35549abd64a4197cb0a593e475f9d8575bdfbb85c8d5744c818ca7bfc6b5f2994b31b61d49b1fd854c69e5ea6a5fc081b822c67b53a53c2d222350265028d02b582c6a25f682dee0252e340e760043568c1406339d1c410093ae57965b1c06a98f2d01d2bc427b2745d204bffa203e90e49eb7e80329fcc95b9868686863cbf8d842de4793d266fdc0910eafaefa18eb1f3a123ad0515ec678e13894ca67b53a91862082b8bbe3616d8291646a9b5a5d23f0ad5e3bb01dffb78b0220b13e499552658988d33ddcb07379049c1f3e363a494c12889949d5497a39af4c8414cc9a02c0021cb5a0514ac03f9cfab833ca844dfa24aa80dc66b22580a9403568e40404339acac6c8a1050506522cb0702829281807e7204027245214720296e902b0b4715aee1537aeb0468a34ee43843d3e80603f2599279c418c963eb17180c4623f2c81e51514754a9bcb35478642848dfd9a157497a6ad0701a391637f0434cbd70eefe0c191fe343ca9d3eec5e3ef43e90f4a115b57cb8c2d242b3f2a18bc8d432f3c3971aae83de4244796fa1879c36cdd4c9f235286c2cacac1ed65a15199fd002cac14e756255b84c254bbaa4870a17146483a4c76ce9510f43f5e0e13eb06165f5500e52e3a3a3c0af4a1cd5b9b282d09cc192b011488a26ae8adbb66ddb0694c3f8d228189c8eab3a4dd3b40fb924596e1745e3aa74f8fe0c1931604e2fa612c9a58565b422b21304591a7e1996fbb0468e51f9f834aa6bdd9aa661f037fb4556b99d6964a18b8fe2fbc7ae68ee2ee42baee2dbb66d5bd53c2a149f801a75b7718d528a35ede505ac557afdb9bbbbbbbb1ba95193a84a62608cd49bc7fec699e822cace65ff8e75e582b10b0aadac6c98e462e909acc7958d00809cf39797ec0ba04694892b1d33641fd95f3381f55f895030b63473794a7e4bd683cc5d961cbf9b239b3bdd9cc427414edfd7487ca22d91b91c4e433cb440f68fb90a236c20737725c7181f663077327a39924c6ccb15d8e9364e852c55606304b8010a2e91ac756111ca302f2f5ff0bc58039fe586a008b2044323311673d50a108f1e281e1f033b0c0ea94c65794a1a396150c85160ac3f0485c02931472db1212874d28188a35eee52912a5ffd03e2ca1c2d965e5877a948ecae42b9fb657b5564ee4f480dc2758377e36e7b35280cd98697b7203c37e2654de515c5bee8fb653f8873f00763a4197db8b2e23d021bcb70c6afadbeb5e5285665b9aa9fd4f475695006cb84debbfeb15a0653f90c163999fab28620962057153ccdee3c81d93d81df3c3eb5c6b62b91e7ed89537cd124c70f8820d1069165fb8d21a0c5c08241b0f6293ef9700047f5126c50b7b7ba3ff0a96cd153b0452adc4ab7d9fa820c36a6e8e5778c2aedfd45df8db7cb6dbbaec3841c3f1ca213b202125059fd596e2c14a334a705c8f2567b6b1f56968d1eea21a9d59d12aa060c72ccd96d202b62516457859595615716d6c3e08e4cb54bcb5a64ad49ef30e1280982df3df86077a9cb95b9b6d85fb79bf964aeac49e6ca7c5abe9b6e0dc494870576c77f72e83f49c082bd61456c8a4c849421c7ce38dc06fe1351f263adadac89a3fc55be0ba6fda8b42dd485496c99a21911000020003314002028100a0784c2d18040262b92a80314800c7e9e4c7c5ea1c8b32487216490310618030004004000604030182100e45a5ad2498efbbed718cec85c738be6e5ec500449b23c0025852dec9a75a405982dfbbdd7b9cc75ccb030cf202708b788f153a7fb603b25c277a5f003561745fba822c1c0856ecb8ebc5d6abd5830a711e062430e3c1304dc4d5ab40f2f7c18c31bdb1403f96db183fd9e337e5221f1ac2bc764cdcf3bebcc1b0e917ad31791e3c696c732dd630d19f6234deb89b5d97b162570a5fb4f343904704c11c0f1f8d987e39f0900eeee463164acebabeccba1b1ebf172bdd13f157f24d130f1bac701cf256c4f3de23d53a421921e230839724671cfe34697af4649f78f2552e06a4607207f1324c784eed2f0627f8ec8f9dde4875c5f77ac994cf5951786f776984015c601bdb941603abd0cb5de6e20e8cebc4060fa834396452482fd12dfa5dd33d11518c6b7aed15581ed0e5b9f74da63bb699ae4135863dbafbb7c402a0f131f8830728edbe681b4e38edcb4f4ce69944e1bc632cbd4cc62e1cab261152e9c0ae6e0f853a90f076f95d0198c61017a5d80cb114361b5a861c71739641dd0e9bfc7b77456d2c1b76f56aaefb6963ac7e573b09edf98bbf98fc1f75fdbfc791a997ca26370e40271616b1a74b2a27b04877ced1503710158a49f98f2a4f698bf41c216615760aa07a21f6309806504841d39fae8ec718b4a1b041e0f7dc73d4ab664d0bec6d49395a6a6c87da9b4a1bfcc7d71a3714135bd3e7db0a129ae15ecd19a2ac9b513ad9464cb8344471ec89f9ee01283e1900c3fa18343a9194f6e61a30613322d6047431c4a588a952506755b8e83634184d77648a953092a216db7bf561bafb1d79b08a09c3fba83004a47e36ba791488bc5843ee74de7018190cea01ba02f8283ca816bc34312d025a06c775e920f9e81cbfc59d52f45d4a65b386e44fe47f39626c2b8fb8cedc3ae0c81009b601911a0d0a7ecdb2f4be110b9ca61324cb6301b3583a3b69f72ce4b202d3aba36d8f19528e4a26194bd6b2e955d5098ea794374746b6b0b225a2646982590304b47e0320ba09a00be0084995c033ef1f932a38c7fb745782eb28dd56f63dce327b0a286ff99310e99e4e755b1b3dc050db6064018c8ed28cc3a71b3bf7e61832a31dd56d50ece5e3663aa5cfac746cc8983bc4717d537406dd1bb0869b88cc222e13285bd3eb454f19686b7dcb6d9d7133f65d5e1a81a156630fcdda9746ee6cbd6795a3ee633e4675be5801e79d60a9a71a842c8737b0b91e5ba700ef4e57c9cfeaa6dc3250e2cf32e2d7365c546515f93067a8be452458d559e3299f954b43434978713475b7c37d6ce2021ffe34663c78b28ef6a5d872907fa92a64446d77410b5e52fd5259872846ef638b2f903574dc69333164d02659dff38a0059b3ae30e36cd568e5c4237210a94ca6c588ee900d9c9713851565f5df43644eaa08f131d3d135a1da7c3f98392520c50a8ae4c3488b184885d3ddeab35bb329946efee35614be625b892657ba9ec69230aa0551dfd49710744d36dae0b63a57d93c0c4e837a48776a91a82b66e29497fc2d3838a601a69d6c79575a9d087878aaa1c8e7bb21db366d4cd8c13b34a73cad28b03c5ae5ca4fd11deb348dfb633a81bb6d55cf318649234da95205095e062122e1285f2a4c8ef806600aaa6ccfe199e367f280c58aec96d9e002cd616eb1206715cec870aacee4389408f47b208fd4205617017e69bdde07149c01e07001c20bc9c39ce00d8596705b8e300260640b90111f895172945abe65bba1fe75d81bc3d163ae3b4567516bbbf6d26871a42f25dc04dfe12b19f2239cd60e725ac443805ba1c37c4ac7b26c199f45750abdbb4db7740572af4262d532a91f1c5ce72bfa2f264f0dd615b6b7958b48286aa0e04c549177de795695f76415bc5558447ce0d95bc02bd8fbf65e30a9c7a532aa7a0ed3e6a738ca9b964007abbfade994041964dea1265cd65e8504abd46e8e30df11fe89252e63eed4382e1c512f8bdbb2fbee4320d2624ae04163d7a20f30da794311cb4fff786405fc3d4a64abd477ea997de688fbe720915b1f98fc54da5b951a6dab2f89abed50fdd88f62fc22ae363ae41744fc60fa4e78c4c3c945ebaca03939474e2ea9842bd68a7e8d774f082b2e137b507a7e800747fcbc5ca514bd641282ca83c0b01979fd1ca68265889b6242625b0aaf47860b2584cf9f7c5b1dfdb5940ede14fb2d6f0dec608703ae8e8141dfeea80be2d6fff98e58266049f5eae06d793a9c7a8f395cc610fc1ae4d7a9882ba38681c3402ec54b89911f0b53c52c49d35256e3f4d7e85c1a02d2dcfb5eb009108c1acc1969a2c53eccf4865f9bc04d6c7a4317c54329b4711b87d453e2daef2489b853d4df9f0e8fffd52c20f96007b0b005d982e80156a7299d16493a5f37b8ac5509b4138e654b67227f140524e0af858e8817483c61dcc5dc2f9fbf435af89bf634f82cc7802922121bc8e6a9d1f091d3bf573f24f018da0e2c65a732bff114d513ca1abf1a96d61b496ae516d403fc1649d4a4571ff6b8f41bc33ec297f2a39be5f231d67da76d41d0cb607f5c750fa1f2175d346315983e09c09b25489fd14d14b6d08d680c52e8e5e5d94e48c02df99d446a6e7065dc1621b4af651621fd7cf760ccad13292ed1b15462eaf4780dd4134d66b761eecb3c3883f08682bce181027191cb6b141d5a2d685aa150d4dbac94200f30320cb6ad385abb14924bfa3038747d6a0e61f614dfd3ae36e505a8fb8b019a58491577c2271db48addbfa5d503011b122a152507499322018a65503c00fa4eb4d168d6f2ad1a300fb65e4381b57278e3ff409a782a23ea278dc4a93221b8c066b3a063e6042eb387ac276f2644ed74710fdddde5695a56cd5a604104952dd3f824f65ab933cabee8f22e4007b5d6ee3ea2978993c872b3429e220ff7b09a2d061aa47d1986d44dc396a6849941da0c1a1d59f3905151d83550db807f83477a67b918ce37ff59ce17f3d261584a14f428cc1b4c04f90e287094ce1210c5fdae3ca4c9c67008bbd568d1574c80e0d511306a6e2044b178953986989c1cd02cb66cca70936c9dd71622f30a6301c185da3af3db4f735640e992b9638b91d5a10cfecd94e6664ed767cb3ca39bbf88d1c0e01d8270c56374e1d54f6c062571e1cf13929b2f9b3778c9a7739cf062f49f9bd9bfb6a077bbfbd57f3a6f35fd5a9e473593b5466ba3dac960b39b57edc7dbf1c06f0afaeae16aa81eae6aa0c955df09da4b6a1a404c2866c9d33065845e917eca65138273e65c91b686689cc1e51000cb9f638e44cc94651ed41ebd67d561fa1522ddee3420726b21e41b9f719e60b25ef51b11ebecca492e43f1580681f61bcb337b0bfceb6f1f5e52593a243035784ecb6ced06f3e5d841abfc5f7ba5888040a5ca4a463893d1cab8601428cd943645c75ce65d5be7c678c747b611c31178d2a5dd4a8b96ab5de1964c4948f4b0a8e6a1b10ae7937c5bf6778cf18ce196e808edbe167af734eeeef15a2dc9495d07f8b84a9f4a6629699a09048fc352f527840c5c200eb0095d13113127fc8cff3677d68cc025643f1f8042f06d0fa3623ea9a527c8ec17be8643a5b6ca7a00914fce50886cfc8e05d118f10cdd98e08542708ebf4af4d5077b89b8087089216cd3544b21d76a66d4778ff97d22e5a4a10988587289448291805013275dbea1d134ca3aa7e993a53fd52691bcd8b58c58497674e91540bdd7a240b67300635f090d7c5359df0882e115503b705470c5519516aa59b3955ccf42ca1d7e0bc7245c1eb49c2b6cdc93c99f49cf22ef7973ac2ce9bf5080d3b7992c9c17737dbf32fff0665526efd2a0827d2e9d2609bffe24fa6bdabd8512e1698224b66cf3225ad8335e87c9042ae273f8e1d1ed664bae23d405b2ad921d97ff36cc43e0e0522be81669561111447d2052ff692193720085ea891fa63d09c62b3927903b5e13c0f9dccf7a8c2075caf55495232d3a1a1679506283e7d24ab9828e5d5337da16615ac9135633532be27899de2d0a97f054f008b25a3362c328ec9c7f50f6987b6d222fa73c190d7607d067c53e4c1fe1909fcd9de777281a5181dfb4a72323835a473254e716528d3ea700916c108f6a1d7d14f2e5f566cf53bad58dffb667bba41311bcdd45ca9771abdb6f6d430025709491047f8c18a50a3263cbd907f2b879eaa1d67407d05194351cb6c8ffb1891428cb40105eed9b17351a2571940496e41d60af863fc0aa69af640437a2216acc5f3e6fa2b22daf4d94a931a03662bd30408335dc7ba9330f72cd2d6dc5ebe31fcd7e0ed20f6dc50ac3141312451b69e0ba301475d61c19a2f105920d5d1d0c6b52fa0d00dedf56085383cd7dc2ac73926cbf912eddd8f2f1b49e4b8172c9109d065ad70da2b369c24486b40c5a1baac4d8cdb728097f285dbb41d5092e99441d0ce6519e3f25d45a5b3cd8ad8f2df1595878995a997a1b4e26f4dc914d2c9cd15a3311de43e876405fd70a7de60c2855306cfe2cb224b234181d3d00dc70d42000564edd2abbf813ba6d34dc01fc4e4c23a48c8c3c381810b35c26d0a620e02ad11ddb82f866376f0afcaefc1b656f680974cc4e2a56d2ed968ebb3ff902fa1fdb7ac919a82d31dc0017d48986989fec710eba313df52c4006a23013fa41a4bbddb379743284483b69abe7b226b8fb431d9f720d156dbd6ef7675efaf6f32aa90b336ba8a1532e37c2e3436d5de8bce6349c5e939c516e311a5d2d809e270a1b19bf756219e641ee0bc7e3a550eed72b478f2d8ea86d95320375dc6ed23c4316d90e4b51e5f420478bd62a37e32111955c84823cf1da4cc0b8f60065ad2404451c8f8ab62d64d543319f48782e08177b98c472e2261bb30f42a32825238a2675148dc82d1f1b8681a15060653c49b90aac5ec769cd84e43b72ad876e84a14a3a25f80763750394f4d74814633f280471f90664bbb749ebbc41ee1c8b2960f2343a2c8a95a0789f43ca3861b96b24b69af6d38d013932b1fa3b464e256ea1d3f6c70edaec63f99c17163a1ae64311b8d7065784ce8f9ed22e3118f7cc50e74f8b7c41b624f8b56a97f22c5c9d24182ca9965ea309440617dc5fa182dc7240c7cd7670364f961586b5a6b14d62069815708e352fb7211e8af5e7d0a68b11f8436fed166ea9032efaccb33751201f50d2da53543fcdffd7f19d0f7802680101e7b28a89dcbc7481fdfd830f1068b9ed43c7a5298fb31a9dcfe6ae87c5edb30edfb1efde2f451bf06c903292764dce999ca2fa24a1e17abbe72c2a1031d91a65b46f7f2147fc4378267de5c282890a25698cbadd9545d56444dd609e79258f89c0dc13b5793eb6691396011a0f70a75b8a9cc53bd90a5c9f741d38885a5582291ce6b52391a3373b9ce5c7d3ad818388321b07f675a93a0b98e3f4ee74ccbeb53ef85954af66d15aab9f088d6ad1d746de1677237050be03d516111c0a158f57a34c5c163a79204237b241bddd1fd7355d5c0df4c193ab03470e2735a487ea4877ee227ab74b451fd6e9325c2696fa5c774ee6fd936d83aa37f90d20175663db20a71bd17daaf337ea0add47cfb06a8955e1d4cdf0d5c3a6b1feaa10f56e66e01110b275001ed925ce09cb0a70dff84ae4499f2068584c19fad1d8e1f0d7f9a3dc090b2bf2d88d70b6fd00817a177b1d99814443b778cd0c5b86ae94dbb4558584b670340afd2dbd2e7c00d7eb4a21b03216cd3a37b7ea8ea2a8ddf4b0dbb69fef031ca2fa92ecbb99b1ba68eb50fac6f56ddb6f20fe135e9a1470c906f31563055289e43c262b87be948c6edfa7ce18817b740ed15b3348320c3be1f10d39ad9bf049fe76ca77c9fc4266cc45ff82fc87c3dc3fcba0dae083ea4314047d65838b1844e08ac0e09c602f8cbfea35bd46cfa8e30362ddb1223e3415afa446d0dcc7c49c575e147d6a518bb2a43e575628d83bf2c1c9a99782f2690a0ff87e48dd200555b264ca88c4542fc3bf00d692ef25ef42c2003e3225b681ae223000c23d5ff0f742aa220df4e2022432ae512ee6a56896000f88d28e4f9c61188ff850132852c05fb0d24c566c48ffba181e010e5d22aa98a817f1123c8c436e6309c20946a78cf3a5da6bc37826f1240d99ad479d03dca7012aada4f7762f94f36c42c0931332a16244081b3be384dc1a7a6af5dd588ea4d8598c94ef1e6ace92507c3ce6264f462046df3a8ef914db34449df5371b5045cbd4171aebb5f525cdd47eb9a2a286cd274da10c97353042649b43c1eacc32e0ab4f47705a65a350795f682cbc8e7056551118a1b0f63691161d52c8ada994b0ea42cd0061c67dfb68413520235ffbaa14d626afd08e20e38caf3032e9e8e416f0c3c12711c55b51eaf9cd809933ae0cf806d7a1515af3468adcc10b918ef5548bc1974d85ad0cf2e14b73bade175a28d1f6dc9c6464dedb4a00e4661f22bd81bbaaa675183acb103afe45528ec2d477be40c7267efd0ace438fa386d806a80b41937e9530b288917a38c22a2dc17594f962833ae31fbe8c69f112b5bd6c5cce6461119117df9bba5b8acda7f7f76d506c1544116a86b776efee1809e32c4dcc284c9d1533d53efc001bc430ec9dd53bd904850ea1ee116456e2209298a37cd35e56f007523fb9b266308269f62b52d5ef12802db8c6fcd2c4cda58910436a1f4c709bb217f5ec4bc31667c663d0d96406d92546260499be33226adc3592b0661f287d038c4442a6c09e0ba68edfc2a644e9429d93652a4137900b30ee1ca532c09cced1d1f0992c041719e2530ebf9daca07c58189c0accef9c4f90f8a8e4b782830632547fef58732912bcc85d0285d5e7bdc0f23354c58643a781a98dd451b87fd53367a477ed652d93b08155713414864322c8dc56a8ad8f7e8538e20438902d8fa44bfc4252d6a1f73130f390b5340ab60cbe2b210f453b18e809fd3609d7da2112f80bea0c94df4f2e0ce010d5ab020f9249ce9e505caf7ceab4a0841ef33672c52454dfeaebd23d5a313566ab1b52fa8951dbfe832f6ec7a22070dc05544e9850c7f0f4ebd2c2879c5cdf431b178a23b91abd5441cea84658812fa96d928a42be822673eebac0fffc066418cccc33835f405a412ef2beada43b373124947dea3753f2c6e304c4160920bcfbc4aaa28d4b32a41eae314432d7fe619a049eacea43685b8b8064dc015960272811574e1355e000200e25e47d2fb11b2daf00ea01a6b5944c64e902128d488db9fd71ffba942962dc97ffcdcfd47a3bc32887bc8ad8c8f80ae8af7d1af783927308abd11bc7566bbcb72f123d593cea3ddc541879c5f8258def540d86ef78575d1c17e9070fe7ffd9fc10c2c90dd548cb213fda8833f361941671f61b37dff5c65af41c01028b0ad67ef4118891195089d5220ddc75c75e5f05b276ea0ce191ed1ef633b5428856947be210b2208c05c688ecd40cc7de257c64bd8830260d6fe4b7127ea1346360a34f2c0ee630ce99959400a3224f49b9f17e3fae970f04c74c07117b594f1e07bd088b378f2954a2e21f9f90ab5b50a4462e80469a64eaa4541aadb28bd1ee90d07aa75fe12fba8561569dc8a2829fc9280b451470c18dc2dbc5c20bd3bcbb4da048ce6a9d0fc8b51a288fd95488f0d31662ae537ef8721262c71e6efa7d9a15a0d30a98d842bbc8eb075d5573601b200dca0649fac0257895d46bd0a42858621b17755a914a747948a3592dd9e7f215255bf3980edc5a5894d932eeb85ec95ae2e09a26b5d1dca99485c456b17c171f58f301fd627952ec2a1ac0e2322db70e28c55dc4aa0c9beeb10043062a0340843e8cef1527b09b7f229040101f0f818c0a2eb8baaf6555b3dda786fa35b7d84c8b269b68885eceb57acfbb8d0a74e7164fdd27c4180e782348b71d791e8f70e2f3116fe2ded70026ef6c15b2fbaf38702ebce81f5f092179853b1a5d18cbec857b6414b4738cd08389dce0a85f867a06cc99f3666bc3149dc32551ab690e18d1c1f2fa06894de0bdb239bbb653316f9351101a0c023b911768cd121b19e763d3e07261e03ea9456940d648aaf4e19a299e1d86c26240df6af3e2187b69794aef57a28714c972b4655cfea6509ac68f52c7094805af427c888c8b1dd54e251e030ff63bc941d2eef45705255f3094c2e17861e9211011bb330c122458131666a2cb8c534614a61f56da6b7be2965f85bb3e9f6289043d19436b0bb470e26b627dc3994cf7ddfe21089059d804c9cdf879b63e4dab0ea41fd759d24ecc7d43110c113f9be24098b569c7a7992181fd02607a5401b2b5037d15c3076226df70175396b6e6a43c83f41252bacf0be3ebcbaba75fcf65ac7260ab9e3f50bbca7925d4ff66a729180ffd81f11825e7a434ea9a23a25fad80dac896d744f0dfb2074be59f4586746f325826b465d9db7811119e141a68b6682053a58c3dac21d2da42464c2460d4281254b3340a3033ff16437926331fe3f1ddac360e7a6f539f023a1f00f31bd46ee83e7c7525796535c7bd05a7e42f4e3df618ea865e1b6de89ab741e84826452d3cbc224b1d2da302dedd81a053684038a7f366bc4a68f2cb247cf9a14aeaff43332396f97215924c4d1adec673b9b16e19c16b943117f8f6a2f80ce56eae4bf43f51e7170cd55112b9e4b642a5c224541269d3d2de5157ac0fac7163b5e506c02dc5016af5dbeff4e8c9b7f48fe7d80296ff8c13d8726c415a70a2d68ed2a5d88b7960c7dfd4fb413423596e8ede5a66f1485698d1c8cfed95802ecf9c10c5cd8d729f830bc666e783925b3ad8784ce7718e6eb833076c079a203ec94419febb059bf1ffebbb94eece8beeafb09cbc3197ad3b0f86dc185704630988cb5a783d036a417de04d8d058a8f1522c61b25f1207c5c5886f4d413980b5a79b128afc1e023a5142f93f20eeed0a7b3e4a28397ce90da19ba429a1c4925b7d0743ad355b09052590411a1c8a236431043a3848776c03bdde9e3feea021d7f0303aac186ec590db7c1c6ec885df08330e33c8ab93ef80c4a8cc6d491410bb063c3cbd7ba14f65b9e5f02d74781f5872df294dd3028998fae0f11b8160398b143efec4025d4b9df0ba6fafd928b32c6736388ad75fb6242c9c0eceb2f8aed52382cbf3ddf5e9aa315ac4a0d8e489f3a0021a1b551d3016eb4c83a0730c36dc3d21e9f3dd8634a66023a7aa6cc18df4e2e25f3cf15caf1b35302e2c44fb5a626f2c7bd283eeca7467337a01372c766fd5332fcf05e22f5903ed1f787d7078c997ff4c7f11cff8cac5569251a4d4e580efd5b34bd1327bf4d7a335ee8b5752b47f3146fd605bf3d874b91d4d0f416fe98faf329d354994820aea775d48783a54b50305bf6f699a78d346afad34e84e5731dc68ca027999e6d97c47c55ad8d29d75a54365a9b68dbe1bb9bc1df81f732ecb99320402a48ec03068093292c1c5b4405667f4916d7fe4f55b4df99eac4735afc1e0efdb3cf0cef0e4b77b9f81d8e1075cc5e8074ab01ee0a57e42e73ab278256396b52342ce9a724509468d3d041ad704569f00fe10b70c95eb25553343e51ca402f988a9d42688d166caef9c316b9453e34bd1085c9157d9d41af8afdb2710bf9a922e4fc30e872c7f72e4a8a5b3c2b1abd3b5ae65784c874347e117e9913514133139be23acad235a637090b41f973a566f8d5c3c84bf55b22b281bf5bbfd5e0b64a0d8143dc55bc47880513f287e15a8a7d2e475c53b179e389d45bea6d2888d820f28246e62928b497cf1cf771052ec4c1c40441339376828f259f982d06620712bb832e9973c39e4f02255d11d5b288e8214d32375e11b6fb42787a7bb03b8547ea41e52d5e24f086197318018e84a7a95828039117c9e0d102aececd3b58bcdfb7c8660cfc2dc7dbbe42e93f68b1da21a3feaf5ef2f29c06c36b3b06c4ad80db6e263e3a25ca317a8caed265b899f8c1d46240189967269d101ef5f291dd45ae4194067dfebfbedba1c1aff58d972607acea272cf356c6fdc7b96f7d305f826985b193cf4b1742bbfd9e7a8d6e7f1d9d7fd95ae050a161221517ce530bc10bba15a9becdfe2e111eecd5fb10b745b03a8772e34dc1edc3fcd3bf48da3bbda88ff3cac5153fe6154de111dc308a44fb442cb0f7b95efacb12ffd6681ac79f8d033926765fbeebe72e0d712819b06a41e219a4859abb3cdf90a4c75fc76987384efe3100902a7cc968122e04848ee8785148c05742cfa9769e7e3b580451c79072de431ad315e469ee32a195a45e3860ae7a3c351c189f9e650ff97598067ed0983c385e3c82d4b0edf70756c8c3b5e27dcbe65de9f1aa3aeb1c7b516d06268600889b5411823a8d59b480c1cbc47253e50ece0fe6e2409584864d11b6a581b4b2424eae9c153933c603b03eb6838f3b192acc0f26ef15121d588456173c9c34b53b0a6aaebc301c7561182bd8b9b52c380e3d624d6b7aacfb3609e9ae38b1b4849521f36648e1e1cc9993a5364bf1e919a56bac4cea6019a2735980a30d2d0cd3b19c49bfa4a9c90a90505ae1830ed7ef5c117754f2685257bae524bf5f35fb02289add780cf6d40f0591fbd4437e024b3455126fb1d384c90c5ef5fbe3c1b31718135207420b293e0d04c6cf688a1da6d97cde4ad4cdceab30f3bed8f55dd8a2f5b5972a28691b97d7a1e574734bdf21c459ed77902f56caaae5b4086c3ed30135aa2fb431cbf45d4b05e756a3369b4ceb6bd04f0562c2e8651187dc87888b944ddc30944c0fbc25ad4ff63d3514e8d7587331c6423ebed927c2b5fc591d634c0498b8fbac11f25708a18ec35caf913a27960267852c469b367bfb4144dba280e9f58b374a5d60bd0c79b35d6f2e41d21db78d5420954a0b6008bff5fae2db9de349a5f8f80ba013046f6ad4b74b6ea2f0db11a90b6511a0825fc3232f495e761a66b88757e45472e58f327cbf608a19f8cede7c59c8e95dad443ef54aa5e3abe8c765d14c0a16545218385820ccb68374b3142cd333d82bd46e739880940f32ba644592fdd674cf855c059b1670f8dfe748ab95793892a97c2c58c5679c0d99e6260fbe3d2d03003e5a2b43e4be1cb486fb74bf1f42bacc6604519ac8a9f1aaa90be12aa0f959a5087b6223c46fbcb18fcf8fafe9bea0bb654931317385765e9bbce165c69ee1f5815b10047641378f0f8406cc499f5d77ee26a1803d0a86ef8afa59f9b4bb6a13b89068b8d453f1a8c5ded2d0265e2d935c4400fef2bc216ae3ffcd2762946f815d8c1c0bde2628287f53b70c0c228d735af43d7792ab3332caca32e92507d0ed6f669dfd06cbf18f612f00919e2cde098f7db9e42f850873b9cf1e1bed2b41f279421802afdabcaf12a61999b8a4ece284c1e4c459be8190d24e4e6be184dab885f1e953ae83221450bbc59cf7b3fe186a62902cd7ab43ca259ddf1ef32d84d23bf1b1888d65cd4aa41596f20028d0449e50f8729afa8cd2e741042f2d162cc72c9a62a1d0aa496dc172bae70151f6681a6170c791a028f4b16901da5d5f7e6265cfd7570b7508ccb4ad1362828a784c3742719a1ade5c3d1b721983776aa8a6cc7788d9b2afb66160f493fb5cb047eba9b4a33662035618bf757060a26b432434db168c07d430d0716cdaf8bc5755ac76b11ab399d45ea91492b87003332f090fc576d313dde1aac87c3a2732d78f99ad39f3f8c87b87f22745fe892605c5c4f172a346a6de34bdc28a425bd02f45fab08fca0c569b1b1392aa8be77231dc6b427eb175d40a5cd5413c9201edf61155a6b112e265cc59c3159b7672b01391eefb4fe984494cb54a9694842b3d9d16c5232576753005634acb67158ab2d929d2cd828d770c6861d6cc60a6f53aff992d7a5c4679e895f902257ae31a82c842da7b6ab834976af8b58a9d6f9cfe89f2695c1b1fbed4c26c5415cd67e8dacc2aa37d298e215efd21714606320f3f83c91c6ca056bc9547b76821c81706cf5b3c577ca408a5eee9b37e82f416359d3590452248ba861371bbad8f27b8c2c1052a15d2baff90228b23b5d0fccf6542ee94bb9e2305595a5f0dd1574d38014f10ed3f3c551244e25663fb4ba26d6512fd6ea9e2bd2bc607407e090cb3202ea5fce51ecac217cafe37f3ab45fb84aa00ac38cefa8c6a13872a3be462335a3b25b725a85227159116035eccbcbfe73f14e62530ff8bbf476e1459d3bae9a330c15e6404ed7027603bcb64b90147ccaca8f8e091375a623786e42073766ecad4fc9989c922152976dd008b8cc0ba391a3f4ae8f2dbe3a5cee5fd9eedde18f14310038e80b97f2a03d2e6a0b290f36119b1216febfd44d9e98c4d5f5cd40d49600163718a1b67c45d832a784af517e20ba4a959a5e1adb96edfc5929fd2d7f08e5b94fd7be0f29843d142318356d354ef8cda4675f7ac386d27c6bb34f3ec055ace5475080ae29dcb0eb2de465a260f288a9e65fbd4811ee9ee854c602d2981919bf7cc28a7e484bf2eb060136959d2ddc7c3d8e46610450d83a4fd43bc78809b6d62839df8b552cf541d8680bd0c68fc31e43dded7b6983cbdc1c06f078cd5965b5af1a4026034e2ba29bed6967ac3ae6d91792d68337882636d3539a622a754803f2e6539f428c904925b19bdccb06f740636ce70d6729f7d3009ebe103111065da9e73286d27b438388c907ff1f419662a833d95e9b7d4fe3348f03570735c3b2f9eecc2e81715f0005ed055ba186214b6b38e53d82936fcaa81513b4e89135e4abff1164c755649410ae5e04b7e1a24ec3353832a28b2c1356fc97c98eb890f5455147da5fb7bf54291a74aa8a28b09a8bd5e1a0cca2801c96cfbf846e8ba9b2d46937da72fc54878d50af5390a9bf3ba6df8f14e59f6ac694003ebb94b451be42848b7c8bbde9386b10090a9ca9c1e464af1d6e8b697843e8e2832f1f8679a1ead6da769774bd9b8b3a96d540d4076b7c5d4ab9b78d445ea79c4860ead91f444bd7480daad83424d72f8e57b6595cff9d7e9c0985eafdc3fb4e532317bad07a4d3b989c083cd8283221dc9d13cb0781e84acf48cfebd49f96ab7fbe23d461fb21095773f6195e2dc987e40f4170f845ce4688e1c5672431ba2689929803c2521c5e398fd938866fc68000fde5c69eba814432a9deb1fa4fcf271be7b8c5fe2d2d36760e125cb90b34090c1eaed7be39613f4d4b2190bba489913f3734ca495b7b72409bdf736306335695b6e0226338621f9ceefe537769d926883fbeeb86db55d896c4b474a2f6eac86d8d674e53ac5a6a24b550bc1d2fe185a76485b39338039cc274df2d02a8d91940e5b3997384b0835aac34a51f19ceb9229915916fb3268ee75b28a2ad24f3c18126f33cbbcf2a9479a36408112a73c3c28614cb9c973d664e52fb3d904e37bda92f68da2010e6a59e369812da6c9cdab39d24f48cb38b0e5ca7ccbb0617443a0326fd581ef1b696d9ac6a03417d059f27a9d7c788d3f878519556bf66b5ba07ab37c4a7c1b28d4b392468c9c3ab5e211253b1e706d64ad8774421394300089f70a239e98bab04b4d3d729519d78db70f793da4e8ad636acb6fba6460ccc07b6ecd788bc89ec24fe3897545d81afade80dddad17e6bc1235ad0c5740fcd05710dc562f9e9de5b55a9db80dda4900a4ccf9c15bf51d067d834cb69751442602e89d2725b0f634eef88ffe0a66e355851172ec89b748dc6b14235178ea84c6f28d1b1b91dc3bc2a5270144a63741cfc71bd33578b6d03437a4988361666357cabc2e62a0b42b9ab7c24a756552246cbf2f563513274e1a3421cd48adce21ccb89c511cc078a022452a624cc9e00048ad68d24159c0deeb864f480c6c91bcc3f880678af12a5c939c99612e522bb7cd826f5eab211e175504aa41a3989079927670caa1451e666020ff8ac9a2f638136d71bec4309d5c0d8ac7997c3cb2891092f173cf1324f64524f9e1e55998028e1e3ce3c2b9e5d3915b3f5ddca61ddc1588afc23216ab18f70a9a5fc58fdc390375829529c8b5df4a7f54a1775d94bd21c4d6369fe7f1f822165357c6346902376b86da08c5cd74bbe8a5b9b1af23e634cdd7c8533845b7f8ae15f2ebd70dd4adfd47b90a0da65e60b3eab360c9b8fff801885dadb62a6c390b986e53bbdaab5e9574a1c327a445ab3c1328fec681ed3f90ef054291b575409340d38c97c2a8439727057acc14e2fdd63b3661593c80159b5451bf796a26af295ef56a60eb1266e1ec75462a745c530f35ace222d0af3c8d4368a40dfe064011c5ff0287293ede2fa8ab3394db7f681354167681f31fe167ef1d24c0b977f02089f6d083f943edb2ae61d7a24cf0ea116a4dd248a826f9f20c37f328d2246442c26d451c3a22fff2d292fb328afd7ba0bcb7316245b01834a66c5578d808cbca232259ab43fc159ab73d858951832b798b28f9f5be8a2a1a103728290b858367ed8ba5a4bf4b3e7ec59e838cae7b80d60e06090abae20baf6a770314447fa1b3124f70e66ec8e09849a5247a254a130a138a332bcc8a198a29b8ad06e55ba62df311f120504652e84a614cdfeaf6275aa5cc24703d088c1c3056e3f86f272ef1e22e8decd6f03c2b23bc8468ea7653f6a01f2bf754cbc2a42765af1d7b792ca6296dabbe50dfefe8493a11dc26d6014862dbd294d1182806d8da81bc3996958b4c794a6b4fa19fe55a9f707029dcbc1584f614c9a4c4810b41e8593fcdd68782e7a471abd60208855167f00dcb29a8cdfab5107f623d7121cfd6d8220a1058a875608f8264a5fc2e44bd387ec3d043ca0ebcf513d716777b64dfe21bea24e2c6e21a952c81c8d4376b120356c8ed1d87950df44443ec9680d2147310d3c797551dc1011192a58bb12effe2e92724aaeb1b05917813677c4fd15711daf09fa77ddab428b4bb43449d215b05872eca6209f831dc0a66fd3b39a9f5ac8e6aa6c9e759efb26d6cc69848201344ba735ebc85219807b8cbae027a437b63e0c538b1e659272534613d31eb13d3655da02aaf722f4cc93daf69477c578a229f10cacae81ae6b1006ed801cf7fa1f207d152dd500564af4af907810ce2f948f932153111ef4335b00ab8d91ef240917230ee2d47824c0d4fb5bc08cf0848500e82dbca3a792afa8b6c59b58725087bb02c2482b394b77f05c7fb0d68cdc095178cc0df97ef3479a55f56e5f568cdd9a203492e4aadb98fbe230fb61717142abb23bef56bda3bc2cd4c581cfbca13b3a2a290d6d2c188e8a8547766e4acc6440b91d12635a04d50c7d2c32fda38d1bfe978c9c221b76b226be3e8205b20547584abc6244205f5ad2213a28ef4b4167b7edb06a1e7e8dfeac8327eea496a729c865059d10cb9bad35a07371f3a78520e0ecbff12e1ac56f89fcf9858ebfd691f9b94addae231d3513906e1c386521ec23fd61881fd7a784c7ed49663e090ef369037946844fb31e03bd2e53fd78092eea64acdf80485c525073a8e7bf00bd8a0ea97c7a0025642b4b96f4100fc3f72f35db0c9e7bf99869683bacc54e2de3fcefcbe005c376df8af020c258a62f3caf6a23d078cece33a02adcbf927f2c2249bb70fd1b39d3718cefa25085ce66e2c7fe9e705ed35ee9ed4ca8359bae035738e04be4e99f3ee31ef7936b36dbe54bedbb07473cf194c7855982d958c2e895da15c56b0b2f7e3fa3f1b6977470736769b9cee0be0435dcafdfada21637c1f484ca8e8e9de9d19fd7c51fdccae5e46f6aa9af4090d47b1f900f13574725f53bc35612e569b9006ba3df2ab8ef95040872ff7bfc88d1322079dc28f32537dd9d5a77806d10ecb5aa41ebbb2911b18d9a1dbe18e5a279dd7454032e015b8c72c3773907ada76584d327bb0ceccc481964dbc290b47e3b679fe7aa8376e8d350f9376401aca919a5aecf20484375d17244307201a4a59c6da5206a88344030ead217b22ba2ba8413fb33db42724319b02da92c04d6e653f4e92593aa8b9491e231cdad866359520207397384d6ea52a11a509474efa026de7810d26abaaafb9f6487ea44b986e26b19c4f4fe75481a15b853b65da96c5c84cb212bb58e04560364e14d48dec1f2c2d339ec06c9cd003b90c7e688459e4386e05d1e38ae50d4bac01a86cd81da41a7940e81567071e6c6817f6b707cacb81e6cf3043eacc6dd7324ae27312e36f00d8d0848d0b655f3d26e0d9064c8043f02512050e7c873886a4a1c1921d256eb2853ecc7af8ac97418c3e8e400c058f266e8397e6ec6aaef7f7270a0a60d60a3ccd73e2c82422aef3cf79794c310064f737588ef40b049dfe0ab4dd386e7a22125c083996cd69eb623e51cda71c09d9446a53d6c421f26813f41406913d7e21c705220ff6c7537727f9bc679e76bb55177825435c8264e5ea080217378465fb27c50ec1ef99c5301ac35a14871ac6d0461e7584389e3ed9afd420f90dba367f6e8a7a76ac890b222869219460bcd346b09647a3e0784a479bb4993de6cc5d428970092a4b709849aa53c337769ecc62e659acbd32a59919e11510c1e0c57fc17c0a5fcc1500ecbc30475f2974a8be3230153ab39282389d2375e72c06f1a440c1be8f89cd1b5f1a3b8e037dd3583daf51eba4d924aafd72621cf8a2b7a23737ff16c66036c47ab616131dd5c34bf18517d8c342920f0bd934ab3557ab388fd6e8745871c0e0abe367b7cb69cb13ce5b4a38959caf51bf3d14e9c702f284762afb4724250a1e2ae839186cb6e8920041f7fee6a5b0effe12b6dc35e4c71c324e4dc8d30fe814f4feccc13ccb89d56bf1458400a4295119b6c71e0db4559acede2d9c030612e5397fde91f506d0e151f63274364c6000850d643b0fbbc1b56111fa01af7b88a49b43ba078481b4841efd69145516106e99c50eb0fdaa6711496db3caad109dd474e752f2b61c551ebe00facdc2426f23232f52b00a8d6dec4210d78a3e82dbd0e0d343af92632f5075f60954eb32458fa25766b2641492551298493f2f509012a7a7e3ae938aa71d2b40e4b8e133391b66011a7e88f062aa99332ec0087f920e2cfdc8e0d64e6351c71b864cc9e73db3588b88910a75a34b15d0f013a030e57864404a1011b002e8799f81fe26f01e9e4d9fc092c0990ba85c8d391b7d4d1fa06ea1d603cc202b0d72c1af6ff82563fb4a189f263aebeb5fbe1b111859b71483b423cbd85bde912e4ea64e8ef856c4000c7757c99cba8fcdf9b3ff68ca5e4e7e673031a507343db0052d00ea03c25d690f68b2cc84fe4afb5900ef0089f1c8aa672d3f72a84d208665dbf3c874b421a60afcfb3e74f79446b638df2091741a3fa1e88aba0501dc4aae21ab660761d9828a7498d57eeea5ab1893282ec557916bb809566d147115159947ee84030a95ed85bbd9d243f60374c44c9bd2f403b1ec007d971a947f26f8c8a2c68da12244b45077b9836c80f01ef1b84e4b9525cabc320ed7aaf2b6b7cf94a45d635433ef346e29a0d986a0ac2fce26e8640caa490a37e29e90fad5001160736a623e792599be06ca0b65a6c2ee0e9091154e1c3ef978dde7daaedfb94ce7884cc3b5096d86d486ebccfee6923b4b11dd22482c8fb75772030cc2feed7f6009163f7216bf6ff49a69a56b3fbe3c282766540789d828489f6f36d5942fe0e0e29649575a333f78db663a51532a0be20defb679aeba67054dc82c12c1fd682ec1555accfeebf15bb0ba555ce780eca90d082482409dfbff50351c372bb49054207e5e385f8290dc33f2e1c7cf7b00e0f75f63bd2d1e3d424453795484fa23714edd9434f4322d10f6867235f2d37aca0e7501835480fc227083be25c48e89059d3ada7a1eda84600fbe7ac312eb2aaf14b94a9d9aa9b76feaacf9e8eecdf5337a9e1101a79369658ed9eaaa24a93e749d185f938c76bc3fd61727bcc52f9536ff71687491164e6f32148594a7e824ab876424a4d37c1d7a46a84b6c4b9f51e6f3606b6db11bb6dac78383b59548600a119783a6745a3ad04c46e5aa6ca25317ce50aeec7dfce94839adc0ccf4ff72a0ee4fb64e6a631d733af616e3677c37046d8bdcf82b82d61c297cd935afdcca90aff3d55ebc190c0b7e18cad2b6c44b8e7c61cc75c2edabc920b63fb6302362941a614fe6973a4cfaffd3439bb0e80fedccb3fd1f98f4a2715f161712b595cfb575c9d2065e7fa22436d56bcf852c95803b80f6f1f3cb4bd5015b4d900a6c0e18c009e2e362fba76f36746ba7904e45d5e61f90506125464ae0fd42a37322481b55110a49c6efb602948fd93f4ffc1f4f93c1e811490958b15d5d6a3150e5fcf081d5d34995fab1f1c4447a9dd8a2d07a46fd1daac9e5c03f864a1436b877dbd27b41cadb1f7fcce7e00124758f99aae75bdc685cb037e2d6be66ee52ff74906a1f3ca6f16764972370172af636c18b73a059035b7369589d53d3856f5730dc8e23fecff8479833bc267784e672cb7edf946e924292a7acf373e16b6c81793855b1c7b0cb8d8a153d4e7f1fa14004f847981798aeda38731f0b933cd63d22bf411062acf8efa00f467b3faf4712ae77589a8a2d211b5931d19addb1edcc566e723b30cca1385fa2d8dd1715c6d12f2c6409dea30cdf999ad3c99e00d973c3d48c562d09549f5724455da2fdb39155999ed18d8d14c433e6fe53e447099f5a9351914a94ba4e8a972142c5fae3026e1f0b512801431912c132304e263386c41f95a7a718c51bf1d286c69786c1dc3a91832e7fe2998b113e65ab5f3da851bb1232d5231d4f650af74a025c5bddea6b31748f4284c98ffff2238d1b2cd22b53a77bc4d8f02e3f516f82d40076aaa45450383b05d649c088f0ec9251e70e0bd5e512d3869a4c993edb67e0bdb1444bf9e8ca1d2344699d9ce42bc506546bfccc29cbfa499e27293a78d608dc25b0817eacb297b56a23afbed542731ed0b85d924aac39c7b4671c10077983a7be00d081cd250a0701c298ebcc6ff7be2ac3a43ae4f156a97e299774407cbb3383d35cae984e407a6805183a5f7de083118fac11d2f1fe761e9ac9bfdf850079f97a9a152ae0c63420885f98b0bdc33d75d697ec2e8c498f260515d9f9d99f9c2fda72e3fd5d6725a12a7cca2fb9d6a1aecd9946720b1a43ee0a6217283a4e8311023ce38657de4c3da87a8c0663b2d9480a08265649b80f504dd2c0f00b3454aa64c8f7bcf1376ad55e6fcb3631ef409a3b8371e6a7588e2d8bd7fc0e3792fc36d6a929447b5e3b211348b5c1c29920be40405338225d9b39c37015ddfbd10a3f45428449044e2d09b98164695a798011aabd85ced353c2ab52c3340e5e7891f6d6a0a6659fd7efcf8b4af94c2f6b6e87112b0c2784fee69b2cdde8536c205a67d5e257a561e6bdc13ffc5184fc9e174857933e844c5ad263ff653606965dabfcef8862a6ea1871e34318ef73327e27f21770bbce8472df90be58859c2da4e17a17a51b9f846663b4e45a1ea64bb77acb1e03c48f16322d8e4aaf72f0024222b43b36e56d67e19920b61480d386651911abf89d6a5354fca09aeae40541fffd412841c5135aa25cfb722879387d9a3b2e2204be6de8cd00c56224712a754116ad01f8390ea20cb8eb3473e765dde6197b53887b510b3dabb6e25f10b274450838a0144cac43475ce460334b6df1f73fc5fb47e19a6e7bd50a9bf088109b47042afa31a47a4470c21a97b8b7756edafab210f83cd3bf014804776515b6426b19a5b2e5569da5ebcf022d0ed882ecb46148041f923d6c18dadf2e53a0137816c4ef3742fc70e561b5d03dae0a6dae4543042d080631a5f7a4a356986f4f0373522cc916b408a64d9750e5e8bbb96bec6d7ad9dee103660a95c333c8843f88ba9b2a5e4b3b8723ec796b88310bf72fb5b7aa0079c927cb60a4b2bd53f6ce36488121260d29cef2e11ea25eb6bb0ec1ecb17a75d1f0ee0fc89590b5992282d36a09101510fcd4e58de62d116239feca82cdb413ab5005f7ac9b7400c68fda288ea78f2c6adaf34b93b8bce9f9150a0e90b8799ab969368bcd19029a2a2f850f64b32caf7d28bc474521c0e96b7ba858bf3c656beffee5d3a7891d06f4f9e47d04c22fc7d63d1bb7f75d5bc8e763513764acfccdb750629be25b4f62c59b552023c28c33e58b4b424fd4b1b04181c2b2ea9ccf5e29cd4cd4d43129b74c276ddf1e7fd1e43a8c9509895947c0c1b13b02c0d673b08d7a8682674addeb2c20389354d8be8893be867ba818723128fb073ab05b152947b891c3a35efb32cdeb91639cd15f0b8fbc62fd0fd31fabd3ce5637a549992d46655f8790a9c766eacca57800e80e32cf3e9aca1f0b93e0144b0b6f7cc769502efa404fcb662d7ce90b5ccad6d8e9c1c857e046f90672af2c62522c15db8df77e40c03e02e77c640d97849073e688b4821340d18119444a8fe9e50b512a91db6c2b71203d977243c151389c3ea164c87d0bd46330fa08799d7befd941e0e40e982e46120653884b364f012ad9db7f54663f705b0ba0750ef7de93c74ef2afe659d4716d6bc2598b6d8dcce8afad35d148438edce0e8e73825f9d702a0d766b01e9a67af65941128ebf798143f5f8f3da7e65f6ee697abf0e968542727919a046e69e7b09a28e8b63ab129653130458f93eb66bebc9266d093e5718663912a617a9da20e81d0509e28c8b468fb5ece1554af302d1824887a3f48ee749332df7287e6d3012dc595d150bcab4ef8b760b6ffcd8b4053f4162936372ff144259dfc09a3929e98794618b5a3752d00e05920b21ba6f6650b1c914a75824d2ca232233b7c670bb396480ba31d68c6f5020a9d704272cd514836cdba2c464fa271d1c551e68c0fbd986b93d81c9fdd67a6467198cb4b53b6a9b622e4eadbb9b87c65a51ec1c941a8cd11a66e2a04b1182242bc12ac3fc2fac840b3b68640d0f8eb240a96b5bd72c002b22e515a5d16500d3920fd2ca07abd80e46901d52627ad9cdb46d0546c718a85b6452b8ad5910afa49a244dee0682e379c890a841d8bb56af553afda40e634f7dae9190210dd99b107e0c1ebff21cc58c442454367bc3171e4b12951bc182485a4c082b305772cee5a6f399c50fb1b327110d2307c43ad92cfa0a17fcc317fdf1065f5d6883233438254b27bb18b0b25e874e6b5777dae3d6f41973fd7e9aeda06b664bd777122113ab48e20d6aa5d94fc4477c0d3cfb58f646b9cda58b6989eba744bec878397969c780a80ec051dcbe4ae96961471f96d1998184eadf945d9ec49489514f3200f8c81dc788e3d03e1ce95c42f77f1b279a66df9e560a881da59e75f8ae25957174b0dc4e0b5191bf782f4bb15443402ff98ad96bb2e97663045031d41c933af5c949249b6427b55147af0853074272fe05c6adafa5af1e2dfc745cb299abab18670b247581730de397bf031c428d475ebfb93156a8c2b476d4367888807aaf8cc2c4956a5132255321fe373c033e9b2e076b0fb9205d0a540ed595dcfa6fea6e7b7de237940d01d9bcf887d668712330ae78603875133e2c5878f9d6da715fd5504ea0c7e0c525b38dab6181911af38decb56723cf7fffbbb83ec2ba6a02bbb1b4192db54dfc933c6cf4d61b9795b24d79daad5568ea6ac394ea72fac54add6ba5e6893bf75182ea06d8d114168158538e59fc45474a5d018909fa5a6f4b9320ad16060f8f7a5e26e90bfb8e5209c1eedd60c6e3e16b7c633976b7c8bced9b53e3d31c8d1c9d502e606d93432bfdb27f7bb9e2cc6b9a1b998d13069e7d633a33b5b7a86f650efd0b1d8254710d4c3e3f09349775dba9eb37939cf0e450f31f03b508d3e590269c39e60446d72307c67b01a5e498109799ddb54638939b365a7ff753a28551d9e9734973fb18e0d99ade731289b7b34b306b06ba37cafd23c579d5817642da0ed25c6a326cd13105aed6b41a46f47a24468925e5b7bff96a02ec4231115c0cbb272e109f08b8298ecaa5047cc841052d3eb83838cf4ad43c61ec4d8ed75684e470961111244609f180dd7b6dfd7c90d9519ebd7ea7e41e9d1957226561ed1d0097ef90dd50e638c766beb9b35b302a1fdf9c71fc43894e86caee73efbbeae69dd0a1d18bbb844b097ba4a07dd3a7badf28a05a459c596748fae0d36bbf06d98930f07403d8e73e5c6fb133d53a93c2e3a4103e47c495db902479e6c03f2c9ddca9b9b66a9eb7f856f0ad628d55cfd02e86d7fcd29946c4e614ef36ad6ac29c57971ed5593a514e4449761e7b0e934f65b9efff67ba8b29798f027e0a8199f85e7fafdd764a22b2f29eac89af7911d48b1ef4683df989e6fda256931da0dceaa12e253a5b916df2cae397c37fbefbc6f5646fa3582daedbfc99d868d6ea5104b1bfd3ebce604ec35a33dd80853d93008a67167a8174c6ab7cf9c74cb0c8de6e35e40d5974cbde8067188a001f24f3836efae7713cf3a005279bf3ef3486a05b1aea6071f480accc55953f75a197aebf86f23db073fb581cd8c9bf4ceb40db28c6b07b9901bc821db7f1b33af03e82b50ede94d1c90507a616f694939c53fa62629f429111ada6e199f09063f26b827cde10a1c3a46f26b213c6418f589e0a184f511a36ec6995ee34064695d4678c8f934cef7a87057af390400d150cbb22e0094bd90833db533c4d0e65e9616ccb20dba9e15af41226542ca920320abffc17d186aebff0ce4d12137ee03828edeca4c9d21a2c91f568a208aa73ace86da6a217bd2d48e32f2968882f65901d11a42b8711c52301eb89ac9987c1501ad6063edb0dec4a1f66763f82d37accea083a771171cfcd74205db598ca7104d8816adf27177c21b3a7a8f65bc6b99d53642a3f0d4149b843220672cd819997bfef595ac6dca75e8926c4018a88ea23e6a16a6c7ad4bd25cc29c589724603cf4bd379d356ebe8b4c162977ba2469b464545494c7189a9e7a059636d27cb05bf77f2a8cb553d353563f2de0cc4dc3c8e3404a551e5378407ac7967605ba2913d7b061d88a6587972a71b5757c6998c41d8db939a5ee1fb9fee66780de3be00ef43e068725096b7b3485dbc646b88fe43061cd5fe718b72bf7bf7178e0a253adb09f1e9a41407c60f2a3821d5c1fcc5a21e8fc48504ac55b6fa035bb7ca5197ad40b3dfc677af6bd44854468bc1ec5f683fff54086a2a917ef58bf2a9c76216277673864f91d5fe27dbb14ca6b8127c931e1436b279c8cd2ba936a08107091fe23eced5ba3ee5a714822f97b9a79dbdb0288489eea3b6bb06128692e638a5a1ca5a9638c24043cc0f26ee3b13913b7e3c6eda31a945624aacd13b9262a809faaa85c44dfbefce5775f011b2e365f3df88af96d7ae8852c54fa75b146063a47eafd5bff3a4b71e09b554ad13e83e6f47f26d6ee848e461e8c9f9004b69048ae42eba464b4f2e7931c191b6c430442cfba136af16a3838b16cd460596f0af063caa77a7240490645422c82c426a2da14200e17771f196050a2931ff0fd9fea42015ad652119529e0dfe273023727b759153cd9d8cd8c72e370f704b6d1add1f5288e611e1368580b4a229a90414036dc0c9cec437e1929444ecd5f88dc485eedfb19a65ef703b2cfd352bf26f3fbcca0b18f85fea97e1b6e15fa69e90f48214e47ced1c7e5937f7228d595227b537aaa1355a2532f75f1ac1f5d8267aefd43f47c4f36ee6839ecac9c80b6940d0133f404e556e49c52cc0b4251001ff43f8715805c5c512c53017bff922b1868a6231738c7b3c4815253cca3ad9204a12ed9a3b20ce82b0c6edcb9a7f82ee1db8edf24bc85b340ef4bf699da889333d043ec2ec847ded68b3ba7bd18858240f96f9021e8ff398175082c26bc69a2ad05e2f9a4f4ab3bf3b7e9f7830035d46d49335da4437b700f712f63acc48c3eaabf47c0ab32ce531e128c1b6b724355ae13caa97ec23c16288d22d2fc4b481f782bdc9fb5fb562c0100ae469bca7ad33525e7c9edf0543e8da7143ae2bb5ebd80dc38e8ddead7a4eb1747a1291a186f5b6519943bd206a54df9a7ee83e538b6e1a70290ea5023c0e7911242a47235f04db333c0e3bc8764aafaa8c8136cded598112031753e109de25ed0173d5999962f91f5533a080e199764e6e5d01feadcf065e062c2b671e9e5150c7c8e5a43273491d21c8cdb954407eae024c7b121dc28dd88c5609551fb1765c0936cb2aa544379c6f8ea53764ce68d6f044217eaf0b87ee92733930314e149f3a46d72ddb639192f9548059eec810c21e693c862663f413d70b2b181e864edcfb3079af4649f5e77edfadb9aa8abd9eab5619d31415a12a1c8ccbf2e59cab39d15311c00b8058a01f2dca937eb9d05ca3200ea0e3b8b6521194da6324dd6eab7b5c6e2c1aa1e5cc8300454bc80c6fa8a25c5ae7268fded3963f99948b546f4e171df24b9a5d74108907b71f7aa339c21faa9be63e24cb0edb3ecd38db575d220469d0e054c465cf6193573c0b1b2d67900d00760154ff370a186039b990031690e952303372edf220ffd6b49d0a987f06e8e5cd2113e5991a84a6cc621733e559893db2e386fc6104979b583bfe6418ffa35430a430d19fc0925a6235db6b33ada74a1ebc64bf95f41673e560805e96f8204393d7d0284a22334a4da2876d9d421bda49e1905f764dc8483e50a36bd6f223d257a2e82b3676fe49f79fcea31e2f77a5579e11a15c0b78af4d81a26cb1cb3583ac5b9d08ef0274a7971583b7500d449734f65d61edaeb6526ef5055863a6512ee81d11ee03a5ddfc423f0a35e0735ff7faad9ab43d63c72bbf2cedffc3528496b969c02b8c07707a812f071090a58b05cbf1c51101eee270530096f814a7ed71eed110363c06662d476a1fb2afd563ed08bb679322240b4323f377b73e1bb958740e9ffe6f047ecbe4536de7043a66a779e1781aa4724639af559754af14f15d9fdb3ce3a9e3c69ccd5f8bc113196e0a4fc97e288f7e54cca4b61a2582e6df0d6d7c41343bb88ef412a38c562ed89c0337131316c9cba89659564525cbe3092231f03a23c70bf28103a3f9e548d1fe0404febd9a04101e8254b7eaa899a373d1031b57a5e40f63934059be01b290dba2cdd382c665e0827c0e4e309cd6b4b58e5fde51351d03249f8c7a63e2807fcca1d7a00e6ab4952ae7964d2c278dbac7c052365d6fccfbbef990c70d01c57adeb877e8ceaa12cbe18b53f4a230db7c297dae466e0c66f37443281c283c08d04df5d20b00fd8050932c6f46b6022324de22da1ec706b31247e7dc5d8b12a8f1a5bb064d1468f93d58bc2676cda853ee711c0d195fd906ff08c5eb330e60e6c9c0c05f06e483e12a84ecd88db3dc0f363d9585103afd1b968db3ca1dff0b545516d103d4ebe10249c85f441b7f0369e4dba76a14a078527a8512a211afe8346399f9cacc9c5c683adbaa965b31c8514d5fd5c35fd79da92f82952922292bfcb7b74da0d712b0c763341b70a702c2b2488a884f75452adbb49dca5c833f09031299be6b6ea07a882827083158b7a0a6da49b22a86a028958099eec325a2e4c26bc272821dbddddfb77f938069255b3fc72e647a7116d900a0ca75acd83716862cebeb3bd0f5f166a377741c32eaf6306fe79577a4d723464b4ed81e3c91105b6441fb157dd934d6b129f10b87bba0d6123594fa63e6bac5c540461096b17862cddcd04bd92ffc7305b53460ec2c7fdc3f4f0d58002a640a6dbedb06f807499b75f9615f17d365dd6750f779d57a8c7f78be0ceba8bb44622ccfcd3a00110741dcb390abc814f0ff3a680158c66ed5c8c42ea9cff5b36709663022b2ce49f118c183b9e52cd8e67f5a4af35e3e3559f5488eb3e5c1d1f70c2291bc687c06476599a318c80ec1e9eb4c980241b108a4275e3015f29b627ded30d972823221b5a5584d12e87fb80737e37523ddd1ce2523936dd2465b62bb47c071833d9271ddd7969cb0bf185141fcc34796e8f02e497746ce4cec382a701c8d95fa403c4129284cb8417f85bb09d1c1b74cb0a540db82c3c09e8cf458f49975afc86e7f3fc4ead3d9f2397525b69c9c98c40ef8d5e892edf0ca544c9252b43cfd9a17e69be8a2e541f5fe947fbcad9c15ca9cddf887a5d13c677619758fcb78f51b927612c8668dfb1137ff4d467f178a1a2bd7c03d0f02d6e9f0ddcc880193f518f28659338ceb062e69ee8f6d130bbe52c83503bfd13185e72b60da4709ea5360173d68c04ccb19c8abfa5d6bfe95d683798f8190123bc5956ec073970e17b0786196bf34566bb4e346da6e0b669ad39d908672cd05b753498264e9ea83ec3632cc79f2f4c9cc1309474f4442d9f5bb50a48235705a325031068d52406dbe36468e544edaf58aa2325fa6352dc8237156017a2b227e6e55da5a399fd1f1dc0d2d72d972c3e762b0c94900f0ae2f5fb75fa53d4a4246f6bd2961dad46b14b96905c195209e97ea5a35e50ce4124683b271945f93d43ed626c9a282f7f7c8b10fc0577c12ea0f9c9e207904eda2fe2e5845e223c31558cd94e0b43bc8167a07db8df507667e1e1188be0737b1e56c36f46e2eac75c273d72d3cc980360fd18a4fe08c0e51782943b73f890d2a6f62250133440d210e3475216a6bac5ae4cc6fcbd244046776c971f582a9ef94a739bf55ef08cc599ef2e1919fc0ffe7ef08918a56021ab16065a884676c609068a665c6f8459674250fc355ecad937eb204e5e7522f2e6051e04f676d15458d26909a74ae8bd25dfc706c45c926682f02f3c38c46345e2701a593d42a8ec2681686eaa0472bb382787d5855d6aef9ee77041ff0fddcdafc2cce9cbbe6c5930fffd5af8a7d4518daf1179071fd654def797cca71153a3401a0f86e04d061f1e7d2401ac53f4864d27d5eedc6f94e5fffb861a9e618a4d0152b04b014d41ad30966f869ca896ce35b93b20fdc8268e24692e0059fe006142c547b08771df55f118ad76df0a6437b7f679786076b42f117b3d6fda15e4e519b8649cfe9845dfb50e787a10fc10ce783e2e348420f7a3aeb18349fe5ad123d171bae70aa2b14d675a1f6b9fbdebc5d107ce5444f348ada28359360212c83330b6da4100603dfec4baf395bc517d60226b06a332bc3bcecc8bfae9467b5b60ae1c5d7a66212bcbb0cbdc8b27fc5ce62d631f563df8e2fc46621056c47015bc537e3a489902ddfa09fbeb4ccfd0f9a95be2a51acd9a30331a0438fc642a260778de307b1975bacfe53027056f7d3dfefd6f7eff2a7e232e331b8145b2e1b2119026f6caf302e9589174687d17c47b01ebb1bd93bc0b3cf3c562ee954edd99595f34cd7788b9734665227a20579632bcf440ee8a0ed054d1661ea489e00a092a44d9b7fc754762a49dafab8b3a0c33bed20d80e0a1f4420433ce3eb499d4845c32da30cc246bcebaa91fecfb3707376106efc34382d8391de0a00c124ff4d36d5cbe42919deea11f77fd535f784428f9a9d2c201c7e23ae410c4558148620eb3fdd564656be360c289cc25632dabeb07b0c8c119e2fbe902295467c873551d3150b883b75f9d86b7c363ebc2f018820b7f491aeeee07d2beaf78cd647f377a1a0d6a9ae1888f71ae932fda3aad53c448467dacecb2058cf7a306016f89ebdf6ee24c1f4b6150e73e171b7f0f87b8eb436e78770bf9e096a0f6c1609a353ae904ea82cbbe12cdfaee26f3911adc90a7af0df7679729c1fe13446e1e134abd7a83493496a899ddfbc7daf3c706a4e13041e9acd7766e84da504803e1e22b4265c283671dff9d8a6f21197265b3d46d1a65a1d13a57673f3f538148a6988c92d0b6acf54ca89eb1db1fc3a55621cfb8216dd787b738b01761b1dd1d3b2c02720e425f9b6c1184baf896f34a3a04ed63debe909143fec8746f066bf7c1448045113bb2aef81043a3f26818e55a19cfda8bb63a84fd1dae77dc2d4097e85a28aa44d4a7235b4fb83511e47dc2ee81b4bd562cd42bb577244c14dfa9343ab55f0c2b97f65c86767e858ca54056723117f19d0a19f77e20df4decdc6b3de14a3b25b11761c2e57c9697b00aeaedc94f69080c8aad46b640395fbac9608a953c6f5099751d669d5c50f274e63c1370df22a97ae36cd14957c4a7cd1e0f16246302c104b485e7f8a2d941b214a201747e7031d2d44d5fae6d1abdd0a506e2139823bd589b5282eaa22106ec10ec0f81f3c2c331d2d7d704b7a063abe4e1575d4298eedcfea31f26cbd546b14e7395526945efa5b8324598311c247a0c9099fd4ebc4417605309f7717d9c516f55f9bc14d586d1d0935be574bb45762e9ad1e0513685151e699ff56d64ba79c1facd25aac899329803a8b49bc8fbdc65f0173d2d341aaea0d0ad49120a8b811638f26430985635cc2483c292343d141950ae5a9082909e52910f4aa9dd9eed80cb8859ef137f7ef4d39223ded01de00a9b4d1596d0ebe97045532348bc61845f513ff6b8c316e11af927b1a28cf0c15daf3c429951dd477e54e1f378b9d27f01581c5bcdcd72dd2df2c1c8a1c25d1a4e81622f9e896717ce8ad6e2c3470365ede608116e6608964a03362453137b6492ea191a6b5345cdbe9a91853436578487e276410dfa573011e711482fb6e138ca204106edfa78a118116c7fe361012c20c3eb7df322ae033d802acf802d236bd89762389207ddc271719529903aa33ef08e80a80e0303040d56a19086ba22a39ce632117acbe72e4c2b4c4a38729b97809b87d9d2e0f5fabc774a5f37b738efb3dc7cd06a03ecd31909d4c6a63584951911d4589ff30fc9c61d5d49481a6e20767190918308ba4d50ceb841ee067293e5f922e40bc22971253cf8b3dea1627f24fcd5b2cb8d3bfbc338edbe5ec54a78ebef17669f60bde6fdd84e67f064e28ed55e3c0dc4b6b47c46318b2d09f037664fd1ea6a0c3f8b5d5707e21f9cc54d84c609f02cfa1b518faf37c76c390ba6b73a67f67c251857dca636b14199e2709686b2ae1a99d4abb645b2e68ab09df960d2121c22e314c9ff76059201d5a450f0e89f0ec1e52c61a0afc2ff3876dafc2d4be410769f99532e985974b7e03d8568aba2fc16154bed607e16984fbaf25dde08444db828e0dd065caa33a99364c4c0c0ff496dc6944dadefd1cf977fdb6605463cd0495cae6a917200682dae8c2625932caabdf2efee58bb586176bf572c8ab8aa7aa89a0175bd506723fa181d494f0e870569c924ed0ddb2886e95034bb5a23baf719053d06827ac318823e137df7749b09808a4240d3a79ee1fafbd3ae33ba1077c0cc0d7cf57725ffd959a224b26bff1c88c1e024215d676d2c7f763d054ce325f367b2e1e94e4a529764b5f28f721ab17297f0bfc2ebdb2f340cb64333d338f038dde2670e40c55e6239ac5bee046daceccbf64f58097fe29a69527c93becf0faa65c161bdfcf465fa6f38332eb2c963fb087568624785f55897d0e5df6b0f2f6a27c6ef7538eeb0a60b6935aa9eb145669c25a3256daa724093e519cd579d21b0deb800f4778a6bd46664f20651a5141a96ed11f2fdeb78a516a29694d46e476310a4960053128c98deb70bc361f51635525d19c1c1c7127bb5a590dd30a3a89fcae599c288decbeb8f35647fc4adfee767e1ab50309ae2ef3965ea76b33184670438e609701f2758ac9cbc0edab0de33757eeffc14c8557d2188e78e290fbf6ed4b3a821c79d618cf328446f9fbfb09d347f53941b58cd2f2a62d0cd1b3a5a1a8bccbbce89f79b8e9431eaa59998aedc8290a2f8dcf5419d0b2f0aaff21b40d1116b4ecc5ff8fc45db260387f04658b8a14a4505e962a28aa7f8c2d046b47d81e26813fb61812d53d8df1cc1053e3f993d3a227fd14f89bea57836115b4a97db52c7a99b04400e2f3f4b063e1c586d5232bfb579ff7313428273cf61b4a1bbdff51a7e417cd24fd74751cc828534e1a7e94c1bcc5a0ae62a5688fed2fb9757397f8b4727bcaa69752d337dcbec090355b60cb87a28e5e83efcef01ba0fc975f96ffa01c472b75484774c3fb0080a818ea5a386c34f081319e4eb01bf7c74e2e8993dc1a36f4ff74e49191a92f2a6558e0beed07aa3db34f05a3a0069ef0631fa8fe22ce156c4da243ec224e70106b88700f96fa1b19129c4b7914f7dfa97e2b10e53b7cacb8d8b3330ba75cc64fb6a7d5bfaf3ab90a563d92223228b9e0af42e56b27e94e89151eacf73ac4b24334da832b76d085e7b37e887b278c6a191e17f07ff1a19b3b339655759efa5e5475c7b91c020236c26968de94528a5b0396d8f02eb0f4c1935583469e1ee1dd4e5b485a9b3d06e1d7064b239bf5ed3138cb307aef164d4d96b1187ca76c7b0d663499dac54a25b2970fb17194f096d59dd5db1c09aaa3a11e00819a78c71b27e4240e09208915250d218ef315ef7ee55a23cc9de60ff79bedd56977cf85c4a86b1179ee6c9e6bada527b1fc36f131f210d7e14235fbf1c8fc093c5ba60d150e0d87ca1c117288f75f80c5948ae004ffa08332693ac277914f083dc3c780f57cea5a45e3b5a1c26225ebb963b7e564816e2068ae16b69cf46ab062631bd29206e7fed5a3fd3a4e647a9ac9cc6b0501fb9f8bff254a958f34ef4abfc1ebe77e32a5c90066cff7f2bb70023db34192419a0bcfb005cd0fa5d68ed45439abad18e90985a6310085f2828f170704e38b206bb9c09927d2447127fc683831e82041a2176e7c50cd2ccda2fd9105d41a96b432b4910b08e399d12bf849dc49667f3b2dd40f7a55d898625548e08edd1b890b330a6b9ee92b6a1b27e209edd8267c5bb851c175000d8ee47f905d459d9535e425c640b41071bc3f2605387d68937c3945a9f1fdb73c1fe4e12fc64b60bf7617a94f51da97c4acec37961cc787c118b800a827f59098ff8bb02195449928bf4a58dca2084662310246f816d5bdcb84913f85dacb54aef2e27736fa9d1d5156d8f42b5a50d09593ca111fa7251b547b85c4cac7bd425fad2ee3407f869b3c851711cbdb6fcef66a42fee4af33eaf03715b85854a75068ccce26c92a1a861372137f4ea1d95592e899fbefb0e5868a112bb0fc9c99792b0bc43561a43df65dfbb288ea9bcdf8c6db3ea0e8d0fb8b38cc65bde0997a3b3d9d9bd02fa49a4da870b91b9b7c0e6eb92134a654f39b043add5cf74e8bce37bd333827fd4b7b5d88e7a0b5978896452c0f659efc144d0fb8ef7da5f7f6e0129e2cab74f6c1eac161c7975508803ab2b08d80d514a0e9696c7e478953d6265dfea4070c16929c98103d526779c3213761c40efb4664828809aa69fe828d5a4157c13326efff07e506d3970be56074945f329467c193ae6424f96cfd60caa8185c1e18b7072b7926e82396e1af44be8189f8a5b4d2915ff47d9808e2695e207a7913184732637725851571ff47a5429af7789fa5547aa8ee916d057ef0d8ad6f4f20c4a3c99d2686252b512ad704fddbf50cbcd67aa7427199c0e692d8059986d551cc406a886104fe9edc2f2008bd312b83be8dc316580c13c0959184cff1abd2f2eca079cd01b6d41958451cb87f1b5be665c346ac25766e1ead18dff5cbd8026c16987cd989319e29b247ec1cdb390aafd08f8e817580b571acbb78eade3490b2e00898e3c99557cd9cf044b058c35d519631bafcd01999657a6d75c89dc6308f9da1c2bb26142658650d29deb3bcc9a2b51a8d09e65120af444c2ad4bf56095c3843e34259d4397a38830a38084782342ff048a87f2cd4e169419937ca31105ec17c09be33e7b4913410e31a6c60fcfff2b9457ded490109221167c45136590aa1617f83d832d2d9021b84e6900de1494e28fc4c375e26c5e250880f17b63ac28ea1fccc887819d136042b18caaa89127b6c09456c2e054ef1b0f2b0cf9a8d2d3fce0a6a6aa646e4a431cf6d80810986b2e3a04ba30b1bb0c28fbf040443cb2ae723c1cabed63ad83782f8a6307925933866bfdff256dcd75b00ad58f0f3407058368aac0de51cd4c5df468dd8604287632639bb3ae5fe2c4ddf630a27a73e458db67366e9abc560150bfcbb5b16f89c993b00d15378db5c4b81009c51f28f35fdf58a7e9c0068e5516152c2a76032529a93707a53bc7376840446f65a50bf42970f8f2ad5ca19faa783e1774b300a0990f9453b13227a4889e019bb08eef366e23e398f1d825f024aeaa12a431d84aefe8ae00976f1a32928067147dd110fbfea3a4f0910eaaedffbdb035a7bfb962fe3552877d1b44c6d50a22cc68328bd2a526b185c20556658c19d0b85be5dc6a55b85b3f2a74194dae84e71d646498f7ee1f48499aa6a17abb774ceba9ee1baa53f8d06d72b73dc87fa17852472d3a72aac56ed25057a1726f0d60042041a38a44a38656ab619cdfe37ac518788f3772ad96eb303785154127e81d306c09a9561c52d92b6b6352ac148867d0082b7a5a052dd911cdbb71925e1f6c0dcbb2e682a9581ae694157e1121a1b5c350eb28e242fe34e0fd8472d234bc217d328cd132b35b00cd1f6fbde4bce794048120355ab1b782fc855521217f744535f3ce76255e2f3b4e6d58d4aa8c45eca151babd8cf10b2aaf3028f6923b615cf90574988bdf4b1b33d5ae3b3f9559ab823b9dcc805a87e6b6cc4712f6fb600474b838fbc2e5e31ddf6d73b73d5746c31efcf97acb88b80a778a92e5a7b6e0b265109a9a761b5c9e53a0b54839c27fe1b777b8a8581d4aea2b650c517420fcdf5b5ad90d7362ea5016b80a3d3228651dfaf7a84487f8035427d479ff07ce504ed8290d1d6a2c7c90801d2272621f2979749bfd39bf85f67a8607381e42175d595a304c6ee674c1c00e5c2abdb47c09397907ec42181905e613d856ce58fb26efaf21514e5e10545ae3f54cc8e379955d0065ad23ec82302c6415501541dc6bf1142de4d54893f92289a54426ca95bef6bc0e323eafa332470850ac7a76ffafc556d1a86684c4e97b5921394d24dc78e71bb1f00f01e306e99dab0c0ad1f94a99b887519e359a005f135db1931ed6a9a0d81487d64c9e5e9bf12fcca344a7903a030b95b10c17149b7a4acf264d82df059fa6a974ab78decb15c8352022dd92ed9fae648cd0f3f1382b45bf885d6cd6a421d97ac408b49f5ca04d59f1e08ae5828e182c955c5d359f2925d57b6fa7312a113da3ae4c41840dd376b0c7610ce988b703a8d3358a5ab5730d276b24e1b224f00c0cb573bae460b2f6bd5299c13db76c8a04642b12829e574878dbc5780bec487d752c9ed2d9aebaf088ac6184329968f52d0ed111e4e248053fc1719ddbff4fc0a32c82eaaf80d976d42a5b962000699062236959749ed5c7a7713d54eaaf7698077df2879b843cc8152c451cfe1dbc206c2cb675d4c2ea1ac7aab25d706e0f4491439fe531e7eed2e452e3ac7d99bc2643aedcb963eba2d6e00bafaa6ad2aa52999247a29363a21e7ea7b6a86877f0c768d497ebcdcb72c1169f419f3ea916a2557ea0524dd465498154f09ca1027151c15d928668c433768a9f1abd4a2e1ef91778c0ab83e7336fde8b6414e5c1c1db27e08762ecd59f6e6fef51aeed0e109ae291080e02f31ecbbb48d163a50f46a426da5aebede6d64b14f3f0db51322139bbad153b1ae5f08892956060b026038a1eae5b2d5fb61866ce153a409aed8992b10b8fdd1149aaf909e419816dbc49c67b7f140eded3d1f49a2c169d36e88cd05408d66990f1192008748c47698c1406b623c4b7d2432d0eb36107efa81e8932536cdd8d4f436998b389a8315a4342343ea392c2e31828e0ad78de78b9c9a59288974d9fc15cd2f4dca19d8387ac252340d26807eeae4a32ac2b5cb0c16db7d10cfc4a08a13fe9f84906c6f5c5156c483efc90fe93968004510fcce720bc8d115cefadc056fbacd2433fadbf25ab3c5891190e9e80bd4f78b47ad64d9fe77a623dad0a771e4c55bab5c17626b607450ec9256afc0748993cef9aae0afb072f520fc9790cc724d60ef18bcc66714cac9edf9ec9be6fcff815a8edb11214ebbdbd74f0e1db1326a0f705525b538d22815614dd8437a3bc76796eb7455277ef78f03a4138c6d3d653a4a1cb4acd7688935ef7f575b51de8ca50d0fa2e9f41bc1ea7a5c22c05a3f259b711fd8850d2c124b1063cb51df071f40e31e3a46287af02449a989130c55c3554b12f6db33c4e8ceea2a4f348041ee2cfcd238720c0974b3151fc56425ca4a9529af65af46ed2fc291017e8eb7caef3af33785ece472c3ff885dfcf6d08ef6a822f82e27d7597ea5d32ea5ff71925e6cd499db39b4fff8506dcf12ce4d32ec3276929a3a4a6caded0eb333431495b61de323027e52764fbe8e4fd825baa751dc151891a5577e18b18dab79815b1c775a34fa8bba5bf86edb03a23301f50886c027cfe19ed3f570068a1f002ecf7921391f8853b7d379cf00183a78a370f963529c698078661f76a84925d7f4c4f15427e308505724130095283e7c348eaa2c487e0e28bcb8dc8c5336dd9e352377325a148e03ae73322fe77dac65adf5d5c87401cd7218ee960682ab18ad42748a1d9968a3a2a565cdd4a0ddc3948cc9121c89a7d29ddfc2a1e8ef1a57245898ae882c9c05cfa593c676200610c2f8602eac836fd8b7460ba21b8d061154da66877d17e32b512d21bce455f4397f781eb0c2c8542c90d6ca45aa1d11fe33b94d5e57ee161b377f45e2727800bb8464ae1081a1a824120ac70061d15d57700a26bce569db9ac5590e688c233636090289b238ab8ac7243f7502361dd3d6397ec178f2f0f92070718903721bcec6ba3fb58f4df86489821cc15597fe68ad441917aba81f296c0e92d58f81b184ae23731b7363fb0e5d16e08b98fea35e174546680ba6df7bba78d144f3588bac0edf3da639806ea318b4a92d325f08344b3a9480e16a94feba23fabe43c57bdf36dd5f51ede2a15331dc64517e27d6303d48606ace608ef3b8b07d2ac872b868168ff20b21de3e6fd85e2c9e9a98c522772ba7396b874f11ee57413cde15d1e6d2b458348c822f4cdfcf1de5d3962cb57fe0e44f3f59d6d63f5d9c607eefd260cc2800a772371e7846eefdbd2c59d1caf36050c7418c6466800a3267e41e8c490392abb6845d0f5762dba7a8b55619ca98aa7f189ae83deb13193be85f3f369e90d0d5a83c54a4ea09bf8be2637d779dea63cd2970785d560ce1187e6841f69b439773c17bb5143080b4d141830aeeb3971b4c5c7ce8756ae73ae42531e567102d01e738077a69203754193ad6c3ec4fab198aea7b18b106b1abbef56d404dbd439007b0687431f5be520dfcf1766083d613dc1d64036011cb62953e0154ea8173858c398a1a95e8661ce39d01a980a7ded6b0f25f79a47f551d790bde318385393c5921f0d853088546c04f349f75c02445e041a3993a051206055a5039972fc7b30b1508ff23cf88de53b784e78f2da96ae0393d4f24ed7626c5d7697d58f221060a8a96e8e0e37ccf9d4f9cfc77530ec18b979ff4825b465033bca86c82684ecbdb794524a99520a0f0a1c0adc092f01bca21fff008ce2558c8fdfc2ab203e762a3776d705c0777ee78f96e97f99405aa681f8f8936f669096e98fff78653ff2b44c33d6a40e5bdff74cb026b249df4c2101905bf4cdec915bdcfeb9d337738a9669183b2fec8b77c17e7ef4cdf4f901a46fe6102041fa66fe04e1e99b5904003c42fa66023d21b77ff6f44cd137f348cb146f3bd4ff8bcca76f2616d3e7f6cf217d238b86fcf48d64cd7ceaa748dfcc201945ae6cc9f817138ba2be91432e45b75fb2fa4612cdd8cefb6750df482de4c0317e67ab05468571bbd9ea60dc8e5abba332279005722aa717588feb7b3ed24101af58f63c9a58c44d92b11344eb447cf99ddf915f0df5cc37a367765129ed4baf205ff5cb914ec76f3259193602c5221eab00c24a39482d5e58eb2289ae20fb4645f0db78524c18dcae41d441f4410cc2634c7c0505b76e64eee93f4744807c8b5bf742d2436fd4adec2222d56bc8b9ceecd565da1008934ca1acb7779e1d6c1d7bb657bd12fedcd398f1cdfe68b6efe726dbfb99e2a7f1aa9ff14a704fc3f2f0e77e06f73cb657d91d4672a89ee338dbc381a86c734e178fc4fc66fd274ed14db6ee01c25698c20f7a62bedf8ffcece1c8c639304a6ccf591e467270bf3d0f218e90c565d695dcfbc8f9ed996d8eed39bb83fbed7708d1a32214c05f7718c921f31b8c8c7d3f4fd53fb79fab3e7284a8a9695311e0de3f87109bdd6164da1cdcbbddb1e3df63fb07a4c953f5fbc811c2a6a6952207f7427c0338c78b9eaa5f08bbc339dbe4368c35f2e3cf0179ce793d4d366bc489d47cf9fca9696ff0cb67217772e7447b48f595367583bebc9c10cf23157f7bee53f1b9df1ec6f2709b8a0ff3fe42d854b4a924384b1be68f74afc7ad1139ad8e77e51f612ea89ec8cec997a8c4210d3b39be44f59b7d424f85224214942374fb5937daae692a09df3e873b919d1efeaaf77139fb96fc65878d7fc6d3f8ee2d794d9e8ae8a9aac0039e3ba312edbc30f4a0484f4e0f2031279583ef608538a8602747f53035c53fe3b9df6a8a6d2a09ffed95e07ec66fef7fede1b9ef1ed16d0672fb399b620b81f03cd51b80644c819a4b33ea91a7eadf6a8a642110108fed53291c3b8ce4e0dedf478edb1d27e02cf479aa7e43e90ddb7bb729280459d0e7f6432166d30a633d12c22ce0129ed8f3546e230f73f6f8bd18240426af053e415208e2fe22a7600b0e39d7538bdb5a59e19e93cfe63c4210e7584525a71f855794a80865d0021eb2a08536b02187ff621a4e831564200210f8d08536bc2187dfc4377c062dec70f9a9caa52d5f9d7c8bed6c459eadf77ed2c8530a789f60d6bd37e45024da942be842e29c09e58dfe128a34624e1f9f085fa53efe11be6af9f848f82ae5a3ed9e60d6a54ffa984a612a0dcd854a6421d52b08097d2ad6bae8e8b493b654ffcf719aad912fda597a7e34a5295fcc52fa5b2a4d558a42b5b87ceae7e7143316b6a3ca582acb2acb2a99d9d7d785899bd9ee754c5c1df19e822e248f44e22e69e6926a2e8944fa237ce5e2498f84af549ef44cca5829d676286abb97a898ef91ede8a75892cdecb4dd0c4c8ccd60503534b619ae64f9a9542af683fdd01fce5120d7c50d3914e18b01dda0db74a77634c8edef3d6c1810272a9aada7f20297fe654f5bdf28d3a7581df19e2211b729b69187e765a4f7563299c4b92024ce35cf56ba9c64053faef36cdae5242be8b93c4af98cb945c4df86fbb49e88e2a6b418bbfdf1e7a78b3e5decb9f1b1914e64f12e6c5811cba7cff2b932e5356cf2f93280e94887af9111527ef66a8f0ad4849d9c1d2350bc672350bc4f21203e7fb44fbc7b83ff59669bba71435a221ef071a1c0aed6d816b77df0931feb13ccca766e634d9ceb20e71a89738d05bd60489ceb1f621b614730ac8873fdc48bcfed2804a5f4a3471962e3675fe92791fc6eb698472fd6d3247a11a5524a14a7c022db21b745791e619bad9bb15a4b32296bc67a18973f6a74942df1d58bf63d9ffcabd912e74ebecb586f0991ed332d6223247cdc275e1e0d46e966f9a93aec47c5e22f7db68485ae5014adb9b4c57dc75dfa97463a3a3d57b7ea959feaa4a397ce96cd5e4a265ba684b64cdf3f4dcf62fa158ba22ad3c51ccdd3e4666a5ad1543b46523b26ee7b527c1b2e3bce829548296bae7c229c66dae0a7b5ee6c4525b7390b15dba1ba685126dd50cfcdd4c4e8a367232b0a3ca3930d4f7dc62bdf2c93e51c546204ca479f6b88738d85af4efda9da37e53b5a721509db39fdc862579cbe9eb023588faf647c3f3685af82f87e4c06bc8af1fd580b1a4301af5eb013f86d69f1ebe2f2e2c5634232be6b5905f15dea9e54465d7667003906102fdf4dfe97ebc4fb93e7ef5eeec382302c4efe0743923d046c27ff4e3e45bfeb2ba9bd319f78790f82be4ef09f604232fa83a85991a08c0ace68c0590e9aeb97adee9743fd9208f5fd520e6c93cd8063b4e89bccba68a554866efb4549a21887226b262a39b9867ef4275c312028947c6fb2d88e731890f783561df13e0c08b6f32211c3e8fe3e9ee67918901de71adbc180f88aafd6a85e442d37c3d65db4c5d10e5b97f1bc4783ed3c55ff8ef7bef0b6673bf991c70ae111d293d30f754b3ed710a729e22b3e31d96e2b7133b7e6aa4e6c47536cb731c9766fb21d476d37c32f6d5783f2d9101b12382a223eca47b6f16dbcd4cad7da6157dcfe8751a5981dc945c6d34dd2edb09d94db613b4f30ebb20e5bedc7b521ae1109f295e9d1643c3f18124ca8f29fea6357f88a7ffb0e3b825de1abd11fb99368b6224f278b224f1c72fbaf5691af3a6c4732f1d575b7c823b3d83aec07fbf195fc7eac88af886ed3a116b683fdf095b419eb0a5b97f1b05ee8d090af78cea1d2a7fc24ea96bf5a2dd3a5524837f5dddc39b97cbac17eb2ebf2dd2863b54c3f7be132676ffa589d88ff88662b1b7a1b7eb51edbe99b7945cbfcf4cd3cd2325e609bf9048ee99b8945cb00f50d5b6699936f6a3b7fb1e3f273db32c700c51b70e44173fd2b3556c151a546a027c82b50be7f1ec1423ecad32b2edb23b7b946dbf1cb2efea808fef7720e2e2a33472d6da5541f21e075d9ed22cfc9ed22cf4a95029ae690af9e85e265b67c65328d744c2522db97463d5e728ca46e949e9f2d142f375a5ab2500b48e45c93f84729b6b3358784b63c6c42fa331e7ed24887af205f8dec85c46938a7276bda54f68c31e1c9da9942ce75e4619b8b6d6ac034b335dd30c5ed9f6b609a1887db2fc3b091a450c4a428dac8e3dc90732dffbde78915f1f4f8ead969bb176be4714e88731d85c428ed240ac2d69dd662f15f410a3bb85ab009dc023661661eace776cbb91e62f9eaa792c97a3419eba9bae55ccfa1ae473a91d5858d67094bc61ada9a5997abcfd97a34b4e96c31b32e8f7458b7bbb075b475fbb52032e443b84df1734ecb5744b4886be4a95188928de77906c51de77e38d75811abfa31c68aaed6bb5a57ebf6633bd8cec3c3d6653ccca332747cf2238faf84b46e7f0c8a499c86afb013a7f015632106485a456eff5771bbe883859d23dc2e6e74cad9f2552793cc215f9564125fa522901824e3d1b81079d876f4068e3232b5d478515c1a484f0729d2879ee2a785f8fc81085bb4642a15aad4d742aebf0a4bcd5e43c93295ccaab0f44e0bf1e6b95e86b601aac25744e307bf18f6190a7692995035de93159c26760ce0b692db5e44e3871a97af0a942e6aa9f4d89f3e43299dfa62a6784f27148e196ec9456903561909ce2df94e8d5be26ee93b985b9a01920114e396be7bb9a512d1537949bb25a196f1997d36aab0fd74fad2a7a4d8026ca7be23ee3433aaf1a694fe04734b8f32734b5d8d5b2a951ce7965e06d00bc7644faaf0be9bb9e6dbb394fee4b39491ce892dc0b69dd42e5576141bafa9f44dd442ddb7f4a58e96ac2431c764cfd734d2d130add26721284a239d79d5391ac137d2dab4b2d26c53e292bff4681f0e33a00308218c104208218410420821841042082184704609df9c51425284304a18259c2fc237e78b304608239c124208218c7d13bf63952dd36dc33920784a0fd0e7fa535fa1584abfa3d79b686bc1dbdd69e53bd4ed5771f11d771ba67ec7413f03c3c5a5a2402338ef524f6e86535dfec58b17ed524db208dbcdba485ef7f8b42e327d061f29c6ed27452f629bbea54eb9dd9a4b2d5d4904974aba2ad248aa02e06feacadbd4964755215ea5aede451dc013a0a67c4d85f134f5f42e757461fd01b3957af32dd5e6532a011e46adf953a5f90cd697d3395d5beacca7d41a0f6be7acd41f46022080ef2a85cbeba057e63397fa66dea5fa9df97e0000c016609b01c04c698679559907c0d580a9f1d9d35c2abc02a801a844a005c08c4ce9f6488a0ef4d8b9427cdf130c979add94caec2b225413974f7dcb775133f195cb7b8b2dc0e6d2e2f2988b4bc5ae1cc235c4f9f032afc3d6517ab34c4bd59847559857a934de459df12955f5306a107faa32be56ee5deabcb0fe301223c6672f75e581a82d6febc778977ff1c216608bf122468cc3d098a1820972958c5a8ab1525fbea502f15fedbf70b12e55de37e452230b81a4bd60e25bf8ce0f0fc223a4a7885fe153b8ab4ebe59aec19b953497fa2e928b3daa3a10e78238e7efa23a8fbb10e7fc6bf5af7eaadef354fe306ab3dea5fa35bdf013c5fac6e5fdb5944ecaa59b6e2e5df4ba496fe13b4fe52ef5745b583e5589b0d895caa9bca4d4130a4abdfea4763e440ab895bac86570fd47458e85d0c52ad08d50403a670f07ca31f2a00f09f6701fb047fb28f5681fbe0121e4fa6bdb344dd3603b0dfb92cd3ff33829563bd4c52024696c49ef511a49d34eda6773a4a36971623f5150a0eeec0ae92422ff8da4859cc138638454ca371da317d655838c91680e529bddd16c10031644393bfc776cdfe3460b4608ca319269403732c7120ca2c4e2f4d384a1a79231963e06323c21288763090671ab2e84136c1194f34a30c078b09ed8d342a3a592139494394b724ae92da91c2489342bb5c3469212cb4cf34b9f954a5f22495386f59d25592a95744aef91ecb091b06f1bdcae6d70b359851f2c49e5f0b215fa3ee59d940db1a508e5e0c735bde9337f9eb10dc781020348246c5de491016db5e61878dabee9b9ca8f3dcc99c49e67f64cc9137bd27bd7970890cfe19c186de479485656e01890a862a8345b9e29718aca5808788f3df67ea25073fbcb540a48b1c630cc4ad13ad89c2323f86d0a01ece3d23a6ca534304d14e2aa227ae86e513a6ca594874f702be5e34827c5572d5fd22949fb720e57ce816d52be4ddc4cd8bac8933d6c5df9499aa96566f9ec238bb90635b3313729e57f5651ccf45c4f3e7611a80505b72ef612e39b9d54948ac9131679640d731cb3506a299b28282594bf523ad0db8642711cab86b571a5938cb628dd3614aad52ad9d9ca7a7e48a60ca5fe9b2df95891f3a888534a3582ef6cf94cc66766cb5476ef4f8f3da6dcdcd17e2066333e3bd5f933ea8fed55f0393ea34ec99a489c9b412c9355a7121f40bfcf25b7bbf4b167c69ec81379a2901e5f45cad4c69ec8d3c22bfa5774a33b9f7033815278853dff09dfcc2b48bcca6ee691c990212cd5d99a4413a86f349f96e92ba865fac2b03a704c3f90bf8ce7e7693e7d83e18065fa539a0f5603c660b0821de6e25f417d83cda0655a7d83b98065eac036980a38a6fb063b0539cfc672f90a4582aef36c3497af50840c7752f1c273b96379d6fe7660c77d13fbfe8cd620083775837b83ff58c5ed9f9107b71f8341f4c1eda8831b6dc0311d85b44cff89e78e2e0b601c01068c174678f1c2c50a179716a09696541152291622b0b0ac185959411541a15486a0a2e242082e5ca4042125e5f4733aa11041413901c2c989a90a93691bb26da51f944a241f9048232a4623cd47d3b21e6419c6030cbb76705d740a4aa70ee694399032e2e0c68edfc59e0be10dd8e6451bb08d738c4d734cfc4905258237c627a2adf8949f563a4484992c25a2adcc629663d1c528cce9c766cd584b5eccd616b78b3c570ba7b9829eaa5f88c916b7af25b7bbc61d9618993f88cf6ac7a309b191bb314a96325aac08f643b51f1be3b51f13cae58265b21a73c53ec328c546469864c078209289be090372ae7f9c6bac48c4c2066f278b52bef45de4c9789e2ac56a3f9a4fbc9de6736998a5f940b6e91d1daaf1b826a43d46b7c5787e34578ccf58ef51efc27654e52f1727cf713335326c57a375ca09cac5713f35266b44df8cc53141d8b41f1fe7a6161b12ba6d45d84f871ad96e3bd97f14dba150273b29366351ba6d28d43fc7cdcc7435fca5475932d60b9431aa0fa08b7165791eb9c49ef6e1fa7f504fd57fc42683f88a6fe4b982b220629b9626b81df5703bd2a19f7b6e2784127962922ef250d47735dc772c94b1b0297c7582d5806f64ab65baf4fd180cfa460eb54c632b6093d4a2b3381f1be9a09c546c8a52c564c05c3fa9622d681430d7580d58a63118b44c632b6099c64ec031fd99edb01bdc7e8cda693b8c05b7ffd11944afa079055d449b089eaabf8803028472bfc33f052ce09678aade9182ee699e299c06dba1ad1ab6a3adadc8455d57f82f219a61b75659dfb091ce7ba91309108b85e5e77461b9f047e9f22c9f65978e785dfe1a19e1f22e53e8f5b31d6d7164266ca91b2fdec77df17c1afd14928c848578e39ee322e9b1934c49297bef7a2f5b72623316ca7719eb316b7af65d753e0b4a953c857cf20ce20905b36690af58ba29749bc516608b2c95de51c58a14f9f1fe09623959ec0793523ee8502862b57cb2681ec1c2b9d2110c833f4c36be3cd2893ccea1618b08e89f9bba119f3ff66baeb281fa0ad9408dc4b9a0fb144332e7119611cbb0192790a0a0277fb6502711c2b0179fb1a40c3629e06d31c7f7e2505f232fe8900fe045edfcfee5983961b63afadce83cdbcce5a02a349149d8fad2d691ad8b3c427ae0954dd8f865b35a49ec243c27f23cd58dd88f949205ad2a1049eca79774163e5b5cadfdfeb756e342f37c3a13085b97f144c9e2a1360c994fb644cae796e7dacd97a9cf7aa493922cb9242559a957e22bb62088922597f8aa0588da8191ce9c9dfa148d8cd41aa254f369f1d088ff427221c198b80a6bf200be914d3a16c38dbf00be915bc4257885faf813e015cbc74f8257a68ff18de09bb9e3f29d016eac797ea6c17e020dabc8e0f3cbf76fdabfcd576d93f01cf9b7e3e7677efe97a95356f1337cae097a501812a406070583f2558b1b016f5b0a99a5830bbe40693b0aed3bd7d2f67c71eebbf75cc68c79e5cad5ef1bef763eba2ffcc69eff85f37731e89c94cc939968c534f47f18818f82282a02de3bccb1040e56003f644b843eb4a91bffecdf6ddba6af30fe0e7b6931cc89ecb1c734db89e06affde7bef15a1713867838849fa39df09f8bcfdc32548241c9ee346e9328e25288e3b734ca0a6460d29b0ae1a3a5e963df61566163a015f62105a2a9f257c22f4657d71553f37741aceb1ef5fd8221e7e3eb7783e95296430cef13bc75cd852efe5fbc8493d9b4a62befc1cf3e5f6f382ff6c8ef9725a1ed7c7f791c344a9f2983c4ede74fa945f42fef636e82b217f7b258ee0311fe59b8711126791f140f949d339283f9fc7f632456d12dbcb5f62b34ba0587e46724c1ef2b777196cd2a6e86faffdb429babd12da6f3fb2f1b68a7da95e4faa1db3b6a76a1df11af1c76c8abe4d519b4a623efc1cf223e5c206dfe2f83167669eaaebe378ef1c3f3173af156c4fc5afe673a63f1ad990cde7e27b3e5337e8cfcfb02a3f7befb38ee49a54c2c6bdf7fd6a78747fbc247b5949d9f36844447b527d8297dc9106e32a7f7fbd9649ffc6c3867d87c23aee46dbbddc8ebb3e6200bdf36d78118e42a15011628f82a1dd1fe598feeedec2cccccc4c3b332d62923d18358228f5aa433606fe7a77134c60c0b9c6e198267cc5b69bb934b2e477cb84734dcc5cfa1db764ae13d46280b5e530c90f976d343f77bb9be9c886ae6268091c4422e84602470e1cce75abd41c4bb47f0baf4cef9fc2374c987885f2fe183f5ea5dc6060f24d074900c7f473bf3b417fe2e816071804cd837f74023010a4ff882ed16ec257d486b31d3adec36d1348017b89a723de902088775a226c7761b341c44cad3173395f7514a65d380dc24850ce485e0c8c59c1846940d493b383e57b70501a80e4185169356c74670705ad0b179f695338c797b9d2c078167a34302c8d42b4745750281e309e252545c8065376a472cc3ccbcfd814f8c8917996970902abfca31547ae7fa772ddc53f9bf230ea0e1f50e041931c18cf525339585ee665ec0e9967791f393c4aa2656a4a09999ff9191b7d9eca5fc6c69da7f29ea7720c085b8201b14dccfb6356b00d10ef8f19a16f60de1fbb826d68bc3f8604b651bd3f9684bea9bfb23fe3fdb1200c09268425f1958cf7c7587dc309f11dbc2ecfbd8a2e51e8148162cffb11ba1e4fa7d3e9f43c8af1f4a7f83f5872fbe7e42ea2871036e8fae9e5a9d693575594e7eae86554d207514b1fa36eff524d1f43c3ceb033685415272388182f76f3be3034ec8c98caf775add9abaaf65c952fa3ce0fa2d28f51af7fa9d80351fdc6549639d8ba28e41f8beafbc72bb08d7dff8885bea1f1fe3109dbcc78ffa805b6e1de3f6ea16f54ef1f595189af4eef40bcbfbcc7780fe2fd2351dfc86859cd263f6138553d79aea2bc8c3afa202ae963d4d2bfd4ed81a8a6afb5ef6ce22b0ca8397f9f334eaa6499ad9e502dcec11f550c280534a3f2e51838a3fa5559c932f0b5cad9c831f0659561bf65e0cf1a846da9312ceac59e2a1076730ebead7d69546f19f8332ae49853d59cab956ff65cd55e46951f449d1fa3d27fa9d70351b1b7d56fad7c9deedc226c9db376ee8b7756f772fdb6e567c3592ae7bcbaf25fe3bf875141308424b4725e5429e075c15aa250c783d5d99567517151bbb64f38d055f995d3e9572ae414cb3907ffc4b49548a3d634f8596596e9e445ab84cd31f0fd6226248c70055fac5542c9143764a97e7ec1711ace6166ce99e37b83d10e62bb179cf57f92f1d1a7ff58c77e4fffb1a78fb1af3ac2f7d2729af245e49b9696711bf8dd5f196cdcd33863dc5ea8dc9a651eaa7be12cec08d7b5b232c31cb3b2725d4f83143e3a64db1e0b3fecce38d7dbdd502c6e86ad134a011632288e01c8a3fb83d1fbfdd6b34d099fffbd13aa057bd9b3bd73758b544a079a58e8b8504aec63edb41bbbaf8650bb104222eff905a1ed83e7c6bf986c5c74fd2d61a33f22423516b4d560289a5dfdd9439d6e9b619614908ba0e022965d3972518e9167a97345d793828b0bebd8efc22e2cbe4e69d9d04f333e94ced94748ffc0c903ce1d8a88b08c9928e125353549706ac8d460568d990b737b9e8a63b4fa2d14965a4e3694fab247a97e513214c95748930ce70e0d04250f43e8e098fefaae24d9a86191fc4a9949928d1a96908d24d9a881d706074a7dabeb5f8cf1aa89a6af31c3ada2e9fa1a6f054bb485d217f337286189b6500a4bb485bea027f5e4b2730cbf894a2a37b935db6473b68c7462ac5876d1495b5fe02e2441826352024b38ff3538f2336cd690b6fae86fd56f7ffc6c44232d22a24b7461e80b180e8e91f55d58ba6ce0b0848628d5eb65361ae940483358ba6ce0b0848680a5cb068e1ce27d6633ff8d6636af6c622754cdc57d6693615ff336a46bd4a4d6304dc3dad4a5519ff446339a5112c5ae382576a198b00bbb649c12c524e39471cad23c9d6c3205c5145d9c4e32aa9282f26cb43af354dd1f94519acda72b2a34a3194dd1962c91c245a70d3aafcf58e635296a5e742e6123632950e8425b02e732b3666ad4e078aa7eed6538a73117a56da77fd7c3ea177ef6596aa49365b5e14a12be6ad47c4cd09581a96f7e9c596a659e82320c5e3aa50d9a51085da4a838ede13eb0f781263118baae9515d8af91f0719f779009f81e5f7e931adfc15cf7d9e64b2a36b964eb702e13af288e74626cda1d63efc42ecc9f4f9f7ac77e70c87a44a584425a86d1b8fc2fda0968c3c288d49f657d7b6259c56ad4a85828881bbdd26f988645202368272220236cefa5659ea8b6c5cb54db4ef1a56536ed8d6adb29beb44caa6da788829383c39dc1b45213b58c67336eccc979399ed33959cc99a17aa5cfaadfab54fac9140e598517abdbc957442d70b8fe7d4751aeac743f9ddba410d3f8b30c49f70c69d40171bb6e8d655a854f4be9277d761ae990487dfb0426839a56e3258d52bade7e22206edb0efbf8a6e798d2fbce3bf19d937513cafc528d6faa5d63e1faac5030928bf224948f77a2a06848728c48f61d762a7e605f8bcbdf3593ffce835025dc779d850cee2297bf6b242dd4496a9018dfb59020beeb295e989364d1ea9dfe719929aa460d0ec6bee33cf486a13870b6a32d2ab0bf8085bc062ce43b007a2a06424245d73fe89e1845fe70bb481f2eef3c9590325cfe9a47d3c453f94b0d4d87b26300183055f8e2d086a1eb6f814019e9445bfbb6161b135be38d1b10bed364e80db7df815cdfb9716803118c0a59444a5a54186a92459115d400a3beab865a49db5f9fa190aecd14ef559b45d44a5a4d851e6ad25914b515d4d048bef66da117dc7eafc16ddf817b90af7c6154be59aac277ab80e4faa746a30cc5549b3464542455e3358d5e14010242d25404051d39d23fa84285effafc81083e7f2872aff62c23ed6d04f00e4c9a085a00816f60f286d8dcff6f7b7bbbc37efe41f6349f910ff4eefe07e103c3f342df20d1324a56b27b70b8efb1610643a26ffadf6fcf32cbf4531b2db65ded1e376eca38c406b18bd2c7d23218ecd2322e8261cc76cf0c14264eeebdf902d8b487c0fd035ec95f451f1ce13e2255f00dd75de4be1ed2459a8a256c57dcf7fd038e792ffde60d6eb8dd4bc75dc8f78deee35734c31afdfb1924ae7f6fc6da2ede864f6d372a7a24c8231d1beef3a2d4278e47f358cc8a82f5683ac082c7825556978f7935c4d6edc336a5fbbe877cd75d07e136ebd1b4cf53bd551361ee11699f9601cf7d226840e744f154f4ca1c6cafc963f50d5f7988e2d13415ac7a1f84fb5e5bb1042d8a263b0da47d38becb5800c29019af8208378a0d751bc036ef25c0349b0320c0abc9bd35e8785bf44d07b859e072fbc7e6018e790f5b0c5bd73eede3d33eedd3cf9be10e0d256445f4cdb6f73f8c744a267f94c96a045ff985add3112fa3ece6858d1fda8dce6c0d71a0c000f339a786ab3a357fc6b976255bb7cdccccc09ca6feaa90640643b81d7e47370010d0ed074406de82b7e02dde7bef794d4d8dbf266aa226c2c1c1014147f8a8be0ce86fdb4e78ef3df707db398e83818179ef754b4b4b0d7fa2c6ed77afa1c4dd5f8cd100102ae138aec5add67bae84dfd32102e48944db835b4242b79d85c4f09ef7153226c0f6bc09197e860cf9696969f137333303c5c9fdf4fcbdbcbcd4d4d4c06f7f4990b02289af407091b042e8664cb335fb0a092b844ebe6a1d7eb908fecb5647df6791b0228973ce2d066f875dd84e4ee354f3694fcecde95e836e230c27da1ace35c3ebdf1be2fa195f49d82a5939c623cecd38fbc8a43afcd26e26d6596327a165e2d39f98ec2b5a663e26639c9d04abc9165fb56d71ae7dc5f2678d73ce3c64e85c94961fccfd999e4b8002051dd5eeadc461edd8f463151b96c539dbbe97efcd39e7ebf9328c3538d24982039fcb5b5c4e2224e86653e311ad62cb86b06cf3fb9b27cef80ee4f39258cc9ed6dd5bcd1e1be9404c7b356e728b51c6df5e3f5f950e6d17b5efe9f44fd23f97b534fb9624864df910c2d7334281da4e377bcd691ce8a9dc69b42c7e1cf9b8720235d09d56a3ed737fba88fc19e23e5993f9d9f55ac58268419c830dbb27b4abcef76616351a3520b11b6a2d6899a76245f632e78b9473ce399f92397f4ac890999764dac9398f31ce59b7c7239d8b467ebce645b31ff255f039d21a8918c59e132e9df7707483469a79e4c85a8e1128341a211970707070608df444800b6f56068012e2c2192d322e545d08c4857fa1bd2d2eb63e4c5df81deacad606335343854432f9a808bf2939788996f18d538129cd906c8ddf2cda5afa5ab7ff6a7a18f5e45f549477a9a7c7c1d1324b2451224503d70995877f04266401e6fc533503cdf9b3d40db00e178173fe4a208123471296cac7aaf22929bf84af545458ae8aede293521e7ebf8b0c5c177589c8ed2414c7907e4503a77a628e846ae2c2edf4c449d5364a822411909e49f01b0ed73b5eb20407e2e05c6821b7685ac00723a9518f72ec86cb7f01ae00dfc0c0408067c6c05f4031a1502d2dff2f2f5be96494516d3b69278a692c2aa89ac3558ec339d6369f8399a9c1c1ccd45071714a5171f1209531e5341fd5f22fa8967f39bdd34339316da5bea96999bec16999ad6f6cb40c0eaadd1a9cbe11c1112de38fa317c031fe320ed7fd45402d37290173179fe1fa1fb10024fa264709580b693b7ec3f5c7e12b4a1f9dac131fb86d289af8309b15b5cdf82af89c688dc0c7fa2fecba5e8e74ae0bba857cb50b5112424dd3684401d31469234a514e25d3265d504a29f72f25e9e2492fa4e7faa606a66f706c1091529ab945708c7fb49913a5875f53d38463c029a04473fe5b650073fe45e0d8208283622d1de1ab12c97e810c69f0699164fcd2fd5d36239dfdbeed8963e07732d75184383d81721283b2811313cc0914a68d8689035b69c6164589a42a758034e248528c3419230f6859109a8e0c8b917d00bb5e30105c14882b04745a2a8229eb9d23907f2509220cb6897f6309e0bbfe2fd826428e812897c7c339067e16670bdbc4af71be19af79c55829ca57f4694c17dfac3da816e9cf17e7488752ab5918d986af15567911fefdf1df2b15c1a57c8ffaaf5cf8cca60b9b6950d0764fbc6cad846a28ba61d98f5045c4abd92638c6df86fccc7630641936c9442f748b50bc5cf85ef4c958d421e9375fb9a9844a394139b56c2f83188d466fc35129a82bc3ab2e001351aa4704d1f22f5b8bfc587d5484e4a0fcd2c33755e698adf4369e8f5baad039f802b089c20daaf92a3eb450460b8278d909cc3a75ec03f5769f004bbaf6fe338f06be67ef86ade3d7ea57d8d755278bc58ad09904e15c0a0094ef54279a94debad43dea9ecf6fdfffd1b0638fe218f9367caba54aaadae69ce4e4ca9538388cc341cf0709f6bc6762031b5fc1083d57d311effb8d956a4783bfc3ee77021cf8fefeec35eeeeeeb472ce6dcfe97cd29d2377d0da98a9117a472021a2df1157d8f0d5f6fc44f86ae5592809a5db8642fd73dc8c0d98bdd1f6741b692c4f1f4d141bea47dad62f8a47f3e2fde451fee4c276cfa5d88e9b29d96ee6d9aee6beb0ec2aea62d9552ad7f3a349d9d2f3f3a774db502cd587b8cf14ce799369a29b3bcafa112eba9c1ff1821fb9efa34049b1a7a247e9b6a13a16fac286fd098aefa0d86ee2852dfe894df1f5ebd2b8e04758e5dda4f41e89bb1dad5d8dd0466537d9567c34c49fb18b3e8c39fda7cf7fd2763c6d1a6598f5a34fe05c7ebf5afe0cb171bce4755db6bb9ee97bedfefacbba5bf741db77321a08bf5e4cb687be6206c00a2184b0df7302b5949676901e8f11dbf498afb18d7c7feaabf6219fe5b786d60fe8fe104a29a1943ab2ef7322beffaca922e2fbfbb89d8de6187f675f45967f80231de87e3bea84a78a709b42c010977f88fb87cb1c1387b26c88ad6516b64ebb7c849412c60d7faba32fb46e09a039e74c47bfa15ec61329c688da6ecb75e3b7cce6576c7d29aa36ab4a2f6be94f7dc3b54cdfc0b48ccfb40cdbac38c649a7eba4cdc228eeb65927b687cfb9e00c5084027238e76faa4b38e7bff287f19fa971bd936ce7d176be7dacdb936a8dafb6f8d797ba7f6fe391aa8f1b5fe65db8fe57cdf5a79b3f1a3b75e37d7c6899f9c54d3dda0784f20f05f8113480a2071f72ca053f9e38e6d90b4278d5cdb9c734f331db41867d64eb961c693b78995b6e162fb44d9cde6fef7d0adbb874b45dcb758656649185df9c90a1c8b3c0862ff0bf871fbf04dbcb6673f73ef2777ee79c3e1f7d87ceb9f3f5e7b083f74d9e8b0b415e153b35a8008529a88005cf1be574940959dc6ebb5c434e8a6af91794565bea33d74a6ec74213682dba9a47a206a7032e83abc3bf6f8f6e3471fdb17ae28d35e6987b2f2b64ee7dbc7edd7660c785e19c6bee4892ebfddca3a87da8444d1765452b110d00000000009314000028100a864362e180481e87baa20f14800d879a4a74669c094a0ec31452c6104200214004404000006086c401d8fe94a63af2767356dbf27b2a3fc447a087c796f67e5a93c064c90f404d4084c6142142f34a0fb0fd221ac91d214ff03aeca8a4695b1bb6428b3a2a03e45b1ea67a31a251b1dafcc6048391b7da1b43ca0811542a851bb4694b9b3db0ad9bcbf6a4230afc2cb9f15c954d1d5fbe1251eb2752e0b98b422fa7ea8c8c3edc8ebc0d43c15a202bc3d06cd1232ec1e7acc1b23ac056a869b9755980173e9f9436568eeb6e630cf502be6e638bcbdb568778cbc65fd9aed93c4b13b0ba6b568f2ceceeb8d6e15aa82d2831b88017a6ece4e1be9eb881741b3941a4f35883909657e64e54e7f825ada09a926522a0f3da412b1034b955da113ce1bc7dd07e9f201b9df9a777e5a46e69a868426af145b5a9d249e758168f2b7d9a27ea28d141656cd86d44f3db02e9c40587153b34dcf69e888fbd0b2afd1cbd238b5eab22aedc92cadc23618907ea34e451c52f66c5de16048d65fd2df92372405c0d571039edf000623c036fa21d5d49b41a16b6cc737ac806e1331b60bc4fe4d79b87590c02c8752fd553592347ae3dd4b3ef719b886594a2364354253e9eece28e5a9c16047382bd6cf2b3600c2d948634473c339b795e17ed8c013d3a041e9a3342bbc09a9d535428b14b7656bb94e518b74578b10f4686be05bb9c73eee865c0d683301a13c103df40312ce4d8da4419e6d5988bb445a045f4eb8075dbb606d1b2bfdfc8d2deae31f836c4c98b2b3777ecc9b0409703b83c5d832569b994a10afa5c45e5e33dcfccffcd4440a80d5f611a7a4c4a7fbb56352e64741f7178bae7d3378d3fdc75688f36001a73b8b147846aa64a7b4df1515f487433c896b77ae71ed570c25b8a10280990005946a603fd8fe3e0ddc21f89bcf79120c426f70d8ada0308f82620bc8f00695a00087e3f051992a2cfa029e4fa350d1de882bff56d2af601847dba5e59a6f6efa1061b58e7ec44a395bc6f75faa6091f5b94a90cf0f073df9feeee4f696effc461e38366230081d3c5a51a3060f902208d70e847294e11e1ce9b2c6cf795c741930016e724c9f5f1a16d14732aa0a004b75e22080db73a65000ca40aab89eadf433cfd281893d599c969361d17e89014fc5fefb397b26168027e4594169c7771d2b7ff32e566e3c239b851e3db11eda32e59f8f71da4ee5d2b1b8757f8d9653c2b1107c6417b5df6f91c3f25fcd2007b9df08a92d6803164970bef50b26b3a93e1fca3d1e579436ec11015460c39f67763795b2ecb6a97a70d168cc2d14e9fc94867bcfe5378fd1092dd9d42c5761fc8b53923fafc49a9594750d34f745543440a8188d1f17e85989f5a7c4d42aa617154f349d53c6489f1611c48b08e8ea629273897c20a057e6f029ad384ae70294b084ee7533c362b58fa1fbc68950fc4aed414ccec7b35c071517b18da993415a26bcb2f0d3493c428076968c421907277eff3228efcce89423103f2826a29058ac8b7e60241dd0034fd1fb2893964cb8988fc08c1875f1ebf6b49d5f712b43cb832ce2c58bd3689ec90803aacf338684dce8a503b30a2457e82ad60a511899bf0eaf866bf027df13524a1289a9990928dddfbfe07031f58d9a920e13a82b7897796be74c314f3a4da232119d57213f222ad51972f2eb7f65ea72bf7a3ce9312d54ac1a03f790d9f57e2203f223eb7008aca79cb6873bc817b6081b2486d12ef79b98b913444642ae34851ebe3d05b0b3a3c89ece4aa87dd47c0c126d35a39d648216e397e78875f514b9d86ec9c201626fc8fb36ef82cac533d21a393e59ffee1945be88896d98b14c687aa7dd093f8ac4222248d535a62077c30bdae4064ae927caf67b87a6c2b03cacc1b2e4e146b29ccdd7d420294f3b422de0e34789ea15e83fc490c7b840c45e8699160a7bf856d0d2560c3b5b4f4175647077412a83df6b5566c17d005f84a20de47b17afb03b52e9cafcf9f1dbf6a4dae5b4b23ae3fbaad74e07ed0ed4a615e705cf6e74e835d1a7179846eb32bb0bd7c02c18cf515ead9c58eba953a0b1ab458e7b6c6558ad86d00c2869ec91bcb6af1066c59ac43f3896b080f2e8847d7aca510dccc2df6b3cac33177f4e86f444f8b5ff003c27a04ea4678b65bcb62d506b7136826ee27dc894b64597e4508246529fdaea139e812bb3ea216a8164e50fa2bf08c54421041d4b4fa44c7c2a28c83e0a6c5e5d1b3aa894d5117eb11b710e10d7d15001fec39039651b43a9725825695a550496f37098242c13c9ba2edd7a1c7ca2e7ece94f461f66e62879febd652f8dcf4f5b79eb1ba6d2590196e4b55c8e81f32db6137c8070845193e0f9c39b18cb4dd48e241a6dc026c44d6a8bfad809789b3c58eb29402cbcd0ec707ff70a75b8198d8f502d2523f2a99b839de69ba81b43349e577f750c45d29181037cae2325b1295c1f7a19d2d865b3804506ed1edcd94d3882ccfd0e4b6038b214bc38753211737d784f31b47e1cd450f7b196b271f66b20fea62a4b292838a31a1b29c814481523f38d35548b23ce496cf112162a8083fb3165be9e8263bd2ab1157f91a3c9ba25e2958e8aaf6464fabeeaaf2bec9b94b5bf006d125d88767e3a8818e3644e1465a95c8f06f3668ad21f53e0effb186a600346ecf79ca94df5c8bf6a4275f3e2a7e5d877d0d7bc6fe90f764073f34551806117096e4c2444bb41d1de079e9b26de207e5234204f28ed5a6e1a2524105f8637fc0ab0bc7db44d547e15967869620391485773b98b82d99ca73b5fe2e1bbcf73c8e093c4902676fa60f8d81e8abc047b2dbc4bcf0af30bb7cc21ce181a772f61a6744e0af525a56e648624a017b94700156d942ae0c0b2c9ce3a58f6ec5c8f4e3812c746fc5fcbf8fc127c56a844d0bb8468a95c923059a20df40852d4e5cbb916ebf39932c9723f8b7b9966850f8ce1d318f3e6dbd0af44750f3123da8506a355592f53bd8f2ec021d96301d67b337ffe242a92bf1b42ec92c63d8e11b959260a81341c127ab798e7e79218a6b27b70016b99984f465e145c03fc721cc8517a2fbb0a9ae2e4ad61ae55d01ba6c890e59835410cc1d27f6281161895983c25719e8cfef9070d24690e6db4e9746d9b829b50344e1b214d15541cfeb9388512ed33e38f5b2c11b6e34fc69c64ab1841ce92209921d8f30a5aaae4ef18c32a7dd251564110ecb45b8687f98cd68e31c17fda93c4131751e616d86a29afd54777fe284cfbfeefb02b860743ccf7e907088ee8e4c488e7327a441ceaa500327d488c5fa1ccd9295b48117040e5c17426799b1e6d5a10e7b436b1086b651d3d1c5e52840c0e91b647c030951c77eb4f0441edb3e51dd92975a335e0c19aaca8b44a8cd9dc6df4b467bf611b1e9bcfb196a589c14b52bc6cde0c15b39ae2a01fb676cc41b021e9621ad04afc8a4ac21a5d573059aef91835329a9ecab6b9c4f5a37a3bbf8e9a35e50f769d799d6f35567daacb773c97ce810f02c7d810e2097fd266513ffc570d74baa558ed80f4ac8323da888b2c27ea24fb0988fc9f307be7ebecb2a595419505f98e710fac86a5660270b3a6881952df004deb94dd7a837c4fb236c4b2c881448799348bb1641a75ab578fda921fe85244d50ca4b062b7c545b366f992e18f7957c42cdc4bb61101c404c52325138ff6b345ecbc92025d2fcd5105f37d5f9b144bc34f28f8fc3b849fd1082ec8280c77a2ae7457eec77d0a6edef59173e8497e76dfa87f28be3ecc3edecfc5ef850fd3c3d39a61e193094a73684e67a785795ca0300babb374d49fb3f3aed3895e2136b3c8ce244568212c63c8c96ebd0e8a08d9e368b30bf284e62a081cf9bb908b5cdcf529137359df7efc089d67a19351a0819bc1a7e74d93a2136ae9b124046f54b0ed24b7f0c1aafb16f1b6662c12b9c14c83ad281fa0bdbfed15e63df71e701e4169a2a9e4c537eed756ed26993a4b4098edb43fb9242274c8ab9b4656b431fddee8fa34c813d8be25750b1c9a2193c90060171a4b3c31113c8566d12da2bf272986ab3a9904a6ac089c08274da530a4ae07bd8f7bb1e9bd7a17756649192e09b0ddf61684866241918db7b0cc7b6ae96896a4a8c357442401aa0eeae26bae1b7a88b532edcc41d76d681f1a608aae2bfe072174573be70eb05c5e1ad3635ae2a2f9f2909367013c7505df0772e3023e05da282c6854d6721ebff9ecf321392c6cc9934d92152cd83d620b8c8f70ed9704ac5a7b120455e1f7ec4ac592b514f6a60d7c51bde4de388949cf50a97f25a9f746211707a9cd01e472cad5f8d54394362a90a9dfdfecf3bcac83842c74316ffa3b92fb2810c240e441a36c33b14873ba8d48042aa87c5240d0825e7f60075667977f52485e115543a9381311845af140793780ea2cdde2891587d6d30b4b3c66e5cbe47399c53779ddc78da693f8c23356e727cfba3c370cd5a1accddda1ec4c735ae0f638693eef17b32a28c3998b3fa050c23c176143f87d521a94637148270ceb91f674a1e5b3d879242e290b36504fcdad01b59de9bd7482c6defa256651785eca0cbf4a949c32114855b86a37761f81afe6c43543438acba963c2bc357ea012f049846ce8584d7bb8c464cf2ec45bde4d12cae0df9bcb3cfa94d71e299b625ca7bb0fc017a9179567d484a0f1168317389b2cffbf360bde0eec37b571423d7d43326abe3432554532b592e901344542e6d9c2cba8ac5944c26780071344777307172371f42138d5b9ab266932e107dbfc4d5b2d8c65b94e0a0b3bafa046d4bb3037199cb6b88fc4dcada69c5da708c00a74b904d04c051b0eead344ab5d0f8349e07a6e68fe36324121d5b17be3375490fa33d9c436d606f613b3425bb4bf1b7f4362fb9171806ea0d3e57d43828a9677b74ae64973141e69d3b519a3246a7ce7dca59026564611c2fa1f379d2866056365fcfac4c9a8c6a4f4445250887241e0e13af2e8831df42b301475da0d50f3dc3e11a026c1465f1ef6a3a09691d8cc578605957a5f4458350c80caa381d619d99276ef5c26951a023ad3eda52d02c80c3e86054db93e1342b064cd7e778f44e2bed19fe4836c405f40580019c2d264a7a12f3844f0458c50ea9091715d6a028e381621775a0bd379c56458277bc00df8ecf85019fd4e849636f5b124b93810ab9a744dce7231f1058fff13fba23e7d8a1554e007bfbe0f70d4154e4914808905196005462dcb5af2de75c8a40960885bd16c97f05376a8caa0cc1c25642b1f0e498aa9df0ae73dee6a52285cee14b0ff42a367315935b61994e78c506921e17b35073c4812e24dd8dd4cae732cbfd7c28536191ea9bd2597c4554a3ab01eaed0a4f11cf42cf3bc1a2b4a219192c7e6ee50d498f3e7c2d9cca48bf72de4760de1f085b2ef782f8b0d269048b12b4e3f12cc69c9390abceb38c88b60bfd5c7b2db81e9ff6615000bdf1a6e6128dae148a5e4b2c9c8cd0db4d108cd55e4399554026267f0419fdb3564add345351e019cc99a6b7f82ba57b5740e165f0e752583f4a8b52a14e58a40db7b1869746e384dbba469eb30359f26280324b814690d91da93016c7b2cb05768c0cb9f8c35956ada698cee920f499b4a646c2d3e5a6475b1e7eb405f2c79b2c96ec8c2e92083ecd2ee42fa8d476544df4103372f410ff28ef539c56184f9ce2433a41f4b04ca842199d63a3f28ad0b48c3ecd5825dba0bc479dae3cb08b16137684a97a00ace4d05f35e92a0e571725108748316efbd3166ec43ceeec2ff0565f67d3ca4902fb32876dc5cf45ccbaf5e2e4f2daba951634698170e4c76d6d481199ffc16f56295ffa9423da28394ca2bfe5d7c6cd09f7b04629f447da77c8d1118de5a2f9b492d7419bb0c2d723c717c9b5d94cf1fba0366dc7696a4e04bb3841b07e1a414d337890a8775a4176b1519bcc43a78d5b547fd1d36448f5918567e40114542d70a444ef6eff2abe402b5552cf392c3dbe42d0ee852f274a1fb24495902b649ed6f948d525be42787e7da320a6b881d2e353eb5b7830c836394108db563740ab190096b07d4e85124fe119da02635e4463c8551ecc3809e59c5127e69c606b881c278d3a91c3a45527e29c606a891d26b589a5475aa0b1b0bc81453be154cd37248447ab921f01e418caf1e7ad98cf5a0a6cfd8adc1a95eb2fd41be2ff048970f2009f34f34c5a0987fdba4260bc1349d4730162d320eae556fb63657a2f1f65a52e1498100c33e49a331f9fd2ee87e86b3726cd73ad118b59f7bd3aa2f48c703a981640f0d239b1ab538f95c8451f19eb400e1e3be7a4e1ecfafeef339020f47c00f2ef45c8d828e084f5bf43788ccd575cfab506ea521c7990b22008b0501c1f30f7daf29a411fea221fe6719d1d8678b55c97102961c1be807bfa9da0b5cb551e198f3f24dc1f6c4df7a0a724410bc0bab7f7c9d2db6ca7af9a2d4e2d6a8b497e9c00b74b0b99b02b3477caab113d7daa37cbfb76302570f8d7a1d973a85d179c93881c5030968d74703305d2953da802cfaa73a5f41fe149f1187f4733a3e6ebe00c3baaa519328f4320c5d40c71356ec8f02ae03ed985b3e892cfaac82cdfb2f84ae5fcb8a29c156c8d4715109fafe9d600fed44cfe4db5a3214a5d01a97979f1fbd3b9c764b0d7893bebacd3ee556298301618d1e59d72fcb5c6649980825e12991f6c3ec593727b21d0dae9462e35f978e158bdf883104163aed0943c6307a5a78eefecb8f4b96b4ef0eb8aa54781c2018c34f19e057c4e53bcbec97a27a43fef5be259715265df699cb2cfe29904f5c5af89c7476c870d3bac4a2ea3f8ecbf304a455802cabe9b3784c7028032a06efad63d58bdd4324b0005e94100b616726f0238e81f27026815d5101140d3932f28c029a56eb2f7d8864e96393a0c105fb23355bfd11abe530a42fd9f7350f6c100e0c3da63d73ad1b0fcb94d91230034511c92bf879f050d61d64936004c3437623f2173c467d440ff3ba2051eb87f3aafd2cdf1ef00d792c59cc39821436855b38028cacaea034afb42cded20e9743169250ac91fe524ec457b1884cd0ce9081f83bc21beaf296ff7375574edf3761508d5c26018770efe4a7c177bb33c98938ace7bbb5b123da357aef24785c9b1a3a49dc1aabed3c49f6d7ffbd70cad9951a675c5fae0cb7dcbe84671621e6aa214ea1080164ed47fe2ca82754060f87ffa477b22d01d74d675ce563bfeee264c2f872b502db8380412a1c4553dafc6d40f96664f0449c84bf71351bf1dec9d51fd376f50b3a66c9aeef84e29c74c6006b97a3452ca3024e06cc0656606672e628b08ac5dcf13a504c6c2b0a6f5fea43a5da61cd6134ebf70861a42844f293896bde47e7cb65a5c3a3400710ea48eb36e8de343e5b96a917fa76a164c177983c8d3d7b995c3b5a52ed44c18284fea854d8a9639b3d8f9d863e9fa351e8092192d48a804f1df8d79d2953a40efcd5b6009ac4943d885413b0faa3a8726f27f167577900cd77a1662d3d4a266cb944ae04c4593f588c2686b406778f92fc19238739017d846a0a9937fdf727e965656fca5b005156cfe48423299089687afc7e2295da20969f0e85d741205e51210b82642226682569ea2503df7347d27106276e31aa7940c6fa66ac65c50813c308b017bbb09fbbdb626dcdd194cd688bab4d7a23ad1b4c2498faa46357b0bd4f6cdecbfd75dc57160b00697585552af83c852b0f4e87cfe9b9400a1d73be8e1a5fd545fd1a122d6c662ecc83e2c85a5ee4827fe725f1d472abf8f52db94342d1fdb47f98f70211ddc7c9442630bd125c5e9a8cd0c52bbd69e6f9f1e62e9066bb39efcf0f3b8641343d4c82676c80dfdb0e3d3f694983655e3e199228b55c044282e6fe860a14806cae6f3d231740195290b66d7b718682b62733096bcbae58dbce717f240e2155a5ff9912363ba232d22ea8b3240fe1adf6374e14bdcad766d18e93656efbb92a2e4425cac927329e8f06d8bd305e706cdacb22cb0f055a62e7ed731039d41ca173bb4217bc4168d7d2d60827696c9579b24b28f83bf31e068130444ea0fe3569188444480a2d46d3cc7f9555dba03f172a4294b4bc09a4825a5ddb238cd683922eb51df9ad6ab421a5c9b8155fff66d48e3aafca399457a8192e862ebc074492d1bfc09659f07bdfba592233ab1bfb9d817ae92dafe2f766a2ef67c14d43f8d008c248f5e513cdd32e66dcb5f059aa2bf7c11bb35ea6953c5e2a51d192202f1b9355fe3741bf7ea4d6c04b20cf6225725a0ac3dda2fbfee5496a0a79082f27abb59692286e4b38e90f798f4e6c29bff5095afde6dd1c5929fe032d4f05e56d719c5445fe63d4585b42b4f2d343571de6c2a54aea6e24024e8f5a7ad3c2c816b1a69083fc86cfbb30caaa1e950f53737bd3ee49fda6c7e09dcc405e61558eac71aac0b8160d842141cf56d9fea17ed88132b2720b668c9b4a6564b6898edce263a5ee31256d345f85a851b9a6b387e407995173fe8372cca74b8b8076b19003b2f8632b18eaf041709b4e0a9bd59a48739c3115006f2d9d53d4112ac7c130d708f90d631b0ae19ca3b20bbd13c5dd9fa17b0184270b4c36d000bf3ef83482b4de9efac645b499c63366e95cdbfe0e8868bc596ed73e664382e8c31364c00177a67e98efcd241819116c5f15b27fef720e87387bfe0601ca52d25358cd756224c8d390c0d8a98383887d1d84fac88235881f311da1d04b012417d5d45ef7829de0e5e00f159e5585ec0868186ad30ec5eb12d81052127b8f99b1d850ee315eac8e51fff2e674d35d0a8662ecfcee9115ff2360d5ed1351d708cbe1bef595471a0181bfa12952ac58fc0ce54e8b8954d16ec724db44bdda1edac68e6298e9eea2d748d4983506fa1a5b2f29d5f9f38667eafe3184d6b31abc0a4f2eea6b107a8c2823be656f7b7d1092a914a52836178855215626c7687081443354425eacef67d043c38465b7077c4a105ff67db73138d7fa81b49e431157c13b2eb6376adb75dd2d68c96dc103488b539909686532496e616a8235cd609ec5247c3e0b79481442eec1c2d164a86187c861ca1ce3180d8c036019053ee9e2563fab03093b681e26fc65e54f477ac023155aa28a09c5408025d4f541d155ad79fb729ffa7a80ead15916a39d95686d7b13a3ac7f4a6b1918c6b56ed6dbcf1bec66f90fdd0a69c4519f4fbe17ff620f557f4f79cd4d994d3dc953b97bcfc90007e6938c9e20c32ddface841ec494fc6089b85fe76c40c3520a9ee34db4288ffb5e1a68bb47c6085c618a50ea115ccc07c58f40a2028f06ae6e763b5dea2ae53661fd6835626400692ce7ed04853722ebcf2a797ae39a7f00d5fe94b57112489f5c788aca87ea18a773dc13831abd3983e5b327681e4af29ac6be9c193db9ce8c8c20bec002d103060fe26ee01c882466d83803d67a5a1e7d7796ebfaafbdcd5132560b00f86a2a867c3b3a68282983242cd0dec66f38200995b483559f363cd317acefd1ba1d9eb17b4bbcc427bdd1ff648b2a91c89fd37a4dbdc892025522a37c277344239517e4b97924b576d6e3dbd449fea68dc4e43152614790b1ac3fcae33ffe6ad8d3b0dfcba4842459283635c049998cdb613c7b8e83d3e24715aca89e394c86946f3a9fbebe3657af1afd2c0a831d057881c12299e8b44ef72b4dca8f7c2cd3e810e9f0d2ee0a2dea0b8e88aa11100bcc10eb3c54b3ef22c4e4c05c3d52789fdf6c2e602246f3ee91bb2480568019abb02f4636a6e83e696dd9426124b3d13e2a4010f93acf23a589d40c03511352c4493b954c91712e6d6fbc3f1aa1c80b6f243431d6daadf6ef3fe39440164220cbce6edc90da747b54678b25f0bafcc0e57206a38c107b696bd0a1d441ad41e807d56eeee5ede916ab1c07ccae7bc714f46f9af800ba30b1042cd7384289a2b203529a2640d60b4be30caa735afb879b5eb2254c33e5d28a5ae2be8db5798dd44c3de598b99435878b9ce05c74499dad1f3e9f8a5195662d3ac5a0285e118272a6cfb6e199a880b8c4d02eaed1d13b4e6a67c722489616db499c4a0d512175f76aaebcc3b03c9da83f0314f12257c428850c22fb1fbfd0964d0e62acba61f3c1de952265666d5eebec22441c8d67d2f3a643c58918d4acef13c9efb3eefe4532848f2b5dfe7c441a1e8e9463dc5dcf1344aadb55f4dd4ccba9cc82e91f08e8e98d650a42631c08aa1aea13ed68af61445ade90acff085af9c61096db4379a3010594e6f3991125a016b6df1670aec5df1f0aba6f1ac872a63c5826101f432408f0fe24deb78aa35928204ae6d8a2dacbfe55a68542e4b3fa1e27d08b49db6e4049ab2a05812dd351349f1f6aad1559600ffebf0fae278e96a42b0069292eff1fe4502dc15ec3abc5e63baa4a8d942f3a4fcec60a22e3b5c2fc1ca9050f6ae9cea7d6684ebf4e857d5ee4dd96fa93b37684bfc2c8977fc71aec0c973259c27317e0d7363726fa046f47b5dce3e9228155885af61352b43db28a32250f340cf5817d042fa9219159f403c3517abd4bf4a101b64e615da84049a2ed821683a062830e6de6e64557b86591cc80b204a437e9495ee8386d4a5107dcf3ec8273cae35716bf465418d2f9697e4fa1aa3d246b28335aa09d1379d269f0255e8ccd9a233f530c51ee61614cdb1e60e809c89e10b07d18e1c78813df763a68f78e9ce7b1ba3a7288b8b17ee7611a42d70a1ef7669be87ac427383fbb5b986d6e35d8e8360a05b808ac804a1eeab8319623e9e78ae3a8928ee1e92a544052fa1f0cc26242c415045d734ba5df3224c7a2fb2aedd06ac41de8c9602db91d72445299d8b29c32edb4975b1926828ac43fcc6f4377f04d86e0edb9045f4d7ce4c62d4395cd11508a7ab2dd6f2f4d0da3d2fa66612cbc499933848470ba4b4d31dd2f5def11ad91d77584c9b39e5cf2ad8d24bac4f058e03f4045ef7be240a9428a04541f5f12ed0743aa5a338c8b9f1442fa9ca07786bec0619894ae1864f78694315ee9cd0881247f257c9724f91bc7131b533f6949ea89dc46ab9d2549701fcf8aa0bf3dc2b80866fe311941a6b1f7b4744ba8ae2742eee42c6e0fb84e6c3bdddfe2951b9a651e8009b782fae0eccdec0b1d30d04ab84ba572983572dda299f519bb7082bb2c58d0a29841c9eff808505f73421803a9eb90b4d7bfa754ec2b4c28d03c5b8cf5904381c9905dc9e311a4c98b4c725abea6187553828d3a6a13f8ef43d722fc9e90f922bfb3ba14b7effd709a13d2e48c58dfe7f8850064111524bf5f63b865e4707cd016c2460e8b5d8be604b343306c3ca5dfc37bc9ec943460d0c9295794db7ba8c454b9bad0196e72cfbdac02f405333c62c07f331d4ce07304cdff56c5d5dbc488dc0facf76ff7efac018e875880e1ece12eba7badfb66e291557cec50dd6f34e946ea40503cd4196adf224efcca8176febac4784fbe211ed0506c99f71968091082c63296ef3d549afdfcf684a592b9172d9330e778b4f9c220e39030de2c3412164cf0911fca84d76fabfc48ea1dc5f03e3d439efabd7211ade977dba55cafb1b169c4ecb9438915b759b8ddb5196df52aeb6fdd18ba3aa6812bb451dd6b3511852801248763016c57651450a9491fbef678ea73edb1c1b0c2b5d47ff0069720aaea4d11d10871a78cc2d4b7b0218ece0c537f7bdec84d65ff408802048bd8b927223132e00c54af8e4f5aa8d304f6c78cd9302f1f1c67977f2d253aba671664be80d3fb3b5b2929db1664c9212893f91416b8838248d2e36c4cc2571aa237a735467edd96cd07e5883f475938d3cd237121b1000566eb5f60779155d5d23ba7d12f6d0d363de788b91ab6787eb69a85ade848524bfbb75b421e3eb0de05176b1a1e667e8244232ddf69c8edd1b9bc1e4dcc56b717738dbf0bde28ff77d165e9642ff929e490d4e19771490087ef3355d103fcb5673b9dad92344d3a77d29371673784bb0ed578d9a28fd426b31b981fda0e7da88b5f6670e1c6d37d5857c134532c75473322892d042e11da87b96bbc271f322bd003fda3e6987f5ea42c10cd4c58a13e70d7d447dd0f705801b2a2a28b5d0fad5ee8c1c7d07ac3ca10c774e1260bfeaa56395119e69d855f850f5c0c582307ff4638e95715691e9cf573899377276a1f00232d57ebab111d20c639318fa122c0b9ae6a65ebe84f5cb19a758ca08ece42f75d9b142bc2af70f2e69fe5c682c7b1016249df9645785b8d704428040efa933f195abdf32ee2e5f30753c7fd3a8e4c3b99f4ca6987a67016b9656d93921347d39b40760110a64c34cdbfe97c90b3d80170c8c6910e42341da002334bbe09fccfbd0598f1fc441743109f802da7c7dfb2deec14aa2fd2ec1c6e2ddf5cc2ffc90b099c4e6a178d36f68063a01efaf68e2669fff58ebda130f600e7bb55a5e029d91d1fb98459d008464aa16bd7cca6f00ffccdba1a70e1b734a14c773bde242a7df902aa2f8ad8e115545f8ba1c035f145b790ce786cde28ba97096cd668e42e61a6c4ebc42f61767db49413af44a489c972ca35d7cb0e9b0996f123d909a53dfdb50fa4b640b3f5336186fb6d83cb77b965919df8d8a7522b910a820acd17369f8ae50257503c28148f5855d8d77ac17c4e9e4b08398e088797941b13ae44a9369587fe4708d2163b59ba20c809106d363baf9a6e11bba515b8e25c97cecf8607435f0ab2a93e4c340eda39e72d7ff3f612f2819087e60dedaeb489ef66fd0fb56e6d28fa156a8d6ac32830575e0e98b29fad326975fb67845a6f1095d07650636f91024a5936770bc53c4f77ae34ba12cff74e329f6548c6c830d7b1bfc45ab4fd1e0ccf2aeb6599660717fa88e4ef342e0e788bddc24d96c20276d9492821d08922c4cdc8a5e24aa313d171357f8ade65cda19980ffc77c29b9749861f67052544424889db6d76716af9204a818df8c588c1a332181f2de3d42b53d8f4ca02d71e9eabd648ccc72424985455be1e5174870f313a73e85d231466382b22ddee4a2518c173974c5c96bf44f52612576700b825eea2d39bd2ba7d460791eeffe5fb88d26ec404a186782aa690e19e72a6b7e0aa6aa762489d7f59d035cd86c6f74bd0438643f6cc3c9be9ee2b10dd20d13265cb601202ec819debedcdc0eb25fc9ae2dce7ca086f66ac096eb79ccc8d600fcd6121feee596ccde634df16c3ac39ba080f0583601f8d9517a2941fd2ee3adb5e0d4fbb2c6a553a6a0e9e9e62469fa53fdfbfc70e327fd7ffaf9a5bd9fa0ca14e2103370134f797139de2b8b3eb99596fecf471e699f5b01e1e069879209141f4eef6882c2b7c8d279f7b05ba32b1cd37dc86b0524f78070624c5069165b5744294edebee8f2e19a20441597af722d818335412c51b63ff55c634ac058f1305012c8fbd811e66c990cc318796117328382496a546d2776267f6b151049d3413dcef929ad6882242305fc7ebc27729b5558d0a5bf4cab80b0bba4c8f95cdf2a20eb124e3276e2fecb5eecfb262ee8ac35e616b573475a25b5148537b9112b3bfb4e9a701a06e3218e3cd92a7e100a53d05a72ca99484184550770d2277aff2f4efd5a9f52f83da10fb8a1257a4109fcffbea60f84efb8758ea129c1065d0f69f6c1c3268ed010d280c376b28fe6d4d9abcf7c8d8a25e92a373650c9cedf8755b62445cf6e10b7c28fdc6c3bc67ea6332e527c7a874126e71730bceb986834b3cbf2910db5a315cc6151958366e969f79cff1471ce6659fb858c322a480a34e37433814f151b2f2b79626dca5be61d4e3faea685180633f346bf4b7f2ca67179ddc00f920d1c1c0239150478a428e09717293fee4b894c2fe89df6fb2387302e828d9af3a83daf3cdbf97446c23d8f73bda1d5662d0e2d521d13bc7dbb062341df3bc155308a7127638709ce148e71d240103f80d31cc199bc2eb918754bf0e084a72a6101fb14fc0f1d8316da603d14f32a6546b016bd171b6c7ed562d486a423bc261de1321b31ccf41e539fd3720ca6d270a56ee0116a27ba74a8dd69fb2f2b78a95fc334375ca82370c0d182757b1c668469678b90889b33572f79dab1f706bc66c636e8fdaf2e2161ada2a141c10c7118d44ac7e28bfeb02a7c6615aca3a66a9be4f16c71976acdbed02072c9a29f6a7563f409fe77f7396a81316686a666b6c45efb7dc4347e020b6ac2764766e4d66be78380ab264ec3203f9f813977a21b59e4b31c6c718ddd59856786bef5b13b3d6cda83ce28560225caad9e235e3ee041d1ae31f677cffcff4544cd28326a4d294b9fef0cc35455e293dd70926c37dcb32b7c13fe5332fe4294584717ae5879cf6587937164f140328c6a3b4328ecdbd4cb604248085f05fa5a35a36053e10f3a9eaaf1032605f505b8978ba5fb30d2a31e411131342e1c446530a5a061d6dc75be210d828684d3b64d83752fb7fbae731772fcb545d9326fbfa2153a957333cba29b4c76b458456a57f1801db76ea887eadaa5cf78323b4ead06bef08c72d42294eb3d41524c208b79bca32375f69063dae96423899108a3e13ad46ce9840b2f084f035fca31136f9fc4fed6c0e05504fb49e2eb329cd919a05ff658187856f1775a14feedc8d02b209872bd1cc0f4e67664e1dd3df04a28b4084292ee30a2d547804be32af1660d72ce653c3004d70b2b01c668edb4f95023986e4125190a59a2f2a8f28015442901fa9dcca4ba5756ffa0cdfbc0f081d452da43d3e544b6083f5dddf4bd383871a0e50cd9d606fd048e78472c88722a070e22e2f944ed89500def58abcfc96230a9f04739c9a05509855bda4a4f378299f5dbcd539806be81fffaea7b9ad8582a8b3822dc8c57c1f03bdc4df700a111a45bf4785ccfd6115f01a9a0007dcd43bf73ee5b35f07e937f1c02dd8d6e8db736017460fad0a1279442d357948fd12b819fb24d283d7804fc2040fdf1fab5c08a489a8fa738ae5f6c2815dc94e90654e20dae6bb77caaae0f681e3cc9deb6de7e8b0a71a800082b82dd13b1900710232a32acd0778e225e760ef171b08cd174411dc4ef34a22f8bf84034a862bd576aa5c570a87d4ab56e34690d05e95af3dd8998c1347d61c8f55feca0ec650c5471cddfab032373040192fe09358c964b4e9f26ebe78154fb5d9b323a2ec1f7ca79f53985e3cd954a46cb900bd9b870e31e45759e2bfac5bc85abd12b3ec4c02e3de3ac272892ea79aaa5e3f6db7a0560e14291e13213d1bcb602b3f5a214e2b3ee57caafb8108a92de823866af320743ed9c3c08de31fb7dc4a44778577a0236c8715b00cf75b2fba62b343540b83392dfcc4c694c7545e74c9b34296ef8d60d463f37d1041cb474c93835542de72dd7cebaab7172f3d2a7a08618b5628c2f788e8f27f4629463afab8ac6245312ee11a3c1c0970990fc4100d85d7aa16ec4ebbb3524f65013660dd02979922816f239bc4c5c3e578eaba4fed829add2b9b83028a899a910c5782fe0fbfba97d2ef27b6df0b3ea887f250196d05eae6db0118f76219d1905706d6a27c9d9cbd62f50149388adc643f344c2d563661ae59da7e3b0e47396a9218bd2f70ea2aed7f63f880d1eea122db6370fb5fd1cc93d191b8b534bc4965de2ef8f2e2fd69f781f73a72117e1217905c4d1f5941fdea40be0285844baf5c93832fd6074e08bf5334caf4989a4a18a4fe9c42c714dd8bc465c75165ad9460057426ab4948abc0c8c0ae4eb49e8661391ca69d954a3c0b6723a834e5b965f7a2c78d13692fde75c0f76e283b910d5816a90697aa108c50e26aca7a19bf27041d48a4a4085aa9838468df2ee65a932d790cd56674e29c7c9943ecee003a876bd6f1e2fa6aff9f00adcded7f8fbd2c52d48242bf2c71a8081d8d56c7b898927040aaad00ac0b5aba3071b8636e88708f58ed0cb482f3e7184dea1c203ed69cf0a660b986d9af12394030d6081bbba06e18a358c9f7b7952ea22535cc29e54df431f46b9ff97a16cb6c8f6b207e4800d807671db4b87c50205350b76247885889660641fdfa6053e7f002ce44d0e7b5616bf4908fdaba28e9a5a112a4d913ef90ecfe49a1f6f4267e4f768e5931a66e9eded3dc534f8446c018f5f2846be58e26975bac4550a6b89dec431bc22737840829bc2065482310ace80fcfb9ec8a4e19cc2649a5778b7c6788fc2f34d7cc86b72a5db1abaa785bec3a3315f585586518a5c536b15c846ada218ac2d8fab0024df24434dc6654d1bf07a0c2976d981eb6c7839db827f4e3d56b4d85cf7e97b4e1172ea7d84a951d8ec92264a465fc8846467d2a605bbd70a9168ef4f090de29cbe64bfde9f49e2d8d9986a97fb24af7cdb228be5a90ad36411c9a804d65bd82dadebca6ed9e25fffe7cf32e2762fe5a40900fd5d4c2ac487d753c30730b3664adb47e895e1f8197920b487ed8eaaca67c8f71c0ab51683c962d9aff14de7974d36aebc16ce9eb358123e571d71b77fd555902d10dd3c67069ceef24dbd1e462554ba01f43a00eff0cb43fc9fde4e2d6e78bd602f0f48f58e64c222d990c56008691d77a7c51af3062916e0ccc86db89753efc2373a8ffeaed0412cc8e7c344e643e9406d7f7bd3615a85f66cbacfff409b5a186f1eb491f69fa9c3ed6b40c34afda2392528b2be298bbb557925ba0696910303b14b9aab95ac209022a98f1b881529f1727d015f1e9f0cc1c7814fe7087eb7914ae23d5be25a76085a4aceb8f8e325effac5ef7a71f86c137e86df6651b318d8c76b6b45533c59339d574dff268b3400070fdef0296f0e0908646ecdca4102927d36a8df3b82e1c35c9dab71a956f18b23e0a65897ba8312b2930eaefe8a8d74004769687d4077aed60482772acb398462744e88b319a7219eec24e4cabf44d4a2e4439471c6ff928906fc7451aa4b384f2f7cd2ac73c53fbea1bde4c56d1d1a0233edea53340651f860fdd1572e54ebe110cad85267f62ecc815b8aa32c82aea75a98b32aa019b8665a35a528f559b65a60c89cf1ea1b5f247d223cfbae5fd7651c6e0c55cc8f11563f3373b0d0e2cd7b3ccad0564ba7625455ca7d508be1023f8ab0fa749bcb6c50a605aa6ee5c17784af76ab827fa2b66988efb1f226f5f0419400536ced8d1f705794f434511d00a1e895888632396c9f6646ababe3a46850205a5d51ee3cd8e2486173941e8cf5329188ea8dd083a1de4f3c42d71fc5a91763bd9b28e2fa4337247c31b5cdfd7a18f7924c1c312ceb76fd106e6b66bec2eb472892524d6bec7d1059ebce3e6feb2b9124883ff64676130397d795e181ef0c8ae6064fa42618781bd9c5bcd65e95f48f05fb17062b329d58642c4c779514a015675f473e41f8b00e658589714b33b6a5a09172860989af902f31113c404c12a7fb6c2a22f671f9ee396171db9e9b4b8809262446f215ba2ba120742ecd99387c2cec4febcb63f6d7c109d7ba54bada9f89a2aeef7248786022b663872d4d9252aad79402f728eaa0821ee9c57e4ba9f061485fd5f226425b76a3ee26eca0c7233cf4a0cfce9bec7b6394d85bbb6c389863ed051ee135a23ef4951c984213e89fb4227a5b8398889690a31f435f66b93efc9577570132b848a095927ae2267027f7f129ef9ab54fc128f9c53e05f252110a0ea151d735464e86de2d05eebb7d775d993fe12b34fed9534d531fb39acf89baac3fdcafb47a4eb5b75c8f8a296f35d94eff1cebce32dc7ff3339a325f4189ecebe0a6a9db7c2e35d531c5bdc224199be24762db09e502d0582aaf1aa0d29f711155a3a36a627b041a5ff1ed03fb23977fac09d86bc2afb0e901fdaec43d3a386f01f048dd3c10a8435bf1c31af901a8183fd6a51afa4d067ed88cc2e3582e020e3a12881c723cd9c14f2179757f31a46faa42f321aed6d6c86a139c54543eb9501ab766d830eb673b4fa5e4e4c01a6f44ef87d7a3a8790c7690d1500d66a05172a8e6378c310c00c9f05a3743f899e5dcb212c1fdf4c4570baeae36dbb2bec2fedc1b9116b32e6fa2cba2b75510f1e95184d02bb70f9d67c06e67223a85173baa5915be634b480649fa34eaf08dff8bfb6665518ccce612c91886ec8b49affc0572d58fc2a9dfc848fe894f7368415bb37e640e7c99b84d97b2834d76ad741404b301fbc4b192be1bef3ba058a95e8fa452fe5ee02b483d292ee75aa9d215665b0a45b59324ad4847998de1cbd9a7d052a3f64e2111a5acaa1a9d68143fc54252cc156781f071910416ce93f8a11fd167a22ed4d7263a40089ba7441495928e66ba17308b90f419e2d63e52df4c2b1db02dfa90c019452cf6bda344e2f6e4b7aaf71cb64f3582cfc2486c4aaec2c9d0c8f62561844c31808944147a0f20f1e1b323ee298917aa7c2e2d59318cba325c8c66538639c2990e3410bf0a51630ce27b5ee172ebc24ff6bb81260e2703cc2bd8d4e6a60b2b2233f23d831953d34fb4451e60db643fb8799b1a1aee59340f7d0a3d605c451f31ff8498cf2beaef4666ab663442f2d8fa51ca67ef6402c4907bf588b76efb7fada009ddcf66b0719f027364d701603c4be1b022d94179d936438a59d7174951f15c8d1d8377c7b4d2eef0d73ad37098a81978df6c8c71c44413ee4c1390368126383091540f61ba76b8ebf72f56c6dcad41e184db2f00f1bbf07eecc3c007c8319b7eee85435760f27408266e87c5a46da69e067af683368e6ee7b0e27f7ff4ccbfe2d4b1de293a4c4380671eb16b7e820fb1d43fe77d50d0c30eecd9788f5bbc6f2d130e788007f09b47ccfbf07d2131a7bf3eaeae1e4557a85762faa01a2e5cfb43495d97ba406423b36c6c76924ceb1b5aea4d394b55a6c09418ff4fdf3b5b96bcadc98367b60439487814a25b4b75e7100743014943bc19626b5367601665f376cc0b44b8cf972c38fb2981ed735eec3eaac08b351124c0d695ba45d358a759046edb3750026788cbd8330588c60083c65da1f7f02045c5d46406a31e2fe1bf4001ae5065427c02247cca344cbcc033b5aebb0dfce41438098b0af5efd4b3c9ab89f5eb8ca9f7a42ff1b6492ec56ada912f379b19a1378fe94dd08e723f4a357baf23ee7db9e8021ceae6efa82f2ef596aa6d833b24716745feb67d4f5843257ad9066485a4fc61ddd9af06e8c59b13ee9c01097d6b7ece22a61e96fc60ca3326aa10f4605b331580d7cd250f761881ce509d3502a144794addff7766bdf615b5b6a83ddbb5963bb476377c0634f00258edc53178e19c80fa71e293e0a500fb37616a97c1b379f578e4d7aea82022233edc0bad0d402c91e5ee84a66e77198693e54549995555c9fcfd78f76ebc41f12a70e741bcba8b04bbe5c30f580876ee9be9591010a5cfe455fde096e92858defe953a6a9cf3d7af35a488710a6a271a9dad5f525906bab6481a718ac2cd59487ec2db5479689bc30118e4c3031a570d6d91d5d56a40548faf2bb20ce4c7ff37684b08252a050a870c942b1a4aae94e8a3f7d45d38681e3cacc5465d55d9bf668aff40fb5af84a97b677d56b064514116410964735628a54beee472d5b703ad172edd76c147cf5a787b9eab0526ed254461e543a8a7796700566bf668d62788e510f20f81f9111ae9d476e7234fe79a16dde9380029d672221d68c177b29f95888ed998ccf58b6c3e4f62f4455627470a2cdf431002d368b8f81c0cee6b3ff992ffa3e53eada20dca837a5486a7699f32a144ca188a1936a2f61a9c8f0af1af2971782e611fe2fa9230257362a67df0be9ba51ed322dd402c12357a825a7f4084d181ea804905dc2c00b59b471afae82d3a31536389f6d180a302ae16e1a81091f582dafd667980e4c1feed8c1377693fad558111c2f4447575e2715f9db7a4d4958f7a15dff98cb43762d6fcd39cbcfdfeb1bf4ae6a26770f8392ad3e059d220935cb786865863ba6688e472e9c60b12e8f1c53cb449897e0230480ba070948b3fd942d12fdce2a7baaa5c4ef81b8dc4a5099acd3debbcb372df949c982840eef47fa55dcd665424de2094fdc07fae2a2657826784b45ec8e6bfdb4155abec53a08987cfeea16f02cd1544f620e475759eb736dac8ac0b938749df3299de1b7bf67dfd9e3e056215c92bfff9e5b1ad6d2cebbcd575afe4b2cd99ee183e333f45c2aa15622a7991b75e7334c8947980227c637861891d66c9efea8ce89459e7a24960cd7448c3abc734390bffb138ec09adbf7b2b440cb6f89926f0e4c3c4ed922f079c3676f0d1fa08214199b87c6b79196ca7fe2fbfeba1a515ac9704984839f8df220d4ad0b5f67070e62ac27183337897cc9aec3d6ec32e03f93a5740770289e89c67a5af228f11b395d35c9c92b3705c0f81168b710458445fa5a927602b016ef6536993d57635fdcce12c35f2aedae39f3c2226e119ff38f5870f07f48fee091a821f301c4d32cf7e0746e581f9b55008d10e9650ef1113aed3434534f398b6229aa28005205e595014e3c44d966b81792b26c5093f2d43a7c36b07a7378dfd3b4ffc612f03f35c263848bb40f8b54300d2bb47b1c2479556d5655bb92349bacd4247cc2df8ca0d769e6d25c70870823438a13c16dbd41af2af31bf578afeefebd3cce96c7a77d73315cd08309ed04d074a969d1fc8841d4db1073f5715c3d502d74c30391aef6441c39256a649ac255ce47ecc9dafa5db02b52990855b644e4d1f5e87440284fb8f3add80584404a8c0833c62ad1d356a84e3050b2aac5b01aeb40e699e4cd61676391995632243f96fa254ed2f15170c0698fd3ea5752937e5a9f1f4337658bfbb1c545351152fa0324fb12eded90f5e9a06ba63b12812f911312bb0dd9ddd2840eb02bf8ff94b661a5c24603a21a3a3863be4d4b800189fd7ed7c97f86363fe99769f1fa7116a53cc5aa86ca8cf05863d795d55bb6d0090143b3587d22fe36d9f046a8190baaef45144d4f1e68f5875dc8e86b949b1a109a6b6521e797369c8b59ebf4a1c69ce82bd3aeb2575779805b30c3b578d181c0888f674d5fdd8c294b21ed7dad1b235fc848caba88ba41ec2466bbce392ecb671e87b813918aceceffd0f540bcf7aee9dde72c123aef6761eb79fb4126f5fffd929029d4218c52ed63efd6dae1ba0eee1a3612855e4a4555001a8d44e143ff9a0384e1fef9df13af08265f3fb750cd455844358cc1935bd9520c98baa10ed87c8fb0a8db5ea2146b1eb5adde3d58c60a6b5967812556cf9d6f7ef7d67bde7df39b37bdf1c6f7df7bef1defa95839d7f772509af61939f4e8fb77a10e50101f4cc9bb9c3d5cb844a1ad421bf525b6828ce5a6b9d77082d8bb30dd3e6864df23438eb144ff6b43887b131abcef2634637a1665acb84aa21921c73eecd0523d1757444abc9907ab1235b7197def39dd51cd221f69bfb8ec41e8d0534d81bfc01e7dd8f927f466dfc7ef29edffe6906c1814af659577888f6a2959d21a2d5a27ebdbe0fbef70bdca156f7dc5e9c6156ea930838163a34432039a484e3f44561402b22848d934db7fbe6515d94268ba75d94cc140c21b7e34e40f9067449c2b0be2c27f93b3735e438694022344011cf2d171025602ba5ea1283c81efbaf7cb006f5c937d82afbcb2b75a56687f42c6f2bdcdbc66183cece0604636b9a50b055cef9f37699586cdd24d0b497e6b1e8072ff1d7933ed69166783b43e2316ee1bad67b021547d623f03cf36bb2ca12568872dfc04e8498e8a02dfd160bbfcaf4ca08f86f2fa12a07f726ae903a7eedb0838fa3645695bcde41a6be252dd16b4d2ec578f18db082ffe5baa2e125728266a6e8345e851d20a18c9f01bfbe0b919211d4744ecb004f13a911138d7ec2240b87d620191f34f16169c8bcb9f1a0c9c7c4ca02398f786d3cdbae6574eab6efd8ae64c9f3aab0bd4e8798d997cadd151824a9374378137c5b1f7b15f6474f4228ea80dfcf836c42b159891d9379eb56ce7cfb4399643aac719a36f6d46270a16f870977fd5b2ab3c1a3dca4426a72e6b1379a0d8bca61f2c5c20dfe0814cb28ca1b281a4e168046d00db08307816584eca90943360398321e1612dbfff8c831ae9ba718fa8ae7d031469ba50e8827ab795c0fc7a6bb91b73758faf451100cd90f43ad8088e1f127691afb5f932584465388326ce10948789e85263354fd6e2f0296e87fce5b36648bbb0eb3bb8a4f0ace8131d607c349a91bd1d445146e332bc222b782a367148bd5c0361fb0f9be53cc410473f76bcb917cc3a45d633498f87998ab17f623e062d8aae3c80b67be6e60338cb3414b114109e3579c0993c1c51e75216816d09fb785ecf6b79f1cdd77a3087d1a23ea6de8b4c9c82a8f3af5ec9d0f245894d0a62e02fe98bc611c8a0760f2178db159ad073b836f71c5c622a7d8d935b6e8e382aeb0c1f895654331b9ca8621364f987a7b87bdf1c08c707c40662de37477041495e0a3780b06f2edf2586bfb97dd6ed14f6cd71056b12facb0ad1c192498917fb9d51d3ff08b99e38170e99efee1aae26077a23de7111987c610b2db52212241d061d57ba967b4f7831fd7778e33c5a8b2db88668e8fd2a3dd8c2ec59685bb8fdba307a000b359fa1399f9b651ab6261576a01d4b04618c8bc1e47b1c6583279f9e305d009358a7a06bb8ce88682dc23dcb3707299ebcabf9e3a2ca3fe627c496080a0c9c0266c607c91d3ac70cd4ded45951bf56713752593c983b26e5a9417873b87397c5045fe37f8063433610c09ed88cd5dec03a7b385e0d9141b40f9c3711b711bbdc091ea4cacb9991dcc55dcca58378f3a73a31384c9a9470b20e4ec03161504cbfe8d77a3d8de480bc6cc2c7b516799590a87a5f2996cc583dbc63cbf813973279b53759bc531043e399107d90bf70607e5ec87ddc63c229839282d7115de2f1c9b68f12100265a010643d60d5853f2fa8f889a144b3e105bf0d143f3955e11c104172c38f07b1ab0216a59384dc561fe3f32ebe6f0bccf43936b09ff646787493c25c0fa6b5bc076a2fa8e9dc017009f14811a9e94aa8e90bc8228c3d84f92c5bc51bc05ed0425c889d9427e297059637342c5235b4f0723ee33b97d9a3eeaedaa13a0fbc9dffa1eb87fe0c7c95bc83f1cd5903d439090b69ebdb04a6eff576250cd5c5400d2d24d4c65acdc4a173816611b4ab1a7f5d47da045b78c60561b8018a13618714a72df8200d8a6e29c46d80bc528dd0025306e247a0410236cd1e09c9f53cf190b7c8361451a62fe982a0f60bf43f63ca81d519b74238f87af6d8902010cdcf5677135b36d8c94517a74275039e4ba3bde0564efb485dbd422e8407d51662490005c5c12ca6a4a9cd6905a3dc64f712ecbb22026cf48f4c7ca2b244abac1bd0220696210fdb556bb6ee01146ac1ec9fbd968fd2380df9a6e7bc20c141b00b73336c782a3b2ed56b994cff385153c351b18e621337c0fb26d311ca85529e7ff4a491653fc4375925200e60d592a637d47ea0d20e7e7d1bda90b8672b168de4de3d5804f0721a504046702449030ba4b5e8a7a1bc7c4d2767d5a546d3a944560c9dae39bb20ac22f377d3a974f1a0cbc4c1ccf25efbd02d8d2c685fc5ead3087ad9ddb289ea4660096c852e61da7ed15b8c6685b24e127ff8ff30ed77a3fdb7fb8d0bfe57ec64c328826d8847f2b06bb70446fdfd9d9da60dc27570308ef1cdb7fe5b1eb2f8ad244ab91cb7a1c33cff0947e656819b21fa2aa539302f40bf345fc8f3a2843558746ca53aee536387d845457b77cc4a4fd6744fb018041df301f4886679a1716beec082e394f8840bc248e9266a7601e5a8a6e9a49eaa76cae126a3806eb1538069e6d0e2ff0d2e11d6dc7c9d5abee59f9f71ef7dac11203f285d5c310da7246c3851c1b289ea897285b2801c4ad0d0d2ae270d3e46d252b99ed9f1fafc56d86d3f81ba9b5a7d07f4b6135a394600b80d1d6c195245c0557b0b38d7f19f8a983172fe59e513a3b192d399474553ba1a48929a2353225ed9dde2da5c5391447b0beda5c1bea0515b9df3af6815b584834f62a9e71d2cdaceca85e837fa510581327aef2c246878c4640cea12e6a276b26f3ba5557c21c4a465dcbe9f0ca9515dc6eb4417b22373399bcd6bccdd144c99feff427bffc51b03b9d9e560bd2d5fb5d980541586835faaaff9c9727cf2793a8d3c97b163996264332b45128840c6ed15bc03584be8729ed43102ca7ce2658d36d60228f477496f27ce68f6b45e49491f1a4e58dc0e06f2eb53e17108b6b361a902147cf00c74b031c3651d0791f4b6a6375843ef45d7fec89e24aacef92b1a3f8fdd7a5a6c15bc5e9d60b3de1c246e135d8bf821e30a37a5a61aeacad9183d7108570521b032df7513b9ded5f74918d0ae4db731005a6707df65af93742345c0fc3a77302ddd4eb00360908dd16e33b70766342e276f63002fddbff1acdbcaf3b2ded5c370ddca927106a36537f4fc7bf544c7f37484d76601246ced5a308ae37b105558132302c4952cad62bcf274142cdac17cde6ec6255412048230129e7efe082cf7c64ee85cef2992fbfa762faf090c24723c82fb9293a08892175e5f06445305d011350c9b2ac88af82520597619ef80b54929d04a1ad6990476d090ee2128040575ebcf67c8a8a593c09d0d49b3fb635827536f58241bd219050c710cd6533345e823f5e50ad876d743166f0bee514950d3532248585f657853b9df725b16af7978063aa29a09cf8769f8fb7b05384c55bd1a9d8ce74668e5aa31f066855e3e6f1c0b553c5b8eba240d749e67e7a4641e7d229a74a2b52f72b3b6d3a5b2a5d73379179e28f299ceec00c316ddb4318bec00933c149eaff11b48971a2a523ae171c370f1589988730318ae3ccadcfcdca449644b695fc9f91380239522379d08506e54703137cefed22f5a3b848c5de782c3cfcfc5b0ba96e7a2455a7d554c138477abd757b2ad1ad15e4c910fc128c0e870da0ce30f9c27c3fc710671876f13acd77d5b97884f476119a5930cdfb072b1c9cc7f0cdfc6041be913dc108ea2a3c269e2138c499ab5e22691cdf23f6f8ae46a7baa57f1cea419c5bf5442e865386bbf6ea826366233205ae2b643ef63ace789dc1d15863728f5c437478a0e62c9a940dfdc414410dcd8f992203d9b0b1d978d8777718d42588ccd9cc6e26f818c9be179113d8954ebb912d06a230a21f1ae370047a948d591f282e351831ef60a9f2eb031c1d14c0219324ca51646bf893536d7a968605346ec14101e8d2b2ed92a9be757eb5e30053530b575cddee9478416301d5029c1c70439fd624fed6856ca82f6a79a3ecf2156e06df05ddeff4dd73e97a18c22ddd265c6816a6ca8ea587fadf8a573454d830115dbd18d54aa4129fc4afebccbfe882bdcdca83e5d9885ba25adce6231ed6927ffea9c1220be4b8cffc8f7fe1bb9d58c0f002a30eac55d6b745329dd2cce7293a703aea91a57fc79a70562c9e56b1d59b113743936f17fa0089d0842123ac03e3350c7f3a6cdc3b73a86b31a7a77d0a9cd2dfe15d18a8b61206db04388436b50675c4409dc0b74952ce0696fe047a92b4bcb44d4b67411bc3a8d029ed24d865c8d11892ca4a18ce2850c4087fa6ae03b27cae1893bc3d0b62627965c972d7846b5724c766538d6d6e48495d5131bcbe8368ec92e198b5bf48cb0737a626332b5cde0c925e7708b9e21d6dc330165434b99a9ed61dd7aef35f6faf8233d32edea13dc12045eeb43786ebd98f23a4541ce01e373f8904cf5ac9871fca61a6d4c6f716cbb45041ef4896170fa8d56a22dd1ac23f11d640ee0e9c847a197449860cee3a3d40ac8e84972c949e1087c73d04c05fb10fa630ef060d4960cb8ba4f885393181b51445808222c15940e4012322dea106c234e52b89716429ac644f79a1ffb60e4941d5020a7bf66d705018fcf643a66fb9816f159f1e5919fa9c027e1b6589f09ed854a94036592cfd261aed7758ee5ff26bafc21223e8a189fec8fdbd3d2f570cc438589ca99ce718c90d8eb07e915463e189ab5cc26ab89cc46a3656ca6a337b965a09764b6c294cb6b35f099fbe3833107392a26786fa6e322867d0e73b2d40e5cc204d7c4926c6c11a3ffad3818d1b1e3cb45aa3516298f04e838865d6912e8f89db09720892ee8d5f44a78c3520561d5aa1bdd673f8f864adc468d323d79537debd0a41d5059f5e10f20c066559fc8f1fa64c89f3ff8543ffff4a2bd9759642a4a1f53955ed8ea8a9b0d0cfe9ce79cf31b72e6cf3a4e77520cde2117c7a717bc63024a174f4f27dbcb6ecbe5186fa233c46b4b8787c5ab9492d48d0d4eece50f4df91c1d8436b7eeb40951b4bb4f60c8c1df6793ffbeac53e4de09f93afabd133dab102dc4e5733cd96c5cde91d51dc1950003a3cf9e4445a033bbe7b63c1d68ef2fe76838505cbb680948a857266a690dc495860ddacf2afce418e4ba25f8c5bb1b67c1bff14b136f6d41f34f50c04289158d469e7c27945732ec1a943989e2b6b53bb0feb3b39ac1ad7a316cecf0309d97fba2fd4289f577a87fe6bce5a7d259863e35dd04d53a62f62273e5f994b612c7e01de33b6bfbdb4a947e8ff29ded12c4e143fc33b80b6938482cfc12d99c2e0ec94826f5bd88b2ac8e934ebd50626f55f7909093a8d70e891222a8517607a8183e99815d40a339e265c617bdf3220f5e84259f90e64e57b6adb679ce46fd018d6cfe21b32d7a13d49fe8033667a21d622a8732e4a266150be953e9286e857103ed76219768ca9834db66e08d907f9c3310479fa4c0692ed810e190b0e7d017b868186fe50dc52532da351ede5ff89a2ce1a032c2f0c13b6e2d30e1447c06bd3356814530dc19dc98bd2785ff87b6dc5b346d5b76ef18b767cb1deb4ee078d719457119be6df9541006b3d0adef487a36b716733edc25501890a5e8d7c4602bf7b5d9a758538ec58fc9b98152ea06566c37f031e5c04a5d8e0f023ef79e00c46a9abeb39b5e69f74736397764edde64599b9869029c5266312441f7a192b7e3f4402ce12d3d86ea134961c80d96f46d79cf7bc7f2e3f77ea0f7bb00283ef061d964c5c1fbee6a695ae9c6628f29c93dc75e42e33a2f6cca910542123327676b0f331b40281c3d070253c4efd7ae01220c0322321b128b13559440669c050dd67cd58e6cb010a6607d635418ffab28ad2d8bacb0e292f302af99809ddae8358b95e2abe7f7b2e97920950c310f42196feee644f5aa28f59cf8ad18eb56a1270ad0e4d33f061a0a9937f59e3a3c2630d67f241a8aa0186194ca907029263d0447f03a6617e535b0a00a0b9178a5cb507044c9a09c260aae0a5ecacdcbc93249036294ca939f4cc2b88dc42e5acc389f611dc54f7d1c4d83cd9a67fe15499c71a34492f833f25e171b293c0b5acb0004543dd3358e192687ddd3e2687500067761a93b1557ec6bab220960cac078a7cc453d132a888e46b9707b195349f43330b602a453fef695060c93037e4ac7723e7efbd1bf629c0cfbbb177069229ea3bf1fe951aac695be5ebd77bb51add38fb74b663f77bd3a51be8fde948b085f8d7a12155be96809b6a4b5b116ebe6915058de8973b7660788736667bfed0f770f9a0743e3b1d76ba8c6214867747df9508433a396640bf58d1ae2d3dd54eecc0d28b6f0869f46f23cd095869d9697b1420e2b3df2b68e8e518e4d0eb5d53c6c82fee0d5f819f6710ebf00464c992b1bc0aaacf6b042be36329a404b1387c95b89f28700857ba5f319d2c055b0ea2db76fd3ed2f4df5980e7f6065ac65318545912dac9ad66015e5785dc86449868b78694c2936c68bae679f5894ce1c6c78b7a62ddb291d59148cdb93c6e5930657bf34a4b8fb533a628c45bd08826c556b6d473e1211310f0bfc7a4db91967f56967749d347cb69a408ba73a3754c8928bedebb2a2a02f78f0c14c11b338fcda80071f2bda998e9ec4c631ed938ea87587e36642abc63f24729e14deded8a904536c60964f6340421665487dd670e58ecbf45a468852fcd478d5279cc0876ac6ce5ab5690bae578c1083dd61748b1d02934b8bfaa4bdaa85005861ade151b61a01349ceb640b16980fdfd567c3ad59e98d57291d72467fa602845b49cb932a1f40c0ba44bd62a15e03da9015f8e5221bd6b156c3f3aebf0c8a7ac15f6e1c380485825a835d2624b4954fbe9361ef21b0051f33d0e59244c2f205f0f14821e09b8689af994adc92d9f001b1c14a9b06ddfbaa5956887ea24574739044be8605d91ef8fe7f7af52028887cf02abce8e47fcf1134205c7cac169e821dce5cb5587472b1bec730104d54b3d1017e82e84f8adc45a32445596548865114063572b83293600334a9822883b9f0764a3d1c2b11a1bd209cced01e714425f3280d3ba78cbd00e37e1fe2c322024f86f6378e88041991f8c726ff1cc7b604c15a3f4998f2291fbddca8f2fdf93092c9520c21a7dfc7b49bde576b5dec96eaceb06cc31785d8ea30a9190a6ab969ec74a37111a3559ce2215abba66914ae6b76366eda06891f5bb277af137ae3fda47edcd2ffc90bfc010d4bd7db14413c550daa80c1e522209f5e2814664047159be44d7ac6400e3f36769055462254d304694971ab260ecfbf360a46f614af382aac0c611189c60385dc9f5f79730b0f254b12b318f99ae94c7098582685b00a1f0b64f809c5ff477528f286358ba26daed49032809adbdce76581900593ddf780c3fa8a4c394f6fd4a6029e878f63e62389b8345ffa7bfee7f18ea991e64072055645d0e7774025d5030cc0c16605d9407e8ab48994b141f5407f77f5c5b35171d8e8849dc09ed6b10e29e172dceff95924acf2b6336e62daec87c8ef708e2704deea1a8c3a46883b06deecb140c70923e317b7b56b8e482ca917a3f921463c362508d7cecfc45b22cb4d2b082c2c8617c1d07d8309e56e4cae7aa521b9e3e038c687f25bc38a69d10d771a569198d0a8c7843428cb848cc02726c4b9debfcd2fc97356b227da1f0b3a86ce79e104faa2a791fc2f93106c4ee17921d0c9659139e5eac3a8db453632281d0724dea3317474a79f02b1e68c589f4b194b63f9188a7f90baff92e1bf454e9d0302da7234aac202dbed992297b6b575aee1a32fa24bd3edef294a6fb1209aa73ece28a7d31d118e9e00ce1d3bbf81746b45e5067b60caf4b4c3b26ba3cb68bf68539542abb0594f8a458fe828222e6bfd827e48f0d8358a4030d0b8f23ec13b3c06fcc13b8a17bf4ccb6c2d8259dc422d7ba7f425d1b2f0232a8bd39623a1488ceec20e40ed4c1b15e262aad11d181b591629e224b017c975f1fa2ad16c8aee314b0ee6fe58e98fb0c2fdade7ff3a0eb0ff4329a2e63fa1fe6db72b26ee1e7833d45feaa65fc1bf1de3fd94ce7341243d6e169a39ba18644f16b39874bc60e09e341a2840d050bc1515efbf027f5769106caee832b2f632c204055aadb17589998331386b068699ae65a57eac19db2256ee6222ca65bd68c40f48ceb9a13defbc6d3963b96f7a50a80f84aef1928713ca5bff91716cfa653f5c6d4716c4bdfc6a0561a6865f834d18bb78fe39af665d5733308595171bd104e9fa467d8dbf0079808bae6f139da46950e8b592ee72f67e5c6037f7e6f58e6c1c6b83fca8f96979276cbee0e071967f6715824e0c30b26afdf8eb506099bcaed4f9c24fe333aff0b92910629a053169f475d9178e971020f6aa9b6b46d737b9d07b69ac49fae925c9638ea84f2152e319707c5f3d6f0c7aea11250f31045e933c32a62ee57003a60942bfb5504c4daa86124b4e42d6ce11a6237c7409c62acc245674d7896f4905d35c9980b1de3b3b47da839b9e7eff64ab4584c39d70d4b8f2688c5d322b24e3416e665d70759e1aad4e4101c1c0f1691d54ce5470d7f98010b8c14a2659e4f394bb26d68e150efcb64ed0c349fefcdb6f0645d74f721b71c44766d84be56c86ab1c27311ebb039fedbf94a492047c003f5a930ccebe29047cf55fd6c5e08f1cdafae98d3f332b552037b27f2fcf61545646b7a6927c790dc736a779382b5abf10a44db7e98adee0798e667ca36d5fd806a58b9a73f88214e3c85ba1fbf59d3c4dbc2a2a06ee73e014df0ee17651a6ae691ef12c10ff2a7ad45993ecc3900629e782e613d96f7b8b06ea1c01835e5b830bc337ce1dcd58393ef6d28256f52f8577ab8383bb5ab71559a5a89fc4b08fb71bf39f5249edbb3f8f33dfbad564d2fb019062f398bb20e2968af60aee117ff1f95df6d5954508c5272f4a652a4c3fc71ab10db1e93d80812185325bfeacdbf700d82820b23de774417480293b6ced7e47ccf79eb1876c28b6460ad907bdebb08d6af46b31370fc98031752ef0844b9c69ad9039ad2c75df39743515da97585d2847279f1f2033f02b9d84ee3a25130f8d1a81d928da4194bddebe0194fc56d5c4aac157e1cd5b2a485906721e12fcef73f38dbda4c3a0bfed7cf19cc27f43bda13809d4dc0cd3af94b63ea23ff5e1bb3e2224f26f6da6588ff4324b2f736ed110e48eca76401c7eeecd696b27e5fda3fe5eb557f94e4a1a9e56adf31604a2a0dc37b8c2c681965a333b3ce44f8b1ac5e4b8a062519e52edf99714a8e20e5c582dba69f4e5e914bd9efe5800b51bcddfece80f8c2ab1fc42ef2db0cfdb94d4ac60828d6099f14d023668826f58a778669dc9e34646dce049eeddf1891dd93cf8199bfed0aa313b75d92549eb7e54d313f0158a4094cb5332bb5cf4afa2444b7ddb5a290b7d408443c653e45faacd5a8028bfd62a90c132fe14a2fb3278191c6ae4622d9448126e724fb5a82f8958ed799d87ac4340c55f8cebd8de4cb7bc88a27dc45b68e411ed53e17006210d5411eabc6bf8a5d0ba850e33f260b633213b39cd66e1123ce2b7c58300f1bad638e191cc2dc29e90d1f2c10efeffc33a0c1b2162342ee14b879ec6e9cc20c5de33212b3a82d88dcb7519969b4d8f6f97d6da1c3e2e60a016e31e228e72451e6d78e88c128163211998721d4ea5e469d9f48944fb72baa00c5dc28930304636c933190da2d99f84643a0e76805ae416c3117e188ffbe068bd39c14ce596ae3620d417a39c1adeb7bfadfe4c30798fd4a7cacdbdd7e4b71572aa1b4f4ec5952f895646cdb8343ca2122ba616dcb7150947f90da43f16eb8fc940374f978983485731aa7770bb69e4371f3c032f09b4026b86df46b9ace62173424c0b2d762a370349cb092df00223a76444c12fbd4c8dc686a109e157826dfb28a504344a65832269a2175ba4fad5b8fd937f47dd4797976f1d66d3c4a120dae1d150449aa47930c41ed7cb068816809a598badf9df5eeb0aa701f10602382f06119991e3a6090c1e6b13ea8589982e242f7fe1a494ce4bc637924904374b7913f1389c319998b408445ca2b0815891bc2e703093e9504eb3393f943487cc031bbf262fa7fa602deee26badfe4f94019060cf11010f0197fd31c7c5845c2a1043237d13b4ea611843f1edad5c13b5da58ec4428baf3883ab2f2bb3011a3bd6d8bd433d197453aba5e8e3c2e7c2050b50e95ea92b8252f8f80fb8af8814c9e4259069db01ba67fea8e6c02910bbae72700fe1b5f43ddbc90961b45fd2388189ec4a1eeaa6c89313d5a20ac24999f90740d210bdd81857c70bbc399cb4553f59f8936f4014334b9623f8048d3edd6e0620582fa48f729b879b7dadf83aff6af000d744c13f6afeca0a82434301e6d9f77d52c7156231d7aa27d190da2e4dccc70a1ea67c8404dd56de1b744229ae4d8d7659983000db55d55372d1b4b69f6bc30f5d876f6080cb2bfaf98c5404831bd72cb516fee8c1d15a86730c1e97a9cbceabf057be033a271448a5f4fe13c063fbbcfb0ff9392c77c721cf8db2f904f79116bb366bc508205d4292a778ff4ecd7c8fb0319cd03b014fd798bb7b2341806a2e85ad832390d1a84c590c69f60aecb716dd8afd66b0943749513d411303d049868d98aa82b48e84ad43911550609c88f81588ff94375948422c5ac640eee9fa3ce55513e67d32664feb82a92e6e9a53b8c55699d1cbda04f702a6b89af96402bc7c7f4c26bcd4d8e2bc610c6e139b46d5e2413edf3d5577ee7fa94eff17cdfe7c29ee4f8391d2020849012ecbfa4063e86169ef70dbd5a4fd84afcc2ada3101392358f1f0645bd4f09e157b9a8ac61cd5a942297c75b3e2951933ab77a3e308db25cb416dbb9fa2c4b8312cea947854c32175d73a968976f76511be7da857262e518082717a8066372a1e8a5f754e79ada182a88dcf6ba7d551cd261621ec3a6588b2f7bfa532c23174ef905b2a5f72607858365282d4c568daeb91f672ab6f8dabe5a80912c634846fa02b2312921ca767aa92e3ec11b2e357b727d79889ec0ea089eee8c57762de0949836bdea4fed58b21bb0691dd557b8e98acdabd9a5c82cd03e696382756f2e722b4ca23f74a971c1451dc5510c4313b09b09583f6fa145709319dcd6c6e28843beb54ac3975a7bc5b1a152a3c8eb381ba6e0736dc84c1b2c36d161e420c584cf88a63c76809242c94b3662eb31c93c193d437c6fe55e56716e00ea0139f5570831c38ed899edb4ac7c92ba32608de806fd1a271c5c2c5f4320012440898ad194347cfa6b8870847e9f93d758b8db9e278962b7537d8328bd587f8e36730bb618151399c3cea072f1dcc26c50cd83d10d4adaeb90c2de77de5139699a01a2aaada92637a95ebcd501bd93ef4dc440d14a50c78611d922076a6a158325f31c0bcffe93f2897234b098caca86a49b99d7f7f53e985974dbdaec33e47f2011a59002243931b4980acbbda3a4453c04fc22720c9ccb197bd311b3f592acf083d8550b2a8fc1502bd7c36ea438c4ca4410f592b309ff6c3b8dd0813ddfaf24b7a73d3e877c868c37b93e44b988db10e8420b50adfeafb2187dd86dc1056ca143d41c40f646776ebebcf1648c33b363fd49656cd545b74c82e0d39bc911b879a388f955377018ba0dc100a883c0ca0508b3ca0a60d6fa3e8fb94f468f3bec76443fdc4b3352ee76704710c01633a4d11bf93850122c8cc3e060ede976add8dc789322ecec47f955fd59c87fc8ff7cfcc50ccc2764b093972c0bf2eb6a9c82288df48f55e99649854ea0c04fcb20d29546be4278bae9f20fe0a1953aa305c343607be8744e99b00dcf4424c9583745c0c51de6fb4718c9c606a702c02ce66de95c414ab5b5f4fb7a609a0afd0ba54bddb413b8b863c878eda62158503b182c3dc36701e8aeb5104c774b684918a6c90981bb86def230e6deb943742aab8ed1cbbe39421ff7e208cd68fbb6a0017c81a1e39667051a053d02600b324ee172f05f2d1cceaf041b26636087f9ad96bdafa63b38c8a08b8019ba702c50dac38bbe99d7d4ab201c4d7351d3f07fc4dd672b71e621536db8b2e7965511455b7a348d1a071076c473637909813e2840b084bb11e1248b224e7813e1736d791331c9e53404c87e6120ab87fd14e93741e100803d45253d6be87748bf6ac301dd133c6dedfd66314b3ac513782f2f3e068dd643a493d3be00ddd55b23f11c16e5dcf3d03b32e6be14d39bad7c09e7313bf4c874ba27eaaa112d27a987e18eea91a9c8c368b2fd082ecd38bac06cfdfbd73a82657374dc834f7d313a7f1ad2c8256e8b2f5aba18d6358a880dffbb868438542b592d0b897f385b5fdac714d99939872571906295246e0fdb3d7d1ba6505808a0951990c74472409121a1bcac22c1bd0805f4360fa99564d07eb1183c858ae28ca0aa09a9157e2bd4065400c4c9ba635fbe416d363ff8800f6e746c08b766507f70a35bd8d6633a41552aa1bd5b7bc55c0f66dcee63fce827d41351745464576609e8ddb2bdc7ad97fa5ebb28b756fdf7537d3f7f8efb4ea6eef4d647d9971739585c1878d7329c07a78b92a9758c5b3096ac5a509bfd91aa36d45852ecad8fda10c4f6c83ff88f70021862101e212944b4873c96f08d0abf2445a933727024043e553a3129cd77b264f8a6a81f3dc7af78534da5595bcb59cba3882f8bbbb5989098804df36a960a2fc95c4dfcda414130082dc27548876341bbd465fead790481d459d48c85a82edd90232a2306f0903b0a8fd32832baba8430db85cde48420db42c4bd6ac79d097a265bd4e6a0970454e4cf8e45863709025613fa8cc16ddae4fe879016bac6aec8ce1dfb951fc8ca4c6103699c16ab0496fdd04bfa39d410b69b0a458ac11cedfea8348cc82f735c8fbcebadc870e5b44e67f0ba2a4e6dfef68c7eb3a91aed9625419edad0e22c4e99aaf8eff37c3bd57821555b61c29ece37e2c32b3be3a77045dc6c05e6961c1240deb0513c6e70af82f789b73f22472421dd235fcdb44751eb527907692a5553eea78f1d340d6806c47e70f62f29410424e2a808670f2c5f300ecec5906bbb1221482fa839a11236a80354197c5d1451f0d008197044a06234912588890549d64b45cf9b47ad92fe31b5e04bb2522bda2f698856c905401791bb9fb5c1c81803fea28604d042cff1eb59b991192dace39fccaaf80fc56e525561017c8a22f02b575779f213d90f4e45158b01a07a82e684083550512f1381a007766cd6fdf71de347e6c0c9402a1046dc04682a52bb9c0c91a7c66aea5b3fef5bf1709d5afa5168c9dcc66f37b4b0d80802a796907bae2588f85a2ceef92a03ea80f4160bd0fc28238d046349680d50fad78ffb7f9d1db488427eeecec2552c998bf2c74d5d618275583ff88cabff75a3f7eab7731b21bbeae09ba857860778d153b18df4b540c30677357ed2c078909bb7a4b2ebb793ac86bbd657b37077295157f4c0ab566e75221f0e5fc1b41d37380246042ee09363aa7e625d1ef447ab42d53da1374c13f4b0aa861200b95c40e408b80b0d5c4b5c4a5e880116652d21aa68985be80ca2c555674d1f4fc4eaa3577530583589a2dfc4eec37ca08d173c2268e0d11de3e1774c6b054c305f9758f1a7003aa691d6f193ca4d529c96f33e36c0365664efe5a1cfe28351013e287522b921de79e01d3d70be0e3e843934eddacd9f5d24b9ac022928a0496fddf0b8029a833a0db4a867973d4d3aa8c7c4dcdfadc74620f8aba0ab7dd76aa71bb0685662272edf2e00b0807617c2eab39af66183fa47dc7d06c7d6fc7a5a63324d22e1e48008e61d52584325828f697a2e20f2f0d583dd49a1d96a61e2bc3fc985c8ee553df39301b976e0153d0017841ee0a96227b5512dbbaee5f31df0aaa3e54b220b763cca4f1fffe4b171446aec2002482c8dfa599ba71d4a78ee7b7b40f24f9f64e40e8a9ecd90121551be8016474c0c18d1834bee1cef44eecfdb23e6d2293732ea7ea912d5f0cf0e87aa605406ac3921eafaddf34215b6e19cd157b41929bb1c8946f1892c5d2192dd26a7805cd15122ef1d4483f6248a6bbc24940ef4207a012f8a8044908897795453110ffa0b3a8b171bbd9e41d814ffcaee8165092c829cec536470248b55b1a977a0a3fe0c48028dd36dfd3b3512b1943d9ce2d67fc32ac3e095cd0211566c44675a424d65a395fc49cf01d5722f3893c1d0a20dfabc62047712348dff398c0c6b22f288cfd40037f25675ca04d719131db655e4573206eb4b2434c6e903b546668ac04fc319d7f24ed97ead5d4ecf6137f872bf7618f09dabeedc6c87c2ca17d3ee05d8fd85193028f683c93790adf6f46162770ac02dcd830c09e069a44d7d08155fd1b5f245cdbc09d016c87af803a7bfe35801bf59e61c9bb713d074b1882b7fce3a5901c691f2c1798bb345e8c507282c2062182eab46c9e2df41c410e3509ce56076b5a5a562dbf4880c71b5fcc5fb8cb0d39f66fbf1d69f46eca61c891f4edd63610a157ca70a7a0a4e0093dc3fe63d4a00b94b0778357aa69c0274d5ada432285fc02795b9aafca316b2d785c0277a75c96cd4496648ac60d1aca3af69f69d8cfa1d4719fd273faa01e814e8627a6172dd481cb5eb403e261972cd0ceedc48052e9ec4af0e531070759c7480a55c6c3a0df159cac54a3de3a8516ebd468b0f320c429e2f4bf9e8e53de29298b847301c08844099108e57003c59899ec0a079f92aa8db8fe8f7ba06eccd0cadb135698410226d1342c89672077b0e5c0e560ee195a3276029c151969d52266ac17d01116f215ffdef8956c1ed777da682027682b19038dc062df846df08955b82224e12b9336ba0214cb3ad8ae0493ae79c138939278b47c78e92a76d37dca587a36338fa35b7733747bfe68b5207346c5a23a488a97ecd77ec39266735742629ab624a099b11af1249887d84a393c4d12eafcdf449daf0b593d812c63c3a13254e3791d9ddc5939f0f6208fef44ef6cd49c8458d495cd4c932715196b7f4abc3f7bb4af7953ef21df5fdf4bdfbfe1de1a309eb23a893edec7cbf9b5536acb32311b7bb49487728c4ef3e883b42bacbfbae22c1ddfb94e0b8214a93c1d026713b24c0cbab85f7c0ca3dac4a701f8984550910e4b8ce72e390a2ab31c89d477f95eb5eaa63a97680c82d713542fc8fe82391bd042211f3e604948912f098b0243a2693b0d2cbedecf333fb88636673cbd1368499eb84e0c1a0e9aebc220d2cf041e476e081e640737c353e1bb1469491a2195fdc30e3adb163c5a0b48fa6f30d4d864685abdd0a57fbf70451092969c422c28cf62cdf12c4235ced9af651d37e03fca270b57b4cb0a29d6357fbb56b9721716e788d764dbbf6a2bfce3448f66ac9dc0cda3a317bbf398e06f741ccb8ee66a33505ee882c9628ce8f221040be3bada695aecdc917595d576aedf3d36ee0bb9f9d9cbd10c4917a1acb0eb52ca86b441c34ab82963aef9b794923794576c9a60f50f8230b3cca92f4456621df0532bc6ce0c821afb8f2a56676741f6b7654d1b818333eb02b85a50e0cc1ae34371c948b8a2f66dcb861d920425a21c79243cd512819ea4f883aa5ee7adfcc0b878e1d37455e52f073eaa62047f9851d331f6519e41ad889181f390557f20bda0ad74d552e6a5e8313b79fc938ab3ef1d291f9aafafcb07464fec44bc7e70991d570fb927560d69fa03a338c0557e11b5664990d5abddf3d4558bdad114090884133a3664553136315a38626aba9942a26a54a35ad4132104c58df55739a7b35c875989999cb7cc56050123534a8165f31e3aaa10c1e123d13b74dcb3237ab4131deaa317ea28971ae413e4fb0746afef3d2a1b9eb7c06b64134ef2ce887a543f37e8caa03070e01f09061cdac686a582b9a15ab06461461b2ec29168f3a674711b9599517558364444cd7433028881a882c57f750eb96aa13bc854ee91998491cb62b58599681ad6c6875616873d34cdcd6126bccb66d625589592661a24964e26673e34cdc36c59ada4cf3dc047b507ac536b5925861562c57a95442ddac06b18e621d06d591f9cc5df547d46189ac4a254c7c07f6a01706c6cec8acbaae3b799ef7c17c5f12f17edf275653cb75d6576226ae582ef00a0f146b1886e12756d064327d62fd4451fcc4eaddd315ed243b7528144aac2518189814bd29b1722a95ea13eb16131313f389551357600f7a574756198bc5fac43aaff779264edb408943d7027bd0562bcc2a8cea238382f93299d3e92e31464f2e97cb05a3fab8585f5d464c9d61e267c01ef49e8e92f7601ec25ca6ae2aabce803ba919179c2c8882e9249e9da1d90e43bf0fec4a1f5f5dc9a7f527aed3b25038deae99ee711bd783b3365e14049b955f57f21aec41afd6259e21b59964d2b89a54df598394e6ccb6c9f1911864ce8dded9844dc384387ced66775e6d0bb77bdde77999496e37bb5bf6751d963a3004bbd2d4aef66dcb348dde6d662dd6a0d64d5b0db205855e8bab42e8057fa077b354bb9ae9e3903bb526eebc67fab8a0300cc34d047fe04e290fdca0d5616a908ccc4a72371582cba55237d5aacd8550060ae00f43ee98fdf4ee82cc123aa127fb752e175d5dac4132d76a90ebbcba69637d6e77da91bbf7964c76471170cf58616bc55ab542ee5ae5b68d83e1c6ed72b604fe2082cb6386e0c7bce97dc4f3c0ae84729d6e2e5756e2dedc37c38f19e5b4146ba6e8a341837c311a7a8a9e386b50e9defcbce9878c49d3fe813b9ad6d548eed0245acff4ae9bb7d6368edbb26639b90d0c5fb7a143e33c91c528d0ead633436d40043f6ddb388da3402d90375e206d7eb6ad0b63c66ddbb8bec76ddb43d327e54d27ae5e987ce87af8b94e07be7b66ca3c7027cb4a3356c680757001efd09f5798d849bf9a999919e8f4d18f042490258d2bc1953325903fa9bea5ca1d7398b350c744a15227009007e5a293ebe38b13276fbe6b5fc99b967894104a0442e42d13d6e7a47376a32cde326fba686ee14416cb55c1b7eaea21eba71a54ea22172e5e44e78d386d475902d847a58ea5d9175db2b06af24c3cf693b195bca863778147b313ad5928d4e8fdbe92cb47ccb56b31360506754775e79f79c345ddb345234881a97041cb6890b079d371521fb172fb1d27b175c2ed7162d297691bb5a248dee82396a96a197f99a9667766d9e60246c23a72a46d5cc6c4a4926b53e579b96f6b49e7369bb0296d5a364f4645df2d02c7fa0b878e6d63d93e72956ecbe709aad34774dbde945eb0f4350796b6b9ddd014866fdda581a5cfd50ab34cebc0d2b7695e9d776b2d6c81a56fd3a817f3b9b8da6530e0ce4dc2b483e1d562c63bcf9b49bcd795b22b5a0e05b3c1dcf838c15be87cf77982ea38c15be840e13f21eac8bc09a6db105938aed451248f6eb48f256d2e51c354b92bf389fae95af5e6e4c08511a58d76d68a9f85aeef84aafd02182e71e094e14dab41dff67d0fdf9aadf06bcd54b539b3fb7d51325715b92a537f449dcfce23b49b340e74719aa9f6359950e7670fabab7e554a1cc4cf1ee245c1d84e62b2cc71a62a6fab8673825c57a2600ff14e2bb7772ae64bd5d335f5eae31a3413c38a71d1b0664cd8d2c41a141ed512755a37b5accf13d7f17942d459bdf5f030339fe29d94a39181c40106528716c81dfa33ae24ace94dd697aaa6cb35283cad41ad4d4bc1b4c4cfee42e815e7d6655cd6fa52350c59cf6a1057eaf4639dd6544bd33c2b2471d0ecd89c26f3a52ab8b93eaeb7543d14b765ec11113570273bdb1fda09e61e4c8c9cdf7ecc6b73c69c037b4cfb49f04b55efd28dd27ca9da955c7ca95aea5e7ca94aafc9fb97aadcfd3eb047066e17b45f2aa8eb6cb88530be5410ebb406b9ced54622274c266c4dd7555acd6044988b53036bfdaa34c1b06c899a3c53cd97aa13e63bd525c425e865ab0417448878e73993288a31be54ed958c471fb3cd984a6bbf407a5b27397127195c834050e328bd030aec21a236d48c2f15d43aad41e1b74f75b06635c8bc107a61ba05d2a68faaed82094bd9d98281017b6497bb974285db3955cc3784829171110387adf97848e2b415d2a6bb080bb095f46a76190bdfe8f3968dcb4cf60658a0eca09f70fb5ef78307ae47af373be366efe0f6a1dc3e6f692b5020713a06d2a691f00d277d7f68e26e9b27bd7b9b17b32a75a799970d2ee2a2067d289db5fa76842d39ca2cfc11c6de564bdcdd736e95bb5c8364de9a9a8cf8b156a2667f64e764beb025d30abfec9ba6c14c4d84397d5e1dfbfea862ed235c667bbb389b306de3766ffe98dfee69435525788b1b14862d860beb0294af916e479999d938ae4776b752d795366edbee46b94f55fbc268a9eb949498d55753859a1d4ddfc09de71ee21d87dc697f983eb3b40f252e0c5b49b7057d076b4341c2fa5d6d2e4898dc616c2bdcbeaa74fa3d55837e449defa7ef7dd45da041923859e64d376f4a345f3be1274d05578f74ccd4dc4553f603f7ad895b839428b76919f78d5b514e9237fa1d6b28887da48fe64db740da4d042d5f9ae99b89e5b53e4e4a92af8ef5917c8df4b3a1c3c5b95212415e217e478e49e6c05b7ce8a29b1f1c4556d4b87d83dbcfc19696818441f514b77f6a26b7df45fdd356489c2ee29cee2eba4b6efff411912372b520d93dc259379224724a8983a91bfc817988f309ffdd0b6bf7e878db2c713a1e7f9cced40eee6c7383cd3ed28da461add923d2a6cf6941ec2ad581c2df3e69a35ddbae75d246eb968069d7c01ef4d27b5b365b63b985db6b5f4d853aa944932a043f4fa5ea4a2a958a729b4acb5453d5aaecc2b446441bc211a1432647db6709de45d59556a82003a6824f8b5e663627172b5ab6685976e45d69a50a5eb4d59556b4f8c08a16292e4bcb115aa2d48a961ef04a2b53489a0297cbea171785979da5c6862d575a61c311778741f3454c2b43f481427b07791e2d4e2e412759891759968d39846c47571e4dea75c61d8e44e8bc81d2814c884a36044a89fa5574049112d1a28ec96d4a26b44da1445915e2a8c4d66b1079a4444edae706c9885a0b71cc84ee93d6321d371f508fc63b6802b74da28e8d99d06dda445570a1449412dd3eedee8a4a30f0668832f364cdb81ddd7e0cbc3c77b926e298ddef262963f28edfe791f9338d7c1fe7cff7ce4e23fdfa7ee60f7725080477e7b73b9188468ecc1f69d34913d644fce506491950c7bcdb9993dbf74c26fb435fd3c1cf9f6984a84adfc8261c4d241d93577c797289e691db597fb972addc7152d1318144558a3a36ca2bb763a3347d632a16e38e3393888e4df02dd770559dc437fadb4cae8f1c8573d06a7ec16d4ec16d2227980c520db7e55147346fe64f129341e23410a4cdfcb1b92313c910b58858442ba24e03abeab3a62805c12c3b0804897386db6f9eec85737a0adbd8bcd84b378573dacb6bc68eafbbec78968c1d5962cb7e61b597541321692f9c334f206ff47b12410b54b64cc9f2e4c8c99d2938c3bc76fe704bc4316bd3f665f674acebbaab6c7fe9b4f8d2d9d993b2ddd9f1bb5d973d95f517b0e74b7fe9e9989c46a8a7e4f633daf34789d8ddf341d4baca6f107c573bb0664310c7ec82ef3e7fe64d1381efee81b512518bf06c11a005ad11446446f8006d265fdda57c759720688b6ed71782185aed5ca70f22d8d97964fef4ab5de034d237334a4f4f4f0d74c0d8ce9729e44bde71c5448c8184c92b6f76beac40c2a4ebf2e8b9a140dccea30510040fea233d8dac9abf988809ebcb093bd2342d0c3b0cc36bda377f26bd9cdcfc31adcbf4efa07599ec77d0145a3bce2fc1f77be77dce9f1fd6dd3420b6a38c483867a0206b4a73ce49845216eb6c794cba4dce3629bb12870671538315356cb9d28a1a8e6eb8d20a1b9adc79ca9af9cb068e588e37ab0762e9236bc6f3ba0fec2e82a20eb13faf9b69585f82ac994fd6ececa0591279f407b32df17ee0fb4294dc0399966d5648dbeff2dfecd4326dd334ed3ffd58ef9fe37ed9cc8e8373e8b3536ddb72dccd0c48b8dba5dcec08a4e6908306d4b1ed1ab71d314b616b6af5bb4c355daa522c6de3a6933bce7ce38de693c68e3deb3881ee36638534e5ae714c5b77ca9b23a6f5267ffad0cedc11f3e6a58734475dab2efe77e381ef31af0d31afe1b099a68d34ebec0feddf327b5458d2fe59181b7d8561c7ec7e3fa8356de7616591f66ac71cf7bb674ddf3ce2388ee3b86f2010dbbbab2ef7d5791e73a68a77d5ecd5742ffc72e01c2dfb32aa711cc771db04a795fd5a5d95b2ac959531b694b2218c1d55b78fb2a3ea7e272ba42f67c7ec6ef596ec0feedf4629a5dc3f9b03dfd81e52eb2a5d5594c398ddacd61b1ecc2ed29bbc0d1ce2bbdf79cc9b4cc268cb0947743b68c71c9ff66c27eb6aa994655b76fb9b5c655088edd48e3ce6c881f6eb1bd2445293a5839687c4f70901c2bacc1b92c8a7611a6bc1496fabead89101c16c6b6a6ac2e0e502e04a2b6198e273392aabf3eabc3adfebc09dd78cec311e83c66b80f70e5e3b08b25cdc414a45b1873c5f0341f03440b0753ee76add758f86c6ba5ab6878bdb4010ac2058415003691c04635ca35103a41103ac5163c68c193366bcceec11c196881f5e2d10acaf7bde8bf33ccec5bd5e6fbd6ceb3c260df8a375f0d3f5aae025087ade067a2efb037cabf5d63daef6f0ac04410d0658c7968b03eb88c410e0d9555b2ed055c721b74544ebb25f231157e5fb7a9dc77cd5d561c47c036bfed57cde39ae737d20c843b8cee2c4ae8a74c2b47e799ee77d475554d7cdd0d23bdb041422be97becf582688e810e1837a8a88cb5500faef0990f1d25d3e40f01eaa3201a588ee29cb44ea9d6da2bbea4ca0de049422baabdec4cc615eaa2eed25cd7e02c1370133164a11aa779fb60998cf24a07bc936a17a67698375a437f37688f041592688e83001453beadf5335f5cf32414427d5755ff76d0c28fd7b11f41db545944a5f9dc79451e984c5e8a81db8b3b23cb28f47bf504fddf3b826c133ff5e848c97cea335cd7ae00f7cff5926a0786702e69e55fdb374c234d73f50083eb79dab3caa0e1711e2e52de22463a66625354c577806cc97ce803e7dfd2fc11eacfb734d82759ff1ac0ecafc8776be31eeaa31ee11e179afb32adf17679dc665c76a7c868bc36ee3ac1fda3d0f9419c21ba2f59135b25cdc3510fc40ee31ab6b35587f714fde27977596b9b78143b07571e7b70edeab2eee34f75cddbf17f159398b48e2328d1d91b8de5b56e30e43bb0606c1d7c5656cc98be85920ac7a8fd3c001b8b8eb1efd3402f07571ef9a057bb8b8667fb8b8cbfea8718d755dd8ac5f340ed678cc6dd431bb333e411fab1e35acec170dbebd664798cdfa35c3de9e41215efcc5597fc1ca401f23e83d638119eb05eb96758f41ebd9d15ec8bcac971d895c967dddda1a44bfb2d7eb3cfa6547be445cb6ceacdb7bac4a4410acc750225bd75677b9eeb5eed518072b4d1d91b834dfc09d18de3d098ee0b97a1e6b07398fe65a8fe98293e1623ce62dfb23c65d31ac0bac3f5cf73e8528ddd617c3d3ea88c4d5b4192f4ee38267bcb0a39859199be566348771ae60cbfef056779dc11ede5df7c073d7bc2240ad16d13c7a74bd55477679e766de5519d7eac8483060a60033b6324086f54a5fabba2e4120b4b71e63a4f990eb9a79119f9db14574d6883bc69cc602615dd7e584798fb9eb3cba55f9c6a8f2f298aeba7a4d1d79dc98c3a8231237e64174ccdab3aaed41fcb56b5096e0bb3a78af5547246eeb7b3173ee446ee5ecc8bacc1af883769af3bbd7e584712d9a3a12b99ecc79b40bd75f7cefce0017564e188d6580cb3ee672c6c8d81fe057671db4600bb431d607dfd52ab67a762fa6eaa823f8d53d098275ac5f5d3de65e1592dded1a0f1d50c46d47c7d86e40c779ac46ee31aafaaa30350bfacea01dc2d2399d2ede74b250b68b377d7cdd4c0ac9eec62010db6d13508ae8febd09177fbe74179b6c139d753db405982fbd883e3d7db6b9b823e530ac60c7b36312d7fb47cf153c688be8984773d5fe71efaad49149258e484f22999783079eace920f87efdd27e78b414a5080571c471b93fb90ac5a2c851e6240c5a78e134103567f4579e332b729aa572c2b8190ddb467bb6104deb27de76356d7b67756e99a6695a8665561124cb7ac2a0b97908623373b6ddc9fd026fe3b88cdb4e1c57e23eb527b223a82852dadfbacfba965dde685990d415a2ddcea2a9b67d52abf5a594ca2cfb985d4dd3e49c9d653b2d332b1a61a3d956aa19152ffdf6d2a9bc9996da6ddb2e6b36ee81e783d8ddb31261ce4026e7366ecfec0fad8a6010c76793c5a234b3725ee37e22fb9573bb26b79a6d6c332b6f96654c056f72a5beb7cd0a93367dba7dfba4d2a6cf55c479b15f96f66b665092601ae5b8af54f2b6e6d1b18372f7a4b675c8d2a6c391a3df59f9a3f46e081d3ecfe22895ba54b25f8e7ee980633e475b1c94d21e9cc591a3db663089d34da4a766246692a761990d625e7baa5fdf96eedec293350fbaf3665679c33f73365ffa4cc9393519124920f19a2f1ba344620209209dbd72d7ab40c7e4fd9937afd8f8e28e3c3fff83afe11c07f00d89030169c33efca42bd9b141000189334a1b24f8c63c9f40c24a3fd92c2d98c19d263bbee0ccf24f9238ca2d3ea11d198a3bcf52b00fb340bee6a9932577c680690002e61754a0633f7844826170e74b47343d8f1924ab006bbb289ab834d451842071b49bf7942bcf44dff050c5c038a06f8e98b0f91d7d530a4d94f3ce02bf535134129a6789a2ca6e11daf23367ff7092fe69235389112371971ea4cdd6d3b1d187bb8d3ab7f2205fdbc352c541beb61188ab95ce3e3e76b8db38040e69b31dfc44d9b34437cb3dfdd2d807090909c9c8c8c848484848a84fd0823b7b06773614f3938ac4e9fb8143b24cfbacd822b538c0066b0646aad6f4c71a39f09079a8164d0e568e18697a51d68c5d0900f96a58d731291caea471a50700187d1db3e6f60120716064306edf078963a7bdfd1e244eed7afb3b24cea54d5f478e26942a00e4efdc34071ca10832acf92b57dcf91eae6307cb14144fd6b41389c33267267dec20740fb88f4de4858a1d1f9b07303ef60eae9c5ffac9951f5b07750a9933b5b8a17b7aec1fcf86c4b9c990464eba3cf016e6c25490235b81abf48d46e386a974ec972f7e20733a0bec2307e14a179759cfc842b18f1ca563341d9bf90b89c481b93c137d9315e9f0917d727c6423575e48c750aa9c9924098993c2e1a3dc92834b0899338946a9842bcf23715a97b20a8e8f3bae2c82c99c4c886f4c9698ea189de918d85dc6dc74bad4d183ddb1c3cee75801f08df92a5a04316136da0d36b7616d1cc78e4f62c2261fe1a41ae7c11aa1347e636159cfbce12893618fd91dec95ce61475107db9cd4465a28071c8cd4e0b0373221d68ab42a9a9156a42165451d1bb51e24ad8ba645c746ada8c7472bd2aae8d8c139fd846fcccff3e09c8e124500f3538298379a686347960ddb444638a7b11c99379de5c97c0d8b6566a17164f697099b13c94cd285736614be310f8b12e56593f0d1d490e6944924c439f3c8ce9862a466a42dd45a0fe7cc28c81bf3330a4435445838676aa10596279c3393929e44e19ce9c5cbfcf26566595167c98a66172f37ebe92ffd0509e74c242424777e6a51386772e112e566333ea770cedcc237e6b74c99530bdf98454423d572a415cdb04545451b08ae625c322d942a453303f3172e1ec35e1931acd6a3458d1dc5cf6a3d5adc79696712e74c222f9ca3f5f08d2f9ca315f18df94994747bbc58216de6975a3531c8d73c0ced0c779ed3b6b8f36cb8f393480d7796e1cecf30481bad686a666886513d0bc3b3b58e4d5ce6bc7b19fdd8be6c94de75045262eef55fb5e34cc24d2cfd9a7f5165bf8aba644745330c773e734133d383d4d3038352695c34212e777e4bb964aaecd7f70c690b12d2961fb6dbb248daaa66429e1d352f570be7683613d2be30b56c37c682f726957ecdcfa21d97735cae999139cdf372769993453d89b6314ca24925eb99375991d0bcc990b2704e7f61d995edb974cad8b19f15cd1bad67c290fa0be7cc2467b156453145628674ef53f5bb26849ad77ae68d28522a8aac9e3bef83f86d57439236f3485a95cb59ad48dacc3004e18bd28a88a874acfbfc2c9a40a4d1edb4a22afd023bebeaa1e37ad7713dfb994e2283dd176f839b66d4b192d129dc8c5a2bd28a802899eaa6a393e9e8e8e89caa268a57de9ecf018a17bc78c1f7f43a2e9c49a48ed469d0fe9849da4a0da977983ffad995173c68c7be65ebea412d8e2e69496356d4b1ad4a1b09d12eedc13d973bf75ccea63651fb82384e2c134bc7da89c4691b433222debc11c3cc40d0af3e22720f0838890e4e72c33a2dbf5c0780e046eabce8c6f10a4d673bd2bab50188f965d111bb1b316f40902501bc854e6745092bfd25244a4a581088232b89b4e9963a2fd9db2d08bf6ce0d0382b64bbdc76375ba3f5ccc47ef5efa4196706ed4bcdcc35ee99691b474b9df781a1495c79ad8fb7c87c72debcf82f2fb2e68d8dcbdbc091a3632e2eafa363f5f23b3a6661d45c3e888ec520a28be8d8ebf246748cc66b5c9eb7bc633397afe918cde55fcd59648c7579d622639913640e233114ae3c2f41c65a499039dca5cbd111644cc60832879392b2b8f25c0419735db297335871e59948c65297672a3206c30399c359b2f8408a8ca9742073588b3ce340c66282640e6f91ab4b2e7ca3bf852864cc2463e1a50c602073d868053287afb009640e1ff18d3e9f809fc024b8120bdf68816414b0133286ba3c0864acbb3c1332563a111aa860216d5ade0332878994d880cc612aa38c7d97c780cce1220ac823e46dc0d4a833289045a39e6060d0eb557798401d33421995070483302ae20389387280071a91a5021d78c416202510092421144c22890910f8704f8f110de49f1f4e9281417ce4084f308881eee2c736e3c2cedc6b1775865e9abac4bc1c9db13d885c8c0f6a33db2010da2d4fe128adcd51938ce49269b19024e99274062f46badc1224515a47ee34cb2a469582d1b2650b5cb46cf9fcc15fd80875124d01608fd5fd9e74ecd92f8a483f7e404e2ae3e0a268a90cc4d5955780be5cda09ed18735cda25b1f19a52124d95985c16dd52d2fc0b072f292581b448870e1c385eaf0f481c514628a38e8d19d251c746ae0875a563320b3354b97d1496f0cbd23ae28a26ac398e09e2181e8547dd31c681e59982cba94adf489df08873b822ce8a9009b75b88abd2371fd0e99c96db1c961ff87e4067899c1571dc84b6271d1b817c9769c0577c13ea1853f17e9624f697972008a31e2e3a135cc54bf0ea137051df8809ebd3f7b59f8e49cd49dfac7a3423b78fdcd694d027e294550f95dbab1eaee2a58f2caee2a3342a7dd4c1557489365842c33891e61462968e7563a6e5f6b32d334b9f9d208ee1d17d1045a08ff49e4e27efbce49e57c32cbca486479e570464d4e4688a6726354876bd169934399d97d8f0a886594e3f35b123bde214ba2d2699b00eb37093b75cc2e49e1db9890db31c49efccc48e9497d851bca2278adfc01d313c0ab3744c3652c7ba74ac916e7bb97d9910cbf8017d409f938e711207d450e66e20351dca88afa821162a6c78d42f2a8823ccd1e9cc04d115cf5144af8e9452eb79f574b1029946a73abbf4abbdcfa424ae4849d147f9c508f40a9da1f3d22b188b8f7ce4d2d7481c363a7d0c89c34538bd0c89c3569c7e86c461229cfe25635ce5f436240e2f39bd8dc46126a7bf41e27093d3df9031063abd0e1287a1387d0e89c3519c7e0789c3529c3e2663ece4f4381287a7387d8ec4611b9c7e87c4e1a0d3f720632c74fa2b71f806a7d791388c83d30740e2700e4e2f0019e327a70f42e23094d3f79038ac83d30f40e2f00e4eef43c638cae98790382ce5f444481c1e3a7d01240e53717a03c8184f397d02240ef3e0f40a9038dc83d31b2171d807a75f808c31d1e91f2071f807a78780c461209c3e0212878370fa23648ca99cbe02128785707a0b481c1ec2e9919837a5d327316fb88ad37f7da3429ab03e3dc2e969c7388bd3b3ccd1a89589d4af99d45d6652290969deac7ab423f15321ddce1edd2ec0d429854749f7549464d5b3ead1f17c10b90634b85472e9f5c7572a3d5ba9ace47c84ca35386751990667a3ca33381ba172923316956570bea2720cce552ac3e05c84ca48ce56547ec19908955d702eaadc827315958f9c875037701642e5c0994a4de21c84aac4190835c8f907b50367a22ae4ec83ea81730fea12671ed40f9ca754109ca9a821380f55119ca5d4119ca35426ce3ba84d9c7550879ca15422e727957bce39a85ce48c83ca2438dfa0b21367a1ca3ee7a0ca2538dba0f213e7292a9be0eca4f2cf598aca27384751190567282aa7e00c54d9c8b94965159c99545ec1794965167c409bd08475067efc80c2231d28a91a38d7a00239d3a0fe38cfa08ee7243503671954009c6350799c6150913823a91838bfa05ee0ec826a81730b6a05ce472a05ce2ca81338afa04ae0ac827ac4d9488dc0390515026714d4079c4f501d70fea90d389ba032e0fc445dc0b904d588b34f55c0d9899a8033092a02ce456a11e79e7a8013a906f8905a80375189381375888fa012e022a8423c0495e720a83efe813a802f517bdc0335880ba940bc03f58707a93b57a20ae049d4009c0355e71ba8f7549421710e7f1937219a21957e2a9a37e11112dfe89f8ac45391a7818a3a909afa8f0af3b1de3c03951e89aa3a06eae917a8dd2d50bf57a0f2700ad49c4fa0c65c0275f5232aeb11a8ad43a0cafc01d57507d49937a0d29c01d5c517505fdc88fa2ba0d627a0da23a0c27811b5e607a8316e802ae305a8334e447d7d880a3b012a8d0b516b9ca7dab88f6af301d41bdea3de781015c781a838fc879ac377aa0e1740cdf100d41dae5363bf55c7c3a3b03b0c2b006ab78ee783988239f75079f88e9a133499208e30473e3d3d39e78187b30e0f393cf8f0528e7dc209930e0f6f1d71880f95250ee219dcc1b9977d20107d51f7fae3a1f6f09cba83c11d2278b8886347223cdcd4be3aaa0989b4e913a16f2adff9dd547963d5f40269d3dfa19a58205ffd1cd5b40269d3d7a19a54206dfa3954931169d3c7a19a7eaac904d2a67fa39a9e9036fd1baaa904d2a66f534d45e4ab6fa39a6ad4700b69d3a751c336489b3eac866ae057ff55c334489bfe8c1a7e91367d19354483b4e9c7a8611964480669d38751c331489bbead61ad61971a7e41daf45fd4d00bd2a6efa2865d90367d9a1a6a41865c6a980569d397a92116c22a70480569d35fd5508bb4e9c7d4700ad2a6afaa2114c227489b7e574327d4108bb4e9d33a8aef0091ab527d353c8239527d17afb2233dd80db9e15146dff5e9e704a67e423f6817653f206933850f680044ae07585708ab7532b9c5150f73741a89883047fd6a9812144a2bc880242e1be19f1f1e6dfa9e04c9eeecd2b18fcea4aed29b65606903d3e8c260b18c848f2c214419854761967e855a6e58057184098f6e1fe6a8637d182cac9e1943bac6902662876c37863011eec4462930f5bbffb98449823ee6165bb07c69725ba285985b6c91d56ed9bd33ef652cb39e4156baf073a515a42f1775a515242ddce96945498842b22ba59452d2570d11fdf23ccfe3f1ac943508698d60cff33e4f3b7797fdd2d88edf6579ef3d3f7a9ee7d1cbd197280e79b66104b3945c538b90e77b1ff944f46b046c81c4511e9dd52f0e0a22f79b0db72f25ce28b5f8f88634c3ed3e10ce49f10d3ec36d1986f9ecda4b6f2986238c8493f49989b4e977567a337ca40bf70b4714c0c92a482dc82eb72f934ce1f699899224a376bd519e7e943fc8ae06c958fd62e2ca4db3d312c13d411c5957b6664a41d20c807e9268c122c914beac193f00ed479c9f60124298e818911baa6573ce39cf83b5c9e38ed938286db9f39e9419330361a4bbd96f48926dab236fd1e6d71db3583a56594bc76abe9db774ecdf607cfbe69af976b16334df9e6275ec0547023113bdce037768643404d0b1912f2bd368682fd861dffe3a8d9bc01d1af7f803776864348c2e8cb37a7ce69c0ce475b3d71cc679b417b352627c9d756fabdc59f5deabd6cc481caef1f99a8ebd0e73f9d84ee334bec9803b35eef157e32e70a7c625e8a3e6b2de83b8ddc8cdb4c8beb1be6dd758f7bcaf0341cf14c2b04e9f4803f67a1d06c3f2401f301a342aebb017ecf57abd5e271088edaf7b5b65fd556baea7fa582c16eb2f0bb33d625c96003ab669972f4fabf42fee5a0adc615901c4d8ca47fdda5e2b63a99ca55fdb6b2a7f3b8cca5cfab5c9b866685cbca82c6bc19d9fefc89d1f5349561f6be40ded994068b76519e96e173b6644ec1fae622471b2cf2c0bd65f4268f758f45a56a4b12abd00e4eb42e8cd7e861892bdee49106647232eecaf1ae475d6b32a84eff5f00587a897f6cc2dc59355f3d7abe6d9ab88f5f612dcb1b0d7b06af764dfec7696855520af0be3deb635a00b163220ba35576221032457063e575ea97d59e6727de372615c5e2fc7e78358f31ce04e0e70e7cf649cc01ffa8a30608f799716d7d5c3f539559fc64474719a770f8b25b250315fffdcedddd33e5e0cebc43bbc176babaf2ccbb2d6f7d3d3afa9f9b0fa07f5ea1edac3395de46a9f340efb7cfff400eed0b03d8830cdf268adfe98b910be2ed73d568fec2e96f9091422db79d9ec86aeb3f1d5b8e186cf068e1bde0e5fc9dbe193122708eb52da6ca7e00efdfb35599e0e5f0e2010db61bf82032f3bb0645ea73b8042d4dcec0cfaa8f1f182d59aebf107abd95ff5ad695f020344aebc9a1d75f0b69a5dab35d7bbd16a160381c8aed99a97ed11e36602c8a688d447e6c776578fc4c98a481c4ddecda5c93cab7c2928c476d76796e03b73ef4636f38d16b6ee44f7e8f8c8780c1f199f711eedc5a832b8e6d6c03ecedc9a9a9a675d53f306776068303bb23279b7b62c9fa2b358a86ddbb62d07dcd9c2b087c6051631f072615cbbd71fab6af76654d691515955bc591dbfb1e66e5da35fac6fd74021b4c3c85eb6861dc51a730bcc8e0761cf7ee64d4f1b767c4f0f0d5bb32afd9aa87b2c56774fbfeef1c762b158aff22693925d16eb3ae00e4b142fcc6645d30be2d83d3d3258cfea08e4bbac8fb48e405e97f51ad6a774342e5e5ce88e1b10ede9984fc75c9f33a771f1798aa4632f3eef69df0ca9c3aaf2caa85267822f3e4120f8d2dcdbbe193baceed1e1316b6a56d42f7965554718311fbf8da7bb95688f84cd7b30c6d7dd3622f759515625338201e4757f09b2aeadb5ce2cfd9aafe29597c577bbf6d6e96ea5bb6d3a9b37bb794e2d6cfd556653aef717f32e6a27e9572369233e4f88ac6787f93e664555b8e0c70d88f6545a44dacc6b321059968eb48736b993e88a3748d1bc6326e5ce9b684f4f0dd277a43d404d7b46d61d694f10ed72ac7eb5007880924a5b26113b77c8808ba52e7d3602b9da29b5ddf701b9daf7cf5220a9eb69b5abe390cbf3a644a91da946c121b2b326670de6bf7bf5bbd7ad7732a7398dcbfbcc5f2871c4fd91659f15443d7c565117eb78c415efcd1eab83373df55014c54b79c45dd9941d8fb8e1c3cf8b5945a16cc98b986577d15da6fb04c36f56d47fc167d565ca281541eb32d9ec20aa8ee2bd9bbc87750c9f59f0db33b087f7ccfef06eb23f5c08d16e98f58be6a08bcbbfa863765d9fa00f7ef6067bd04c97cbca5ce6dd65ea38e476f7e60cbbecd37653c68e4d64b3cb666847ae9badceb6ceb55a2d3b9f59ee5e57a90ec40e884e8906f69896ef790fc1ac8e470c311fda9148f612d863de9b6005bfaf86a218f36942a52ee5cde9abc3d46c75d5eaacca7a4c951296c1260c6547918aa0fd11f2bd7b41c89b6561187ef40e8233fc4c1f62b242b4ebf1fdbcca4480ee11576a92df1f672166f63c66c6e38ef242b4cbcc0d613695c2146081e40a27b1a833d22bc51c58bc000993810a35cd2bb1334fe45c71481b3eddb44f1ea96559145ac870e5ca2b76509485972b5766418627d2f3e47cc738dab13ea77d772e69a3a8699d10d32a31b760e2d2aefbbeade7b4563cf023139712b914ac38a44d776aaa61f5c277ff2a8fbca1a5fdea4ecf813cf282767e75bb576915d297fbe4a576643eeb6ab6a71565cf1b396fa40ebd8277ead9b62fd39e7d436c76ecfb6bff02227ff4805e336abd8c18b5d61a1839383cccdc1175c4458c889a2123461d3b7961ac8d5b6f6f7b10eb6bb5e1e2f5d56ec0860bd58baa81d705f2f2b6acc09d1917332e6a75e18286aa86ca86ca4675830a870a07d50d950a76550e57b9f8cc3d17332e5c9c47e750e4060e386eb0b15183064cc74d6c871c3abc66c8885103a388aa8855a9543aea888a72fb3775440ddd7e6c871c3abc66c8885103c3de453d8f8e7171948f6ac6856a46a57ae94071f9a8575d6537f0b29f16e0f725e8c669aa066a2e909afb7db9fd1b32e04e4c8da92a55ad5606864c8d4c0c19193233645e32301919999f736c5ca6c6d47a1e6da3c86b868c1835302c2c870e39e080e3069b2232456ad09091919191c901071c37d8d4a0f1c285bc3cba558ff29189a931b60751264646c606ddb86187d4a82e7319bb811a950d65c0302cd1803b2e954b2523a3529d4ea7933dc138d59cea4fa7183fa9eebaa772a954e7d13160d82afb151373838d8d1a3460af22a72233649c4ea71a26c5dc6063a306eac88882bd66c89851b94e2ad7c9658568f7645d3e647efac92ea1c994c22fb75f3ab8d39269c9a07e3a2663c7ed9a3a8e55be299952379964deba27d392912952aa31aa548c9a22a622a6c3b02693c96432995c316a60d8bf7041f302f4418ff231b5645ab607d1d432996674a0b87c9c3630730a2a7d853aa14e26d3e9e4fab8ddb0bbe125c7541fbf1b8a3794593d7c8a73eac313ea07d5c3f7743a8faed5e4052413124a89abd52a121609c3300c4399960b9a19792de8831ee513a24e28db8318a2c290153eb41b6099585503a90b247545a2db2fc90077604c30a6d0a27e4cad8f1b4fd6a7ebd374987b26189349b4620628168945174503be818a010a09dfe8af4e3145669179556ace893aa18ea0988ca824631703f4418ff2996f18d3cceee4940e14978f7003a9b0fb1442273bc685a89fb07b08f370cec9a3618a74a85391b04858242c62429d5ea00f7a544fc7409f8ecd9f30e42ffb6c64b701ee34b87322eaa0ee62d5c077817c9708e57dde177ea0c954242c02163969c992e53bd231cff3baee860f75a45f7de39ba5ae1b008a474b0d7584a3b4c898f9a0a824da96cd7933bbc4e4389e4113f8ca8c8a962c588eae1855d9a123070e21d8a02272fff7b258367be3edf3935b6f93e925b5b29bb7481b49eb56b24647598a84a21001f10f1fe124cd7d1b291d59dce5c6719b7cf6a5254c9ef217038f5bd3ec8fcc4a41e4cbff64339b56f627c1cc76652be5b432db61db5f3c297178cb34561673e549c717669cd3946b7430cdd591235ffd2f9438315b5dc9575fcb52fd19f9e2cb799392302ee249e48491fbe24a231274b95e7f50c84f0a2327ae5c9b2b8d9cb802745b576271c5a72912b4b830aec4020959ae1990dc1daeccc28b96ebe44a2cac207971e511b280c1493f11fffd045deeebca2b27a8f29334c508588cc0c5c911bcc82c8280e4feca2c8050062cacf85c898511aa5c2c9280e59eaec4220945d793b4471c534759f8727fe51559c872593db7a67b3caa45bf9a8a4b56a284a9601af050f1e37367c09d791e2a8ea82eaf0bdc519d67688b962b03ee80e7194ae22e6f0bdce1ce336454455e16b8c357ce3374c4562eef0adc612be7a1a2470b7963c01d3ec279868aa8c8ab0277388bf30c7d61a3cb9b0277d8e83c43486c84cb0b03eeb011ce339485ab5c5e14b8c355ce23e50b17e1f29ec01d2ec2798680d88acb2b823b6cc5798688980897d704ee3011ce33748487707943708787701e29595808971704775808e791b285a95cde0fdc612ae79192c4413807e13c43420c84cbdb813b0c84f34841e21f5cde12b8c33f38cf500f135d5e0aee30d179867ed80797970377d807e7198ac23db8bc1bb8c33d38cf90bccc83cbab813bcc83cf2371dc94781b927ba9588564497e28f5362377f3e997a62521caad57629104237774c03dddab63cd15352d9342d436a1ed4a7732d2af3e1db97deae9d7c92749122020274f4a9fc4d1311737b9bccc44bc84b972fb06a60acc11ccd184b5ebfbe98debbbd4e12abc4aeb47e9c983391253e26704b1e9a9aaba344c85348dc45fa4ce9a56705a25394a61e9578be3aa4785d4932a1a6352208ea9a3fb54967ec11ca9aa74acb90a1270d14b9720115c6455571aa632ea57df48321422cda240572d8af33bfdf0ba3ad27b1648cd554de918efe07d15d1bce12aa4c89cd4161c704e8a8b14322785c4375a09e7a4ba409131d6c1fb2a1b708ca1bcaf6a2263fc640b155c9e5ca429ba30b97d150960207352492d9031c6c10a3827e505051ce31bbcaf3281cc497de11b4ec8180b3d279524032f476e7f39c1ed0f0102c1510ea3a563d4fe60a07ba7d7500b83c50747a97c190868e4d416ce8941e2c239315d9038272609694b172e4948b79feac239315e923827e68b17ce89d1e20be7a8aa68c1392a2f5dbe24c568e1e5cb3d82b4e96b01742128a53f18e8a733931dc420718eaa876ff4a3508941c2faaa1eeea1f4f682b4299d87ce527848ca4b75c50309fb78c9e7799e977d0ce4e364c726f7e6178334e553906e3fa64b1449527871f2658af763b4b0c1a3e8224592132f537cb9368811aa2b13dca0ae56c038a82b18e4a0ae94f46b250594bac201d795941dd41551afa834acaf3a425f558583de57197190aaca6d91bea3f245af04520332d019a8cacb4c2a0c96a13aae8470fb2ca5ae5230ae5cb09ac1edb39355cfb80aba7d8ea28e2b1ddc3e4fa9e38a079aa7c307a3854747f9ee087374d431aaead230fe52471d631cbc9fc2a242aa224a8682aa904415124361c7d591dba9a279139385a68a62b2cc9b55d2aa477eb9a30aa9fba842faa988470a10d093274e9e8441e8c9a947bc3c528018e49102d4af99440848491227424e9eecf048499204098f1425198a4adf8059c02ab73b3b7e5a28154516eb7fbd4e3da79edba5242e0a0e8dfb842888324219a18c2817859bc211756cdc84b62bdccf599ed0bc9959266c6689727b223db9fd532a8a2f25f115f1a85f8d8427294b14b1883f7406a211f147ecb181c84fee69519892e4352199ba98baf4ab817c9e1027e227744d4e6e9b94f4ab19ca3dcd47ec422ba594d298bc2590474a1579351f712c25dd1dc01d6612037778c93d5e52bd7aaa9f288a5d9fbafb62edc4efa7ae455e52e5cdd1e45d65282e5606faa9729373930a5465bf188a2adaefbb58e929f5b4538fef3170879918fd74a55f7da99dc48f1fd0e91f958e8dab1e51fc67346f7cb8242b530070fb5fd177d4312c7de3633ac2e24a94dbffb4f40daae87be2e5f6bf28dd948e8da7a2954fc77cb8a72ba5f74f461d3b1d0a06aa235714c455bcabcd4c98dcfb44ef1d1b9130cffb4ea7d3ca5c4e1f23d12a7ef212f1dd69157faadf3570473c7962e525f4b444a4d5fb09057c83b9f4cb3badf462f56e3e5abd37c84c2e41915eac9b1093de7600775c9ecb13f94a2cac4cb900b8e327d2ca23e5ca955828a162e34a2c941c91a0785e52c52554acd7bbf918dca63011670ec471228d9b0d386709f1f212cef9803e214fac6376458f995c480f713abd7766c2528817d2b73b4bc14c4451bc27c5f8dd93287af68768a9c8522ca9f4dee91ebd1c33a0cb91de931db92bd19bc021bc2b8a203bb95c2251c0395ce87700772833b95899091519e98ea753a18f42ba93c2f21476ec2675642ef734c5b9890dce4d4e3bc641e726568a7f52d81fddc57fb6491db37bfa2e41214ea7dd77b22e6e7266724f14c5d3d3f98773e84fd6a39489c7979d1c0604e23bb53fe8598aa74426a7f30d4eff463612c5f7dd80c955201062ccc7e4a6915c8f56ad49e5db755dd77113968289a5ef445e7216aadeb98a5a0282228a7b7304f2799dfd614721d3764ea8651474e245cb4d3e02f9ee7751fcbcdcc4fef8de5db4e23dfec44f888efea3d6c5529c51b084c9d9c9c7ec7a4cde95e8bb9af58b9b9c819ad811c8675bccc48e2c030ef15df1cc03b8e3b11495eff77d2c4595977a4b2ee5d85da49651c03778c94fd701dc3979a775a497b247cf4b8c5cca46ae5889dcae8e6ce4f2125ec24b5eaa4cdc90a433e486249dd219ca933a9abcdc0f6862a1a4e74a2c6a907473b8128b1a50b91f90c4e1dbffa09038f4dc15b98af3688f5eb10a2b274cb49f13fa2b8ba0f872c75292689b10c75311dd7c6e5fe3d2b07e172fb7bb3f763f5b1491474a952a3c5278a41cf5ab639447ca111744d1f24839fa3a36aae8a9d83169e484964b4f938af148a9e231bdd245d7e391c2c415bd2aae7ae45521756c0c8f545d54491d1b5146b779a450e997bc2a2f9c236f1fd5054648e2c8a32c591e6e09934c3d573ac63908bffcdcee317d5182c4b4c5c4c5d445ac7245a3db4132cd05b8337e40de3f090221da711a5d11e425582edb20c64bb0bc1f6ae91843f17eb8a5631cc59b25deaebbec588ad373d0337087a5a094b75c7a76f22d8b3832964bcf539ca3a8f40c45a52fd1f715a02a979e9b487a66725e524b5e4486e21e0db8c350d81e440f8aca4b2ad0a5a761217ad9af51fc8981eac86a524771a453d4d1e47347d391dbe7a03a9a6c508364750cb90039d52c8b921ac4579c06dca136dbd2af3e0f153e1debe152e143c58f587fa830d2b11d575e55e5a1c2081547a838a2a56339575eb0f20c69d9b2a54bc770aebc5ce519ea929454a5633c5ca93c43558c8cae744c8795ca337465e868e8488b8edd1ca1f20c6941450f153d543a16cba2f20c51292af2d2b11d8c2acf90972f5fb8742c87112acf101724a4212c1dd3a14ae519c2329465288b142f1dcba10895478a17295fa47c51d2311caca83c434a8080a6740c07112acfd01422a221231dbb3184ca336464e8c8d0112c1dbb410895470a962c59b474cc864ae591a265cb16295d3a66230895474a1729495292869c74ac06102acf909321a121212e1da3f183ca23858b1424294852b4e8188ca8f248d1a2a7c7a7632f1f549e219f9f9f271d9bd183ca33f4244a149e21241d9371e5651e549e219ea12497672889b4919747d3a21fa323ab24348b76856ff46d70db883aa1515c2ac56d1a9483db557ca454dc0ec2ade266489a11e788cd5941daf4bfca4d41befa5c45e59a20392b9c11b822489b7e78c439a2ed6b5738872bf26c6b576e3f11f2e4c98e47dc5fca525c3c33f1c2cf07919d3ce429eeb5bc59f54c985c22bb0f0a19e32880a000ba940c748ea294d4e4dce40c85e5264dee31b14b6867d9c99bd4914af10105e13a453d55913825308812b8131e854793161d694e445114c5f945f9a6f8207e429e1109b45c2322982b8d48e0e41a9100c995464588eea8eab9fd992b8d8aa0e17af744ed48a44c963c3cfaecc8eaecf817039d8cbac947ca64c99175724fac272327f554c4549c8a4e55a6fda2f48bd5d56f0a08c4efb7ba0c643f2ead15a8f48b96b599a0650acd0808000000029314000028100c870463c160381ca88a6c1f14000d88a85e6e629e87510e530819638c01000000000000004090060483f891bce14e2cb6e235e0c9b075981ac0093534c457f0ab4999dbefccce63191e7cedbe77e0cc127ab79377a478b12a437e3ea8aa10acf04b48efb23486b8fb473d0ed957fb150dd28da124b59e03f1c873a1115502754a7e9d6a8f8eba6797eaa1a57655038d66c0779bac3e96631738665e1a86c00ce7afa5887bd58cf4907c76a21d3b10231f389a73732331cd11836d01a92009643538c4ba87b90eb3287a433223c5a1e50572c7b254ddb847404ef7afd511db8e13423b35daef2ea82c06ab0d38794a754b7bb3f9f00ae5e13771504b44ac45237a20cd3ee8e76f73e831f0a5ba11dcc09500e65e57a569cf6170032b93a80c5fea1d97e6c69b76e3a4bbf2a51eec93b1df02949bac93ae3c40de7d6738f6916fe125b01113961d5561683d60706f6cb31142d0a68624d081eedb2044f9d06128a9769e2231873646be1048388fa4932c7607b819585d43bdcc8d3663bfde62e1be5b8857466018f76a482fc78c29d5298eb7e20958eb29ea9eee4e89814acb84d4e0b94223885168d62704267379640336184988b8ca514308def1889f0607710758a90b55e353350660d72f235ccb79d80c09c60fe8127287e6b60a181e898a75400efac8ca068a831fbc27b42a6e5430a29e6604f900b81c684d1034ed28bb7e018d1ec8322f659f48baa6b19fac5060f65bda5d85673e6597466598b98e0319803512d055c61aa8d50159b068389ccf092ae1f7b43461deefe9e71d5abfb1118f1aab114a3b6f8cde18e170147e1dc8bec21141e170db1993f9dc91e9178c9b3540f1118b3aebcef014d635f53154d756abd897a2b91a1997c8cda1ce30b416394146d6bbc2076f08a729c8860af3889efeea571598b205c1f591c8293758e78dfbd01f4a66ac90614014c33b417ca03e9a02615be89b223a7bdef6f209216b54bf82c5066a2e41b046df438c43a26e5faabfc8786a3b4ad306deec6e920311dee0e4df6114db179ea1f9fa8d0278af0a4013bbaee653a5fea270d3b83a91aa02d73e3b94e0c57aa51d64313bc40dc0ca12d2202abd894f52bf9ab58f58253f0c11b368a917d120bb963e313732c83294307554727145df4f2bf5c0ce4ebf8389335e6e0b7bb6fd020748e510be35741f785fc2cf0b1fed901b8495c923f907e663256ea20196e9d75ad394ba61dc117646c6c0d63cd442d95e4056e7d04d18e111e757ed18624f1839c0cec3440ac28284f494e9773ae067e77f204c69b41291b4b2ea36b8bd3ce407cad1b1ce38c64549e4501a9f6ebae41f5ab06b82dab4c094c800e766c5e073765edf4af5876d9e4bd2ef946bdaed47bff0320f06cf558ab9800fef6c31192b195358543232b001052308473ddc7ab69c3c5bbb83de3ea9dae7556d0ecd71f41b64625d7a1d20b1d3e22f477046174fc74fbc68e000af60763f46b8866c134d8f56f975e3e5d0afade9d04baa27e873228b268b4f46a9a420f47d0c1b8a43ca50a8caecc0095925b8877ad08e01951fd3dd9540bf79f3493c3752679f020282db2f0888dfb962026e9f229e0c6fe1b7a3c20ab0e84c4e962792a5dd953cbf59788ddcf2fced3ce5e2e749fa977a9aa2f24e155ae57cfcc4767e7303cbc1ab0a7958d9a851f18abbcaca9e1d1a37a4765b526e885bf612d03f37ff8e156e92481863caf9a5c1e2e2309403d1b3e15e43a29938c8cfe6378fdc6cb7c4007d37b75ebb3e032f3564722b5ae17191a394dac21aad7d53f3bb782f38b98a9db95cc7cc0f917df149dc8373ed72086afbd19ed1eaafcc4853cb104c1de0ac29ef58e84b2346f2d3d0376220d871e413979974d7c99fdde48e33557b4c47766498031d467e05a8ebff2d67c5756e9f0cac196580ce3859a7c107ae1e74989a151837a60328138c59f8e10f1a195e84f445074f803aa0247417f19c5323aa643bfae63b52d54f8aa05449bbfec5dcb2fec05835f5a5d3924ab5d2b1607f403d35a832e89b8b9029060ed8fc93f86b5217539079bd60c8c168f3b2453a509409e72ac6406313d01f6c7743d0513203edf1d08787bb43b72345b8c0481b7a0766e204135698c092f4b25460d6d4592b6ca5027b08f78271a90a06c5363168a43bc148fbeef626ba166015c1583cadc09b87482f41cd77adfa6fe9c15fc6f3fafb0312b9185eb2e7b80d34a38180bfb88da211f625caec214a86cad9923905a1bd58cd8eb82ffbbd312a59964833c64dc87d5b68faf6585361c3550dfa4003ef040d2baa12aecee80420b3af0259195bff6b4509ed1c70bd53be27b34d4014ab3879aed13f9960d7e31ba7f9cf52668b1f35849d3f1f51e7e08bfce3d270416b4092d34dba46e3c997734c8ee68010054cf0cde5b90d1c4c1bd3b836292ea0b21f5563bf108cd7a426657df97f40319ef806cf16690384e08cb4a4ce4aff7d5e093f9b8955d9aae2f05ebcf45dda5fe5860335b8ef502e5bba0d3e90a1a8fcdf431a0d1e27b67b0a5f178bb05fa0b4e98d627493469d729cd83271fac3c0dd7696051b23c7f0c4df4beb6d23a3d111ea0a81289b0f5a75970594b5529435cae9ff39b2a6654709fe78ded23d4f53b526ac01b66cca0ea182ae6374c63ce695225baee00807d22e8abdc631663e0235a9f8602565d1eb1c1d36395885cd22fafe7706d76b3508938589fbe5499338f00eba23f39bdb26f88291d1daf19fcb263e1bbff180ee0e605944e345cc65ae4b900ae54caf062e243c736e3f2a39931a23f8cf187d71167bbf4ae941965e7b51f4cb54e75ff9db3f80aef40aab62116fff41db2ceeb177629a63b6b7b93f3af716d8a002b75dfb4d32403bad6b0180b4ababa4be330cdf2012d9ee16b559323c3d3ad42078cfc197c54e42cfe522a78d297fbad75e6a2e53f3094b2b51e187017f8da8f043caa0087a6a57c5eddfb205d75004462d51f6ed7018fcdcdba9abf3fa3dda2486711a924db7dd73ab3534fd57f7ce3464b5a4e9d0aa6ba6656b0d4d0fd7dd334d5d2fd17479ed35d3f6b52cbbe6c0aafbbddf48c105c372c4748af509d33ad62ba6976cf61c30cd65eb1fbc7fe7b6594d6966c2693ea2340a2f3b87ea635a318cfcac4717a278036e20bb898e62af1c17c0e8a13a52d6572d252f97829b8a567752e545bbe1b16e57adab2ec0da02297292d817d1c9d7361ab1cf2d76cff40ea66e31633e39c8ad341f55bf67aff92d432e0f4ac9c66e01dcb78431f22114adcb83c0710f8a9b823ab7d0219df6a24c50594e8e97bfc62ccd0475bcf66dbd2c616c4e8f1d7a6f97f446747c79b35b458b804a39db53d15ea0ce887915a93c3999a91efcf5a8f4e1bfb8360b0778f41aed870d0097118cb5d2e250232088b76001f083da841c1a43b0fb37a27c460ac6a7c851b6919a90430da9af5378f84ab0fd3267bc0931268cfce6d51747c9f997586c6d8648f1f3e7c4416bc9baec3e6fcf6f687730cfd81e76c2e0d9b34d7270e509cd486df7e0b39101cd2dcabc49484061d1e59315e8a60fca75cc1d244e8a935e24e8c5178795af3e4ba41355b219cf2034780087b419e24f2620f9cbd1a7fe1cdaf80a40c1701ae219e143173f98cc6e16966c883293aa574738a38b81eeb23e94fa54772be7a112dc5baecd825dc7d0b971c83340895dc856f4f0375f3bef4c3b7dc426ba56787236676e3f8436215a43f3e4013a15ef39751c651f7deb62ea0086fa57526d6d6651015d4c2280228606361034cb1428f3964048bb4176596d65ca77bcf14d781a6672f96372d6488e42b8b073280883d36edda1dce759711b5bba87456d1196842191670726d66b43dc3d8d9e320d1ff84ad90ce871fc2c7b96801ff63c1c6921853f062ff1e3a7031c58ca0792c1f4b11e0a89103bade05ba4e7fd326ad114b15e2ed3e107f1b200506ab920bc1361e2f6832c8ef70977752cf68759ab03f1df9fbda6a28fce91fd975e545f04f0728d0d2bc8f2c607d63d0d62110f292ea04862b5bd4fbef2f6a6d2ab26af197891b73bba6ec9df972eb6d531de28503637e55c13efdc7d2c9cfe7ede83af6d40e42e0a93760f720bba1831f7cbebc90a909ecb36439158d4a803e4b56a7806578695cfc5c5642be481be1c1467bd5c3807acf9f1158d0d06f81ac6a2a174f007e6d18ca2012472d0f77d8eeeece13ac0ccdb4ad111818492fa4646f6f6b8b838e24e0401978357c2a649a4c3e6dd551a62f7b5999c65f439477ed57eac5ab01873e384eaeb1a1c365e81966e115c3f0169369b071587c38a2a78fc9e980d7c12bde2d0136a8e8c31ee533ee906ac05533a9e2fd6c264e8706987390381e3cf16dc0662352684eaf00bec3c139b2a5649ef820773c036c03a77c1e04b380f76cef1937328b0e8555cb156e018f6008f35e3299701276bb265ee0f3ac753bbef12768cd2888a1b8898e23ee072d438c2c6c0ab3b8236683ac3ba650b4ee2428e21aa1d7f8d2872c60a4baf19eef691e86ace1def2413d7d66047ae7d9712507fbf4f25e7841d382f2e3c4e89db45271501be30fbdddcb7d4e6e8c4ee10ffddad74b6ec3093fb4437d116899b8e3258b5d8c9486cbe015b46c1f496296e52f7f20ec424245772d8109bb9f37ca3b3d4ad2767dfa9e6ab3ed951f99269ec460dc99e90a03dbaa090fa41db867461b7fda85b6e8ca1716085eed4b62493276f92131701fda3d6a33d80367de31ff3165ce6f49595be4358b4d5b151fe269d44401f25f0773cf69c24efb1f63d2dfd3aedd1d57eae48bd98ae9224121c866a953c4146cc8d55b24144cae591752d7dbb5d1e9e6957be1209db408b1e6fdc11cb365bcd19a3d5f82928f67e59e8dacf95265af1b34f718886fc62e08b150fb71c501d63deee58c97eeea4810ca7bdb8f5bf3f28e493822f5195d6f8ff33a1b76ffc480b06db80d7b229670149705847578236504646b6b7b0b45bc3769b7cd86237e45ef2f099287b14950653288662031f4646d8f5a86d48355f0eb18502da9f045ce67c50dcc0aff6285ac3404485370a438cbf87780c75e51e128bb0899bc8b3e3b9ab2664bb4b8bf757b49d715c7bdb774bd1b63ac7848ce0886b98d4d0b503f461af6abb562ff0ef0a8ebee32489984b775db84bf5cf7eb3c13a6f07ee130a7bd06eeb1de00b9aeea9a5583d8a1ff27177504c6b5a1a59a91902fe0281acb6a419eb425a45029b99c3528e3407b70da9f9dcdfc688b98b3268071677a3bfae5d5f7dab5417fe8a81b0e91107ae6c26c06a3da65580df8a4cdc49e63fa1538674d46456f6deefb14e651edd918f78a3b14e7c62ea1b071bbdb3369ebbc0ee56a12f29128f41d0d5297c85f0b676d98caa3278cf4fe268f942e8146aa1d842c368d01dc2d423181ac52ef89097b3f0bea8d1888ff78ae2901bb61aafc12476f054f4abd75a3783e21ae6e48fc806c3224d131be48ea405c42f583d80153c096fe429cd1a0f971d22cbc2dcab10df2480e0679a1cfaa891790bea3aa53fbd11da58b0465e89281db1b05e431f6c5abe69b1a29dbbaeb0887ab55af9265612774e8fd1ca5271603f38d48ae5982dca74f55b2e5af1640270ba009186dda94290c572ec15237285dc4729eeeb1303150544f1978559bea8712369d751d8d3ebbf557cc53b1178502d4aa6b6fcf77a66f39ec76c7d5d92e624a5d80f97138fcb2d0a4596130e8c89d94d7ab9002d1a62516a5624a9f0ee8a24163e32516fc4b905997b38b766f0f9782b182f1c8bf285ec87c721222cb974b26f35206d331e1229f856069b285841a9b18f150c640784def82cb3df961f0bd8fdb1a31d4447cd376d9da57a1ae15ed061b8221e67fb59fe2ba06a6f1cf2908f9ec1f341219bc83936a08b05434396ce4df17d3efce850fb5686263d87a7434e2250c21ddfca0f009acb310917df3a729eb71845a3f23d92136bc7839002fb8b4905e272ace3c9a023175eb0a6dc2dd0340f44e89244444c36217ea1f371b64624445f1309621a416ea42563886e73747875e7bedd2bbcf6ca068ff8a0cd828fb3adee533be09a0c32072a917336cdffcca7bc950c65584aab4b7e5c998ca1954af189648ea473ae27dd8ebdd8c91a326daa9440004b8e1a9b3d2dc78b95d486f738a0bc43bbb3363a161443618f3558ae8c94120b487fae597acfad800b412a226b955c9b3d04dc2aefc74a20cb36d33728948242f0b00cf680e758fd305d969bbff6a5e51bc9560af4b0b382ef87892096606193c12737d8ace39b241438fab70e6a4d5ca7b5cf81cb493ad54bad2e7a42589ec6a82805f975b3d6f81cb2785e377cd84683fba76af47f1709e1980465c3f9ef005f5ed60086834ba11dd4bfea4ca52319be02e5dcd3d4f08491152caa1d27a15cd05bf65026c08385f61d2c69daa7e1b50e36e457f94c8580705aa799ffb000a9954dbd6ffb805f458cc65618c478b25682edcaefc67ed25e9069186f4c4477f2b455f68723a80a76297acebd3696ac77537b1e66208c7dde348ecc68495f576a84fbf8730bc5630628b41cb26143a322c1246a5d58b2081bf9b38fb3510acda030b02b7aaa52ad052ea891528e922412007c208bc1571595cb3ff5e0594ac3ba1aac881f3fd73dcf0f4657398ddfd589aa91bf610d620aa56daf57f85f0dda5e7fe4a6e33a86c0fe3109ded84271e90f811ef953a456ebd56b071a4eaaa879658cb8e5c0911fc7263796d32f2a64e01448002400512723759dbbbe00d28897495d9eca9e7c612faf334796646c49e4783ad37390eb11f4ab5070cead4287a71bc08d18e450c0a3690c4013425437432cc18095e927f415099bb5acbfcea9efe15f7fda83a81325536357ca15d77f3590c744bc7223fabecfe7d4992c7c9bebc28995e4eb9b364f2d4d32b6c0c135fad837f6e99589924c1c59aac5127c40f46f933ef290a3fa52c02459dc7bdc0efe30918a74578f3860609adea64497396e1f7e56628be056c916f3c88c76603ea8262a4f9621a31fcf741815908cb6eaa2900a0b06e4f5ecaec093eb2fd1c01ebb12868d9e49f2980a4bd149da3b71086aa55dcd5a37a87a86b64aa2bf51808fd21b86c37d4536666ab62e6217c691e2b8a31af8788b3e3a04231774a127d5f27c59a790dfff1b1505d3e97e7031e8d8da80feae7dd4160a93abb5205c48a201e20952ee9e86e4330f5515ec5a8ae28b422466394bac9ed666ca0a985a75150a09adb992a66741c9a8d87cd48487d128d50ca8c42efa39e423491eb99661180e3cb4c97ebed81b091d4fad61170eb4d8cc7ebfd80b4999aac873c91a35c0ad2c28c5203289270c608e989a11819846758d1e9a4c6d4805b579a54b581811a3fc62f87680c1552e5e860794b3b5e34ca39b39724ea6bf5f46ca4efd8124f535b5c19eed7580f107cc4857d265e9302cd436981a4108d695ff9b64ef39f3946534e73a1bf5823b2e78a302494beb4fdb69047c7ee83893156c5244f016052b2e65a6968171a3091306ec6a538f2121e606ae3e0f1ae3e9b0d131494534b35ff9d4cf2c729c1d1f13116542c4ba78434b40ac4b12ad53c4f02f2d93d332b7fe7610fff09fec8b536e172b13514e0e4d9e07cbd35d20aea620efb96d78aff88a0430d2587c239e32b9b8c18619806982b2b84afb0d99846e60e2fd6a9e5d313a6c133f280da2d310f8d4b6f142c2198428c5b89a17ea524623e2153bd86e38dcdddcd9c2c32b91b3af013cf7836488213502d629c8eff77a2b2139b11492fbc6504ea69ccc75bde974c5feb227bef099f5be693d00614c7b65b4490c213d54d205e6560692c375b9c652c73f083eed9c9030bd801be67d891b684bfb7c8944ffb98cd50e1814120d9e9128df352ed201f4fcc891594c5490770a433075f78d8000add6f112d0db24427764c397465018288eecd550e26db5be6551d29160218cd1dfee53ae7be5fbf432a25abc3249ef4df8f9a8c5a82e2d6a60803fd4b24957e6e0565f104e7a1881628c840946eecb330930166b7e1b264a44fa7b8369ef332af0b7d76889b0f64f5561e2dee77f69e7e9a1359f436f85d01b056ceaebc41d19712a6a55e732647e2213b41874d1a08b02156f7089df826ea53f64b6ac7f83ee7e99326a36c43ee0f4c14104124734c95b80314b1b24be4adfa326a53e09916bd77419713b2b6c1fc99dd38564d0aa8e0a05f878651178fba8db6f52078092740ee6764ad681d2e9c7a2454be91022bf2d411b1d45d84777c2cc4a1ad2c2ba670d8fedd2f0c178422118bc88effbc911963059ee852db54e3a9b082d9720542afc4cca0cfef8bed470371c6281e960eb8db67420fa89a8382052bf67f618c714193a4fa788c867ed42f7edeb61f2bf080e4b668a94c97f56fda1e99ee6d673751c9ba15b1d2b5adb2836b7c5ac44a353243ce05b82b5e393379fdcd43fca4cb343322a77ed8b4d6203a58496afacc73a99771ad08ded121b8ee5a1d72f07a747dc5416dd5c2ddf9d3129b11a86d46f26dbbcbf81d6ad5d68932f92c42dc0260ef301e21f17ceb9c1cac753d9b32380ef69931abfaadea4b86d17681f0c6dabba153b3b6eaca21e064640f192dd2ee3d96e0a6c1384e7a7256bd5343c283256c2cc94e953361edf95aa641130d7409c8a9602839244822c518ab22a373e8ed7fea5442445036c7d236bfffb7ee8be1f6be99e0ed0b8ee2fe4996d554eadb480443e11df34a4ef523483a41fa0248be4c11e860d81feb7233ba04d6d9fd3b6417fc18126774fffdc8f943373bf43badb109fda192fe7e90a6507d10bf4d12f1954f8442f8830d4b6d650cbc0b90198d77f3890eebb6646b5a2ee2c04669eec33101db82053914f079ca6f12c3acc9ef3d49dbdaa821298427b197a6b39a486c710d118b7eb7845b9a88c8a4e2147827808a4210f1e016b47788bcd4189dc748b6383128562e52185c5889d4c376ac5ed31e293804e506197e16e03f14b96a84e8e40fdd10bb6ee20df36053f588da40b9b92c3c2440add3af4ae13514149f45f07e392352859410a1061b0193e5184d33eed3e84d4ef27a042474268a39e192d84859031398d5c3ca045b7396c4eef31f1523b8157e2f6583abc9d57575907bacae418e27ed8612f5c3d1238ec85fc469832280e09ded74022bdf87e1fc10cf707527071c272ce5df1cc5686688afb23b892b99019d7e7f400453ad841fe8d4843dd444297ca43f82687d53bda1446598ea558b74fe31a9ab3c893b8594a8a0a99879414f2df7082a2b2d12c45a0a108a9e7ff218e4dbcfff35f22c605babb5fd378e3a16c08949d4855993fd2ff9f6658594b6b0e9c0ff8bc5e7f1907279b35c9ea481502f1631482d1a690541b02767e437c6724d1a2367b561202579ee568ddc99dbce46a525cb655e8b0fbf5a112f7161f42092ebe431fc915eb1df6bd2fa22f192cb01655a6473c6b7768d4b31689b04cc69b312bc7c51a80a03a2481877089d1ae3db7a4dcf9760197ec0baef5c20d24e0aba6373abb09e19bc0aeccbda4b579fb9d68f0aa9d5465aa75f9a615e6f879adc12d595f49cf91ca364e80319f2e0fd296c8bffbb53522d41289535816f12bb8f4496daf14943de38dd3e9703702bfad5b5d0658ec806cc1dd6a6df9efa37d45c61df4d699d8f39ee6e35019d60265661baf3266c487b79d260fe487437d7cd187501c8da3876010a7a13e9938a4117a5a66152342829d0eaba3c22e68fe3b9e26ef311cb7a27190e9f035bbd68713b7daa4bfd98af34f18d377afc095b242dbd43a19d8441349ae52cc77f2e574f6e318405bd56b48b692735f5e61ff80fb6a6b72838a3babaf9498adf74b609866fd54fab54eadc5052ea2807588d36dedbca5819a376b6dba0c75c1e787ef7e1c06b320fc3087dd94a81bcff23feeea040a64f21fce6de8f2b5e74d41e53e90e41a8ec2af9b1d297afd5c4bc57cac4069921494fa74157c40b2aa721704cafe52822f9d5ce6157c14840accb1bbc79b450b9f97e98e5ac19f3c0837f816cb22c4dd3b2707c7d93c854bf3e7a54e26e20edcca8ef9557fcd9e8be4d0b8f0f5f069e1176d96d4d5d62aa8066216ce4d2757e1f8278389f64617d0f5391bfce20a17bc17841e079014fc2927207b45587d39503186d5b84317c9c2136666b0bc640f359138aed047cba8300e3f175dd4d91ee7ad4f8c4b2fc82e52dcbd3667a03d07fdff85a5694b8ecebbdf69d312549fd940af9388c6cfec52c1bb7a6511e60ffecda6d527eebe3b3c46c0c515583c3d3907c2c08641ff2321ffbf7b81402c146ea43fe9a0c8cf45cc04979040ea4e65152ad8e94632120464fa4d05eb4c15688a4898b657e8383490172d31325405e6a9938642a456b455fe4c2570a4b72b9fc1ed1b99afb075be02181009768ceb9fd36aafef8725a3252b7cf96002616ac0951ce7b41c7838db45bd55acea81f65ea20b746fed049992e5f20a49c501ec2ac553e52581db81e0e45226664d70a427f1583086947024b4b8d2221efc9054378315b9565f7146687e32b1f33db6317ff7a3c39dc54a73184bf2825918ecb1fd1a93a92601f8aa9900e3fdd14110cab9151c75a9a3597422207c9d857d79ec07589fba0afa80f2d56ee019a4ac729c06bc636482396d08a4926017914da0a2279297b7c68986a32b307d9206dfb1294e342f1b2c7ed005d5a4b576444ac40e8fe45107aa6019d80b7e2ba3580a51e746991d4f23c9ca19f74124404219e0bf0edbe7c5e02bb14719a648a9fab645f26b58c79038773087ca18654ebf86845ccecbf7ccfbc93fd14d35b73e117a9b807cc6d6ce25b998226d80e795d65d7b97ab795f8b3bd2fa04a985dff774373431b2a48de288ab2afff60c60a3ce92d11a1d5a419f5d85ca6b22aef80de276449562a8d6705363bad26c9a10b33ddf8a60554db830a3d81025d2985cd23d93c075a8518500089ce7c1b6621f07cfc2ededce85c9e4a1934cb6884c0619ff1d338a6e5caeaba432f24a201ce2c964404e512a234ba1afcd990e146864f46d92a4774bd5ad9f6cae93cb2651108a8c7e0adce7d6892702cd29ddf165626d9a33bd705e3bacf33f88c051270f121e164b65b2b443ac66003dc318c47bcd7acfc9278750cb3496a273629fab5330bc4eae4a937e5d581a6cee1fee02a1dcc1bad1911f7c785b2473daf864781850284128226e078bbf57bddedfdda832631b1511170639e5893bf90ca58680f6e9c2f32d966487160ca5324519b9be556c44b0452bd8e10fe5be7ffcdc961a9873fca74b492a23f676a63dc809c6e16908b56994cae0edc7238ebbce8041719417e5c205858a9cea7acf2a05c97b01ec80835d31fc8486ed3cad7b3bc03418589ae7c74b775136107325b41c0d405f46f4b643bd8560e94187aede54127bd79f70ec098f3a4b1ba4f43a105bf18602078ee8550a6c58aeafb8a4b409919ef81768a7455e4bba08ab7447de059883bf7f830bc11e10c99526d117f97a2c3f2c76ca6161a2e298dcc20c6695a0705c81b64ea2fab3bf5dab926389e63be867068d13958ea84f3a3be5d74834fe2fe81746c0e7381f7b73d3e8e5fe3c28db96bd5ad74f7a92b139e8cd1d436740d21f4e330e0e6ac10cb9ed98432072b111e6cf8b619f379b9908b7edba0659c65ac39694b966803405843633137161bd19042970730eda1e16d13477aecbc8e4aa72641480bcd5da41d67a2f81ec24cde8694fdfc8642c54090c42fd5d70b58b79c817b478792ee6b302a91b0ef01c4e2563eb90f65940d66a10ac9143971abf4aa6e3c8e670b10684972745275a88fd418a9b8020c25b5e487e10dc73048a88ab407c0190cffe5a0098fc51608e7b89015692b0e977258d7f95465bd59e582959f71e318d37083ed6eb90ca7fec9a811e82a7b6c1fe6c176a071a826b3aacad1c7d483ded837c81fee7d3ee4f627c8b01c021fc3b3780acc2d1983ad77343ca7a5ee20ce16970168e0ee1623f3b223e94dd4002475808f8ddcec2bef023e9aabdcf0a86eb01050dcc36370efeebcc5f72adbe2f032d7a4869a9a6d6a22c1eda10774ad05a530b83c709e0c05cfd885d3d3512136817fcc34fb01af470c9dab5069eb052bf62cf869a867ba6d5c586e185cb01ae47436bd0982f095b172f0a737ab63e61f18eb358d734635fd309538fff27df88126fea9f60ddbbfe55556b1f8694ea7c2b30ae716b5d98f9fb4e51c1cda066d4cee8f9b602cdec802a754a7228dba01e167d48bf4189c5004086f3d613d65cab87794e50191db2f885133f6c6c74c0baa42bc1a2d1d06d984b13d85743d2a0d4a5bd2072fada31ea6761566ddf9bee1b47d708ab68385aa51b13b94e18a71734c5343052f51b34e2d51d144dbb56725cfcb2dd22d3f4c3e8ce7398dd391623522e66e9ae903b1d372cc1d6c4e06903ed1a77a45d8bc8ff22eb3de6c5bbcb84fea8e992efdde3a9487984d7530b788ee1bcee5cfe776dbf7048ffe46da5bbeccc00c2ed156fad5c2021f6dafd757df4cebbc6be5398874ce7dccccd5969a996d5a7df073a9eb75252d667a976d18314b53ecce8df08fbd98788bd0735f3118a61a74a82c9c3b97ba34e4e33b7622849f7e25981115ac03e60bb978f99d15eafbe2107fd02f4eb803a73663a4a058e813b97ab0935280b95900486dd2878529d6bb846332d71791281e1a7706b57bfde8283d269913e1b217fbd44d7b7a5f39e843065da00eca984fd2a2c3f286bdc39590f2aabbc05036e69775b498f5399a524f94cf76aba8103c6c4875bda96930296a3f07b04ddc101b0fc54781a8cb721947dbd5810da5a725b0236289856ad75082a3ce7fa560d78ad14bd39d56ff840933f9e8b5fb9dfdaffc5dca996f1c88c0d7b5c75d724b5235d692c1f2fefba701dccc188c7fb0ab1dd8f74b97bd3f6041569ce13cae93c144ee1c736feb647eb73a89d5b852720e29f52fa632761e5db23a6921c755fb165c99be03db749e552e3056758609b61fbfedce665a5d48fdffdc39a88e1a37221549612a7040b9becca995c08d79868834a3925b061561cfee6a93581067ef6252e522fcc0dad711b0819cb9d0aeafcbb90bd1370c7e4a173095d60d793889d68e6ad9a118f8ae5284ac68f39ba236779f99e1a198012ba5b563c47eaca4b9cf30ff6ed7cd9e1e88c9a7777ded92ce559997a21077fcbe5e5f99cbb57b6cbc7f1afe92cbc272a63ec984d10f1f35ad83dcad83433caeea1a24cb22ce2f83a0c211afbb328f561c59c4b420e4aa9249accbad9c81b9547e4679e631f35a1ef1c8d9d6190790460d5adac8283005a2ca5a482e331856beac13fe61611a3d491921e45b689a5bf34fb47b31ce8c10419b21c37829063bf8e6d8ace62a3a21253a56a8a5f8afbd824022c602b8ce236c19be64566c5059a66196ccb2e98400f93c10f12609ebaf8417da6b1f64dc1ceed72bf370e42a83dc283acd69f817633fc0deb3ccd2a05022f406a754145d4e799af3ff6f930e11de6a1b289872689ee1e1d72960f91ba35d973617f57464e517098d13a4fe90196dfe50a1ccc493d2fd83599460c745cae975f6ce1d628b81e0c7505a04e92cdc02733dcfdc33049e89f05386b435c321cfaee74f4bf6259a2d2e4518fefc48a7885c15658985c0b0861a8b8a01436b83e8e068fff8eeb10963133296f9c702396480ad12e21bff5c406ca26f68f0ceff5a0a5fc6f2b8fcdf6d90a41fc21a8a5410d0b59e565c0bf0bd65da2fc4be897cb9fc8cfe548a56420711aa8014e01a7c9c648a259b2ab7b7eb1ba351507ac8b4c8172e60cae88634d11a17dda9e59386db4d857197fe2afda1910b1b5c8ca7602bb5ac88a120491e14bf85e0f7aa6625bc39c8fb88d44786d9293d2ec5cc3aa98791c23842d7d80d270e0a3ea473d54c938db0411cd3b189b1cb5b3bc6d3e49ad30e59be5674a2dc3fd6ab084a053cc2ab92564e43ab7fe668ad365490a7aa8e577e7643cac9e2b34fff9c8a820fa7658fa43ca800fce160346f5110c2fb28918c25d20be2988feda04f8fc6374eae472596be6f4e9d6d8167a90a1f39c2aa2b5ca328b860aa41c74e9fc944e299ae94082488ab095da70a7cb17c2dfa76a813972224c705a5db85b0982977f7ad58f0aa2a417f23edd71f522e18a4fbacd842df572aa4233b23197533db33e882c2c44e8c6627c4cc00a4583167e83a11884392eb3d9c1bd8949a7660c916a2c8c7d0c4d1f079fe0993e53fa7e8a535ecec2e2eff7c6c1b27ee9f5df2c9e52186655f22235ecb4a22a6fd89785d3a653a1fd33c0608f4590331ac3997489959290df2d0c85ee5b157bef9002177903b53c33a05900884bfcdabceebc2c7af3317367ae306a4bf04288e789e511cbb4e619cdbb09c360a4d52e50a677f208ce1bd12f7b988483e44554f9bc03bc8176459b66791fca32b2103b86996a9e31cf20c9961912f893d01fbb46491a4d85c8aa1162ae69369a585cfdd52df02e23391baa5661a756d64a0bf488ef700ed45fde6701aede2513594dabb57306934f6ec51180bc80eca7bdc1480bd86feb21a11782badacd42872087e594f81e0f200fcb691c492e18a5e1868a105923b09c2f928999986996d39f612c99d4910e0fd1a5f8a358627c9da9a56f25a60f459917fdb975e64a6c6ae28097b1f622f1b83f63a066d3ecef2cad144ca64e1a240a5b5332d242026a4265d9881c3f12521b4563c045cbd1747f7090bf2eb7fc6d1dbef4fc7d33e54a2f6529d78ea90d6a3c5bae9529092f4494e342bdeb63ddb1846e93909d06b34da774a78d5d9805e4264f8314cb36644a7c8e3561081db160d179d5f14086324914bb7293adbfa3ddc46939faf0c344d8bd829908fdd4e1f80edc4835986da2485aecdcd00e293889b9b3349ab593194fd44e23b36665bd82ff73655c379753546e9737a033def049672b6ef639c7aad85ee0deb86bd6fa3a0b7b6654a0e6a40740f3c8e8c120811aebdddc4287fcfc121c16d9239b9077885e5033d62eec949773910cc07472d776cda8a99b4dbe528fa4857454aaf183198a30065134cd3e405b0d1faf01da499761862c78fde626e4caf66d870c5634e523fb7e70d9f1d7668b9b2d32c6a68ab7b339b6a714230dfe08dd4ce7bd7cdfd35dfda908f93fd260de96fd7f77c18d89b5b1ffb112497d0b9f386fea9fde20272f89d5e7c42ba247a058b1db46cc57d58fc22c84042b4f85b9d66e7ac8e4e6b2d8dcf8ad87d0ec5d4bd520dd4d8d541e821f8215634e6832aea9395ad983fdbe86d554d4a8cce7f50d1cc4da6a196d2c38c9ab40ffa2d45346842539cc6051f8b617cffbfd145579734e35f616944a6ec2b2b146019ebb64a191a484ac27191adeb5dbaa4615d40b2ccd41baaeda53a9e7de91a2c3b6dd23f5263ea669cdbefbaa0f9d1e710348e46c182fb9058e43dc4145db0fb06f681815fa40a7c1a022971b16ebc5357e2c0af01cc9c3cf3d1862ef58a255e5dc4fddeed7232a154fac452d5899ed276b997d2c30136bb1133c1d7ea8269bd464c9d8025b3083a39b739836815d5556090973e82110c2440a0ce52996f6e6f13897c4e59e1a28fb31ddfff63a92a240144727a0b8bd4ec4d85b2ee82fe8641555eca1c43a69380ee0e5aba936e5c0842dec43a2fae7a8e82f67f8070ccd1ded5ba738918aa3a7fd06cc7449eb8861952a07271aa949ba28a2e4d48921a99f216de7484db71c8f7c74baef2222cc7766d22d2460705cf17666f6c8010a1b348388294c4d3579df62756ccf107236357f346870a0a1ecb2f83a63c0e587f2f1295b8298b187dfa874c5055f77a9ca33e42039cca5b0ba45aa3285d0ff76346cb0fa73b2d6f12ca4ad1eb58893c1325d9b43718617194d5967c26897fdb903d011062a5dae0325d103089c8b27658f29eba74e599708936d00334de8f92d57d8b1f888baeb71b25c3028965bbe7426353d3175d5b068655c68cdc9758081da13c1ef6d025b390537f3f085fd255867d9c561d3a50bc2b03c35755dc44bc74f34c6282595a0efd280fbafc00c83b168daac85ba92ca7ba2b3416f6cbf0918e630dd37021e10fda61cbdd38d3abfa0cb22652bf65ff7248acee575dce7fbac107682810cfbe193269b80002e2b440fd7daa427bd53fff28d3f76933a5acc290a30ff4e70409748827c3892cf2e10f982df46b02974bbdfd6cd8df5c760a19ce11c6963d377bbaa33b43c9b31766debcfe80f1372daefb95695ee4c08bda6a69d244d471e9ca994dfb3c984d4dbd4d4470c5fd22ef340123f4c330e62f673da709c0bdb2988f1b4a9a9d54d4d3138ab83d8ff9aea000c8b21c17115ded43497acdcee805354fd3a5e2abd99e1f930c8e0797f150cf8f9eaab373511ea104fe1aecd285e12af932639f481293b696e288dd870274d1b86dbbc7890de7a37338598875acbc7ce9c5e58655656e49d93b1ff09fe18c70551fbaa32f90b91685155aca4bb76ebfe055e85c8bf4dd2343539a611f3c6fc520fd13a4346f36eb8673ba5a97ea41172f35436e72601bb113856a151d4d202efa6343de9ed43d4366d03ba489a73fa76845c99a88325662b6bbe8945364d1aeee5b106d2f732b0fee1bab6c9583d76f7e0145798a832d385bd8773c07395af9c54b61ad4650aaad36896d9eb3abb5dc8abce3ccdf6ace8c32420f8754a9db901d6b4ffb9adbabd5597fb29280031ed85c84528882944a7811fa1a3232ac454ed4112d00dda374081335f5acfdc994bfe7df2ef20a6d4f6c0a896aa1f49328adc16a345c00ba6ec06354fd21e611819b5616f8f332dd820c7a14ac3a72fbe3a670d02d7f8a453269b6bc4087a444162e22d55e7bd543d54c2fd0536413f9cfd3103200ca23fbface7f7f2ed2c74ed721e5603b6e4c7d0642a2473dc3a1d61b5d275e46ae7e1dd037cc130e6fd7864a9cf1bd834660c43a0879d8816c5c4e4c1ed2a9a5282c0b7d09fa31b6d8714fdd2335603fb6b61fb80889ab9dea875862a184ef407f313785bed6d47146d598f10958f16f835f7b4bea250ed8565d8e9c2a28c095e8a0bb01781739810ba9a2acfc11577cfea4c9b36af4880e8a3326d627d95e5b4981e5d9f6615af1e310352562bb2097ac0a32e45cba99807cfc11e3ad80db7a521e5775c69a5930533bab168260c956b748aafad55139a28f89a42b65003bc9aec7712d338dbf0496028c6102bcede54602ce23a6b93d293343889c61e8ae01e59a24864a9aa1f8a32876c3701203aa2a4193b643779e3a170868d21f692fd43961856053fe46eeaa98f3764822ed38fde642560cd3d32752b1c48b40d6261f5cae88db1595611985423186e1f54e543df684d745be32bd795dd76de2bd3747c88f5b734ae74ad14a0d62c923913a0b5b4fc0a899b586b40c4a4075bda4ec0a636c5affd1aa9941b13ab50a7435a475f9abef11080a465296ac088e43b263dd4a4c4e7124941ba1f8e281924295427d56ff07fa60b4707c03d6da3f317442aa1e8848fefa01a1ea5a260d644c743899ebaa289000cda9605ea90b5f6aadb7a79b6906ad8c5fe83158ff9215360b49231ffa8caa61f8658ba2c6ac569a07348a8df842a739bf857d859df276971989c619a1a1b0b6ff390bd2a2b7582aefc0e1746bc7142cb5acab5037fffba71bfcba4a55387df7bdc60f35cbb42436e5ef51a1c127d2d0fcd350b6fb51cff269cb62045d1675560a086780726fc5d306b4514af3d9a67192b5cc115d46bb0dd4277e0c046731558130c8ed722707a2b94217a3220167a211cd61cfb9abfc861482f4ab94533e6abfdca08d2bc8f6503f4056be07a065797e08b8c25be7a6a0d3ddfdfa5dcbf7ffb053b6e65b603c87d1a3f8679e218ebcff813d55e95ca18798503cb5db9a105be5dfde1cc72b4a209cebdf71d847697cb7ad26a4db04c565f781c58a45e750978c48f34fed5b659b0e4ec60c32aa176962c94094b2372783cdbb314358690d8252a9b59a717d820e8efb0caca67396909f19dc50568966456ca26783eb7b3ed98c067456d0305b3a935cb81abd27c7c87992f9ab2988f8154379de5e62054804914c411587dd37eafe1ced5e2ecc6906c84e9b6cf31038b1583621464e5cbf2b57c3f2e49dcc3e0c64efe2bf6286803208be8a662bda58c0c27fd9feb6d0b2c3d81c4eeaf0add21316137d0307fa2b636a12e8d1224dfd6be716154616230734f6356a0064b1b919faf428e20c55525641c76894ac790aa9313f70fad69ff4537392796efaf54a92a1c997700a4ffeeb3ec305bd8781a567c58f5adec5567787ff1ef321b7980385c5563926a6c3ba8ae14190bd92cefcc38fd8296feea2d4925b7741cdfbff06c87df17aeb1cd32bfc1b3e339c61a15e1696b9171d541ad16182660dd507b9fcf90f3682acd72e364f871edf6d6412ef5176a4c5f943b065476fdff9345c9358ded39ded1db6416d5c515f5fe8aec7211557265dfa4f3708891326773f774bec08ff3041b24484e9ec13c231a19cb6354be831a493e7cd09021189782ab4e8f80b6912017aa8a91d030e877302ec3bab5062ceb063726abb30f5a5e5daff0a6d68101154d3164b2e80aa20a444aa3b453209f6609fe15697ebcd4cf23433a45cc52947c10069374c27b4b90d2c380a8ce62e187eb4d8ee48cde26a64b5e2659e53cf607564f552671cfc529d0a98f36b6ab633c2f715f94446e6142e43fde21af0215796a35f0cf111ce86966b39f20e0464a5e69d34fcd9ed0bce5f5f1c39b48cec75a60b05323daa1f1bcada62d0bd6b5dc38b5c4e4971b2bf4f981a281dd020ec50372212cbe03d5915b2b7c4bbd660421d221375e2c57e7714f8dd897a42edc6c5d00597a57bc1020ebc48c28b04d73bcae981112dccdf94f3e11c5e462d1db0de5b9bae2a52d2aa32f99703d3371a9a82ca1cd040dfcb8312b939e95e3b393cc6827d45fcde813c5278da0d634f97312bfaf4a760be8bf74ef0adb4c1b525eddf5f6da5744f8e502854532fe7706fd339cc5b8d16fff6f9464536f4731b0709a902b6e0b4bb0ccaf02604a3d1fa2a7ff3f61228ba8a611f9524abecd42b4591217558467883f4af2ed9054a70e47eaa9afd165567560b2ecb89ff2018d832f92490468301ec7635971b988cccc3d14993e22935baf80d8387c956a66e3233bee362a07201fbc066e5b88a7c2e30275c9c98940165ccf63e56d96767335d064a346d581f92923a9f2d36a171792044b2e032e98cd8ca5c41c2b30c8c955630d30df853d0fa927b274a8a839ea3240f0b977499d044dd3897c7089badc4b01645388ece0bead8c2e338e1306e1ac686ed6207d8eccc85cbc92aa3d90d6d7f92d8bccce0e5b24d0af60576d0fe6ea3109037a938622ad11ceacc15b9be20c77faf2192cad43499af2e5c294beb04ea0907a9d493c5050a4ba31135a95e5bdb2c22b5a833d807b0b6028127272e7048391259d703921d33630924ee8c554521b4871a7b390ac30508c9462d3280aa74f4d3d4824bd4b5c1746ed28762eac38c1159ed530c622cb6a8e23c2a07006cca825bcb6c04662a10fdd7775c6dbe2cf454a4faf4fbce995b9e62b080df881a901e4a0424f7484cc266b4a2c3dee14ccc7997ef7fd9a638ed3b35dc247b68cce18cd6e146d92b619cee02636b2c1173b46a3d08dcabf725b5ea23865dda7166c2abf6ed4a57f75c8ce4be9e262721428a684c601af5c0d5ba9e4ce8eb1b314fe0950e7fe1e2f07d3c2e7cee9c39785fc009614f328ed2b0b7239b026a4f2b3c2eebfae5ee75096ffc25297544bc407d29d6266e28ee572957c3c7e86b8d5a5e88e2298ed5a2290030a9b5521c89318f21f97c99866562d6c969e9e566722767fafd840386763013eaf99627077186bb151d285d024dad296ab19fffd28693b611ebe9968f572a99b031b4fbef53afc0993cfc450da1a04285c37ff6f9986207b7e459123111fec165093ce817620477dee0406c414cef702fb8be418faed55b31db3024137210610489a3b29330f848b797b66409561959d2d3cd728c5152741c9d966d9b77444a17ba7352f41ed82e72b87c11c4628268f9f990aa99521135e87cc8bad061ad1a49aa5d3aecf021e9a4d01e6a63de2fb2e094ee395404b1e3b0948ce4475b464070a88c8f2646ad59d0ba084f10e0f0678ddf9d352f208780c8c2bfa007b868e7e72c4ce2e6e2a24c8577298909450b673c5bebaaa26b0fe5d2f76f2ab9c83fe36a5d1c3db2e4246adcdbe552b30043e95bccc8e581a624f8e330593d4270f63a7c031c84b3a47d1979fcd18bf0ce5db5ad9c2deca1353f5b75946384c5428a8059816c8353208f451e5cb8e75e7908147f3d70ddf967d0cfd9b723e6d26464ee669cdc018c056a213941d0b336a92f828e9f669e032fe1caac2e381b3e6da80aa0435ba26eb97103b0154e65274434b5a3094ddfc4d947e01fe9aee5493601bc839a598fb9342f2cdcb5186fb0b6b370a616ee64f07e0ae98bc7e5588415d8207278451fe40327f0db6546ced84107c8a01c95c13a0e1176af6c0845aab9c4044b347369786bd4edc2179dea46c8b287c9f0d8413746a14cf5049acdba77b344b77401e168d594e6970cff20dcb86e56d38d3743506e1c92b7e930308e1856d3484aa348ec9ec98fbe6b7806249413e60a8c5c07bafc54099dd97ff44785c79c7f87fdac7be78534b95a304baba3b44c737432ae7a0b8914644417c06df9399c5acb26ff40a3dc9307cf59c5d27d6c262f92617bc81308c9383114f0c80b227f2c77a0f56279e0fb6a64fc1d075b19d62c36b9e13e00bb442ffe7c3256be8e88c15ad6aeacbde5ebf51d7c36200168b547e0ab1851a1a100907c205311f622471d862253f6c7a8d48da7b5749cbb627092d6c9973f19774018e40a36e7f82b2ab6abbf0a3c039df454c0fb890068c00de518ba5b244c13296e077d1232405bb6d1700e400ae9fcb2d22df02a5c9ac2ae4b2a7b347c3cab42bc94b9310d35410466661751a1885fd9db6d47185f01c233b8e013addc589e677a8142269220a6a8b20380c69d66b861e2ca22b1daa48ac04c0fd6c835f881c2af6fc2126525c2f40ccdbe068037271bf8cb95e2872bdd5df6683aa297426449cba39424a02717817970594542a6ffe3fb0a915b520bd4639a4120b47534a819a9d970ee2847268b147cbe8cb687f2b69995cea3e2242a5a53af882008ba8348e18bca597274dd387e5826c47e40f93c41472d4e78f4cc820834bbd1b0b111f952d5ac23b6260fd26693a9518964ff8ab7441bfd9d09d020822b3671eb56e4ec8f496bfa996cc988e0938861645ad0371e0c4ffb70c24a2e706186c812b758911482c9c77bf4b4c84e29220f5cf0c2e31a6784c446f8946c42fe4614e3e2586a933848a1b129408be559865762ca730c1a0b1665751f6b5d9b6a2b0860c76453858fb3bb677d58faefc3c2e194b0b50e0e8e983039fe852ae07a9ae131b20cb0d7f72cb2e9410bb0566fd2258db321888a1ffa1959578480690f520e59fae28a6af62e21782da143871faa7ce342dd1dccd3c541408387f014771d2e827144a5e228b30768c112d060b6950ce9954a486eb7cc6d67c1ff1a91fb93f9e84d1bb0a8ffc3b4fe2d64b76dac8231e6298991d111977471406ccb9846fcbb208b96c50a2cd5b508a41f0525f229533a1c027e2c1da1fd1e8a3bcc1aeb6f101cb7c00d27b3c38153d425dcc867a9f398fcd2574f8d728cae6c84cfd920bf44472d332588ba277b160b1904e36080a4f36ee9e1ad70a4a3b50cd6e8b4ac84e6bac9dba0fa76a09613c186d4e00ff9293a6d63e68567456dcff1ea3d34de92ebd451058d33c4f668e18831c218e4015a2374c99d4e7ec79eba2c2ca1a705e252874f6165686817044e1c72c59e8a7b2b71eed4263e0f8a65d881467e44c1f8e04965c0838f8bd769303a4f4b20017587bee242a62acc3810b05ba72fef750b45573885d2345859d6691c6b1fab3a95f8a9c11c1cefe269839ce1fed75e28051c22bff11376e7055d2009fee572a8dc4db62d88d936a8aec5370a9eec7a6e602e7b25d730153d88cb5c2b0f8f4ac1517b2c75f9addb46fb1720f75961ff545b4472068ef7c5c373ab1c33d9a18136e236dd34d2b09e2c1d030728f6178102c06c39ba886ee956040c943fb2a8d3f6709baee7b3921749b169703c119ae3f6059dcc99a7ff20cd55e6e8883e5118472dba885bc1657d4ad048d04ba6a8981d6df7a987971bae4ea178c21412aa3d474c30b75f0d54a5fd1de67ae8d4f15a4923593d7a7c0eb0e23cf2271d2ffe8381606a7239346428e50e37b13205e2f5b06a230cb6afc1b2e81d545360cdc9ef894c8f569a428bcc232d37c73e81cf8070159bfdf499998ad64d7865c4b29ace80f88c44c8be237fb36f51e07a8091eb4ab01cfa2a58f9508a95be0bfe63af1c9d1d0dc780e372e0a32c96962ca38f08acb8e3650fc404b4c32dd04f6bf5433d2a167941b5001490c9702ee9fea4c72f481f6065a20d2e16690fbd38a974f2d51dc80cb4832b80470eebd9e2e593f4239adb2fe2a2d268d0133a3d518036b4a47e2ced56c8715cfac79f2f43afb73be0358ab402b69f59e48ed8178cef2cb5d2b5fdb6f74b3bf3c86111eeb09cf9d569962a3abd9791455e804b0ab07b4cba977e005f2610e9c88a3e3b9d13c8d9fb4d8907245392dffa525f1226ed9834fb7c94abee45fe73daeb1070e25caa4a736325e4fc737e0c0463800c2185d0073d5059da766006dedda04ad30629a7848ac441ee44764242accd35c75a608ab0e10b1029bbbfcb38208352acb5f6465a8604099eee70b34ea85bb7de32eb5a93c19089e40c47281c1589003334003a77670d67ad7980249ac53ad3381069240becf80498ee0f52f67f6ae5bd74d603e92acd6ba22c908f7652f46e04218b724d4c0c419d248f70f602618895657001a9b999572d3e2851a9829ac4df1ab8c256b02f970e024f04d66f851c330c01c4b018cd34abdb89d6e4356986c944573c551736fa96357313da602400871a9c1dbf65b8420c0664fc29695355cef00caf4bdd231a6aba040466b61c84de245d8a367cf61ca7d4eb80cf05cfa390572af844bf9e9df4780b6d789ad71b30c2ed08179a95fae04ff65f243ec0021fc27889fc93a0c477ed3fa801efd196f700d91c2d0849ed2c103a890fccf218d2d6bce70b8e87dc474bb60e1950080c32046f60013173617eb532361f22b587008ce133b23bb53e60610f07ac3463c98b0227f194a825c1cdcbf46ca36c503f397da2af7a0ed7dcf29e8f3fe563f4a3107adbd015f25d6e734c08f628ec756b6dc179450fb0812989a01289e845512f28607a033d489a251a53cdd412f36b2faa6ad63b7c0f80a20512686db0060590e80e3badb4148b8c33381980203fccf65f4a281f7df0b7ba25d0034e387c87f74fff8cf19bd1509ff7b2120e0bfcc85a4d6f5cb0a654cd2104e808c5ec2b2392433bf1f88dbdc96308616f03794eb3b6cc61d17307c57800c172e9ba5ee5972434c77702502558e051ce40208d6096462d268ff5cbd27c16256619bb2b823f1ba148f785a1d4fba8ebed4e1a3e7d5b4876559b03adbd365a06245899637bdeb714f873626ca29b54570d5acee2d912312bdd0268eaba771e1e33d62bee63120ac52bb71604b7191e050b50c9b8c95fd02884ced1b70b757550853352a27c501f7c3f49e27a5c7ba4970c29575c663f6a5daa1eef325bd5fe2ddda5721d4d84c15c2d162ddae535263bff6afad0889b217e00b6cf5c6c956da3e629b996ed37900f410e455b03ac5bc74e144edc6a1900132fe86bbe1e59f7970f365c13e57146cdcb95d34691223862be3ec6152d66894c353e98edcb718d7ea479057024a31e8c46633ac0540fa988baca0cb4e587941c5f915ca0b8865e0c823d908e25423098cad492b239316fe513551d47c6c0214ac5a5c080ae6d62686aa9614b36dd158be54bd530cc6c66785f7bc25d808a88b173bbe175e0fd523f2fcbda74ff6e703f2de2f5b990439945fc127ae9595fb29a7ec87b09a490f85147cda53635dc63b452733499398638cee41dba111c05dbe7008c5ced37a1c221cf9f00aba226648d607441f831e9cb494ef5f550d8bee11284c50558608e99603aaf5bdd083ec35e1eea6556285e866201f2090de89191bed2db7a7d6626d7e1352c81c211c9f8bf98b9662d828e2b80a7d475439fb039c371dc43082865fb669c48679a6ae3cc2d3afe877f542b99965434c2457d78dc4fa47fc7a5a5fd952e4f90ca32bbf87ce5cc30459342131238948f099c77cd986d7c5c4046b1b280cb2c0d9531044ba18c5620f1e6a176a96fe165430f512844cb312c41a5d4b6781018b8923e6321dd9992c903160adcda9ef4994ead68b216d7c0181ca667a72703d6e58231505c26df7f601d3d77613a4c3c030e3d2c16c92c62e3d04e5aeaf1817e5a150763325b1718fc2edb6edc6c80343684bf3e682713b17e137cee14efe94a7d51a5c61305589f3bc6a66891eb7ca544f1f715f7361358ca8550a5b26b58a5a8ee1e32b89398a876be9ad6fff43d0a7fc81378693d08f7338ffab34f8bdb85ade6f8ae67668b07fdfa18e73d0cf62e4509423670e027538d3e01f61b8fefaa5e130c80702eb1eddd637224323758f26bbbc469e5461a653b1d6564ab3aaa573a423f12575b9c9dbd05fac2b1a162284f88569733bb6e26d0181fc10524fb52f894460560a85347572b8403cf8dc0ea625304b269486f42d6c6084c21d7da1530b59f03fae60019080b1940b6b207aab8c66fd3b25dacfe872e3fbbc95b225ac1dac29364589c1ea02ebbd3082357a1a627d1b9997b98edab5c727a2965fbd4f0989b3e70b06b5b6fb3a2a322d27d9b788a0439e6a11745c622324bd00ba9ccf7dc0cf211ec92b0ce2b36b183ab308a16f0da81321e9dc95b80784442eca69a29d37a6cf6164702c263500ec90f22b398a59a2e573a8f828c58010e3176ab1d30a447b8b4353ae54686283e487bf9a2d5a7281be670c0cbec7622b31841c77f09cdaedca147997f5b29f6a55dc83b129452e8c18d1de3d9bf8f48c62c00aec450ccad9c8e988baf8f4e561bd8f0666beb22ae3f66b6a94248338581848dcdfd7ef2626ccb0432ba86d12c493faa91f094d0a750b5ca4dee12b02d0e9362cc3d96d752e68527f6d5ffd3c560fae205258ce2bf7d6c9ed6bc23b350abfea7a8abc59d861108b93e62befb970993368a6394c29561c52492c57f21ec660eed4a02ec5096b774d42de17eea1d37bd5c231db8b0725ec3e6c0d3415b26ea4c96e12b66262eb1a591991fff5f3e6ca8e3fa40766304154991b649a1c8938ef34813a6e5a23009bcc4f3d083c5c96d0e25117c0609e827145ec3bf836ac879ad9923532e8d73a9d89aca1302fee20a4e48e2aa20e91e684e719054bfb8b7f174fe69442ccb190652805a0e7bacf4919d286c60dfa4921ee037cc9d3d2e2cfad9a402122d68737643983db36f152c16ff55221897188040366e7ef01a2da93bbf8db75880c1e4e2704fd5d516dca9073c0700fcf81d446ca7312b2e1b70cf6120aa8d5a9540a940319ccac826643e57525d6f1fef6f724e5f11058f73d20c348a2c8c753e14a3dbb605600a3dd9eefacf67c251cdebc7fca43deb2fd2e83dfd7eba74fd4f7934325fe9766a3e2ff3308a831a24c40557fc3c2543545e67784699e518d3ccb2979f12411df6c2860585ef98871136c055298b5b665da6714fbffb4c3e72b1a166a97c13a0550163ca85107468883e46d9cd4d9c1dfc391f5ca51cef12d98341ad0fa7913159ac37e394cf0ac33a295dc6c3fc36492fb9481d90fbf401ab2b7236040fcb409f8a80334f4290eb2311226422fc1df8522ef5167b52a5f40631b8869d0bd4f853928c887b1870846db47b22d100b3d25c8d153d1f18adb411d31127a42610789ec73d672cb42dac06ad89133667b9820382ed467e4f6c01dc85a465787f82348ef25657ebb3065198aac7c7feec77f686e2a684cd9cee308fb8b84a65e188dea721938af5f8d6636ab6372fb391800834ffc677899cf93baa2c567be6228058db3b993e9126f0d101a4362547f41967dc24407e855c70a16a5eadfa8b1fd8f410a185e08ef5c3644934386a72d0b2024a3d00fdf3895f79370ca74c76366aa7104dff5b59632f15649540f66cf94f3fca8a923e5e105d746f02c9e798d266053fe4f013623a2fcb2b03f9b93bc0c768f8fe122a6824fa505f1b06b2d4342f44fb480e112c9fddfc1809bd1774a8859d5764895bc54fb569d372a3acf7dfd955c97345a6811296fb8f9cc0a37f41711a697d831a146534be194329db30071c38b210586435d6cfe394efa9b9133f11b09417c07a32adec354a4bc61de1d561ec6d9c22106526cc8ca7316f239947516df923086eaec99a805b5ddf20a6c4caa585cb4434059407cd35c678e8e96bb8e5d26ee38e8776259e25649b442dd529b6b4b0a6b271cb04e9eb514886cdad0a0894834f9d52a81ff22c70de9985e348bfd54c89e1f4220479a64e28cd09037dbc982ca019deb74e8120d72ca84af0c134031607d75df1867c4368fce9d74f10ff6bb8d72fc0530ceecef385e239c9a745c063ba4160c6f8325fa43120e3baf1415be95f387b2b741b4e60a804942fc4b48a7c4d1336ad1d4a5e4893dd5a7cba369517416699cf853e653e23b367c4c498216280b5c9a9a4b6ae64a369f91b0c032eba63f18b1fe40db10b2c79fa59481a08284198a1ffdde3648b0e6ad61510a56820cc9d6c00f9db4b83f14ac51b10cb01afb0b914891e64ee6ce0de99ff8bdbec590ce02e27559081a080f9db146f31385421a2f8b9fbbcf08a7b88a118fb7934c25e97005d9faedcdec708a88ef6163438b0843380da2565c671ae2901660d30dcc4c87aed62183ee3639807814715a718ef0c1861343e417504db67b0af45ee02a66b95e63ef2262dbedd60831572d89a16ed03b151f8e9bed55b3d26c03890808bd539873df07e7d158f86826aacdcfd2a1d43dc06e890cfe954d3ae3c2884c3bf8e6eaf3215ab5751b6caa5f5075706e81ad5305e4a5d28369af534e40ad4a18f0878279d4a8d5fbabc80f44cd42a99d0eaa1174a720907242a3e1bd13b56d1a7c7b430e08be2b16f8cd54e29cfa21ddb81fb0214bb2a630334629e8c960275f1fcac41e48f4180358209540ffcabe16c820fe093e2a836c1d9be9bf3b4778d19d65c4b299f6dd3046577aac3fb55b262393035f20363865280959ad22bc68d5b008bb1bd15719e94f6a69028ad525606be19d4437aed1ab9222077d976d52cc8226cc125b288004140a388398ecd0bfc515aa6eabee6b066b08d6fd8e9e6fc62c617caa2c14f314b8f015e79d1ed7f1a33cb0f399b01e7562ce4e97a02f5390f741bd706c343e092374d3be75eb12f6fc512c4006a414634547ca503834cc81cf568d2f8c8158f51647b1a65bc246b58abbb788ba123c531c870f17a6e6e63e1644e3e40825e2a8bca9a6bc3a4dff629db78280b8cf32f1fdee98bdca481322baa634023092a3be64086618126538b840c8100ea9ee9766e53cf804123868a6ea4924cb75bc5d9c08cc081b11222d7c3dd4815de790ab89fdce7808f8e2a96d3c85dd5358c1c0a4c696341552fdc5c4360c154d35ad7775935e1b4821b7e2e11db9074f29805e71bfc5b66f7162f3298f118e026f09a07d07d6592648bf9611704cece47e18e9201a06c08fb999e4812cdb592d6d1c9cb0f16f1c780c70e0ba822f400d09533dc920a72a17a44162338057d09957a231a837c02b81f628451d436da55b92900a754d841e70c6ed2d4bfb61acd8b29cdb5c257d0a5b74d65d6f17d1df15d3eb50f1320bad28aeeeadd759133ff9700bddfb926e2d479f04f81fbde30b6ca5f5a409fce727f113a0a9a36a469e967ec936a9fd3a3ef9e00a017c10d2bf4389ba069621ae2926163c8946301e18522307e12069d452d2164033325ba9b1bfdbd4e4abdee628f6ef7f09e356a36b075890f533862d4fe56f4080a2adc28539093e025c86a8530a8c372d0f45d42245826752201f7feb83f471fa1ca8f0b19794f36d6a00d5a8f6cdfe876217f5f83ac680de5c46120ee737af4650b6a2c71e2808378b74f18b9f84b42529037a3adc5d3f4513364982e8c927c293cc640662a0359347ee50ac41bc61185862c1a3f58042800c56c84401df6b5c00db3e2833c624021f5973a69849d6cb0fda6bc0d197d124fdd5f34f1ba82de2178204063305d8b89d12ef503fb9857f0858a1565a7bd2737fe6082b3d386557440d3e64d823eec687bd9135400644aa3c7f7f868c15ca5ea1e8035835851eac4436ef4c1fc0e247bc9cf944ac95bc0e6139ada684f8743a4231126e6b0188185dce85299b6bc701bd4f39ef256ac09e94ebf08520a732388a5a35f92e72d6af11c76f7df552b21484350b6932770f87734e17823fe54960e943321c2804dda4c4ffa4a1c17372f78960f789e42328b8424bd833e07a421a3b95e39c1c74390adf099089b5c9c0764f8647219d4960fc1b265f6c929ab03b4df56e6480f16a74e81ad45058fd9339882e639b0242b947303fd9d1d5f12ba78b23995efe3636f1de2914e8548b213b69d9d280e6cfc413f862062a0f0400d3986ac0a54c23d506d86b1ba4de079bc1f647083a47f59a9a5262e3395f5698a6e021e5e655a17b533d2c94d26234b430838f665824f0b59381a434426b3ed16cebfdb8ddddc6a8594345e0e62ee82ff5c3465f8eb22ac0a51650dfa4df75819e007f9bd24b8f3286327c9d133d87af7f294607794a13a5b93bcbeae9a8234973abff83313446fd180948a0a5adae8a5878bac9b4f8f108b44c07826a009e88f49588447aae90c343189355836f827124140262934b5f20119ba08d79a68b6ea515d820835ea80210eda3cd9c39baf69be97052c6885948a8e33e0228e58400cce6301c773f55450fedc594f9e9c07c2fbc8cf937be762d1caa052d1c3ce9a6be93c9d4009ee3d02cd2fb4314e00deddde1280ab42227fa93143f00fdde09deaf41ef00a7000dd0259b524d6dfa5e3ca2a566416384b5c65412f6352f61cfef888da4acbcd61f44bc388811cfaa8a617ded60144ddcddfe28c208f28623162910e4a5ccf506ece998d08cb84f72d19fe210af34299fc8d181ce0f382c21c4722e6f89a5169edd44e92131037b289c780a440ec88a86f49b7b47ed341b2ff5d214d735dc09e2a846008336e9988dfe283a08a086770307a4ac2a68318049b9e34e8438ff024e780e1893a01c9b8e5e75b40af4383f69692fffd6de339b4099d51d76252a68420fe610c6516d7d9c119fb58b381d7b6edccd1cc5237967766c288a524a3c02a96cd2daa21ca00ccc73c38e731bc02e3594fc410bad72f88f0c30b797cf2000527f5fb1cd5cf4f1e01b2e20031e906276e601208762af34645338a7a24b404bf38652d5ed292dc9c81c0a9f1b2fc743f8ab209dd145a6285c12e23286b8f925b43780259cbf85e8a3a1406a91b06001e466c177b5ed98bf3ae6c703bcf509345606e6851488acb2d80a3851d8565f071f6ff47e58389d54a9490b158739ba30cbf18d56fadfed321e9ff3f80cca3f5aabedfcdd80d2e94c1b9fe6a3374bb6d4af20148d515e79e24d1e2260d1fc0db81d8f9c5c13a0dbff969e4d6977a54bbc31b084dd5783396c0fa78ef54af3274bcb983ed0a57ae2d2f38e1fa646b4c958dfa4f9f1e12fed8287bc72eb0c0afe694808dd9fba9307a7a86efabac65851dd8d2da4ef9671883eed34299f6a6cd1ef7c409799122db2eb309490e84983b49f62c03ce96f0427a1bcf60348f18f199fc80626f895ed3256fd6d4850427e7a2d06561ed7cafd07ed5e476fdd2a3d7e9995a47d9ff47e1c0fe0ccb362cc0242e87f352beec244725f5329055a1fe62640be2d000885c75a80a6cd8d928373113dd8b8ffdc1b2edde720bc0c20c7ed1b4fb585e5353dd997778d1e033df6aea93743bfde35400f083e3ea0db44d9933726610848294acfae0a6365e5a196f28a2f61f2bf3c2eaf0e146dbded4f361499ecdd3b286d5cacd7c4099d4b94fd62f05a8b8c50f29ba66150e0f3d931d438ab1c41ffd4b072e602fdec0f299dc6962ae9777b7efb13c41bd9995d7a91f9940cbd0291ea303789ac8c98f5a68542fc0d596f9ea58ed13d13efc64b97740409e46ed1bfa087691039652b69db3b6ecaacc1e668f234822145a403301f8306ca78c01ff073713697483a3bcda676cf70b9d5ec717fe95043bf6b48992f8421d41193e06769fd98ced8dbe6517237bde781010659f8ec6b500cbc85ce67ffb602a3089b022c914d9e2138a545bba6e2c253ed9ea1f4e49016db2c0bf32316f18f626535bef2977cd36f522ee09e7ead0561782b8804f830f99f36eb2234431ee39cc95540e596f29fd26208759108366efee9c76614657ae55dca050ae292390bc5a0f72273418b2a221903f45fc02013c5eb1e25add60d8c13ae63726955915746890bcd00d47bf9725702155c45504df5293ed7648f0cd2b80e3253d0d74735987e8d02e024b81544818f3261713daae30ef6d428a2d8feef4b5b62d494f12c57b4d34a98b0f50b3922301f9329ff2ca3817b2d9ae6b1f8baf6c094b7e9c3b03f1c2ce09142470e6ed664b52f5aa3c1034b6865c22d119728c771b3bca58c36df4474ef205a6fecb046a2c340192518f991895cb7a6dcf48397fbf5e4afea82e5945f30fff07b7819788bef14a1cb1b4fef147d55f1764fa4ee7905b6cb2409e364c454262428c074940d6ae641b19f18f00d6a1072fe28b9800b483a983c60f600df11acbefc22a8ef4c8cac5d3d2613731a47d8744338a65390a4ab64cc49b7e5b761b30dc1a8ce0df34dfbda446a40abcf3b8b0f9da190b81c4eb217c51cafcdd2af6b075a93e34f4846c49c049cc2b520de44490c41b3a02718fbc89feed7466271e69352e623c56de4cbc8159b9e43d97e28616e49172ae562ab70abfa592f8d6dbed6e54d114c2746354406986877d4bb616450ade03c99feb632cc36f55e1d9baacb00bd6ec9105bedd0530b126b71cb677981dc7717c3e0b1cc6e89dead245987952a267f1b5dc0a5030c424aa25f689646b13c69a4a8e600d23e6164b8fb8576a1330da20eb25b39b96422990782f4862d7a0da0218479a699497b0912a9692bdcc3c9c7d79802272b9680ea898ebb88fc943e264211991b5680d7d6a888e25bf617a689736d2551e9b4feb9690e2cad4f07e49c141a07c9f8fbaba2de3f3edaa56046d97f27d0bf62d5d31b46cfacc03a6d97e1441c33bae82d24c3fbf625a15eceaadab884ce024e2db55beb0510786d28dd30d5b0951036d1f31ee834085223b777936ee63bbfaab96ca016d02005b0416791a5aed648720995908ac4266e60f84daf2456e0b4dd259d4ff936e911696ee6b16dcf912f384a11f9a9b40078c28570c09600eec61cac6f020a8c613e618bde7fab7141ea0303047c84832de81fbd9df23ff57ea187d88f2232a1edc60eee16055378be0ba6ef4b3be2c2ccfda244a0186cf5acd9fffe065e3f21fbe989cbdadc878f82c403cc634fb616eda0c912df68cde261d8fe06d822c30ae22f6e5a45c2342924897744ce632502b051f7949bc6251e10d03d20266e4858014f1141f4a08b5fcdb2d0d8d0c4fe3f8c16c73af84f7e4e9b849daceb616f0453a9f05ec5fa91ff1e589853cb0ab8244ebfc8a3e9e2c30e67a76e64f569ebbc5f0699bb4f78c7d3377d0b55043526def5bdcdc0a304e12a239641769b734e00d05974b62c75e6469cbb6886c486f408b25fa0c26b21eeaafb27fb1ea74b9fd56f9eed445b15c50325a6a63f5b06c8ddf45ab8e2e33df537b65a303d674db645a1e889d4c8d35324a63119087b56611c0e16654378c10d31a077b5a4c3f9a009f4e50ddba7f389869c4ccaa8fd36d2adf41f12280d9318579b96346deb52ea1a0ccdd0d32b0af154bfec945e4f77351040da0a0c58027d54eef9458ee1180ab1cb360ba35557fb09afa0c32a1a90c33436ea5dce19e352e2f8e453c4cc1a3149cd0a8dd39308848ed3e41551c6a5cd28ce1837bb73ad999242bd8e84787a450412af94eee42c5f14db8dec6db409f50858c7c613173a8f1c98329593c3f4a2aaeeebe652506fe35c05b7c25fe5c876c06ae70c1384a0a1ca3f8b9261d851c1e08e2c7f577c0fd84bafc6f19db0712183ead456f9d0cd98f97a65bc59740f59ce2a4eae2287faf0570c16d6c1165df7f8f027ae78d09de150a81f728783455ea74f1c7c73586d1c3c758b275a66c1be59d8c61b9813980e63e912cd223987ae686bd2801d591fa05cab695389e7f957b8a7a02508a1ba380f1dd4d197188b9b0a4a3db8a30f00c4599a84b0547781f4b3ac1467e2c9cc93ee4bc6aea5fc921c2561109274d6c1d297cd25ce52210dfa77e3dfe6ee14b48c6dbc93231bd052ee89ca1b4b6e338ec0e2740c99250589320b41996720feec02ccc4942bc30d64173ad6dd4df50f1fbf290712adc5d6a0bcb92f8a924eb7a288737b4c3fe8b49ea8dc7a8f05363f7a4915034305e7ac234abe9253a38e0fd48bb72c2913e223051ba8bce04097ffc963088fd71862203a6a4d44569af0c220abe08665b310eba4804ca6a17494bc2709a6cd1a969a2e2618f2ec45d5e34400b7bd646f049ec8ee27482283cdbaaa9f300e971780fb006a8798268d8d91550a5a4fd59052b9530a2a66f42d2de42c6226d3760a733a835aa9b397008246c7e546a42a1ce406209049aa04806fbb054a652c37c6e514a2ae7bb8d9e2319f970c0a988aeba19c7de1f29024a82730962fa6dc66361f4ae46c246070aee822589a5596f1b4e25e23c2b4fe3b671127d0c1efdd2c81e434d8d3407462988221598c0ed85045329170bff4041a6b569944648474b4f6d8cb8b4ad1773787770d97ce215e582e6c33d252bc6f0a02252a81510432a630a322003366ead65d484649386d21701aa2c7ee9ad0936fa5d4a7a807f2aa4c7ae703fd73876cb93d6054e4d8094c6caddeb45cca78f35e9ed1a455f21f18d02b704bcf1916ecab806f549a9e8a5187f1e32c589b0a9b98f13a9f9d8780ef3ba002d213680a6f28cff4508da15ce4dccedae9741661b3bb331873f5565d74253bb59253b83761a3a2f8eeb97fd11979551d917af9f5f6209c17900343b40ea737b751ec4b2f2d21fe4db3311c485e94ff010735cd3b27d593e9bdf822b5a0b78f19396ac65af4e5f2a9fbcad4d81015a0b5c2bfb66a731282618d91e7a26cfb0316c6de95b7ea18c052ce3a9e80c7a5cac8e81123b180676e13b89dc09666bec5539303c2ba736616836aa9d093e86945c76b2db07d7221439798767ffe8e900864bf84e8c2142d05105e1bdfb45559364b87e87b0c94923e2a9f883373177eae00e12041db4488d64a9af2fc56699c1298b353536c6ac7537f1007ad2377cdd3badb02f81d175c11fa9705af938ff50da366d883d20b09054cd735f1c1159373d636cd27ff753b6a3588ce67b815259f2c309bb06c3a6c0a646320be8d020c6d4f73fb94999d8d714382f3d03539938392c931ad999331ed9305924b6e7c10d5ab72a5fe10818416ef8aa3a8bff618a40375a0defa43e4bb86de294a726ac39101cf78778ea5f7283992cf2b99163f17bb6af42bea48d1a030223cf094949f40a063e0010c1569c694105b3de290a1a68190d9122e5432f3f997cdef67db3c1110316084c549a11a54ed9c0e50e0151727f4432b7a4c91f99777b4f3597c2c38e6b5a7b01b49efe670214584903180061692efac4b2fc21007c2be39e3266d0f4e9743a7af971e85fc3a342cd8c03750c9e3e1433947c9867fed7390ca450419aa5604158c4d082cdf718c65fa538222c338bf51d3e79d201f6c58c161b38e37dfe6ae34b96b28cd9b2854cae68f0ea3b5eb0d9646f544bb0d012a4bce7befe6c5c7c4a7b06805891374a73cf8ac3e13235902caa8ccb40ea1881665e0d0cf5cf4f764c4a81fbd2da2e7ce58ab57f01357bab28a1a1e515f0a4865f4e1db22b0f96a00fab29ddd46bf9e64780c02211436a1c284a355c9bacbda64b003d55d405f050571884d700bea4b6247c1afa9dd3ac936e28dafa9c78582d2847c76e9e15f8c5a398b681242ad1b5122faab22951468dfceb55129a3fec0badc8ed34f286a575614f447c8e9f22a154e6ea776a98c320408c0e2472c9ef3f2a9b081136e61308117bceb4bc575d945acd329376a0cce039c544a9cbee1c14cfc1abaeff21c2fcd5b60ebd7a0491ffedd09868824aa95076e13683c1af1616bdaac2873754a113b21927207f1283860d9f8d1c7b0f2140ed6a079099a0679e31b572ee56a14725720daf0fd44dc5e0dea45597e1eea8bec0df7c08157908f68e66e1ecd5064fc19baacade6b3309b36072f524a0c099b5f7ab535fff04d051f3590d9d0843c9359bcaa246e9171d22ec4b9845680f8810da177268054b8358d8a2d02e226f66f06dfc83f92eb79e90d7ffb88288d422e4ad8c4e28c4892a8e7811709f6f31b40057f926458d5d90e3f6a5da88410b3aed79487d21544fad596dc75929b80ff847aace2e70b734d00949cde63b8c441e6bf7e2b4d030a1e64dd3b0049565a121b19dd1183ea3cfe7d7a1bcecf99795cba38768f7f2c6e9a39693fe00cb18e409335278c1b4adda503b1405d1c20943b99b988174e43a03e43c60b49fd0d9e707fd013f4658b50de4f19f4a8544162d6f843be20e40d10ff22c385ddc99e363ab6ecc825abd239f310e2e5c0c4fcc75645801be13fa35ef4084265cc80059bb1cc864151e646a7039c4df5c0b790e5a310c90fd394c9ec81068c73d27bbcdbb770a2ed196df83c17dad0fe857ff2163a7dfa9a021ada975a59521c0d487ef079195e845806aaa42d5f6f98ffbb5908064efdcb1734131a2f19be7f61d4be88ec9f98fa0bd3046c831037fc8e8f35f8e88a5a6b1e69ddb4a26b2ea051f6e0ecd77682231f13c732d12f023fcd06c6fd9855551d9dfdf8a08acb2676668124e14a9225328d15f7e896a5f8c981bd2ab2f7cb1fb63ba2c42801043d98f08b2566cb1081b37800be7380396334cb95fbbc1958210fba9445151126c32a50964cad3804dec2712ee6bc5052b1d604b69dd4113d2cfd0947357671ae66a332902e2ecc6288c4ce9802d20fb6231ef227aa75fa1797d8e1fa12390601170405d2153952a937abcbb8f492ca30ba7f885797e314e002375bb555b528a67a01b99add70059b21ca210a8a3c51d6113a96617c7c2dd7f660a5d8b2d2bb5bae3d95186c97554b542135e76ca5e25eec6e653c03d2aa9c89d5905a491921ed47b5f696aa32c7914114c96cd247c8cf8d4934104c6518a4ca4c856fe926168a76e578ea73219a71cbcd68c0da6c71a1620d9578785ed0da84c1a36f0370bd2310807b51a8065fb6231fea8be4a3de2b8c46c187821405c85b13c1b1b00addacf185d2615dec1396288cb5c3fbc4a1aeacf0b749ece30314f3d4d6fb28da06fabd1b3f6d6f68f60a9680d50fffc6e7f60e7df650a12ad88f4287af5e0f49530c805d4d98f4042fc21cbae8dce509a15a7fa336b6e318c769a0db73bcea4788138462e378ac7b4645aa02e0c8f0cc05498eeb4ad0d9f81ce28cc42a7b6214cda04b85e946ca8613e8e76ef87944f624c24aedbccb8d65435082412f0fb434a34e6d0cff9489add30c486772f9f7580a0809ceec8becad96490eb49f54b736beb498ffa2d8a10a15b06a3be0a686bba719f677a2dee5381ca95df49355041d929e4a9e0905cc5063e5dbca79f7f4c5bea3110f8341425591057d387640712915d0880d878885a734da051fc1813ed4979ed0c41c61da18be231699e793b6863264113babe2b47c1c2ef97678bad15b7e70573994e7ba58d3dd77e214823ed46e768dc05431fa3e57d71ac2808ef6a20696dba13a339e1961bed2c4620320a741779f90ef6c6a51c1d97e55f938f1c8d1032a18753f8e6f00ca549885033a95f511dd30851d233bbf97511c4675176bef2c704b69fde10c69005db54135912388c7cd98b3f1e88c1cc0ffe471418655ab1b76788e63cefca1c1e9d62563bd71399b673a0991620bdaf17ec0866bb53e900e218d465d6f9b9e0822041bbb03fddf6a445a0d6903d76af8ab4cd2f1dbddd248217ba48c6992e9e2878bec1069556ecf3a027c0a00cdae1c8b73a9a79898235ae86247498bf191d6d2587952852bca1340eda83655da235fb000fd89aa0aeacfe51cdbdccbf3d2184b4fc045e0d7720edd4196e2eb2f534cb24d39628e6ec609d1a64af2994fc01f00a5bdc280e75ca9c19695d4f11b665523fcd03bdc7617359a48b2df02c4c3553c413e220b83a68b61d68d623e7e08d61cf0952cf21a15df6dd08c5f460e1f780a85e20dc8215c3b40615f3a70fb02b50c0e30439fe59c0ca96cf3b6f2d229215823b6fc5dac40f834a8cc93bb909c55bcbb83824f698de7908cfd822868a4ed2fc26bd5d8aba79f8a3bfcbe4f8c57f669951429df422a5c4da80cf13aaf72612e059a4520911c5fd5f70586f3ea5b36abe1114fcc4594918a7ed5af3d68d5c9c5f2126b8e4e9f10cc537450f903309840e87b922ab16d124972c77d7ec9c5a4549ee9c7a623961a9e1bbf87e94f133b53c61cf308946a4e8937fc6e9e07be0290958aebf986c7e2e7d55bdc75158fd3e0d50aa059287dd783d7cce0bbf316311ec77131e992302138f828a55d720906d3c690332880109aad32702603b528cf195bba7c512b0950a9131724759d150dfc589298912d5c9bac75dca3e878304dd8ef86c8aebadc638e3b9f530778243b9cb4cab2ee5c9fb91595d3f9248bdf7322433046306fe761f63c8e2e5ce544888016335809cf02ededff59f4d02c8b69cf28407da3a6a3c03280f59508547947e3df342cfcc7314eae9e8969649aaae61938998530c35849f8cc193cea0e65084b1fd57d382d9dc610940d603067d0a5668d8ce45af8931f084829e987e9aa4907554ae0e78477ddc988c3a61fa693894b3115ca2b886f464a9e58c1abb3800c5d5808c9f78efacb6bfa03f49a74dcee52a02931032223444c0f18ad1cce711cfa04a1bc87727d129cb837b082a458db15499c74f90c1216d644eced3e236bb2f283851663ade7ae2998fef32c1bc0043c858104c681acea6438bff7c92fad3b22292a54325c460673c0512bf247fc6cf8ad7f4f418ffba8fbb37234617fe91a6deb9daec9f25bd8aa6d168ca76be03472e7dc570d07f40d28b4db2ea15636c58b9f500ed8b4f1e5859f1cfcf69976dc7d24591fae7fa7696174439eadd80f5c9a00a69a38c940b10b1ec03610a1d8b400c7fb852de189f37679b029ec17ed705dcb86141453e99dc47d8c27d203acca59b94dcc6e9350944bf7749af962e126d380cb5c978bef0c3341c09c9d87a90bcad33ba70915e3010f5dcd8df60c05205403d190087fbc2fd98f46c49f36c5418a6e010ac8ce09f1e6caca56980ad2efa2a871c9c07d654a2c12fa22f0c7210727a8d6648b42a739035e91c48d0d8cde4720b2b7b053c304a28ef767dac5978c6505b022710431e7e1505483a534447464a5fe6dd7e33407e16e017decc499dd9e569df9d142db481f2574e2892cf4700a76cd8a5e4d563aea520f56ca8109de103623a16c6fae04c4ac487a448f4a6c46ef57921989ab39e2558e2eccf368e66b84decac8f1a222698d40b60b05c49aee27aabde556e41f486801e4947b26ec7194414bd57972de9213c2ac9204906aa7b81c3a0c63bab74019642213bd2bc9f4175128196e4a1b50cca576867f58d495a1459ff1c643b3b827d4ae07d59b14416e341057d55649944dcc9640baad136b102b7ac57d25f0f4fd907504d291de22723e3923d9db13da2667629842ac45f7bb90142c83f4ee3f7a1a7ec87775effe047ff121507b4806f31e92de13ba6c6da7ba746b2340fe4d0f924be513142e00f74ca191081f011ed9f15ee9729c3c396b9bb30c355c7db822d074a473ab3c9e07a5d25f70dc73c7ae9ba27e40ff99220ce40f41023d975448e3bfec60ca23acf4a4ae258f2b9093c1890e7bcd4dc8bfcdc05c7c3191acf917746a638080595d9b206bc2ed1a7a8b573c95687bf031af957073ed8b6b9b87fb188fda3665ddf40af8d2d29c9e9586af96b60aaaa5a0238938007b176f2084afbff7486709e95688f35d164bd51973068744c7e23752928fe8d8410cf908d09e03b21e46f14d5b14a4e657de82241e28a5d811062e90146653873b7724e240e68ad61aa15f7013c5d0907e5c7c659026dfa4d501c1e268f84e182fba5e63281add3911b3f9bf6da4e59f913c9a05e1a551c0d0f6c34a410ef114c8bd618c1b409121caea603958a984e567920f1e9abdf30c9ba0a825b9cc9690b16f24fe455b35b4c874b7844391874edb631bf7111968f130d7021c3b4b62d00874bc6aac824de54867bfcd6c2a40bfeaf188a0007a4cbb7deb7cfaa83a3d211b15673964a5462c4d8eec2e7afaf19201e0f00fbda3ec77ac3702123ef879e37e3a93a742d48c31873d24430a3865373182984834dba81c1b9546df981c61b9cf59ae7ce732b3d86365f000f7e1471bce404ca2200e521bdaf149d23e3979e09fc52f76aaa9f147909e39b47aee1241f1840eb19c26f7211260621e262eeca2dcee0e19e132e145171ae066ec1fa873f6ec52a9d216acc0f00780d32470cc0f2adfa23d3d42184281d91d61717a34ca203f6ee8a853d6df433a2d16b534c8c8197e5e4b8d151d3f00ef52807ed1996d7bb7b03f9a59e044c630474133f24dda1f72164ab0dc7d77b763a2fff66a3d0b3693738491fd64449580d4434971709309d170e2fb08846228b2497c25af0c433ec9b2ef6ccf77f97dc352280b26e940db2a119c794bdce3c36efec32efe96c7bfbb41da578143a52eb1d6542f861d6c45e080ee3d9f7748b340689d64eddce4374c55e54b9339db75a16213d599104a9175444b03ea4aded2c30e24a6b36daa8ec2ebb5aa8e684f7dba318f5ce2692810ae4fcfffe3c190b1eac51513ce025f43802a5a996f7086397f285ce6c118cf13bf90f92190931ffcd71279fae26dfa38b538be4f6b14cbf107d078f46e181033c802d097734a7d0036056253bde04006d78ed623ecbaf1f62055b0a6fbaa23d1c4db5f32267e4bebe634d21704680c4d3a8a463e25eb12ed24cf4f2ce6164013e219a1660e2b765223bcfac77f0f85e490019d2cb5d7bbc88c05829623d22e2a2b4a13557cb5951e3e4687cffc0c51cb101d7f244e0e8d3bf4b54c4df5f56f13e8a85fa5a8a6feeeed52b21a8bac0bf046aa241fcfcca27a0ea6321980ccd6398e83774444e8c27c6051ccb313c1eb4e1311ab2875efbfd95b1de511ee403add4a50aee06920974c08f9a2dc82da3f66f54f30b6655185f29be79a1fc080bc5bf422933b69f38379aa672af950b4faa7673f847ff4509b34571c8727bc8c98ac10b5c097dd0ac29587223541724e1de4f96dbad2d5dcdddc6edadae77264681cc7f3b8f8e45cab90f26d1063619463617d7391e46cadf8cd4d88e3b060b94a2c716772728789621dbceab253867a17ad34879b317f3b409b03bc67aa84efee44a54b7da0e0700484863d1610a6de3a6e54f9033adaa6945620da59a5034de370ea0f4e51f1e47684cf4976eece0339b1b76c4e510fb31035c90b232f41227e1638e0103a1dd48436a8b5074c75dd5528f01587efaba1eb59bb9ef67229343c4ca2ad646c42f6967bef2db74c29c9670906090709b53f4dd3b4ef53519b7d445e5076dc4ef6e9cf9c9e9b39d921f5372d9cf9ec90eeb9e79e06694cdf43793bfb1a8e43645d383e37e3df72c6ffa55b906522692c50ba9c2a7b229332c79d9af6dfe1f8dd1ae80d9181e396c96759336d366bec28de8e88f75f0d02bec0d047fd297b69552dd290267b9179f93233fe45e6955c99076a3e02676a6aa854b5389fa6c519829fd584436477021bc8eecc0dab97bf7a692520e3c19fa9e14a3b738392bb7a2577f5547ef633a106b22bf35586214d4dcccb841278f91941627e94f6552d4ed5871ac8ee2a3563866a06cd8c99193354343333c29797095f3ef5927af9552801f0657c7d99a7f971bb32c0193faaae8c9752869480b433352fdfced4d81ae4ad791a5463e973e35f1919eda59cb1237835194d7b209711822f1382af0a4729ca08c18f09558e331f26acf1e212e668717e2aec1103f5a7971f685f7b02a22cc8057054a9e6f71a087eaa3bbbf7c2ee5bec42d516c0a49a804b250db7cf369071dc26f9b359850f96dc39bb9855f080ca9d77fe9da38f3b95981556051214779456ee1cc53b65ce79e74f7fa594bbfcc0d5134b8d1fcd987cc49217edb909a0f4f1ac85b67fe7fae2ca3afbd9913bb33dfa7f563572bf7deefd58ab107cf97edf42d2c76dbffbab54df9ea968be79e4e719d24c91ed6e9e0da2f8dc3d900b109c34575e314596cfddb3232371d28f3e8288e2404384af8a52e96ecd00d2729b992eb3b434cfd842b74786dd254d439a166ba83624f00b2c5f6639b66464a3db3cdf9915462c5db10823e93daa1a10a9dac5a9252a47055c812e494b34b9320838b872a5942c1c2a8a5bb6fbdc28cda67baca1a4373b11dea82951d6ab20a50551da545d39e78c01c8df2ea54be9db9c52320ede7c380ee5adbb7b1bb93b7fccd9dd2d37397fb2e9cd1dcb80436c51529a69d9b4214e91eb6d4eceb3ae5b4eaee16990cc91df4db7ca5272465a94dfdd73cec96d365e0d2d52dadeec2157343287664eef669f2eb91679d06c7afbeca791c3076d10c59ed476701590dfdb361035c12b77e8bb1d6516e09452cae9cf811eb6f49aa5eb64d3b3a7915d3963c84ce67c732a9339f22538658e7c1b9c74ea3e9d6e53a3eed3299dd994defc22a882e1b60e47b6786d903953a3339b4049176c94a5eed3a9cfee6edfe6a4736bcab3a7dc640e0def18f3024d3eb739b9b9cdc94d4ae70428388da09a9e3e773a9f99a7e7d58edb348aa3c5ecbbbbedf8342630bb69cf49714ca7208ababbf79cdba4741aa13d71f4643a19e74a3a7d1ae9493fb5da98370be6709c293d9752e59ffa82bc79ca97ec85dbe6a473db284a07199b73dab19b29a52a15ce36279d9b46a737cd289dedd39dd26eed992d9883526e39e3f3aea7cbadde0e02babb94524e77a773f69c94663de7d3e0ae4475f82a1480fc52e68ca72b5fbe2773a4bb4f96cdd3cceeeeb2c576c751d1d32673e48feeee2ea724ec19c3b450fbf904b5bf7648c4efe41dbe4a9885b094921fa8ad12e604789ed79e82dda6cc5fd0f45e5c5eaebb2af57d3ad1c8d05c146ae6bb464c8d3b638648f30d0383e371dc30cc5123c75dad7adcf4b8d6fab0e1e3da7c7f41365f73be6f7c7f4137beea7cf778044cd0eb5c5c953ac99041cdc4e06266d4d0c0d00861a8b18ae1c6e2d8b0c9b9a1d36364a3abe3479e1204013ff2110274e8e0c163c70e23e211d1077100e20f2210a200c42044028805100d201e405480b800910162034407880f101320f2f0620f2f42e0c51dafe3eb0e1d10187a80031a10a6aaf04e3f0316a0800318a0000408420040fc30001f8e18e92101320c8943e29038240e89434586c42171481c125943e2903824fae8e1e141862237d8500311d690201a00f0737d66f801242408101f3d3c3c1ea85bc70e1d3a1080009b4456e121abf0b0bde46b21282d947d413a3b7476e8d0b163870ee20e220f620fa211f188e8833800f1071108510062102201c40288061077c400bc98c38b077871c7eb7cdda1b363c703f50186760c500002042100207e18800f478cf4c0c30e3ae4508435e4e7fafc001a12877cf4f0088033ed08e5c5212c128e292b6eff0d36d440843524880600fc5c9f197e00090902c4470f8f0c3d78e878a09e3b74c41d3a1608a8a323ead821e815ed4c111d1ba03aac6bc93e6fba9123a4c08f3b811fdeb47d41393a393a376ee8e8dc20161171100320e620ea20ee20f220f6201a118f883e8803107f1081100520f6bc68c38b41bca8f3395f757274741ea883e807224c210dc08723467ae061071d7208000e456eb04100a16c71c78e1a88b08604d100809feb33c30f20214180f8e8c163481cd29163481c1287c4a11e9d50de1de1d8a386704c5571fb89b08604d100809feb33c30f20214180f8e091a1070f1d39349d1f57ccd1117344f1c78d175fb415f87103ca4ea674c3c60d51bc7163880dcb86884d0d3636d8dc6053c406079b00d8e460a383cd0e363cd8f46063c426c7db04bdcd91b7b9f136bedeb071e3c603f591a11ec2d40e7807072cea904300702872830d3510610d093212ca1671e0a001003fd767861f40428200f1d1c323430f1e3b740cd90ce9e4b85c4c68361a11d1edb7093518f08e56a44df13ecd4833c2118e39ee9872f520454547b431c30f20214180f8e8e191a1078f1d3a74726e880fd4dd8d4f2db1b171c3c6868d8d0ff16ddec656c08768352af5d38e2c4e48811e77023db4a3d3177423de883636a278ed8f0580a5c106d921966589d81aac0df606bb6371defabc2df256fc9bafe28d586468e7061b6a20c21a124403007eaecf0c3f80840401e2a38747861e3c76e8c8a19383c3dabf61c35a8bb335cd108e292ab7ff4738a67670fb81840401e2a38767a5daa12347ca7322f5eae405ea4ffcd4127b23de5820a0bdb1b687cddbb7b6023d6ca0ec7c0c356c6ad8586b6347be36dff4aebabbf266f811bc2b9f1f53771573573f3faaee8ae6ae56776587fc58e3ae5e320feb47f1ae563ff927c8af1e07ff10f995cdd7f86a53e30b90af8dcd033591901301d7e25ab77f48980aa201003fd767861f4c9ca049285b8c2106203e7a7864e8c163878e1c3a39386ed8185a0dad1e471c5a0dad8656dd94cea8338a211cc5140e6ebf8f1e1e197aac74e8e4784ebc3a79c1afc8f6a925ab1a36352c10705563b5b2507676ecaf7ed5a2b450761e869d972fe8eddbd5cada91affde6f123edf1637743197ef46ec8f32378c39e1f53378ce101f2a3ea27c88f343c427e5cfd00fd686ff892797efc58e386e18e0fef87d6da3b04242448980212a67c84291784a92758ece709534461aa078f1d3f42d9220c30fcf8cca023874e0e8e1b3670860242be20eec29700cef067af849565d94fbb74e44332ffb35569f498f489a642fac4498b2fda0aa99428207f5b677fb9cb5ffe7297377197376925d8957e10037ceb8fd57b5021bd81cc41e510c52e8708c09161740af287a9707984481f2cdb7bbb4beeb8f74c4b5db62b10df209f1125b7dddbbbdf3e87ee25b03d378c61dbbba6abba240e75d1166502c4cd41b8b31da3aeeb6a9e71c6ae134d2170de71c6aebf66850e904eefb5bcf79614a1ef09754c60e17648af77bb50263531824ba9086aabdbb80f09f9b32941eef85341057f8c1722b9905b503ff20ac4eb3d7e02c6f13fc56c5478c77f73c23bfe50a04821c59429ec043bc14770129c0437e1265ff882a68577b430c2a00215a00085252ce1ca152cb0008204424fcf1d2b4c03478d680577d4c25123e26214e2f21eda62eed138ebaeaf765cddd15ddb098cb9236dd9d58645fa34161880590cd6a26b3f669dab55e4d11048165c7f8e8ec0b216b455af78dc17d7bfab615cb7f2af48bd13e8831704ecde0720380b86d55bb1542d343db5e53859b6b86385791377b5f87297f4e190903edd469f5a2b032c361a742bb824404112de12d2975849830210de0c25acc3ec66611499c4c4964a696bbae874d1d60f5eb7693f78fc552d8c058d4823d288b64ea3ade9a2ada9c40562d3b8762fbfd620205780b9c474c1a4cfac5aae0b794e4a709d492fb9ce59e176e18763aa5bb8deaa5bc8ad3241d628dc2af0154d7ba21569445e80a34644a4c138c6b02fbe25de162d8041852b58c9e271e169317a43b86eab09aa5cb71e15d76d6dd9200b2cae7b52d0e0fa7b51f00fc7c43b4cba87b63c210f1653f29ecae43d19db91b3820cbaf5c44993ebfe950832c7bf86b50832c7bf0b6b16b5ab662b4cb246da3a41e1d650bbf3b32a9398d8723ba85757e3ae31581540fa6385d522c7f1df3e26fee9f7af452efe69dbeddf666dc33e5ba411752eaea3225842f6f0111d81e4f192903c1aff70b0166d427b42a411c91cd7883818ff682c903bfeaedd60e41f5c1f352228648e3f733058adb5fa7732c7d54e63605e5c52323ed79530f8e6500829e1704aa9a852b9f374669f3c59728e23b0efafc18ef3a9ffa03f4e9ee97d87e8fec95e0243f49d5fdda3403ee88f3ee8ffe0a1943e5b1f3f58fe08e4c30624d79f663e7e0049306af42685b3b34f2b8ac8c20aaaac51b5df3c0a38e90bb13d067e08095df62820f775e31e57be95e26514a8833bc3796be7d18dfb1a1d4a2dec3b3944ddea7587f2eab08a8162d62a94ac0a6382c40d983e252cb19e7bf3cdf246d9b645c25cb8c25852624549726a82c4faa742eeecab497b65b76a9b0052135caa8221550ee9a4f720e1288e3ea0c44a72d312624509b52f80ed9dc469d6114d502189e3cf2f59290d794ecdab1dcadba9b8d0041298a86062bd8ab6a5516c56aa20f37ea65f823fd3160344fab60446f0bdfa9c1612c09fbd07c3874f87248ebf0dc11696a0b329a0421ba59cb7c5955f0ea99f112f8e167d14ef4bcc4b8ccb76e967c3fc9922300f3ecccbdb5ef56a3873a44392c371fc3b8b84a5f08125422c24496a1cb5583e5a067f24494e4e8a58ff49b42556f74a589a17607ecc1133f9bd268b917a6f0a08a88bcb8f5405944671fdbbede8e581fa25a442744948412073fcb5901a2173fcb9901e61b580f5b91f65d37b30219487d15e605e83717179a12fc99a5f374f0bfd72d8ddd90d8152f3da16f6b81dcabb0a9955ab931a2f060a4c79dec7bc3d0d3bb3b4f50464227e11e9cb01ef61ea5a0ef10a4ff22b64127ea0b2094a90d2c44af2d5408955f34d5eb4d5e206822a15d71a9a40d21f68fd23b552b76de36d63c6d138cb445c3465f5fca0ecf9e79772545dee7f156ee1a884a3c081bf2d4f89f11ed75a7337ca398dc1afbfce50de181f4fd1bc0dc971b8a2263a9d3cf7d8f7bdfc623c5087da7728af867aef2b7b3d2737b3ec2bcaebb0a3c19d43a0d4a7f9fafea8f7e7a327978d780ae87588ea811577865d253c8594092af40743ce6e49482d6a5d0047d9e43166cdb651ea31fe99f124481f195f8273217d62605ededf9d207d5cbc0b8782f401df51efef5e481f29481f0f0ca782f4d1debbfe18dbd79437334346252306e6c5251503449dbc8ce340134d0dfefaf252b390868666a988db2108c5ad41406e56248d0408c060622149120353122b4af648926c3570b1ea27b969b1a2b4fc815a51e9404eb145e1400b621b3852212ebc285d425bb449f3cc68cf454a77e422a54bdf47cae4ca98ab983d0a385221c7f204d0953cc62f7ebd5e33a7e78b0abd53b86dbef9c6be2159b104a66d949dd0d66321b7a7270d0916a3cfdab6d1988552f3f29e1aeb498e43352ae4492dfa87fc565af4172a229d703dc9976cc000064c2c2449be27c0daa7fdf03dc9da0d29b496999939e0da86c4927f4bba9b15664a3366cacc9472cd6b35965fd2932c178d29247463f4400966226af9d5c48113b599b596ab212474b99b636d49e8d2d0a7e651caec69302fdbc778a1bc9379528d06b779324468a85f638488c4625266d5843347ead77c8d45522d92194d683a622149a27de088553f090d225694ed95b02a7b15caea819a0a5110c81e0ed4fcf8dd910a499feffad7b010165234f224fa8226135ca72ab8fe9ee458481e7a4487fcabb0e6e91142be85ebef35dfacbb0a6b5cc9bd690766798c09705bda7e207daa481f6652c29211ae2b0981a6008cb992267de4d7ccccccdddd4c5eec84034d94caa6eb8f04e417bf984886d7a1cbdd4259050fb65c2de4aefc70f868eb0942b415bbfe1c8edd2177b7709be9e7d7b6514af3fe41489f199f1932ef7f0004481f19ef9f00fe8979ff05481f98f76780f4797980f449bd3f04a44f0c10f5fe12903edefb57c002d2c77b643c95eadbbeca78fc0d61bad1df284dd87766868c4a460ccc8b4b2a06883a7919d78197599dcf5016ba2062d5b07e121492112b0a6d24de36a742343d08c8c1488bfe08d872fdfd8aebef491ecb3847f20d76639a17603f6b4920fdcd9b9ec7b50dd8158f9b571a4ab5ad67758ea571fc8f588fb5e854c8f91b49e2f8737652a14985a88bbeae7f9d54684e2ad43c4bfca951f350e91e1c237fcac463d77fa44eaed3d6754a74dd27b7c7bc79c60d6943722c34c82c5708fef9fc71cfdc73283999f3f24ecb66c81b532b8991a49568b4032aa8557a5bf3747bb3354dd33e0afe1234bfc4e4812f9aa6552c35c8dbb66669d1b5ae3630186adc1ac3d23cbdcdebdf822af9e552bb947f6b6c1b087a8ded6b7c41db9c585a236298c71541fa6c0de3ee0f359b48b9969028903c752a217db60c06736afba29dbc6ea9d22d83cdecf4a92fa87e4abba9d025f45b6334776d4cd8ae944db618c360af16b59922def3b384a1bcc4d496630ca32ded54b7d9d42571abd514e3d19019e6dd948b47e50b47fdb4b9bc70aec48cb918c5becb45903e4a5cce42f2b8bc3f6b217952750a183b813249d1166d32d2167592a23fd62659051959af542368711b60e1a7f084de36106cb9a43c1818ca94a9b04bca63a423edd4d4d4c4bdc46231b1c5ee7ef54b0b2a42a34e5cf9b3864e0add92aa046008e4d08c3141ce18bfd76a9e99223d6e1b08aa54ffd97fff5f5f9bb66ab56a52e36e6b6daabcb9c9683300e7a37ea667ba1f49f6e0b73d12e3fb18af84c5ef7d45851f112e4022765eb288403d902548ac71c62e6b2744fdd4613e0f925563a850b2c050b26284365425577e3b300b0a90ade6598d280a3856d81558cf64ab3bc32895c6cb42a9e4568ca8e2f217f4dab257f6ca5eafd76bd388c2d5955d8da26bae1ad5a2ac88d985b9657261361d75495cd251c71309d3093309938b199bb1196b26ee928e8ebe6cc68b71bb4bfaba2c5d1732a75b5aaa4b78c7bf1a21736aebab4faa0b64ce5791bc02411211d1968b7db1e307f32f3056ca9c17db5171b1294bd375666666e60b8af94a13ca5b55a1bc2c2fe7443db5272fc70415c1f5afdeaef9094668655746704cac6c87c4b6c64e1a79b72f28d1ed65535ad5d0a061a5ccf11eaeb15d9595b535dc7931215f9a90afcaaf0c9a9065841c13cacb09719acbd7a2155be19f7f47e29fb7f30a5b1a1a5736a5ac866bdd6acd8faa24efe18c8c92c6afcbc23f9c15dee942fa704390391c0cd62de1744b4bf887fbc208e9c38121739c636ac5d07ac23f1d13de7181f4e93ad7cae62b92f774458e0304d9d3492171fc694b4563dde5e0d7d80a03ad6be5e213cc7bb2170c301815fee12996ca0d1f897fd88806d25c8d5b952ad79f757270841e156e84de158cbcc7d382c4b1c23fde17bc330430aef7785a481cff2d4baebf0dce888b2c9f187a587859488f0652f49f117a5248d19f03630897fb827f3c2b9e0d240e13fef1a2e01d127832b861c4c03151c1e42d21c5246465721c77798f870229853ce2fabbe7b2b1e3b782ce75555c1191ea478ee8ce2bfcc3337fe5fad79a9a2f48fb9a8f48df944bbfc03c50e3b863859d9a2e3f4c18973f7bb1d014fe1ad98b1f066bedd8b7f35e38b46f6958dea84b2c566369342ec5473c63fbc6a8648475b5a2c14c5a6b4d3d4deb8dd39ed3becc496fdb06822a158c287b791c360c1e0debf54ea9b7291b8df319b1e9ee6eae5c47c339f5c6d3442f08489f7c419a2603b0e26844fcd5e257b16858945ef4498b2dc729bad445a550295140d76c781a6f5fdf7f5b02ff741be59e72ada57e24b81be56ab7355558eae4a54e1ee56a97c3ab393c2eacb78632898922dc0eb91b04e4bff1d9c023f5319ff305c5541c5e0c8e228e3b57c7719da22875d25c42d54b8f1e5fd0d4425bb349088b528ac6105df7a878517852bc145cf79af04ae052615d527f91a55bdaa226418a7e7622db76b50cc5edb619ace5167aea7e24f2a74b2a80ec1932d20f1e4f0bb9677f41bd29794f6d6d4a9bd2f5dfb4f00fc7b47d41e3846ec631c1bdf8a74b72ce09e9e3847f7cdb8466938c1f67536f9be58c78c735db3e3c978fbe8f4f880c708c57e59d99fba9bed6335d8e632b12774582f1896b3f759fc1fc53bdab6c5704a311bd5897a2ec0573396d798fc60289e32a295e4c089358aed117a98ae47271a78615c18a64e0906501186bdcaeebcbcaf4bb060139d7d39f5e8092525baf18a11e410b99a3d52dac6cf647bb1240be48a220f93eb3a0e3f0f777dec6d55999ea172d66a94adfc67d5addc27c553b5d560037eadabcce8e3f2edb192e5adde650bbfd05b11dd27ea98b42719d2e719d2a713bd6db7396e3ec6c62ee3b8debba57c29bf025240f0a248fc6b98bd66e0b404f8dc91c66f882b68ef972b8dd194ad6ab4577d7ed18c6b14d631d481fbe9dcdb6339dcd1ed2b7a872e7ea2aa36a5114b74ea14d69edc7ab3b689aecae4ad913a0062408102742bcca03e7808fa816d6a600c70a53923e7c9bc03c33abdacc6a1757e49d4f806dfde5f70be2d7aec4602dc28ab83a9bba25def1876d2c4fe3ea76bd2ef46e6ba163d994207de83b4cc3d247d058478ce157aa18b0610df39ee9e2c9914314ff552a10a4ad13704fb69dc018d5ea631075ee3899e78ed33504cbc7e44342e6b8c7c47b2a2c83656306539ab1ee33263228b22664b602c9a3f10fc794c5e0fac3682f2eac05ac61d4566e9b4dddd26c9a4d3c344c8afe3dc0d0af754b3c634bd7bdc98b7fdc0472c7513091e02e1c85ae44900ef3feb2f3b8ce6a0763f73cae7e9d3e333f75275a63b619933a6d73a6605eeca93d1cb09dcb5fe99cd36506793430911a6ef06c70f5dda200e5d5887e749716030d0aa94191da131a11c31ad61bb711afe2e07edafe551a5335416d26ee18268070eb1d38dcc0162ef91ef51d0ad13dfd1e3e6d9ba88e5583801d7796b79f5e801f13578b2fd6a60039a6247db61813a44ff73e324f06fb9ac19a277bb5e8b0ad082422c1ff3e08d0d6ffec8c17c43b4e7d949df1c0075fb280ba3241e6f87f6185398eb3a88d13b56db62ac99cda84ebaf3d01720cd6e2160370d35e7acfcc36ff7b22b247d96a8998ffd59091a4965bed4cfd51bb1b15a15b8b90849a45d542f2c07eb074bd3ae1ba4745e8a242c9f4855186f4ddb0744877bea6ab45eec7e952aa30187047bc2e926c474ab4759a66e7a976308e8932754c9bc6f5e0ed907daf2e8977fce912def16b4d9c6d35f5e0d52060c7dcea2a4b9e7eda5edec3475d12ff70b0ecf5ba49d7ffe4717c549b9b66d300bc1f56dd36bb20c5a6f97276216be236354ff672dfb6e9450ce63dcc6269a1b6e476e897595832d87c25acece70c9124f9b22cfb2c7b949d39827af0c1ef51337b24495e66608224d667bd96175d30b1321b65a648f3b7f5845a74ab8445a9abc90e3404b3e52ea63374970f1f3972f06697aed396e384402255fe8ebbee2fff9880bb6dffb76142bea00e327e77ddd75a1b26379e76364ecf50261c46f715880af12e65d21c6ed43ce0d397e3f8ebd871db722c683d00d2f80cccb204860ed41da21e27b4f15938432168644aa8979f0d3bc4bcde0335d1efe00adfdcc0b07994e7e67fb4292f903cd405fca31d3dc13cd90ae48f46a509c9d394892952bcbc47b28868517d39a1f47505ecc523e5ae93ce6813f4a579d27bb467390de68fe215c197a2ffcdcdcddfdcdc38b9d28a2d9874cb7b7c4abbaa80b28a242bb78a511556a2d87cc0b28aa4268e94b4248c2c286f4a10aeff15d76d20457fdfc10fdccaf5d78ebc07d73d073590395ee5c87570fd69644183c6aa08ab550d116a6a686034343358cccccc18c28c1932429091515951a9645c2143468c1531313041808179497a797101828b4baa8a542ac60f62c400ab8020ca0728d4a907a7d3c783eff3903caf52516bb783aee374c0711b956dd372a0691407f4b2cc9999cf396d207ddcbd06d2a74f53481f9639f31dfcea79f2bb79a016c3979bc5b8af934703231abc647736673d79346c26618f40e688a043305b3267c9a7b8b4a235e576a8750b0988f3e08f594bfae078ff0e81ec89409760ec14dc1b8fc32802dee333f020c82d3d58c28143113f1329155bbcc1f16e85e996df607423d9f22010e1fa6b5240a64228cb54f39b9999999979b662c0ece58cc14e0538caa52b7550854e580ccc6e3e85836c71f42a940a38ba11a5e08d47539ea7b22c2d664f6c6adcd070a8dd1f624d5d79f26395e7dfb45986f47d83a3994999c94caa64647c9d535a34caac3fcf3927cc0bbb4c9ecccc56cec95c257b4254e5fa5318c893a845cf8a9eb4e846a394195156345fc4996156943d69d1333963aebcc206b1a9f98be28876cc714737f271b5a7d408a092e338685fd96bbeda874ff9c9f36718734e9ef686b3a3f62937e015193f6a9eb6d68d5ab47e34c58d908c8e9a475ece94a4cf8caff9311bca8ac8965cff19c638b55cffb9d43c5994dc8832691cff717e715d0b4eae8326b81912441908aedbd4c88ab222312bca88b2273737f3e6465cd9fc0a06181ea8b3279d157543d19ee683217ca0be2075898da39393e3f933e9b3f3fc947fe68fcb1f431843485b94891b6d7dc31a195137caaae4d809bd06bce3af137a4ee8545a7c1c53e9c654b2619570ec088ad687c0917e14d2a76f987142e0ea6facfd0e41ca647e0c5f677c41315820f3d2685f69781c6697a660e5f10f5694669b1a30f44ff641184cb6c88214605a54e19546400226569010c114338b7dd11738bad1d8ad578f642d4d2537ca8832222a21e8628a119e20c48417528b142a45108a01096047b20a2788a20649146501430532290a2208698901164220603999e1db5f504623fc704ab185c8de8679330ba5c69ba1019012d1d7cb68658415b49002a626b4f0000b4a9650e28a212808c1888c8e2481852f9c78820b28b81024092dae509482245c81072cff559629794f36824a93be32223a23bb636603798d8a322250c68332ee389564b4d7843e03def1a7097d8accf19f097d0a99e335108216aa60f21d5c7f2bb6c872a5155b30b9325c69c516515c377229d2a7bffb23c2775a379239ce1f00472ad441dca768001cbbb5051cddc8c8ab34cf9829dd4c692a65444a4a5c602421831754a101184e60b937851c68810a29d8c2932bb094a8a0095ef08009141d7c41082cff2ce63d0e70020a2300c115032250c1026a1955f852e49711aaa4c81f13be4811f4e42645fe5438a5c8524ace4e6303a4f529446277ec56dbd18f3ea316fd8900fd3532d29605fca265047213c0d18da48f3b95ab3d7f76a515b1a53b9fcb62465a30a571fc8d92dc8829d7cc348b5def61a5c51c5c73cd3c2af9be973bb2f711612b2d7e1f11cba3e4f2779f112944441f0e7c47235286e86b440a51f3f41b911285112944963566f6a3eb6ee438ce9dcd7e6e0ee96744cacbc87bbad52ae229a1d8f9f3b82165bf6d20a852fd678c9431924a880fc7f12f52430bd9c27b789045b22880a75c9fdefdcc3ec4341ae236904fc073d2622c76795c6945ec89db5fd0738cd4481c12d2ec9f991de5924a3e756f9699db6b5d932bbf6a51a415ad2597257f366d67481992aa5973ceb9652fbffe4cccb41949588998a495cc8ca390449535c62fcbba4a855aace6281e7f439a61b09eaef90ab70bbe9f3eb5935de942b29ab7ad1241e60c9101b83dbdf20b9ad921c6837f04b433fce02b611d79c7d97ec7ce30f847be076d96427d5976e5bb29d689365b3e8224e342cfce6c272fc9b950db5697c39eaee992392e733623a6115a1fa1e46af45618ff50233eae30f68894c0afbf991de683ef43f6313efb78902cf9edec6c2818eb0b67da4a96f604483456d891ef51f3bf6f7b04f548b2af30b0492bd288b2e63ca196b6552f7b710643a5faa28061623219aafe227875da66edbaaeae5f8d0bb55b6964323232329b0fcc4beae4e2d1177dd23c32de9f1a5129d2474ea62d16259532d2192c01cc88982fc3e5449b08d4fc6676f81ef5417c164914d407a18384a1904439f2fdb448641790f0c2099a84589fcde138ee83b9e8810a8c845892156554499118f0abb21db6cccb7bb7d61a56956a75a916aebe34bbbc8c6719329c499831ab7d11cc57f368d7187c097751d16400d29677c71aab48b86385f1cb17545a4bd282207dbc9f2e2feff2a28231728dca8b86a415bd845a10648e6b565cea6a51a43fd216a768a85d2f3c857ef97371a93097dfde25f5dd17944a6d5f6f66176cf01366c10dc91465ac719923e29e6844adc570445c518b31efef7d9123e339a32d466070de1252482c3c2a78578065817101731c67e2983c219874c1603097e3a0e00896792e7c1acef82ebc79efc69f747e86df67214a880c708c101960f90991819a7301de8ab840dd3979445e51c7d5f772a4bc1f6b5c97975a28b93f222ffeca7271ae4c7ae1e056196a1615d6db906d864b8a406dd9b2650beb6b0e99b7cb694f36106e00bc9ac580b665cb96db1a9416c81d7f5488da71576d4d683669b3a9c97b9845f35a9d29c2bffdf7fb8c8c2ae6e5535e11ff7c48c89d2f8922193b7a4c98b6ac0c6bada5b46569ec549a31971f670cf531fe77580c9b2e8d888bc027227b1fc0dfb144cc07adbf1cc7bb8b0a3b1687f24bba1a14607dcec65aac76d47e7b7fed73d05e23e22346ea18898f980a1f31153e6224992fa85b4610903f28e0a83d6767ac45e728f79452ae569aaaf2bc71c6b49f585af4e87b9e47bb0e65c1c661abd4e1549ab119d3baae9b4d3232a117cca6db154b7f6c97bec0d2a257a50a6b71864bea9596c1df8867c996a112a10859c89c182a4f0b65ad516f706eec74a1769b89a31b5e99c444935bafa802a794a8c46d771535ead4cc0000008000c3150000200c0c8603a2f180a48771e0eb011400116a9e54705e254ba32488619432c81062002060000088088ccc8c460035b4ef163623a95af2e619cf631d80a8407570699e7d7164c1e7dbf712469b4b5229ee91e2c680454347953d0ca546ae94dc2b5fc615adccfc09c91028e88d825a55fb82b4f4ab8f271b52cd9a1fc1c3faa0d60c9f24e8f8c5177273e25bca88407dcb2bcee13d3e693b124175361f786cdb35d396b43b39e2db84259537233b33648034d5b0169e1109f9650d94c9ef8fedee66150b0313282136d0d8e3e736996829a9fbd6a1bc1aa63960ec462a6b39a0dba2405273cf509805015444885da9ff63a2d9024cd8f1322a43814a0680d7f0df182309b2204f3c60ac15340031d97d40606ab138366d2ea9edd69d9f338a3d3a8f2df65ba2b22363f6da991033980044fd314b9945a298c21cb14359ce8940edb31b3abc520b5cd020a885894342f96836b70b0874832826fa850fed419ed90f204616d98bf5a28d538022f57ae5f54cbf4552be7ec13582e0350e282225f8f384ff656ea789c2e1a6c03e36f7cb8409cebd733ab3a2b8e92ea150a8e24a6ad049240bec6066c1a26e5af0220fdb495e00590e27eeca4ae668cdbc454ca2575db725fa15575592d57d73fc9137eada86f427f85436ae6c6f131b7ded1954e793a7d3f238616c26891d23cfb863120faaa743f79da52429169973e3a72be88afa1a67d7bd6545d37f17c0e753a5591b55bae4afb3084810df2aa6c9c50fa9bcc645027e00ada3ab31e354928b978da2fca8318caacfc606d85de2e15c9a5e300a6be3cc571b001f3de9dca5a77a1410b5ad545873ba1d106368e8162055c470e59ce8b1198c69b0ebd534884cb133948f12e8c3429582b15654b089d68c2df3882887b4bc6b49e2fa70cb5f4bba4286e7713bdd1d0a3aa43546ff6877e6232c75c4d0f69b7114d059e24e5846c6d108fad16dd9a5387c23812c382698e476d68c81c42c23e60867f0e2c308a2cce7d9b8c43621582bc33df5246ae84fc6951eb41f4736cee40d59c34cf98dfd1a3d4c15636f45eaf6f59c4e813d2d446340378b0ea5731f61d4e62a24708e138dfbe400aaabcb54416bd980fa100b1e8bff941f2922b68ed64a7d956ac31924b10677de2b1a620bb301afde084605b371597d644fc60e1b6467bbb196d1094c6aecdcdf92a4903fc83053156ec48438c2235bd0c26753bf5f32c055f1235824747e5b0c24d689752129d77dd719151edde272323033777d04cc39736703f8c324be6ec9cfe31f94c8f344711a851288611e5c1f25383f1c60c33fe2b0ba6d7038c0f70235fa88b3891bda77ab6dab929703de8dd351e98bd27ba05d360560f144c8370c51c0bdf3b49f5c483a36926fa10d9d406c245efd80d189b25cf4f611f5dbe88b52983bf6e8ae439d34ac228a9ccdd61ab232aa6f5b196a768d192613c9cfa8bda7d15003af1ca186fff32da0f81500ef7e93c4bc08ef847cae164dbb035a5acdb58b7ea6c10057174357f3aa5d63596162cbdd158b94b06badf9399f2f2bae4dbdf28cf7eea72b84dd30836d67f0c139094479ca9bd98d4614ba1eee0df990b1b41615e498c19b0077c20bda43a42896b35681c197988ee4ecf1a02531fcd79cffb6cbe13c8023d6ca62914c5d27836b72a7c59429edc0a6b8d87f4011a4faf5b6c1e2b039006eca7a1b0e8b21906d57110d390e00b919a5e54c9098b35a13d6d155d401d65e52e5a25a1fe698a613214f9bdbeef34ce36e9fa199a92636f5cc1e9dfd06f17977fe22c2663ed6a15202911539fa6599258e4f8c49dacca111bd1bde327a2dc55c38941d7bd52f8f5acdda4c1eaae2c6168a04eaec2a2e26437616035c746d64b91f822ad78795603d51ff12d278a5c0f8d0619d88eb48c0eca204a85154c3e885688912d9fcc338db5ae73fac478b06b7d2ddec6103c5cf9fdd649ed8ed52763780a026e86fc3de01bf78f76f17452a0383d062eaeddd536232381f169fec5e8277f2027d950816c4e04be1200a76d5a72d572f5fba71e8cd03e21f91d51706d55b4622a76c29e4a1797b5b92fa97c3bad485c569044e9822dd1cf0d8eb6fae00010e610567af9e71a5b68c5892e545a1fdc0f42409852e95da7f2c42d3603d8bb049935903a2b175d483ee5bea1347573e44a8ff54652143638940bcb49477d00d0374dae43e70c0bf1225d0b219019fd6241a1def30989a2ebe2e655e50fea3b0e46402c885fdf395f79672b3c286ecdb9d111301b05dd9502412c93c3f4b529a2670c423a2e402b73fb5834b8885a6faa62b6b3c65cb190a3503f9943478567df35ef37724778369b1bb8991007429845f35786bc8d0f3ede12f877db0c1dc12f9c3641102df186031e55b7ed9c84be59731480ce4673d28e7884fcac62455feb4d4f15411e152525a625108cc39e988f110f170813522a3fd97fd86dc53f4abba4e57221aea3ed122836f26fc2a4824a5f4a418052c3c9979b3fec9bbc45fb7e5bd04ff0599ecf522d6b0c5e75a8bb393b8f28904d7320f4e81b8b189db73bd478bf431c3c55922bc58e032e0bdd1f43a5e11844820514c69eee846e1ce9706f11d7178d9fc23cfc70c5dd364e8b890037e16a2808fae68ff5df86a3764ccf1076656c56e3788a419f8f26ce16026d25a36c21b46664e5d98fb7a44cc114d1d637473b9bc71ea1cf56dce443cfdebb1998f686b66a4f7dd551b9b7288608b4db2474e0fbde040821a0d07d0adbac5843053a4d55f29bd9c6385558da6c956272dce0ffb43a967f0eaaee3ed5d879bd5ed971d53a307a5cfe0aad0d148c9a1989bf94a797c183c8e16a91c12ddf14face89a29dbc7d0eba9c0502c5531776cdc8cb189c8c6387d23088d0daf95a39f54ee4b3d82fdaa76e4f8c20dfd86ebf42e12f4d1f964266586c3931ddb40951e656103576930dc436720c5c7fcd5aaa2ea24918cbb438182067f10a39cf45ecbec422047c837408eb8d59512363ce25ba491741272c0cea68a5abcf10ae9175bef5baf71206b15bea1d29f2e16d453a13f13fe5ab31e1fd8c70b8d4cc0c7e07c0fa4d0b0b31f84daf954e290697e8b40ac9db399a03f640568b4446fbf72998aba2cc88d48cff577ef56f146565c73c0178b2c19243feeff5e90227df971e8d85b342634e124ea0d3c02e31fe8084f4443b391c29ea33492992c4e608294923b1a83dae89e798658a84ed46e73d1fc23dc8e13f4c94805f04efcba2a5725e75ec1dec531ec5c1da5c2f3960e8ebf95ab4a0cf55d5e77239c094783a0e7293529deeb8f331d99a2917cd895a004ad63ea69312432cb20fb0aede100d06e18d6bdf3c84f2b18ff6fcfce4fb1e04c4d14e83b977e3dbbf19468ec05d9c728be00169825195e18f724fb08c6aed159feba9a4038d3318af22365cbdf278dc6e1eb4d301e72bd532612b445b1c187da0a2a2d0a799f96bbf226ad406180b76b121d22b9f340ce6002fa974872d4fb5082d1985845ef00b7e99c757e3f4a2fa9d86b04de6b6bb785862784252956eda2584ccb0d194c04a6b0604357297c53ac59ecf222484f612df421151c832af88b0a8e9180f8443fb198afeae7ec7a867f09097ff05000a3baeff7ea57e6abf6d11bd3244fc684f734416b3b015fd6c7f31f5107ebc920a9af4c7f64318548be815e53882193864e6c763754de705243cda883fd0ed9070108b38fbcf594c106ecc3ec6d54f2fa508f217a8b46283538c89be0eab04603aac30b9a791c19d9374230504ce71093f556855b8c013e432b5211be22a8a973c9c109f0ebfbd9f9a421aabafb90495c097d20d94a3a5960a3dc2ae38117746d13a5bd5b7734d692d0691894fdfc9265d35135709c37619b065cbcea5a00c12542dde348c9acea0ea025141227d1ba833ebb1c387b2d375024233446a8422e534bafb9cdfdd2eb54f4bafde7266ab05444058a08a2af4a4a1330fec205ed6cef4641834a2f0853e5274899d840d501ae584d083c61f105d5a71ca093ca61bae6f6414a6d5dbad07846a1272001121234eca245586c4ecdedb9832b737114ee489b34686822e8ff19857bba81fe4d18cbb609416277f2fd444592d4f343d20f375d1eb69e3fa34065ba96cbc07f49c1bf5287010ec21dc3eda9dd5e196be103c906e7f30a85229dbc8d110db23ae04ebb1b7429436fcdfdb171e118e09913efe8c50e9509add7148f98cff80a3733bf44dd775124e6238f3f8dcbbbd746db8ee59b4bb7451b44b37a5a03c51aec54f2cee2c26c123d1bd9b13693eec24fa6376065bf1a616aaa24a3c64f2a1c0f649954e590441f8bdf91e8ee621112d1b1ca638e1aa950b4d303a14f142de790138c5faee8249093345a506242a2f197a8a468ee57e3dbdc497cd517f810f19e2eb2f045f40abbdb42f8690b048c16be215f9fccd4fdac0d358184df946570be3151eb066db856eea1ac020a101ac27a064e2b60721f0c17c98323d37183c568ce9ce9d18b82657b4931391f3b8d9288ef7f05ba03d67e5f400490833bf525529ca40a189d5b2c2c25f3315cf8c98dfb85d2d1eda3d2bf82ec21e05f002b3fc8874f7c40b7fbc4a4015589ea943de352480365e6d5dd9e8282000eb4d1def9688eabfdbdfc6e8a1d7fdbd0d2856ea60285e7a852c2882025a852b74865a87c2386803f944040d1a4680fa9748eac7b9756711993dd86280bc9d8fd76daf7a4b8950689d206f77768d806d085202a1408186d593382c16bf9bdffc8e5f49ac478e5a77259f5a30092091e7f152b4f465991049bbb9a122e19421867fd4e43f8067977054ba4597a8b54e00216408e3f684edca8ff370290302685d9971c36e8708662b088b8f1611186aadce813cb4d0245fbd1391b587c3fdd353be160487fc644844f44b4ffe3e869de18b46566886154264a06217b8dc3a154c8fdb9e5aea40b05796164dcab7ac02bec744b2d710731b062f6c186baf6dbc65af6277d30d3247c8fb3b6d4a40d6794dfa4edf32a2b2d00908d4dea6f319bd53de76da67de70dce915ba8c6881282f21a42d7977b6b447fc890e5089216c0d9b7d80488643a7d4d44797c55f5086d0b88e474c1d633fbf858108298b38d9677208888ee1bf02a321675f72f3f5ec2b22d8238885ea8918a56bc98362c4400f3ecaab76217ce3a8870df5fbc06ab408bcf8186426a4b6bb04a0b252f1c37c6481ca4e3bdb791929775c30948afac4bd355317dae15f69aa080879717a76644f527868a69ea0054f04018ebd2ea58507dd008b5cbf75814d021be0e0f8b75668c9044045627d3d7dd82c2cc07a15123000bd1d20c0a2632893ec0e15292ba5764ab538a91270c81be9704440555c7ae00976f5fb8181415da12c19982b161dca54687179753a243132a9b18a88a9954f62331f91fd07f8d743c14bd68c4b4c37841850985a765acd50e9b06029c111aa43b2c4c02ac97b31d9f4560ecf5712e148cff9f61648ea033cb6119ff7358f25997104b288defde202840e3a1aa2332155919d945029d9c0e4a4b74e2f8115dff6ed29032f7f4661b9557201c58ceb9b1d240576dd4400f2d3167b6e75c4276dd218d2bb0e65791af3c795af1b3d3ce5198017a336cc2b5652c36fbc89b7122eaa3699f53342cf6cc7c2f4a822554e33ae90e887aaac7644b0f487679f4bcf9b703f687e085b84b8501f62f1a3310ce18b4d9d88931c243223b1563a0df08845729c6f2241e92b30add7ac8f80b428feb89d596bd919937adfd5abf0dd41086f55a76e9a8d472556fab7231a4dfffb0428baccd0c27015d24347f6997cd4133321c522f6fa735f6710bdf1d2f8254e900140658ea1d5bf76ac9912aacf60ea1f7dcc0ca99b00e4ab0524d99b0076100e4473425c576c36d0e0a22b58558762f177c21ff1b234c4cc51026d0f38887de5f3c93e33b4f29d80a941e2c08742533eba7092d419842a1cac0e3ea6863f5d003f611313417467bbbbf23ebd3af153903b409b6d51ce7e54c2fb2b859145182392a7244e92130bc12a0db9325108bf02892fb32ad9ed00ed21b2fff8a23a1989e5f2a813ea14d42164fd484a807208934e9ee1da2a8d7af02379f1bebb3bb6090abd64417afec775e43f57bc0913d65a874d29a0fdc59415093a6b4dccb859cf822ada4b17e3e93a1429e98fd866840de3a406381cc1cbb15ba0bb280fc8f3b57ae6ae6a08a04844a0a02dade6323cbb87a9007631dfdd57106c8f5c00e09a6b0a81a58078e8d859840f2c4cdf9d239445701da9f81199f020c027b193e34b48b0c67a3254d67efaf52b3b600767d3043c37e8ddfdf3ab0b54fabd0944a2e8c458502b7a7ea3db68cff6546622b3e4db7f0dab1e3d88dd842ae087a086eb36e31a2395bbd5e11cad2b59c08988f0096300eac48dcaf9f1726202c22aeb4acb307e9d904daa124f82d4b4936e3bdef10df1ec1bd278fcf13ee529ec2416fd2fcad80dc1ff23f227427af57f43a1a60ee9b7e6017c52c602d37238057891d6fd5d05937becc6c0a8d0ab7aac271786f86900bdc25cfc850402f8bfcc62eda5558a0bcc04936d827230a578e8664423ef3b068d4b1f12c600a9721e7b2aa305657e21c017ae991bb1f1927582df44a722386805206207cd100318b8cc4aa62b7fe3553c49fb37317c80ab70a0680b8f3ae1a7cd68d73b705e85f482092d5e929436c7f4d11a85dac3f6a39123c0332b9f65ac25359f56f7d97b7b6f562354fa5e1c93ec5be13eb34217109540f359a8f3de7999252d96fcd94b1b55d5dcdf84c5c4b0a61caa4b96e7f83c91839887952c2c1d2b779d68fa683558d9702baae8f60f0903c76f0da284384187d8484154cf2e8530ddd9400afe64e12515fe30aeb5d43c4da5ef55df85d96a466fb6f497e4b7e5761bbeca202b95d68d041015cdf4211c94af607bf08db8b9f54aa9fea55b8b3f045f50e805ab268cc3f5478be0decda92eeb991c6d38d14ea8b02f1832731071b04e04cc31d0f1f7d0b62d502dd2a1fd8e902bd9d3c38ef073485062cd1c9ebe380ffbdc0833a6d5ae73ad84508084fef321a8fe87fb7fd7cf683000890c5a26f4e051d33b6c241c98e9ae6758dca063c7ef8faa12f711b7519b0a15fbf7a0ea89f764005a4de14484ff3b6765ce0b76938b4484134605d106bec21ceab9c0f6e86a874b636d2ca74c0aeec555247bd0ef56afa140794c12137c73a9a953b40d5c05e9e614dfc5cdc7d5f7e60cd30736c2f548de6d0a9bcb3d204cce92fd4a9a2e041d1e506033c36413bfa58950ed2a9b79692cc5079d8e241e9ea305f8ae4450d635ea3ec19e82423f32e4aff69096e4e202db55807639deb8147a8910f1be548527a48d9ed8524a1791581abde795f21f1ca7fc8931c5dcaf01e345d1a5fa5d4e1ff0bcf844558ec3e1af57dc97e873951cecb14a11169647d711b96e4624442bf5fca81d5c76835e410d5c969d30561fcfd5fff7b07dd06d1b65c12272d573405278860b5baff988bb1e53867d9f250096d5dc2f419465a4f1d4128204f8bbb13d28bae5d421267165cec9db095236446928f6324202f55929face0afd6dd90c4073b1a3c6072d9075740e17d723ca658f05096fc3a9edd39d16da65ebe4d35880d1a3005a3414163a0f39102c008902372992621c9125c190a902bf7496b23d43aaf1cae013288a9d85291cb9165cdb3d6d6f3768974a2249593c4d6fc56e9cee0ac6f455b2aacb4ffdf18b529e6b2dbee0c95a101634044620aec718797736473a64d49ee46d9e8e36ce472e43026c650c344c04a16c61923d19277fb4e9c848a8da8a64fc04a93babd4b1d24ee81b6c9009181b17c7d3d42ff7aa7aa4854e48d8d8d478471e5892814e54dfdcf05b8735f50d5135d9b47f4b4f60d7a74833f112d787cd6c3ddb958c5db5a37cde3b69ed8a7a3dc147237c48ae33507897b01e2ad5580d97ef0dc09e4e8afd595228ecbc9c05200dd46b581252b1844458c8fa4e4b3bbc6f844c4205d31e4de91e19a7e5e67f0dcd1ccb90f4f268acabc984744f6a38b6d8b1ebf3c2a1f77ff2857b0863bedd2dc0e65fbcdb6e739970d92081e3cc2a3007498ae822f6290d6ea40e00439e4e7299a54db666c4759487c7865b34c8d9643480ecf0a9e8470e1f408495c6fa944036d74d507634b04fe481e40051893917ba81afc830ca0107badeb72262ad374562f7fa25af80e942c8cb42adb0dca330b6e530ae44edbfbd612b82e09688485ae722de86776cd2aa8b99645f62f206129bb854a77471131884fe012ffcaa106c80130afd72d55c277cc8640d2454041e19209b04f7d578580a5e13142738065aa72212f466adf4b461769c2b1e5dd807e457474b1844ae45b5967ba043bf965aeae53d13fa8a2276c06b5e32cb1641de5f98ad73fd59bf5cd9ba13b7a84bc08abdb4c9077a078f95b58f8f29aea75a822cce440a2b14fff1fd7c3db5ba7962c8a0e1ad5dda6d2f14351cc4947f7634807c825af9ff9b524b1c7a6a378fabc52658e5c638b914475d6780608a82b92ef41a6864d4367bce3200d938cee4a136a972939dee74c0139a85f70484ee2fd1b8360449ed8fd4a8c3f04090889b32090a92f40d240a56989275289be4f7dd9ad7cc3a2101fa10fb3446251e8520491d74157fcbbee94e3f55cb7aa2a9f522a3e126113c8e71e7a06db88cf3b2eb75f7967d7f8c232e7f9f7c979719bc5e5a3ed424332306f48055f4d0dd2bdf9030f20226bd6b832585f202919f730c881386fe3eebdedaf77353656b71a0856f1245e9f731e7a8f777ae73d32f314f36f277bde50103e1dc71f84a5b337df1f2a46be9bff351ef23f2345198d7c40071858ad902fb38eefb7ba0f3901861d6692127da0f7491a5338649fd95c757fdecae3ad649e5c1e1fcdd6fa0885969bbcfa1db608fb1fe149826a1b867b0a56aa6c351f807a141ba449a85ab06bdfa0f8e2304c3fecd24edcf1c308583efd78f8c07ef28d3e9651fc10ae2e8902cf4be850633e609451acf86780a51dda40a022fba7a7348cf2f95d21fcac9c4720252fa2521be57261f7f962fd0d8c386e209984f694b72b449d26bd9502e0283b594cac93ce58f2eb86199243c530ffe676832394d48260317f85ee800fc55cb956ebcb440979401381d9cf288aabb9999317ecff5e72c59f7bc97e9560c55429a32ee6e162bd5210d0fcaed9e650047637d6e0e7864b73d296a107507c29992980d1720e4382811c05be0f6aa19871be97c4bfceb352f7a14723518002c2d0c081d01554100eceaa0e3a3f3116794ae9012ad4ac9f300aef9cb5b90b01a095fecc8e98159352176c7b194267b9f9f6f43cf2535f1772f4af999f776c520083cf817d6257f7b88b1924cb698717f79c7799ab79d4bf1eb8f730c1f753889dd74c082554abf2784b65859ae43f7bcbb8c021f960c4347d799401db70817ab2300851f09f1fca476f00ce41c28c83df0b83c81c0fd9a1249820b948e900040f9420f4296d4a424055bf54ca19965ffeef54e8dd843e4b158ac29acfbbe0d5aba930725cfae838f709197ff00d2e5841a76f0f87fd58f7958fc2b0c8b28dc218d8c8bdfdfc756c467a1bb645c7b6678c8f14f71ca4148e2f651a4da837343db732dbe031a60c3ac41abe9fe82d7aeb1543f66bb9b727bbcc139c1c7bb2e32815b23388178273a4b4f00ea251d1fc47eee16c636d6905e4ad6207d589fe7b3da9829b1ceee20d89b491ad4e1b8ddf89cbb24741b5f57507840913766a706c2316371c9243502dce3f4798ef87f88446eb6b2fd3ce8e3b6adcc4cc0109a7b5e60f8861bcdf910f876924692d3ef041171dde22788725a84c1486e22899ac287e332c215a574d5886de64b301335b67402a940c00a9f8bb052e7e3e7be39942d4034031ed74fd8d10cfdea77f03ec008aa6b5f8cc71821608398cec20e1d39a210838676dbae1bb67805963e8a9fcc97d8a36a60ae78068bbda1a085c33e34a09dc7d613fade33f520ef2e71bd153155edb219e500b046887c29aeaf36c4351e40e166740196b01d9790c48ac6dff3fe926cf419b6fc881815eb32b851512547042d6e0357e0119930de23e1a165a2f0dae8ce9464f7cb7a8f72c7fb23ea1a447c2846d4c1c6b0930dffc5b5423a0c9d9c2208532272821887f59eec739f0cb1cf48599b82c1164f9e2c4d87342f49bb086fce9e7097283f0d98726c2191611183290915147bca7608a95d259e2fd3abd0dcdc069985810155a61265be670bda26a94e10073c7ca16cb08187a8d98f64e950c757021f83fd7fc1d02d352b8e62d9e3f858c48988749164b1a9d91cc02e2de53edbcaf110c7ce8e41741a62079c37104e211413ee67d61d413158a6664791eba6f51fe4a466bb1c4dccd422f35c0bfcc97a30f1007a035dcfc2533003d79ef6e43366595bc2e6fb76c109ef9b4e5f0b4dd1d3821463888c9925c51010887879b14b8d4cccddb00092925410da493c64946723e5836eeee2611cc788b37aeb58655c48167dd3ba89a7781de69e1b604e044a5c243714ff535dafbb26f7dfc13cc59aefb66448e37cf485f30d0f5def65b002443abab9df5c0a2d1933c52bf474965d5a5c47334c5028a43f9d8d4b1fba8fd5c1d3598cbf5928309ca00aa17b5a272872ecfb2fe1d273bae4fc7cc8813c256aae8808ac413082a096d8f1a98696736e0ba6b7314c9cec24081950eda1b17e2c45595f720b38c9d06e7d963454a417d6759177545be76219f5762cef94b9e2638f2ddee9ffda322582d168a09204583685e35a63d09a3ce0c0ba3088c6a11694d43913aaa92cbd8168e8622021e655f4ca40a149047696d9f6bd2c6871fa7409fa45d1df184c39f1ce6c283440da23120c4da15e5fe05f8a9e058615fe67a4b80a0b850bc83a858764c15087874f848485ae0ce7c395d8a32448665725552bacfa50a6cf91c5d4021c3bebe1a23144bd08050cd81623325a5a923528b883d5365e9c8b12c3e32f19b4f6d8e13b1e4ccbfcc9fe67ed2161adfd69d91fd304a8b308cd2383bb499431080cee4c3d25fbe0663afbd4f8a7c09befb56f0c0b3f06a100637b97c5c6a85a7cd74a80fef2d9d02e011bd84ed72c712d3b3efcec9bc02371ef4ebff193c9e7f8d5137d00054542721b2fbef74919403c5faa782d792e7b9df1fc01e71de31b31a81dcd884954ebea9442417d9bef9f682a4ee23468462dd9dd00f2cdb42249c4eb07147b0c807c4472758007c8798a9d8ed1af4a8a6c67e492dd1afe7c41121c2cfde36bfd88012654c3aa78b5d80928edf359de7e80945c2e0db380309094f18a94d99b8429c8848a9ec2f6545f3fb8d4f38a3ccfdaa9b07a48c049fea57d1064b23752d4b1bef1d3693c398d5227ac76e1e1ca20203da047049de5fc43343f9086529c70d74f70ff6df7315f43d668ea0219503b311c3c06fd68b5474b24884bd8529828dc40d7a78a8626035f069d70499fd396176b8c92429ca025c545a601fef5d3af2c11465d63d7c43fe7d1e5aebbb815f5ac4cc7da6f9267b968b3d544349d2ee13226d89eb70d166ec15e3634c402d18225c6f97312289d817f410c0b56e9c667aa3735f0dbd22e5a318cf7a6ae4b4a66a34a65f8fd6914635b04069239f9ed75c8283f0630edb42885c55d244bbd6eb732094773a06d0068da5af9e462415ee6cd8e9f4efa2ecc73103a0fcb78569cd3bb612039c20fe8f40156f79ae8cd05361e6c1c3a8a66231a27933f1bef0e6fce6152d9e98788005acc0f8facd126ce26ccb8f2df4cfe961c84bd124e4dd28f7cbe14f1dec69b03e4459d5bbb07f32a0ac4867139f25adb79ea7797dea0f91e9e0707caa08d5948d3ead7bb7c073468b001703c93c51faced16d8ce92f03db173d87b4f53fde36ae878e517e7d5bf3a7c1b49836279e6ed25bb73de99e4e07c9397a4db53bc1101a5ccfa65831ae83f86644afca9619d4072e21888ee10c2a8206cfe26f306516ee268a2638af7de3dcfdfb63987e1a8e7b384841b84bd50f132b4c656c2035f8328d7f9a3e30caa4fa4aee3af83abb31e038fd2ff94a6071b06f2b56d2ceeac3799df39911b4e906cc3f3572db20b0789f6dd6b49ec728455a5a244c45d85a66aa0683a5590d4836a5b4df1a96500f986689a828db8032a06e065d8dd8ae6d14f2af62b395c2e20a432deb554c2e55fdde795b5b2659b8087de60b4f3658cee59814be89a567022ed339d8b47f439cfbbac0c6368e35ce1f9429cc87025fe783c679c42366f1fbdf389840e227031de71c4ce644a56da7f53eb33425a96a1c9f130727e0b1bd06f89f990224fb6c168b1c9cf7ed966de301eddf51a734b33e82be5307205c3758ab663937a318f4d076b553ca424cecebb60042e512bf158db06d2780ac61548672ebb620d62bb0d5f22099b1ead8b9450695156d6705fdd36a5cb298dd400aa92a7d7fca6709369a9995000079ef142c4e8d05812356390b09e0775ac184a085868b3f43b757dd36f71ba9af14fabc7105675f003f381ce6e2f1f73391958d3693dea99efb624baeaa93d2e7d340d2d51c179ce3c44014771890f8b74ee4d51693d49d1b6dfd670122dad22f054429daf700fa2a90edce2af0c48b708483d627f469feb090cb8759606e262ab4ac0b0f16a134c4b8029f4c7365b1d9b7881e1f43e3dc6ca9917067b6b83b4aa56cc686476f40d4c8b781cef16cc2096498ab1b274734d73d481690f4bc9528fb15b07d1be100920be70823b058976109c8eef3afaaec237c25a2f117959c146cd16433d391a6b46b3ab09ac9d97bd6de839c344148d200284b96b693cf8924e9cbb30d6b121c26d3068eeb1bae7bb189f3b5d6b7aff6a0460ffbee598b59eb657a39ee812d4a2eebb0e5ce2ae0bcdbd718ddf121fb1c008735e8fe397e580db18be031576e0f32c608eea0e3b64b261258c3d2d6e7171304b5b1c85ddfd6700c65c82d8331e8b7d6cafc7e39dd91d276da410752a2c9765b4fd97bc1cca046c448add0e406dbb169d01fdc4f85031cc438d9215590b514761a849ccf6ec9b18a6c8a1fc12c3f06a9f5cf9f005dda065674c08f939ebd42afce722704080dddba7f01aa707a7c7ad4c03f0ccd7af19a54bdeb556f6e6d98dcde5fab72bdc46b7188ca62239cbac1431b25d663f23cd5a1cb290004d98ba7c03a6b71354c84508f6f8ec936e2c4901ae1f41e7bccedf78314f82e0f95f600f69458fa78840307bd9c38ac623abebce9de816af341c82430c33228e064975d9b59d7966923e3766b88badc5b02f3de7dfc1b3c1c83034a8a9ee70d1957995b96c94849e1566a973129eb2110b67176556930de1e151581a9cdccd40b56d007b1b85618dc82f2b5a5e0d96196e7e30057aa6f1154d97f2a98dc605bd1232d9c609ec243fb0f6e195a937e37e0f4d0acc4dfde5600f0d84fbf078032c22056c500c20fbb9b10c7ff8d606cdaae5c34e3a5c8c229cbc9e9b48d6c87b31a5c54c10b1febe392e00039d2d07610ecd8dcb6c8d7929d05eb52c8d04d5d99beb736625e047a7e556f490815c0ad60df5e995dd4fe686fb9010339fab9e0d2e455fd87a88d0432c7c50d7da32bb12352eee48646f081ea9c354759a9f19510f76c48e2cbe99229c1e4d8aff849f6e8c21285f072b5c3228dbc59dadf3d1ffcbbccc8b13e631adcad81a6ffd643b294e20231048d2b07b15c8370792c186d8d15ec8cc5b01a3890c848aeaf1f3e2661c50a8ecbc99a76a1a521d892df4e385964412b81c8f6e74411ef016762916581221f876ccc915959808c3710185c1fb9095c05e1684130bff25def261e7e76f81ff44896665eafc5aa894c6f356d6fb21c8783c3f99eb1e178f7342fccc9d0eb25cc44bb67542c1208fb3430b69706cbdb2b918e921cc204fcf2dc171f4b6102c311375d37fd411d5841bd44009f28f9e11be022ef709819774ad30be81054daa80bf719f488587a404045ad294650dacb60ee6894166ed5fb28b57cf286f88f0587dd2a624dab60ca2c40c04f53d6740ef8e6e5d3beca0f0255ea925519319417d22a9dad2bb63583d6b7bfcbb5b060ea106a501adef36c33cfcf190ec6d4cc79df975927c7353225fb54d6eb1c4ab498cee7b3ed4f412b3f95fc6dbac7adf20a96e311a2be7bc5686684c1220ea519b77c3e7ed4d9d54347c1a3b07270fd3b05e461542dbf6ad5a4cb1ad46e5a679c8e72052f66bdb0ff126faf717670473ac03568de4c00d570cd9fa98f8123767d545d31b2f110e602d70775e67417ea7ff79b2c2787ad10b2cb19a5552e9023867a86aa360d037f8fac95adda81bc9cc560be628127813f176d6b47480d1e32c09a3dd2e2a8558c7e67526de72a0f693f34d91bba5e1183f9c52c32a0146528d02e1db19dfbfd4cd4d0b6a4deb88e5d0c2d12d8adcb410552ecac12280c7719029e56aa108f6e3cd2c207f43c38dc8ce293bf52fb9bf9a4e94965455999c1e31da929da8d46f0fd6a879ad88e579397ac1813b377571af74c544fa30dcc1c82e44efd03ea322b5abd6c000cf680feed2fdb0842ee5434db5c62187a001ad9b1a9c15fd1debfcd0a91774c3f183295280cc38b6cc90beaa6ae35217b7688b48e9aafc0ceb915a89869b576b66965f8333c13a85094bd3d1f847405cf41c9a5bbcc6da6e0a02254f98ea12cd7b1258436feac7e2f033647a94f9dc702031289305cebd56b8efd45f882ed5e0e0f5987392f8591c5e906dccb763b9d584f436689321e4cbc4a1d8a84465d02c427ac40948bcc7ee0da290d36c3ab8133d27ffaea0381722bc3afb2c94ad525e4d710e1e419545baceac40a7ea59592a8deb82ec0ac84185514857880bf62e608b1a8047d6d34d8f7302927ef51467a0ff3201e97ffc8861861d1779aea06d17841c5fda441b62e46eee2a0be4faa2a3f8dbb73a96e649900858c26ff811ba22aefaaef803c314e194688a6a9f5ceb79b621dff6ae1e6d176f4ae5e9b9ef20cd73f1a0b2ea345ddd9538992e1d97ced75d8622ab8412358634d4ab2a984c1a701bd25b4d250ea68edd952c2afeb72c6ea13a3ef6a04eb87181d873005fadf68acbe8eb6dcdc1abcae450567e0e1b266173e1510ada513e088a663ea2fda78a1afef6f6fe92f2323ea8ac3fadf768a3041de080c0a209a91a1adc2a6df185d76df5811794b3363fb60ae300798c5e6e57f52628bc220ad595bcc901bdb08931e6198f55a8d0df1ad008e6276108a23a0715b9879d9670e511571caf846c77973c4941771d40202baa46eac3c5441182163f36559668d79b35c4dc706895543d88f62ec9fa0893c2057343e5eb7984accf80e9d53e21ccf0a3cf78c26fc61c9d45db730e981c70a9287aff68831d3b0cb3b76ab15b2aa34fa3306fe87337c7f556f92d94de738cdebe06ce066dc1e5fe4d4876230d4521534b63de1b84a30cfe8201f749afb24d68ac9620ca61cd5a60ba5f109781a2ca213cfa66e79fdc09d04710cde8576c87dab6ad983290c60c30f156a138c4433e96e9913e007205673c3cbc7ec535caaa61256ff46f40ce3c9f91eb4910cee758152ed651e01c2b94681a26191a22504f818beffc339669ef780ba3e3f08220860a896596f160604ca48577df68d35642c08afdce620974226ba6868704a69e963eeba4ec049c3c2999d72ca00ca401094df2180554105ede8a85450afaf137cf04e72cd7be684ac76610946eee21daa200f6e7d585558ed79901c75689bab0c6c17943407585595ee17d162586ae4e36f97c599cf8f6f74445c03a7cc59708b07c8abb5a6a1be656ee73420de7e6348c8be49dd5d3cff9688e64e626e1ca1297a8d09d1020efbc8de2887a66b2179ce47a9d447a8a0015b0086095b453ea7cb1b94934bc95d80afd652ab803508022915576c46f20866e703ebef408c67a033726acf90049cf465da8e2b884260fb626a0a209a2f1e8b801b4a4415f03a597c9c2ffa283efd323347d24a784897e105858fc0d9d9e3b8916da85f2ea5a941ccf571ac5a8e854297cf28a343660d3480314e08dc0b368535b69616444ac8bf07a5f70f8f0989edc675aab1ca8e991bcfe576a54d59db7ac758159ccd56f0b9e3c4bd4ed1e9772cdd2c2ea8084509bbada57ffb5d827b965caa79e1e2dda1333da0c84a34d19d00c1f11f44d80fbb2ab6ccc4bf38c873447aad3026bce2a361ad943b141e13d6246bed63bb89ce2370d553a6834e04073f2f20e4ed1b74092cabe91f2bcd69c6869400e987b25bc1b65783e74d41ea5f60f12909e984526be879aa81387f79448245e235d80790998037f657b7a6c5af63f282c29877f8619270c61c70623f06c9e57cab199d5d4589db75e4a9737c1a7aab7fbac710028cb7b650f9fd54ec70f60ba09362c877c16dc7ea02455d151d2b4d14ba239dd32880e8582bfb7be8494f7ec2301debf5861b246d4ddf85544dceea52c86e891503c97b9735c0f41cc79c8e561bcf5c70bd21c16f36cab2e37123797097988dcfb9840c0d0b5df3e0fe4d579f100c4ff44d09baf3ccb48bb63a3ecabac5cb69d57cf78cb439319505977a07f93a1e6c5f6af4ba2fa6dc5e7c2fc1f391a2245961b2150ff816ebb17bf55ddc91eec71209449e2c2a7ffc5b02f2fa8820975d7178df64f8229072f91b6da40674d14550c0ec5c36501e185335271f7c6702000d5234588fc9549b85fb2cee7320ed748f958a94c419882a30da35af93d98dd0c836a08851aa43e311c36fca95b501894830b9fbe7e5b2f41b7966106a118c480305d1766d7e0400a979c6e50934d63346c9a484eaa038ae2fe9cfaf639246e8cbedfe01d384637fa7e70bbdcf61300d818b3a5751995225103c260f60164ee439a26d584d77057e54b600109713c42612bf213c58f1a8c8fdda22809f08a6143a47682b6768616d888a89c70bb230925869c87488715e1c7c0c94881c42b038a7966396db22ced6d951bab4fb5f42f693791bac67f6feeb10def07c1f8f02fd3eb7828d6f3967f69f9df6ee6150b5d98b80df0e42c6474ca41d7bc1363d31d8f8681515323987c616993695a21b8b2aed440dd3f4854aa6199250f40e32ddefbcb432abf897119aaf0f9c472bd1bb707cddde52f25a6c4473976b06afbeba2ee5d2c3a277e92a2c86c9747d4ceecc28b069525381b9ab8b181ece6330c7aef67621495f46f0b2121c470f3392de665ee879e6586e32b5856838b61c44c50246e1ce728851f15438448c1f43848c1f3475ef2ed5cc6420f96f34614d564980047ae3d5ae35c64481a131d5c187a6c41cfa88d892371c0b6870db14f190ad20165d4fe022ec58b2e41d784634d37720b94dc07f8dd31ffa2e3b29f1655a5ccaaf319617ae776d7a25347932b23b70ea216dc628a37af973e709fcee36fdca982bdcaa770d060f8afb341525d6cff2c5988b84975e39ec5db342229008d16167aa47026526f54f99c63022067be5d8bd3c26716447e709819508502f16b5329dc541bb5dc092abc893744cb4b0296af7923898d88e14cd232b9132c4e2c1c425763448c4f9b79daf901262e829ce741343ffd989d737742342131434817812cc5b55657347bfa82007fb37dadda20f833545980cc224560714a2b9f35a80b05d68b962e241218ddee1817e2bf3719c10475978875ab7f5413c6fca76229c92adbc860988aaa3d09cace9b635cdc1d0fed0c0eebef5daf26ea539f3eda5cb02e263f6df30ba16d2dd7ebb61e122c901a732c706264dea7beab2bfebf6cc7c9c39924f83fa7ca01f8d3b85af42bba97fc7e6ea88a07bd3a3f3693407ab9c7b4b23e0d063dd74b679c0d84ddf6887b863d1ee971db25c62ef88485bbfa11e2218288d9852593e707cc080fb409b30edc67c4f3820faec49378cca74fd83d14d5a153659a808a5795ce9282502ddd166461a1e8e130a75cd61efd4d26ea8e4419b997362ba571faa92991d5a7db0db6d99b25f0241c86c2c05c5167c4bf092e2a4ee176c7e8c5861b38b05d4dbb6712e9444c4ba4febb23a1b0f8e6fd51b1857202a821404865a3382c36c938d3f81d5149f80fd0e7fd2fddf410248c3f753fc8fd20bff56763fc906dd6bb9140ab4ce8479321dfd04a2128308850fc32ffb66fc42ccb1f561177845f3ca8a3b96720f63e92c29a1ebb3200c651a9fd7def5c0a8e2a4bef9b271bf54954dbc0108d83d70e5c9bb221f19f045c22815c5f3c53ee67da1efeafa379dbc541dbed162c01680b21798514d72649c1e5ec9dc027abceb74bf68147714ec6cd97dcaca51361b9f9888e9ea28a3bfba248881c36d317c5d9c95a0c9428f8f012139756b2c14305a6a3e6ba10b2c9e8c73a22b53fb067428caccf67dde0095987ec7b32b4f99cda3e18c02ea9631f5540eb3938517621d52e4e0cca5bdd77b300eacf8f5c12bdabd1197746c36c60832db1b41bcfafc522feb92c92b0fb688f721a63e63c9bfca9013e613204da60c0fc8e1380d0cddcf6ae78f4f64cb94ffb7cbaa404150eeca4a3729c758ed0ffb1725b60442a05f487f75b271cd86ac259c105f2416c448001fbdba74bec40caefccb49ce2d73c4099b8550e10bdc4b461908d698007b852611963ea29459a59ddc57b39f822d9b0d9aa3431c752760d3a164222c3f1b85ef798e2440ffc6c2dd6f0d9206ce9b39e0f96e6d48a3bf3456bef5fc63989c0863a88571dd936a5b8a4a4719a7cc3e618d887ead294218530064b40694ccc77f24a3f7675aba937a1ac81e7409054810ed9ef6b7ef4ce82ee4e8541ec425fefd3595b44503b7df1ff07c6c7b879a289783d623ed5d0240f94a14db49df92d6850c38748d34a314109aaf088593cfa37d184cf74772827f5097273d549949979107dd4a9e8939da7a078f36a2984d5442c267da406fbdb1b5a1e8200cc52bf011da5eef78ca29b1023e207acd5f27f3e3881486a82ba323beca44b9f5d13105e1b20fed5f9bcf373886627f3c0f218a8c8f79de88e7abb8cf999d256c1a84876536fc4c17da4080879f324a6b8a109dfb3f19cdbc7f3e91a04c22e550a9e24eaca6511a3eb86dcf0c0cdca359d88e7c4f7455dd08e9781ef65fcfc211ba6a1526f5a21a3503bb70f6f710ede490cbbd74dbad43b0010988aacaf9541be351cd67cd748687c592ffb458e2260ce3f7f008dd2da2bced9ed31ec598b087628a467181a044baf008701efe225e19a0cec207ff4f0c3666f8bcb8017d7c05325bc007b45b3881b8d3d229f50876500df0b6ddeff3977442228c0b54ad00443edec9bcc9645f86fd80c57a83ef06f1cabb4f7f2b5fc0c64cb9c33262fff3997c9e7034f104f602659037371b83a3ff3b8c62c281d31b8be4fa74973b0cc1e15a0627f8144f43f7d779d50161c4b16b3e02ee48e28ab4cab5e919b77d56c261e3dc0b47b1fd44048666a9223562820c74668b3d9ccb14846cba20c21b43553eab43e6e61db7f4ffe9780987b38b40fa907879206c904850d6b185dc638cb325b6fc8a622b581ab34f864e1ae80dc241b41af8647db732842fa14a1467a6ef7b439019e3ad89f45f98c2e6584d24a44fc228668db090f99e48c978adb6c5389fbc1fca267bfaccf7e7202d4f54183a5da67a063b066c42cf66f606a5c7dd26157417f26f67852a90b8412ac57d76ef6122cae454afe6a0039f065c3c40a07b899fe65eb9d7248051a88c893320dde3b6ac3c4a85e0e80be09e7776ca63a418a39f5cb33fcbad3d06cea00582f05241d0f9f345840c592240996d1e4c28a9c2186840c77d2a1534e09a1ecb912f1ac97cb57dd6ca8ad912683c022eba193e777be74622f31b19e7da235d6856ad367d10a6f20c0c2cc6a74bb85dfc1255869d8dd29ee2e37826859c1335e9821058fd8866e2aa2ed7bd93235384a89beb74b13cd3f5a3affe5143e6d321cf20167a8967f101c1e228884dfd3652886f00581750c91aad934a9555c22e57e34d3ecea713d8a2500489dfd562a0d682fa1b7db906fcbb33fcadc85f0dc6586ff40683f8b4274ce134a48fd33de39de8ada36ec861c75f5383c9b7501eac41bf48541c5b403ec71b0bcff308fecb13458e07520da8b53961bcb4548d799035b13a9f55d13f3c3534bc29585e8ba8c49a44f65c7fc7b008439a607f1388b95f3f770977bee992bafcdd305f7038084ef401e49d1c6eb6f7a3b10b9d6d9719c92fc7c39b785f93639f3e1b6ad84e89a236cbef31809b90e5cf90c0ce1822cd470b86756f93f2c2d7be237948c51eea0c829750ff15748a7c31de0945a475febf0819b348f46df99aacce1e804edab5e63b2dd613863f6baf3504939d2df8b5e4b2d42924544da45e425acdc62778773d6e54d0d55dac9ca06e59347e83d515904cf54a8e7764855f2a7afa1a9260222391df9e31930ca6770319a0930d051231cc4067ce1c0be7dbbad6cac133d9669f1ac7986a44fb486e5f90d45672a51663cbde919d9f5f73183997ba8db96c8271c5c39cabf646ec32816ded2d7a94452622f704fabc3f0ba4c3cfddd97faecc666120c9d3e113472c58778c13cc9ccb8a1b5114acdf945ba28aa8da449bc3fce128520953d98e698ca07c6dde8794163f42b2001d4d4073014033684f3ace6a22d970389ab21de6284978e6ef09200627d2a3f38e25a8a83c0b5517307c5c3dc46baa7db88556c5834db56aa174d5ab59c082a773b594d38b54290eae8843ea527abf753f3042f0a09b242ea21246533b772ec83d04bb8d1921965f3f89f9bf25e6c9196246942d9fff1bf22d27493aa6e6ee39899ec6ad4ec9486c9c20e17c0213b93e44322c224ac2f12b0d38cb8f20dadaaf7e8ead08294589cd9d35c0e9300645d02b7512d021eeda6f82c5b6530cbca40f797a3a61facaf7e19cacbe90e31201dd1c181dda6b1a2a635a26dc020c0c94f689c6bd0b5848988f65ea101627012cc3c5c2759f840ed0b6ea8810ce933fd99b19883a51e2e006685ee101855736adf0fc5f5b5e653e20f4e373b0316d3e296fe0400cdd0a54b9eb503c51253533bbee4b909f2588fa85bee3965ee20394684ecc56cdd7a61d2ed253732a595af56aa3df95b781cc565b685014cece9e72abe61e8a4ab40074a80660a2e69b562ee7356a2e5cd0004417821916c2f8b92b74359bd2f8adbd7ed46e95259935d0d3f99626459244eb352421c70ed549812df130b2bb7c793c5d52e08ba777d294e10e2c23506e32586a5dbc1d554a18d0b655638e1230e3370872e05f28b61996a55b1b3b4c8f47f547fc215d20477376db12d608ff3a4eb727209a7c7d38442d84ebe44f59310d8644cc9e9ab013616a58cd3d960ab5c3e2e4e0891e9c42d68d91111d440bbca585c4b071ed8f2426186d4a42461c6c61c50b51ff46577712a8807a9e66a467bbb317853cdf55bf8ee7898fd24131307b4d97b239750262accf829063e956a790a60f940cc87bcef7c11f9b2de9df765dc08d97e397aa2a8f4e16236921bde1e906801611e793b57277b5cd7f7acc1c92f3f1167240464630b90b723360bc71da621248ec259ae6539ae5379f6b2bd1818ac0f09e80d2b0f6d9a7f64166e13842a32d2607ab1cd81ead91e6f5da9f65faf7af0a2c45cdc8285fb1729f85c4157b2e868427d919ad75990b039766e3f6d5605a8ed7658a88d34a23363e6bdc2af30d13397fec6a4b8fe34d1a0911ca6f4d734e0dc305aa52ff1858d0b43d6f0e27ec94faa590efbb2e5f3295d4f91b5cd9dfc8b917cb42f62db72da68a1b6cf0c7650780f6811c28823d770c8c0bf70726bd758b3ebe11dea51974ac4e9cfbd9dfe1ef20174f289e2b2182243082cf71012d52887ec466fb8758455b9e9ca762bdde3c41530fe388de8b68ff70541382c5173b4f3e0f26f7c76d23c93e50aa8153c0b7efca26b6a9e800404258c320eda44b13000d4f34623b4d00d7f5eae768439dce156f9c5e7129bb57db3f5fb915848773f2067fc5159dbc486d469a2190045198fc129cac8f28777d718a792a98c29aa1636f933f02573d1562df1218f20b3f4166ce64ea2686071df38aa4fbcb91cf7736f5a68bc917316da48172ca80d2bc3fa2b1d100d4b3c3fc7670f1f43124cea185a08d3aa0ccad518ea0df3bffaab8c31da31381554d8eea738f72f6c9103f7e8a2c172e4af1882378aaaf738ca6e284d6c0f51ae317dd032680933402c574c7de6144f9de473a51238040f51670dad9a60cf60506a613dda9501f7ef1671d478bed2ad23618b506d8490e8550f01875aeeed98dd040dff28410e1be6bd659d5ffe8ef97a5c66a7ed750636d52319228fb75888e8942708636fa75c12421945d5b4aed98e4227d65e66dbde7910805c8bb4dfa81bca2d201b4816a8bfb074e2def19d379b5d89ae9da281681cfe30a4d1be556d685f7bbb5957af41eba498fad61b7fb70bef72232116b1f63510772aa821613159574481ed3a9c05db41ee20e42b89fc89bcc32b5c121387f1b55deadf2576f868575f11270446713555f45060953a254030d336698a8fabdc430e63bbeef9ce34ba5c2a2f376647dc6c6679148d2a0279b729f13b003c6cff4155b546a8ad76d420483165432d15a9852469cda058293cd56b01c16984808785aa769be85c3b0b86e2be57cccabdbd0c965870e3fdf157f9b0d9c6cae8559f541582456580460c120c8383f3ac79bf674fcee3b7cda0d66ff40eed04477a5d3d6a5a13efb6ace119cea106625cee72022d8c2b5181b0c117c1df3aa90f1648ec3875c682d236e83dbdfa296902ff9a0869114daaf114abb09b4c3b23802dd861969a5cc06b3c8016f47b61ea06da44f38629054e58736b424c82b56d3cfe968f1ec605cabb48eb5582e39a5910f50ae4dcb6983fb02b07f2f7325d3ce85ab616c6c6f1fa2845904522430fea34ec7698ee2d1d1aa0e4f276c4ca51ef7adf94c3cec8420f1a51e346b33d4c913c5ab188d2fdb43f854853f370e00aa679fc58fc475422a2d075391b7f19142878f5fd7fbf65fe6ba37c9afc62514553f936f434d59e825132c97207d6b588f16341ffeba0583b147b9f6daa1802481ac096d6931be8d55f552c2ef2772946ea9f080d010ea69ee37692924c1da8716c6082500c66e6655c59ac9f6056ae8c1ee57ae85309589626fbf2a7bec91551bcfac221b311f3ae1bbc5c1f45a2bfa8d6e5df448b5d7af206879a3b1ad3b550dc0c0f8dae7d1c590afa962f88f5c30ed809ceae913db493c467e81fdf0781d095100db01e978d51377988e22191522429cb36b754958f9032cf80333953aa8dea6664fcc946d7e6068d3d45735fc2244b4fd86a66e6bdd18983e9f07553be77fe018a5ad9c6a77398daac1b3775c78ba26c26dddff4958eee3c75a394062d658b613e63df3f4832516a470210e790dd310d9b6aed1871f9d49b452b58ead48b039634d6ddaf1b178b4b9c1853e2a9b7d8130dcf819aeefd775908cabed008e60c135d2d8f908174f45e30e702219a14b06730044891fc26ee0313da222568bc86169c8fb6a48365db57dfd19ce765e3ec86b74049713d0974f0c0c78bbaa1bc8323f6af4bb129f982781a9339bf997188ec43c79d18a110871cb353ace7d880e3af087375820221bb19840516811ce11b19d69620365cdc6e8048df6189784da871a54ace59d1d1754d25f6cc26118d23d7e306659f919286459c41ab14a11da35d921a3757b3ddab2072d312256e8ec8f8f7b07207c77aecf6d2e883ce5a2b1addc344f72e38c78640b7015a224b5a4526285a6bdced71b042ba0868d75137b37e2a6085fc6b539491f5029280f3a9818cad3c8d27370b24e4b62b77b27c9ec50d30afb70a2c27c5e030246db20d1a6f81f9bbbc2aec3fe33ecb9a04eac6773c002ae296bd07dd9e73976d211f283abb11e09c77fbbebee93141889f663cfeaa3bf1450876983464f44a3f2b7dcb8e988c5626d52113d96af81b7ee8eaa8f562c4c512d0be69c8fdc47fe039b3c8d9c827e1a8c8ca6203fe34075ab59d962d5f2b3b08a9ec62712d154cc56953de8d49e42c4dd0bc024a9e95a38c1602adbcb3a1d745c2b21cfb4ffea393183ad02bcfcb662e564538f5543ebb4639f11b3aeb6d8627a99a33bbc4887eeb613d9c7c868ed729fce92bc2aa59bcb0bb900387bcb537038e88d30d94cd26553cf4e92a14db980238c57d9401ec6c9cad86b25aacbd33005f6fc35c832f7357d5ab8dede79eabf96e778f6dcf8a0f92f10d9ff8ce7cd2108dc7387f8158573dd7e23075329d7a40dea64df25cfaf927e71e828458612bab311d9f8293fefeb25ad4e05e3e76ba01b3fef66c46ba072a550215503e1b104eada32952675b10b80e0d4abc07543b5761bd9e287dcd1a95e1528e0a3f89bc4a788aec439b5885b098b20de3e2e07252dc403499a199fd579372615f301bebbba68e0e8a5983d8a8746f42bb2270a870713f7c912ba1b6cecb0de43e5acf026d3fcc0641bf4cbd1673d3a10bbcd5c9c5115a4c6db4fb16c04b02179ec8d824ccf308084fe34980c834c46552bdca75f708b40992ef48271fab9449e174cefdc6a8675bd11440065fe0cbc6e73735e29f3fe18fd19b7e7eff46f1c4881e07cd85932a8fd3d8a93cd30d07197f39b8a666f38acfd1e8aa45b3179c56f8d89dfa04a00480011633a7af4802aa14814ca208b8e32c6e4362609daf978ac732b889dd973427ce3b727dfb47666b510ec7b7edc5c33e7a131fea80966266879977ef6de04cdf0dcf79b4dfa53f1783d055de2bf4137c2aea24f4ba817710a18b985f5126eb81b1fa416e73c1ce7169aa6deff3a16c12b2a702589acff078cdb5b2c533d94e8c968da937ba88016148986af9ac51a7eab77901c47becc15883b2d8fdc4caa3643b67fe3d36d2d2d106beed17c8914d72f397976f07c0c507f292835202cdc843734441890965d80bf246c578cdcc1e9d2b74439f403e7629ba489cbf1d909a94e0a7f26340c429a643ddaa2c313328edb3018ae87af6c891950e2247ab6f9df34c9922671ed417fa96a599faee36b307a94f39484dc6d1d94c990143e0f6ccf64d40416b36d331e160e90e848d10aa35bd3891368eb26e0daa768beb76cfdb010eab46df24dd72555c2bb42067da7d58d30e2bd9f2305d90d5554b6599836c127cc66660836c2a625504f3a3f227e4b40f8d924c8e408d1fb64c38f3a68da13e8b1be7edf90cd472886472503b6359546cd62eeaaca262604ae8e7515108051f9fc3cecb7021d3cd71d4b026c598b2bd18f17c6a9c6d63352fd1bb4e341a57c43c3fdc2794217d9743c6e701c3bc001dc2bd4c6c0ca31b75f62732b83559feb3929dcfe10de8f0e67304eb60ec20e4cda67a9e3826af6f28d212300a288f7e9fc7e44b93d6d2910727b4da73d8da685db5bfbfdce62ba74d33f8b544c02f90d99161bbae439b38ffe8a563efa708bd591286e44392750f9be794d28bf13db97126eb555e4bea1189d8f701b7f35c7af203946282af00828880a928812c5108225c3df7fd56dd35c7fd11ae3d7b92065e7c3a4094beb3af8290971c9b90203c66da7bd27207438284bbb52d66d916e128131eea4b4e1942858a5374bec8e825c6b241fcee22d93085ea47374e17cc1270dcb441c0916985edb693e054278da522de9421c709ddace88d91bc286dd6a7702a1e4d833eb42756134861dbd5ac409c942be51fcdde9e2dafc9b8040e5e3c90736b05dd5a6171e12e49ff927b3d5a9fbfe1d17a540992d763b646397ac8d2e0b95502ea27ce62e235924a2c00d1d268eed7cf410c8e70f812894cf4085941a3a50008e732552972662ea4be76f6c8e8dea04b8c8d50b07b490f5f6fc00d0b15995c6d8e1a2dfcf4e697dba4c5d933d4e55062e679ec7f9c7631da2fa92ac5ec67c7b0c261e0aa92c42d08bd606345ba3e0648f3e795d59d1a01bba13642724057de237d020323d3af25ca8444fe1fbdb210151a98c58cd79d4de2651f9012b0c3a366e1675873b8deb4a88160781878fe1b92ab2512b055411b0190ad501ba3c0fb44b177c0f6d5c14415170a75eca1a72facab4cd08acb9c50004201456c370fa6b7c8087515aa1dd957fb5c20e99fdb64956913a5a9a6dc762c0830313a7fe7b9be640a8e98e07cb8f5331f5cce7781cbe9e11b53217f0039fe9b298d08e6307a68c4ad4d7cd7cfd640739f14f1e9dc8d6fed5552e32440e204f3730d53d8b9d09a8c957a423335e9b874542e236339862e7fa90ec5ceaa347a93f8c2ee2de0ca0f5850ab9d20f81ecf8a9aac24df6b4d927a240a6dc1b793c6275b0b397294b05744bdb49d0ea27332f06d45659d6cbd553a2d25a3556dfd7760543ad30077bbe692a502758150abe23c97a0eda7a1b8bedc3d7a4d4f95a3f6783257af1ac5bc051eb07111fe89f27dc3b0a5a37a2b8fa10df40b64206c88ca9783f3d634256b99263eac8a95fda4bbc3a1db4f7de2ef3b621a91cdceb158b544b8e23a930729335418e8ecc916ec75f7be41b5e14ccd01e47b3581059d3f23fdfd6aa44914f0d242ca68b1b5021957defe83deb7ced0099b7a00d2f91a86404ae4b10d1e7247a2d7ecf275a8088376d031d5c1d514c875048c6306d84621738e351a181a0abace3cdaa4bb52ae816572b0d64683dc974a4547e450d5e4fc313634d450b0ead594d2a7750030772c2df8775bba475f1eb69b13a053f7b2a9822ddc70a89f40c055a88a6d024766e11676347b1101a6feac356eb4b4b0c7f2cbf1efd1ec46aa6ec6357d124531ecb378161b71afd32a86413de41e193a08ab392f23638369bffff8ab443aaf38e31861b500d9e0cb2b1c174aaec081e99b0ea48ef30baa293c386537f17e91910ef91718184d7a711bbcaf1ef8cda70b22b8025c391d4a39a817c4db545a4aac3ff60b9764e08e40db75ed26392d2ae5ed456f378164654d451f8f4318b133885fd681f20087012c0608a9567ce3991e89d94f68afd3a7af2a923d11a35b932ab22c784608d2dfe6d63310961b883388721c97c15ca82f885dd4edac4d74351c3cc1de0fc2465196148723375816a20cc02059c123934953339a7b41136a47863377684449c8304069aba517c9e813d5797c565add8e319cb2eb15a292d0d1001c7a48b595222cf5e89d244122e976947d2e48adf9b84d5d3c49767b065f201668efbdfa9692e39450b2395a16b767b7a0c65097947411b489db2c18052404ffedc9a5e2637635131e624575b69a731191b28967e477f66d4dc7a25331c1e58191bba159807ae97434ac6c41ad2c81f455dc57d5cc48d378aacf3b4444ed048b5b39e2470a917bafa17b1e2c52a480b690bfa2e8fecadff148f1d3ef3810376604cb35b4dcbe377a2c839cc75fadea14be9468cb797e0df92f56ddbc566347acd91cb7701fbb2d84304d86817476c863d37be43f1a9b37719b24d6ef21ba4ff3708a53acee15c2bf60f519c40ed33b141274c2507f555002f9a26d4c5c06915f3140596659fd1851795a357a8cff9c042164a6075f7ecd4b96e520c804d2052b69ba81556851ccc1d3f41a78b771fd2c20260b43634a1f00d70c0ce4606e1426497ce4042724d086803bc16794d0d579ab3e7b43714f7b0e77e1f68c8b108f7ee044e8ecf0dea7631431d7b3fc56a7886947354b9886cc2ee78bdd61422a962953b02722a4f94469c38acc9945e94d71da290a153b106589f72ea506037450b2bb096ff7e914ae94ef0a33f53c9f5b658c9774eba600d6f55df120bb47d39c8d0adfec8a0e44817aa68698750e0d13ce2fe9601897bc8d6efc3da427d784a357c38a967da8093eb66a90f513d28d6adc85666a5e44642a48da855cc99946ec0f959564bf32ef5d3c39009bf56f90bac0e20c1aa82e9eb4bf46799fad8d8ea9b319b165d37bd30415dcdf38094270a90ce62c655882c70d0d4f8330ce38484fd8ace5212941d955e3186bb3097cc556503077a17f6b1470e97498a4de348c0c565e12f77cd82cf2b2b7efd51662356edbfb4240cfa6c418c3f39583a44e68498c38a7032a199630c0e19effff2b812f1302990d722ac9613075e2ae6de6d77977f614dcb09c6c669468ef3010909ee1d20e0d826123c1073806e76fbbcd23795835422853b8c509915d2edc19361caf955582f202b9cb5ac06e115f88e9cc10b3fc8edd18a07a5e06cf49e6cd23030698c2701f369f2222909ca76484d60c10201d51bc9606534c2ccd744fc41b401702d3782207d707b3893b25d151add097ec441ed97e9aef19992dc47d091f9051f20fc6b20180134ee59d0a924a11acd1f464213a7cc992681ac9fb1c0c2cfc0ee66e27190bc198d260ee38d54287253abdb5ffc794c489855e255a2d5b0ec8f81d2c20e1e352a596d1f724e3965c7f3efa9687fafa6f2dbcb06bff748274a17d9fc2b3d863d4b1b46a3b0ad8ef001fcf5eb86d3a1205c588c7f00f7b31701aa7ceda1294f049f87f93d97d45b76ececb687e232b08c8c82714aec3fb11d53b18598c8c8c588cc31dfbfc1ef51a4821598102c13eb81fbf8fc0ec00d0d739fd1508182504806845f7bf40a0826d71e7fb5324014398a3e542bf0ba41def2b5e0923d69740e3f35c2cd4ba787c0baab0e68a3dc206b5b682824798c08b69da095b0d4a328ed07cefca168c513887151d838d2eed55f2565848715af07189460340997cf1ce758f9855603f53f00b43c3046dbbf508bd1f2688ca7dcc2d333c51d1ff5d308728cd5ff7836c2b2a564290ede34e935b8db1a91db7168cc0273ec0ab7579dc0ee97cc16ddbfa03f8fba9fb9cebb408b3c1f1b46539dc3d4440701599f06340485e3aea7ec82f5fc19173120dc10571f633904b1f45d29a9b18b5bdf2dfdec0105b8c4e97d62c4a01bb609692fca77efa39ad33fc38e2921ecf0b9b99e0ec002bd118b3f9a98800976f985449bbf7b25b8514a8b4d9e1068ad36372ee5f6f8c2fff06c6aa81aea2b106cd204e49f0a14bc8987125abab5c56a66d7d74096bb598535f8d0557ba31ede5c96fd24d27df295fff05cd4f82ad47fe021d4a21b85095ae55ae8785c4c5e64a990ed5d5e0338223c130ba298fa43ed1e2f877f4c2da2e83449b4a2282e252777923cea70e89c39eb6ad4e235ddd6902f6f63020668817bd20d69df0fc536763e08682a88d462b705506556f9e357b8b2118fac2360a332124733dc6586307394590ea4a2d2806a4638e18cc3c3dce796f5243e1da74bb8da398c9d738e9734d715cd3c886ee267de564267307d1fcc6fecf0991bc85eb53e0addd5762a40610f35b07b9dd0340786ecf9a2d376da309dda85de275d6bc5acf5beaa46a76cf1706b601660a50c15b55763c7fe7cf16155db41145c8945c41d6227bd3404983f63ddebd9934ab105585bf99d2d5241477156a172402fd2ee35db78332dc42048ba21e4ee8d0a4e527b2bc66c6cfbad759005507e6414e732ef6ed2168f0306963be347bd766fdc80400f49b0062b133ec01985f8d1ef315a7e5f69356ec3af0b11c315207a4629eaf47eaa19f0085914a8e187b8896e94b881a6910423a92213a9064e57e430f8041a016286fa35a63fabca37f3fb16578e34321c70d4dca83dfac360d0675609ada3011f5a885502fd7fd0fd1692595619bbbdc5feda8a3d4e64fe0d8827c2f20377c72567529fe58062b09771564866bb16cc43022b25e80fd934876cc4d471a07ed17e2e3a0892c348df41bee3b9a8b0bcd76f0cb53112d375b35cf387493116bc9f2729a194b6f9fb4ed0b286a699b371f54d6d912e3aba9dbcc0469a4df6589932814119b71c26d31e1cc921438ab78498865cea9012a1630dd1728ae5d6e97beba1b4160190a41cacf83e46c20028edc4c2e29b20202be564627f2cb842fad49ff03b1c6706002e335dc9bf62299f226a6075770ce571a3c66b01505293d0e02ab46588f25c06a989c2e73056822e095b46d674e40768e87e1399855a6245fa19be00930c57c4458d4a2b45be579cb29fb139f652f2e1e231364f17d5e36a3b9daec1145fcb8a8f1ac312135336896f6a0ad11e3a9ced083202bc61fda7a677b6db271e8c57a8916bde6bda64b11b3511533e3c635e11137041184331517f97900a8343a9b308bdf0e5bdb939d435d3a79bed2856725cb0abb8d27901df834ff2f8ac9571dc766326c6283a4594d0bc16368d40d5ce766bcc1549840a43378f0319328bbeef7763fe56a9505243165bbb24d2ab0feddf51dc79898865b1b39a646febe4e5120f7bb37a0559651692db9b6eb47f7324439aec865b92bcff99885419fcac92ffd639cbeea56ca2b03d8b95c0f0cab73b7bb407d4a3dac86b0d997e1df91506aaeca07ba7be2173753e52c0e46fd1b7c02544b961cdbce0718831a0a7e75a07b878ef6ac0579e6fca92fcad626278cb6dc8b5915eeeaa68bfdf23063c9b3ebc091585957d9cff201ad0eaf65da6a56c769d3ef80f46440afaf6cad7d57baeef03f202e3b8a9a0e204f12b379e35fc57b9af0fe4ef3265d38ccfa68e967e690e93e6adac084c5cd1bac6b89ce95a725880f9e3d8d23838375777d0fad5a8919c7e852a3e8dea1ad89b891eff6bc9ac635d329a6018a4e09d352de250751203dcbc89299b8a8331f58c187a969ef6ca226aa08cf3ee6d87ba25b3eb2268ad50064ed82f6c51d4b9961d9104f25738e5aae54061bdebb43ab6f5f8c07d3c4a5a9bc0c94a4fb1be3bfe1a6ad74d31787449a5dfcf7640b7a21349202aa361a40318e4ae14c8aec4413c413abeb71ff60141c1aad2b6e7f5859d83ff0dfe41784cd55d56d8e6ba6f2eb8b8205f153f6b05f69740aacfa2b682e55dd731cdcde22d50a61b6e0dcf1de65a9f5ebfa5016af496659ca125b92b57c26680c6d4d121a431f4f6047ebb63b306ffc6b17eb0342c577e9a20f0c6ae83b7a364d771634ebf4e225945936618d3c27f36ad42c2f50da9dd3ed2344ad46fb42aef4e3c727472e264a9f8ab807b450bf8f00df722d05570ef7ec8e013e7eb552f8e918e1f660c8006abbc8af1c65311127b17aa340402124e0185634c2fd2566703788a76bd4f6fe80f808355bd6dcbea577b1ef71f7c0390985eb9d8f0dd65ef1c727878be2a7e36ed84bfc5bcfcb6b5684037a732b44d19de2a78de7919a4fc0ac86b37835e052b0f685bbf0373fb50a644ca88c3526a75c6e07ace81db6ac97c1207d820f6df7300ffd5d1006fc38d4dc31aecb08f52641c2e9d3e40365e3d91a581376805de67d4a089a09d656800d506835248f4f0c05e000483de172b356bc639de32b5937174e24ef85b945b1916ea5e48503ec50cf47dff36eaae3730b000bbd48101b6b06bf5a9c104f060f724e9a64190460c35d69ebe51f9027f59080b1d7fc9d59b20cc523aeedf6c8efb077f4208505fdf5af8bd7ad7f179c15f200c5729b71b67faac73a7240cbf3ca3d5d1df2f6406e4f75bc86022fb6bbd0333a4e081f5bd53400b0ec3aafdade6ad5573c32db237a1027d86835e7469661505ecc0515b6178d3d6dd403ccf7902df36d090d5e28d26d29e6c501e29b15d870137402ab77df0baf51f5842b72965504634ec22bac7d3c07774f5f7bbdef1e74e0ba244cea2e46aa847f1debae92866477a72ec25d4cf895e6f4ce89e6c7d9dca2fd8d7388771886d80c2268f305fef75718e52939fae54ca85e8a4ccc1f78d1c654cc469ec3e2a969ba3401b953c36d9407d0ed953a7b6dd9fa007100dea74fb8ed92d74bcee3fec0725bae0cab134339909cf1c34c054c3ebb684b6e9cc6f50730cfbbffa30bcebcd0d57cace4c05d719077dd5da9c55041803af7685e1e75df781e03cf7063ecb4043d6e5319a8871b241bfb4c4bb1e067c80e964f9c0ebea676087de258a291a22f13eccc2ca5fd3ab2b906dde6f68036bc90a5da4296694fe2646d0ceb9825d20d66c81d05b9b82ab493b89d1fce541a1fcde7885e1b44c707d7d30045f2458fc0922b5c565a0622576bfdcb4e8034c7b82a9788e83a55b040ec864b1a4ef8dc53e4f08b3babe7491a01efda2d945dab359521e1e67a38596b34e6cec46976334c269335c9987364c63c03e5e5786551f761eecf3e687e3f6a14805ea0c06b5eadac82a029881ab96caf0a5bdfb40789efb049e65a0216fe5194d8439d9a0bd5263bb0e017e8075bf9aa942cb373e83116fac39d0fda2e4913c3ff330a02b6a9510ee8856c7bb39d7dd0a1bc99ed6d104f8de1945007df8b2c6cda2c93258ff715da069e34560aeb3b65d003831880d1e70daf0c35d0d538350232d3d3c43090cd39af3d43b52e39f70bf9547b0ee43ddbbf80c37d640fd2a83ac3c61bdc1be7caa36c7e8c0eb230375d1a553a580e1e8c99c59719a38bfe7f62b415c984fd8608d767909f85f2d243c0d211d75bae986c144e76220e61c8372e359ef640ca881729ace80bfbdc7403322bf9aa735f8619dbac8397c3e6d802dbcfb225b84d1cc4ce3049ad367c057209e55a5036de0bf63983fcf2665cbd0651fbf1fb7844e0752faf45cef7922d37ffbbf73e971e1c8c178e35d81625e40100056f4ad9332dc69d08ea0d7b32b18e3207e2615d7966d04dad6c82664efbdb794524a99920c200c350cb80b2afa19a7c9df40c30bdb75ca9ab44cdc8b48db51e757d0dca0f8e60405db123024df9a6c408d8384211d411dffea03a55416ba2c74a0b9b72ba0920fb290ca22e809dd4233ab20e731b7d658409d4dc8b39a6956d2c0c0f76764522e2d2c2b2a29a8ee64aaadba9087e6d0b9568e0606be3f239372696159514941752713b6d96cae1a56d97543eea7a1c94d6813f2ac691b0da4aa774e75619249e390c85c58acbae892d5626254bf25995b1695e809352845c91531aa8f513dcc3e9ca6ad2f5fab37cbeab4d3da9acd1a646d2af5ef99305783866c60aa9b5516bbb0a8bae892348a399b4b26458914dd55b75da7ec374e41946123512eb62378131fa9ab2eba9453b12db46cabca6fa2bed1b881b01a2431d0f68a18f2a83a070d11d98a4367bf391cb585fa08a4228917f246f4726f73e5d746c456c436643b620b01cb08a00e125047652bc166820d6843c196828dc8b6828d055b1086fd8c4ccaa58565452505d59d4cdca6659522a528528e0dd43c343067084c9aa228c3906007797b417a218f23e98abc85796b7b21544f638e1042c07cccafc0ed0b396e59c8e209397e58deae50fdc7b972fcb89f1a14850e669898576195635502621e661f745c50c550918b87fefc1ae49ea661d6be6b1a8e1ae4adaf91b2129e42d2add4225b92ed15579bd146b4c5181e2cdb8c749b17baaf310c438251938d1473a41359a7bc0cc59c1ad4abf88fb3aeb8e35bfca55eba94fcd5a0ce7e1bf26d48dbebd535cd8eb7a31b74126f3f9b4ba9d3b828844189259e1e21700b4720e279f142bec8131e8a14573fb051744a72bc22c79f5c60486e037d981742f5312f047d18abfa98e741dfe4924622f1e312095a06ba549110a01ac977d3c1f6c4b6830d496f8eb717ccd31722e6552f04ccd3ff30a498573d0f98a7b706bdbc7fcc5d42e7f8db96e4f89b91b77ad8af1f314d8b1b7477d7648531c608a9a9b3978fbd5f2cdb8a5800a5b3822b0a9bcbc404390479aa50cc51e19e233ea89efecbc7ef517dfc3a548df03412921c537115ff8509bc313101aee29ba0b0c00a40d914851cdf958be46f1bea6812927b538beea348500c2eb0828b07f2bcc047fcbf1497e78554246122cbabe5be5c964be8348f8e3b0909c3028302d604930236052c09a3025605cc0976050c0b5087fbf8d893beb17d7c4c0bd816a04e867d7cac0b9817a04ea5df5983b267caa58565452505d59d4cdca66598edd5f792dbe4908a2b8c6454febc0cd384e58222f2a450a04850090f9830e211f2e2093f3c47e67f1d854211397edc5cd0a34207757c23aa55891e582b6523496f827e50cca118438a537ab462a41c571208cdf562494867e8e67f18920e953c6f13f4b1269e43dfebb7bdacc590bca5a30b46b026b589eedb5e41dd5986461042d248b2b797dc5edb6bdb5e41db2b282828282808b343439e691b676a7832296508c3a70a993e295b38c16288860cab7842941c5fde0aa23f08202f0fa4cbf2b352d62e4ae24435df3d0e1d904ce9c3a7f702f2b5ffeefe90524a2145f35bfe57d337d6441f722fca927c22339738bfe3cd4537f3defd7ddb391c35afd51f2845ee9ac477230f20374641d7f9d7dcefdcbd934f67f7f2b21a87fecc4143e3d077e7e88d442087a3e6779c0ad1201cbdbbae9beede93d5382e69681cefba0eab5a76514e87945719560105233912919bbc9ecb5bf37ee937f5de85bc657b0f595ecd9d42ee15b1f90e7f37e4eefd055c757fed0a00a954aa0b6a0e070d1aab2be3bd7b7353f435663cabfb7873691233eee7e386bc7d07e325432b86102453a306fe2c0b9bf0cbd378d68579e6aa580fe36bfc8c554fd7e549318dfbad641acfba3f3ab31ec655cd9ff91aa69b97b9f91afca56e74cc7c8d97429abc5428880651a19a4f9960fc676b3015a24130f067656cbe5f0629216db0cdca06dbfc07bacf661a7ff3537bdba47bc51cc8638b08b9e75def57f7f3c92b19322c00feeb6c7203e042b8b2309ed4415fbe4f96337c6a2e909967601a1ac77b4fc6af6e7338bee8f4eec53f4347e3bf2954e34af768fc4ea471b567c9f8d3bdb91f4db679c1c18103655c1a4f7f6c1e72386a249946b36826692eb8be791a3f83d3e1becc6b34ae7beb86ffe0921bffc1a30a85920cadd08149a01401f80f873c801bad9cff72e2132d2c33fefae67e9d6fbed2c0e9f0f237349ee534de9be5be7ccb95ef72733e7503f02faece1fe0def03aee8d875cd328748972119f10800dd36b729b4e7abb7175fc0df700af735f7c006eea73aecbcbdbf22f97e56bb8f4db575f0c5a3de476d47ce38071979e61de57ee73c2c0b8b78b862eb11ae6fd710ff4611ad7dcd590c6891ff3f3940beeab0b05f06688d0100a3cc6531c83f2a7c34f981a1c2cd50e186a6d118bf510b270cd643deb210753439e3c1f0bf0f1e715b045c3c79f55740bf5f16711604b25450e1f6352a2a4a810518906f84f07ec5f53f39083c13a9cb27ef5d2487d11008701f490c3bf77b0fa46ffc49148e7f8d57f91489695d3a1619e723b361a1a477e35f2420204a2bcd39abfaaf91d7260209e6b5e879c1b674dce4bb803fe6ac8abb7e16bd0017f32af3c67d59284753b534a29655d088369689c15eeaf44fa065d6a1c4c440eacc6a9c171e51be0d6f005b8379ee7def0345c9d47dd00bceae6fccbcb853b4ea3f48d9a440ca0c689cf45dfa8441a273e17bf120175aa0be08dab6fd4202508f03192c8b14805ea1b5508c7af2e803ad509785383fa461dc201284717800d930dabd58be717808d8750c704047813df86d5d3d537d641310d8de3cf5a3956d1f0352f3310765ab82ad17d83d622d5091b3e7e1dea1bf125802740c4010fa0488e5fe32dbfe186ce4541af3f0037835e7f0f160e407628fa068b00b009e2f4dbc8b9117a0d71da843fef16b601d7f0e201902f351a6ee7d5ccf44ecf998619f7eb3cc3f43530aa0a453f0ab662be3f8311b6627cbf49ce22cc1bcf09646616ae21d77c85227e7d55249528522c5f7cfa9bfe8585f10ed3bb91be419dd0271549dfa050a8d2aa1aa15862d3ef784dcdb3eee793590f391cacdff1168c8a5257e3748cdc3231fe73994538374deef852e58e59fdb7921b0cf0a6f127bfe657972a354ea44ee25328131761aa633e7d1de6fbe4be5f6bbef935ad7ec77d561788d7fccbfd64aef99dc8ba375f7369bc4683c6df5c1a90a3f13b4e9dc078d4917b4bdc9b020ea1bdf8312818bc8fa78f4fa1fcc7a74a5e0f7ffa91e6c93fa6503c49beac79fad0abc133c9494feeafb34c6e3c9dc85c98695c98677c5afee22b4af145251109df64028d0b675c0ce35e8c365fe3dae029447fba0cad00c24f50d04b7ef9be40ace417e8801adf30fa6bf4d3e86f1adf323dd4f8bef96c5ec64bfcb130155ac9f46b9e7e8e9a6f6e87f7d3bba17b4de5475f9b4fef8cfe1afd346e96649c973a667ccdf79d3be63ba5f4aebea675f056f7f3916b765020728d0ffaa77e7a67bcd61c023aef3003bfe9b54ab903d8bc476d7ec76b6e0e9b97b887cd7bb8c7cd4b1f2b79621f2bd9064b7ca303e70643190c24e61a2f034b168d771adf35687cd3e8ae691af813a207a735f8f36e8f308044c741d7af435321252297a3710d9caf51e361c81d3e33477f8ddf89a7ef3b2f8ccf4796f2e6a1b7687833e4af6eb0cd85eed188af191eae393d8cd7700f185fe39dd381f335beb91c307cc0b874c280717bccaff19ad6dc8e9a9ff1cdad5ed2c09f8fec5fb3badefd9a6ef3d67818137b5fe3777cc6adf99de85dcf5ee3bfe6a17bde9c355e7bc71efe7cac647fad338c1a18c6ef388c8bf37f3f0364ed4ff7f391b5a741f24506e98cf39ae68ff37d3f1fb9bf56d17d3cf2a7bd8f958c8383f33b9ec527114a548a4e229388149bc4a317ce1113a4253e82c8ac3a403feee12f5fb5c3017c72bf4f0f899350a2a12e08198473bfce38d0bdc6f9ce99459a76a7d0173af9aae8048a922a1e4524f7bcfecf27e3ac649c696485ee8b2fa3fcd1a056630dace4d6706ee7d7475a9fd61cdd5895a35f459730c9f1915494880332f780eef9642b74444bbc05858a50247e9be8fb760f1a47d3a0a044864c32ac020ba35c0516445308c2ade6e3470e474df7e81caeec1ea88f1bb2c45f7f90cef2bb7f79b7f9c9fc355143d148ba07aa88a4067f3ecee168007c94ef00c0f125f1676dc57d844e7bd323f1162c9ab9bd64fb1d070294963929c71845bca2ad75ef13ec82bbfe9dbe19f7ebe206445ebd5f274f3c1a54e3c6e67b3aefbf5994bb0e7ff43dccc2a1312990b728edfebb94c6e3fc9762fdd7654a0353204c7f6460160efe52399227fe0c504653c39b0deacc8f6f6f6643374178d3b8091f5c3bfffe9390f6e99815615ad1451172bc5009596b15e4786f0c61861caf00b2165d4739de1959932e32e47865646d0a658d1221c7eb92b5baf5854b8668428eb7266b76eb418ef7b3066dc528cc886882d64468e15b0f72bc308a25458821c73b9383d8fca376710657eef7f17613687e84ae1f6e3102007ef4243d74fd52ba9aa001d1f5cb0ec2ef9afc41ecc33dcd0710502708566e82be0ffcc25b8a271e72c40dcffc1f151ef99f7dc1b6e83e1fd947fe56f2d440f741283df45371e5c303b550c20731f0c12bc9e5e299ef47384ffd1f1c78e4cffb83034f8f44ea39e243fd897b76c03db8c7333292ff4124b845089434c1052c9cc842093c9087faa860891060008328909e08030fe4a1f2bae40d4ac00411331002cf90236e78e4ffa8f0d087dc0f335d74c123dd87b76ab23f95399fe3df04743de0b72b432bb20006f81a94f8470e39e2061ef93f92673a21c70f829523fe71ca4dccff7cf207ff834af077bc5d19c22ec75672af2fd018d07986569861094dd320e71042f7e463eef86ab4535e826e07ca5e9493689c865e82c6690772afa19459471f6831c29b4aa78cde47fab303418bafc5fb12be90f669f73448f37552b61029d3872c1b3649b78442f829567cec21344209232392301ac245ee975addbad7baa330490d9ec383524ae9b3bce5f2347b4dbbddb52e854ee31173522b290c04eac02c1f46b90497f20bb645079d64983997afd4854af92defc3e3f2ac98a39258d580f92aef03cbb7e09e23f259308c2b17fcd9f061becaabe01eec276659f71a9b5e723d486cf21e7427399469f6dda5dadb88392d2a365229b8ea58f00a86ab148c4a75d7be66ba7209c87ccae1d00044eadc7a4e91788e7492fb34862569c1a4d224b8479e4f66f89a40d79057c056819244a380228424680d251e7bf383278df9200967c20c46d00111014031b8c00a3939366e56b24b1b23d46008b54678c11259e48828109dae28ca59a62209fe4fe32dcf4e45128a60b27704b22c68aa0176c04f93d0c10cab8cd146ded9812bd82cdb04d6d92c3ffe0ba64517ff9b535a6badb5d0522aa7ad63e8cad041f7f077d1c1fffe881ea109137cebadf83075eb19bacf95321605eac83cb100bd99d402d4cf18d445231c0bb0359b80ce8a39283c4f182b4faa69777bd3a53f9bd022fe6e9ea64b9fba128ca9ac5d05cc29f473fe2c328dbc95fd9c43794e8d952796655936df6ed7f3ccfe637999a6691886616f394dcbb20cc330cc5ee99e525ccd8f39e8e437153a2de67b146ebe2b411d2ecf188dc8930479fe1115e23e2dad151aa4f9b6a32c57a274a2cf56718a473a29b6c0f1888f2de5a0fbfe839046b8f023d73ec9054bd670e8803cb92dc9f2b39f226c493ec645964496bf2d912fbf4ab425f11696e56f2f6f6d483c07f2b464ff1dc7b0a525593e86b125f75a72e3a0fbb6a12ce56f52d624eec92f724fd6a22cbf1239aeaf6f2aa2e842e54911193e853a580ffe146fee491c1043f1f00411f772ed623ba246a06770f9f42877e021013b40274814e0d199071ab4cfe9c357fdb449f7c1a258837b1d5d7a24d2604ec7a2a1317ed751d85150214516ac48445adf3ccaf9830050a7622919bea04005220b20f4958c99097b93d68d65da065be53f968de7d9882b96017636edd2c894f34871c0c94401cdb4697d69dcc33e0ac144a78c2f1a637c4dce37bdbca13e394af7eec66d32de95aee3381cb54eba41279a49ebb6e66474128162a455a7eb7f34b65bd98b0c54c93085874e4b0036339419a2a0878a12681ca7004caa000f1be41b20451640533492fdb94883ec7f8a30c81e67105f5001a813574081be1189348e7f9126d99700f2d68ccf49ece9c45f7ced2b9743fc4d488e17662e4a6d8b3773e9de8d4470541c819e405fa2dc458b761b2c006418801b1b8f0183fe2723431c64327c3893230e3678c058d942231b9d8d2b2830a954020cb043dfe0d138ce43df700004e08d7f0226867d004314268d04b400f45c0b8fc716b257c0017d8302908b1f6fc131647fe742f6afb85e4c02dec2e4b44f35497d92bcd8c4c7954381348e09699f96d5088749d15658fe4a55cccc94a1b1a65ebc9c3a548aca4c8c4ade9f50627ee665ccab5ec6fccc6b8e676c9098ed4b2e478ccaea506149299df6eda42f2f5231088ad21651a028d53ae3b41f6b0bcbcaa949d2159c34e9247bb235fa647afae257951454b7b4e4a8094c961c451a6dbc39e2cf7e354d7aadf55a65a8cb10347b5a6931f50d8961e3c819e87529199894ec34b2371074a666c0d40aa63c98aa812919301503a668600a064c6198ba34cec81e9928448c0b91d30a21c6c8034e8795def22534e82d181d7a5147cc724afc81c08bb3ad3849f849c8e5c01284cc9fbffcd53878c9a40c61f878f7982cc6659b06857b207b335a9ca1b7a7a558a28b251e8ad4c43d7a7b28a5f848f64c9490c443f111994d7bed37a2984a59bc6d44fd1b92f975236aa22efb0d89b7dafd6f0daa429d21d126ee7556677763afdf7d92b7324ed34e27bcb930a4ff54aaeb1e4332418fdb50fdec29920f98e4abdfd1a41dd026de6a1c64e6c692b2869300198049b2c53e60926ced8cccaba8ca7b1e14e3b24db3aa1742e55801f463be01aa87812263dff78349b46bca1b672d5c49316d9ee1ac9bd814ae41b165057f5d8753f8065d273552474cda88ab28ffb30123f33f233313949237eec20ce5d6366f9c3f76b96c6fccde5adc9f9149b9b4b0aca8a4a0ba9389f382671896ddfc333229971696159514547732719bb675c715f4a088a31e21381005f1f408e92baa6024c4344489a7bedc862be853231adb6360da65522e2d2c2b2a29a8ee64e2362dc3649d5226e5d2c2b2a29282ea4e266ed332cc7a4febb2a3e93dcb6eef6442480594f5c02df88008d1162f1ed50b9141c288e7880953c96d9b7643e25eecedb53a691af71a74082174eb9ef6dbefb8bca79c94eda5795ece843b466532edb8667aa9490d7bc9699bc9b49d4ed62221412aa628225b1c3fa83e06c3f843ccdb8a7df69a8c314785542419436e2e675755ebcd72bb9516eb2267e7c6c42604052755481222e2a1477c6322050d2465cc99898a2948905d01cd43bfbe7c6260ac37cbd6e7c4e69c57ab1bad5a1dc2e6c4eccc01c90b43333229971696159514547732719b966d41d5d6f9755a2969114c40e211e232f4825d8ef9c631dda448358aa423201e212e442e9e238d214168adb5dda4916877d14793ed56c4e68ae28823443c425c848c788ef456040685ec2d0ce96b0f22f6d288e7d0af9f01a1d97ed580d00c670f79a4111a171491eb5565199643d8b619e5ea82fa02a893fae8f2f12b0ca04e0bcb8acaeba4d400ea743a271377838a839a03a883fded2ca7ac333229971696159514547732719b9661b63a123f5b961756a1f483ec17c39ebb41f69b654deb9e4218464006a0273cf485bc846089e70886c40e727ccd6f6be26e1f6a36ae707d5dd5375687ea10c6e5f0c7be2397c3fde93bee4f2c5d5e0cd721f7eaac4b4b4b742b4297aa09ea4fde86846676fc7ea555095fc5bfbfe355d63ab7225ba516b786544cf1822cb905348f0a6b5b670319c1a6916e8a44b1a050a04da814e81428156815a00e75d237e8152816a00e7dd237a816e816a00e47bb40bd0075b239b19f9149b9b4b0aca8a4a0ba9389dbb4cc4a2023404057056337972448829467d79af50efab503265ededa84a65c42e74f6f4f4b81c8189078684592297d21ad0425403c141fa9300a20255b50863fd892b62739bef6f1e7470e877dbf1149f7c9216f7ddb2bc33cbd80ea63fedb5c52fa7fdbabc6e01e98577d4fccf71c79f1f47b5e5ef55acf111f542aac920f797a54af925801ed0118573bd1871a0399af5c83b2ff3026d811b0299a0813420da2f987a871d6444ee44f0ec99f1ff9f38321d16e224834893ec9d40bd8c404de0c751277500355980b79e6e581064eb697e390b80ad5a00d8914b466abeb4b89fb07ab3fd267f7943f23e81434507684fb972e83d8009763e4703414ddb7bdb01f0480f2a34dcd596fdc047dec3651d14b621857b66e51c0ed0ac9b954feaaf7e171ac6a007dd5fb1003435f857b7063efc38361b9bde26a2af51387ee6daf1776651240f2c7933f30c99354526339e472b9f0f6e2b2e9c221647b53aa10e4ad6f73c5609b412eaa4bc01b9b50e3409dfa29a4eec8562324a214458a2b0d06664be2abf84fbc35bd93620ee4d98a8c745dd4449bab894caf6cba5cce32774d7766c879c6300d5b7ab97d2d2d496cd2c0c0f76764522e2d2c2b2a29a8ee64b2d666f5061a98b6f45a5aca0240feea2208995217487882ac51984a4a5968e24505129c44a166285daece05a4048a2d8e9408c104de4eb2976b079b56a40b9601f006fe02e00dfc0458af3d63132f7c8351f980fad4a7708f5fd141f776625ffb7e3f1f307143dd1b4778a28867ce39050c86cca3299688e242b50a36a029609083e98af87dc806391dda8b0b796c73f65404a8f321f73c68c551905212fc2e82def2229cfd17b787f80afea77cffe49952f10193ebdb1f2e74f5bf760da95b4db143dc9b13264f0893dcb3eecdcf87cb3dd84edc73ce074ccada470e87a6c2e98879e21e0e47f61a76fd893f710f7e763da90a4e74c4265b20e2caf33df0f560d803d893bc953d84593b713832b9e1d0f970ffeeee66e203264d999bc3de14b14a47f58a61b8d415291c2aaf69b789b81714f4c12670092a05ff8349a217735e60d1cb7d715317752384df7d556e03b9079f46e9faa12b7651cc7121962e854dfcb16c4421f7a00b41ce65bbaf7bcf63b1a64be1494dc45b1ad6005409e26c86dcc4260693224c8a98e677a2ebfb27056bd44f54a70198dce31efc0edbb807e152861ef01e6f9dae0ff7e05f8045016f7d8610fa143fe0826545162660419bd94dab4555101164dd8808178c525004fb4dcb78d80cebc4a275fa7511f68a4243362315c0a08b6c91611e398de3b618a556c2e2a5c40c59f0e7364dd3aa1862645318c65f57a10b598ae5af8b4c4ade5fe72e87ef49d185e00abe4c4ac95f17d148e98491944467fcba1c459092e1d71c74cdc40ce00d0e7c178a392cb882df41299488e0b7143a95fcb1328c0d5f15710e9ee3fb7b923b4992e147a0a884e79c8aa04017e2a205465786914886ae94e1476f219750116fc9fcb911216f451e7640a405a9a0c10bb24a2c6a1f94f48012b427963244923fab832739c61831a084092e24a40774d1481a6529a59415a0c24889fcd94fc9134439be75f7160658e08d95c68199df690f37ce576a0aa67516006f8c52b96184e2aae7770be9a0db76bc05730b79abaff898c3e373f73db45da81eb200a8d323f8691c77f5573a87340c78c49c131e12918afa071d04a026a0e7bf350e7890dd1feba27ea26f0003a8d335e8228de38f24fb537c24fbcf3aa7143a3245cc880669600a7606f01c6bbb2e957ae8450fe8b340448a7c7069b36926eec59c06cad6daae4ba5fe3d8fc5fa6cf491145df4408fb72206c23dbf40183a77b5408334f2356f55cd421a36ac883d90edb74b6e1cff18b0c5ddd86454f046d7383964fe7ab2c53de85b00640f40f67c32715b0d0e23462afe9629fee27704418e10cbf0d793adfda6329e7a7681c6e286f6579ee59da67dcb85719542a9f8a0c9f2a736afe7d9f060794fe12fa5a960976f79947b8bb55dd7d9b0577b6bbf6d77365d162edc551ce5ad14a7514141a4aca15454545e057f32aba8a45cd4b7908dde5db410f79942dc477235d03a49831b67b3975c0ef235ac01716e07fdf945789be8e843ee4df24dddfd799eeee1fd7cbe9edc8343877ba0db30a1db707ae836f8cf8f5c0ff0e93bd783e9b9df89307bbfd8a3ae364fd884bf0df8c8cf597d20fef5e40fbae7388278aedf104aec5c943f564441caad416fc9200ec43b3b108f5de01ef1fb634fe7d818889f41ab32e8e0c36a95b27c6d429786455946546e96173bc6dfb781527ef9abc1fc0cf93460abe392c6917f555e45a5f2315f81e212b9f2177fa957c9b844a902c59cfaf2e7ab6fbcbcf41599871047e6ebad7025f37d23f4649e5e99ff992c8365fef3fc22370acbfd34b0f5dfefd934cca9407125bffb55381c7fb128fdda0a87a3db723cf8e4985f89e923ba989739c5bccce39879193f3f75bfd4f76b2f2fdf3234940c1932bea645868c4c464dcacb4bf7823f999f30600e32313127530c56e99079180f43c626f1167ef9d6c82e6199917919136b6e9471a3917b52c6ed1c23dd83debaf7f1f76b2ef7f2e093ef0c86ee4d37e1203d247fe5ffa52ae1ad99975f856a116fc5bc7c2d450719305e83f1fea61834dcc53b51c6dfbf32b0ca063d87fe67613c7c4d46e6671ec66b290e070c3c804e06868c4ccc770ccdbd31def1fd1fa77cf1ff9bb81df163e0209d6930c7ed78f98b8374c6f8eb57c5c088c13de69fbe87ea81747e59d9603f967f65cb7fd028cacb6d2edce543dc932f73fdc79338a253fd0b548ae4befb2f1e55207823ffe5d613b0a053e188f4303732714f725d81ac0a7fb67bc15f175fe078e41eeab5da82ef2c5f723b7400798b88b71aeae888df9ffacea9df89b985e57e9bca0da21e65e9f9abf44df8b375f3b22bddc3b0a5185b1921d2c763cb196c9157b4220b13689b6ce89efbfd6593802a79812ce2440e96b8bcc0484e81462d68324bf0ac97710645b34816e540833433894e7a4f1e4de6acf84a7a4784ce6137a36c1cb0dcdddddddddddddbddddada0411dd627ad0ba2a0d3aff956430d3209f5790c25f537f6c94d858e07d481360bdd17c600b3c83db087592661b78d44997974169dc5dd504cfcb552f482b5b1ffcd39679c14c32286454cd226b2d7de5a4dd36c8c3031b56dd2c6bd4dfb6ddb346c66d8c67ac1fe93cf720fde8061186663c7bb1dbcf541251e5c0978fad2d54d2ca90428e0030f4fc1bc042eb0752b3eec00f3c40e70ef7bbe7c4ae90e09d8c15bf4fd79f0f761ce29016fcdf7d954621b4f659f94a3820669bef86a459f50277b77f716f418628cf28db2b43509e9632341a4f8f676eed94f654b4d1ec5a9bdf7843b4a2f79cbf19fdec29c89ab85d966b793605e72cfbee356726fa883f31bc04dacaaa7d7b0aa629502e6c4fe07953ff79007f2ec78bc2ac73978467dcac3dc7629e66c6f55debe0f017556debe13d1f6b58e026fec6f17f268ad05bcb14f6f6f016fec9b6e8b01de586f2efa0bf006ded8d3c767f995eb435c956f5701dd6bef43f7dafb6bf259700ff61df6e1e9274e44b66ffd886c1fe64dbe8a0a765727b967bf913e99edb7f51cfd6ea78fd67e29539689d5d44ce08dadadd4653ec452cd4197ca911dc53dfbf0215cf9dfbeafd9236a6e25fb1aa7c38c97e656aad9ec2c3aa98b157bed7f90bf3de51e725d7752650f79e65565ee8237b697b23dd91b74f1e7737f24fb1eece767d807ee7be4c39a592f72a31178639fb3bf5d07b25f9de8de3dfb194eb9677f7ea16b57b64aeed9b74e7430ffe887ad0475a4eb205bb741b62e836cad0f91ad8b205beb50646bc75094ad51b60f9dc6e21ef12563db95253c0dab86febabbbbbbbbbbbbbbbbbbbbbb254bbabacfdd3c7cf0162bc726327652a8af99fef4f6b3f7e1f96c863e601fb4cf704f7ced7b4e2fdfe7f45adc6a7644aeef47e4facee1f056fda85200f6a7f701f5d1e9b6652f84fc0df2fc907dc442689f6155e31c204f9bb2539b68cd757b21a4fcec7fd85e08d3ff20fff43fc4d75efb588fc8f5394b519cd10b6690dd5004c50a907ffaec1b104fff43867a95e9b5873c3f6caaf9a75799b04a01a8d7fe07d46ba717027b1456991ef590e787d3a7fc09ab4c3807cfdca7bc193287baa95f67d0d91b74fe9cbd5dd2064511a68602ded4e7ea6f57bb1f57f5ab11eea2f985fa90a6e21e7dd4d2c7a95d325f831b3ce222b7f2f91f2c9aac0cadf51cf803882c1feecce965569e9fc2a60b5658c4e99094e4a452c809b937e7bb624e1775ae3c9fc09bf95d14733a0b43e439863cbffb0b79bee3a229d445fa493ff1202fd2511c28cf6f28ade43f73c987bca8675d68908605dfdf216625a1f3970f6147bd041d8594ca132845a1123a8783871d10710f4aacbe0ac36c8cd10449114a8e5d34a48b4ec082ac01110145ee88d93a1bba49caeb637e2aaeba540dd28f3c522a681a0b420b00a8f331277bf81a2b4639a5076fe60aaee6c32804d0cdef27ba39e7dbf92afb793e0f6fc13c9f0235d8b03234caf3450326a68df96d2bed962e992061d41919b1247395153ce53f4ccbf0b4b5dcc8fe7389f94fe675ea066fe2ab5c0ee2c44fb9278852c9f1bb951cffd492e39b5e727c4e155fc3393ee67df6dadc7f7843e3676666ccc8c8ac646262bc1818981a18954a86eae525c6cb8b17342f522918291717ecd2d2725b58589e65656566454545462525252605858241759daa3b9d5e4e26d30b13c7a5b86d73d934ad45cb32960cc356306b556cad299552949fa08ecc51667f13bce96faeeb9d1d5b0ef7d335e77c6d0ad9cece13900b97c3fc9b6b8ae2de7c8b854efea7bd3ed30b89b79c038ad6c6eee67ab6b99e2b8d26797e44caf3b51a4fbdf8507da14ecbe8759a665c9857f3bda33cbf46060d0c6c24cfbf45f29cb930ae64622ef4f972e7bf8892a7e772e7b7cc9523956b947293a06e774fd7f4599add6bfb882ebe07213fcf9f36636b0e833a11eb00f33429e539bfcea7f3270b3a93527794210c1f99991e30bca8de26439f57463dcc18f63fb4ff7a320af5d87bdeeac1fdcac3d756ae86ba2b26e87d2ba85fc12dbf13515766ecb6dc1fdb6bf8afd0652bff03c5ed00730b86d0e643e11fda7fdc0789f9022d8f6da6ab7dcb632df743b5985057e686a2e5a6a83c4b4a4bca6bafd2d29212553ee5b66891cb21e6613ee6149797f97f97d764ee37b30c8f9cf2ef809cf278c7553fb3234656fd8ebbdc173f735f5ee67e09c82931293d7eb8bc06737f7417f008f9834ffae7be20f2c5c81f7cf20589f90229cff22af747ca7f3e3985e5b6fcca55b93fbe96d7527e033e39056f00d5e2cda57ccb55f99d687a96cba9dc1fdca7dc1f5f07ca60862e32ea37e0935178031df661871031443ee1202ff2f6260ca1f771f8c7869b10817c23b4876d64840721003ecf4617c5955ba113810b8f113d46f0882bdf21aee4cbbf80111e78c863c4fcf87d14732a368262f88e8db071053f1557f05f5e08993e1d352232c64865f6d8fc9ad9a7cfe1c0b0eb5f65fbc38f45d020cd37bd2d27f51f2c82465e5c555fd1b4ee18a5b4147371798bd96c3eb6c40957f615b5e1d079a6652e166f9e416f4197afe00f090501c99f0c8b20741f92e9c77c17837e0c2e478c0cc43d8a6a17af32b6edc2d43d52717ca914c670c76b11439c4c2f64b7952d1a8943ee61473cc6a121df90accbeb15b9f018c52394e8240a6de42bfa710a4d3c26bf24952453378a4832fd36f2bf31b62ee6f4ab8d965eddd25cd2dac848a2649175b944aa5422d3476224d39f1d0f1a8da41e3b91235d71c876a76bf24c4f48f2481ac9207cf20795fe733930e9dab6ffba14eb3bb2f7d7bccdd3b00b332681682389a95e66b01414b6ddd0791bd56063243d26ddf0c5212dabaeb8a2ef7daa62eceeeeeeeeeeeeee2e5dde92e9ad8b393ce28abea42f9ebeda28e6bcc07e947ae9a8a418c6174ae512c9c4ca26997e0a96aecc6873b9dd7bcbfb1116a23634303940acd4606387b8a2cff271281af1967401b143cc91437c459fa228476512f465ad560ef156db8062057fb2280567284dba32cde5b5978971a9d65a6badb5d65a6bad122c1c0e0bb91d1b8655d983eee31e568c71f787eb9e9a4e6e3a99b60d46b5fdcaafe01e29282c710f4ccb2ef795abe1865aafcc1a0edd904c4f9fba438e9854ba175b6b66ddbabbd7c7786667b1e8f22e99cbff386597af43bea2b6eb526f3d6aff93d945c5e5c0f0e7f2d8db7fe176d88f3848f4dfaacb7f3686cb61719096ee79b618f6ff71ca8ea17bf145badca3af793173d239c52c9643bc253395445064fac9229924d387d476a93ffa3c3fa2d9c1071012a4e6422809d4f1245e4c94803a9eebbf70382a1e40278bf20b6e47d67df6b50f42a6b81c2ef8ebec21b7c38b397128aee853938a94a90b7d25bb8f43283ca4c5a18ab3fffc35152e87e320d8c58171bff29e82e29e03d24b8c3adc4b9b0fd14b2eb5977ae9c7813c88beb6dae2cddee56a6f6ff7f5c61fdd858b8dda917bf45dae3391421c6afa7188be1cc23e7de9823ad8d3ff172f5028fb1f96ed43566e1f34d2e52d39441665fa4922ec515c0eeca77dec566c310c635f719019d9c4f0b18b031343d73decb00bb305d219f36ec3e410f7e86f3775a5afe4bbdc24bc6e282585327ddac3dffec7e5f0ac640b227946864ab4789225a743f72aaf51ce5ff3cbf298c5e583480dfb71ca16b73c8adb917dc5413abbe08edb817a8b83f8a7b45cc882553a567aa43c90cea85fc13dba57c1403a67d9d34fb9a82be9f790b73a0c847bf4e99faee9c2cf861bf207c79069966120ee5920dc5d344036393a943d4d74ba529c0128380dc9bcbfaf807d14257616397616224492ff41a47c749b49153a0cbfba7e3920f5a2b318c4011df340cda33ee2414a6944f631fb987daceff5bdbed7f7afae4cb5b6360add1684cc1e862fc01bfe343efd76592a740e06a813a4731a8590e9db2cbaf89a267f009121bcc9b81dd9c7c7b81a240cb0f332a48a803199ead0b9db5d3ec994be2bd1b736d28f25cb4f3e29f228eed18f4aeed1b749ddfcd8544929531a94e96b370b0248b79429161be2d45a6f866d5bd5b20a1bdb29745f54ca947ebf1697a04e67faf08b63c894db51df95bc053f46894b500766fa93cb61ddc37c29ba327d18e96b4e40ca27f91289e83e9923961f7fbc48233af9d695d03ada96ca8969e81bd9cb377d5fac6dd336d51965c52c7d311bcffa260959f67fea0caa9852ac9b4892ee5cdc963df6e29e1ebe4b77d08b9f26d3436ec70b1c896493c964c2769afe77dcc46d190ceea9c23a7ada971f535458ba3bc6a97a191fc34c8f713b361a1a27be046462606888710cd3df83aafadbe5dc863f2033938dbf0df8d010634c62ad3549ec3bd4afc8971b5f5cec532e2df84beda43acb69d8543714e51ec6cef428acc3b459daae540a4f5b438e6ffa4fea60bf47c67d733b5c31ebb0c97231c687db16638cdb8533d3a4a6cdd9dd2ecf6405e2409cbe8d69172dc88f12caffacdca0ce8cf467fcb81ee24b0fd2b98972bafaf4d46f63a3c5fa747238be5929d4f9a4d441f734b95e38b70c6d7acc0782a4eb1b3507fdda186238fbe5129388eeb3c932fb710f07942f683aa885b21ccab25fb9a7a7a27e3ae87ba28bcfc34c76dc4094d63a277d0c43bdc8185cc9c730147c215f9db7512ff11cede5c3274849591e6529e5bb7c68a1d041d7a043e736edeb1f25bc2537ea9f50f7e06fa9a5ed9de55bedb4e1d09d70e83613675af9fec9e15f319677fcd1048101e96ced89db7173c50e857b52a6a0a8f63bee413147c36d6464646414731bc11bf9f2d5b97c7cfb842ebe7c970f55fe9ba11d7c976bb1e8e677febc28cb8fa997ef49bce5f21de49e6cf97671c1ad847bb2656d9982ea5468f5cf7e5d2b7d3358fe3a2888ce4579eb9f0e4802b90773aba47417e62ca5e1f52afb27d6ee9a50fd93e57b907c57a27fbc95d2bdfc06d26aad4d687f7bd407d2fe1dccd3fd27fed1b976fe5a067948e2264eaf84e79c30f41575293be872f2b3299824cbc72e74af2dbc91d2f1e783e53fbeb60fbda5d10b27ad98623fc25eaaa0044a110d15255988e24a88f0a3440a4635c3a24874a2e40945a26487507c681abddf96e9cf221d767d6c99da4e227bdc92d89268df46d0381e70cf7ff6c41eb2b2148fb06409223995927289959cf296f4c690dc9bef1852fee4dc9cbb58131ac77f49833a1db462e928cf6468c5120e324469d9ff63fd74f4ebf3e897cf03ceffa15ffe0f42c08fef421cf1017e7c21fae5126f7d5688f8d0e3c31742be6a6205f4cb6f40bfc43036007ec436aefc045d3f44a2fbfaf5ea97b7be5476f83107bebf742d6830dd9023109ab41c3ad30e566deba0ac708b1a941461c8638c31c618638c1ea3a7e02ac26963b531c61877c02c293aeb5ed7e5f81e95140105b388ee020faa70f1a0f0b442480a2e9e1e1456f980fa17ff02f7a0de271631b1052694a4440c48424a96300226b6a85c91ab880a213cc1ec113645544411644512122d3bc29e4aa0094925126caf2a8640e25d8213b7c4966d9be64f0c311d4df1840b362d5b82c324b65e7b46ea844ad2511744bc9da0f263555b33cce5559596f467982df2b2b38bfceba27f09b5f80b4ad21156586109299cc6715b1190155530ea7103ff02a9db23e4884faeb1d6998513d78c2abb0db1313ef124f7e2938e9a5c8e6131f18a0c6c8cd508a848f7b990bbdc8371880315d93cbac7186374eb5ea7bb4f317464c43df8f0777c08bc81df39781e9261d07d2e94891c0aa8e3463c27e548720a7b524cb91387ef49dd8cfddd84d8317a94a45791134cbaec49f10643a2373c65f83d85ae6b960e33f7cc2e9717897252086f1cde4ed245eec1efa22e425d44101665387dce880525a116f7a422235388de40f04903790b7e13f156adf9022f4480454832b98a8ec860d388f0229f5003abcca8c48cd6b5452b959a01000000009314002030100a068462d16838a228a2aa0f14800b85ac5878649ba7518ea31042c610430c10000011001110088404014091731ff5c8a32a007a3f344a60047ae144533621cdbcdea5a40f820ce8aef301c0b3c5e2cc84b18fe418f2cf58831a7875f0112190630b1deafd06a3eda89e7b406e4493e4e4e527885e2ae54fe2b1c826371e598ff1b1024b54e49f4f50cafc252dfb8cd1cc9383efcfa8fb33de482dfeda9c0f77ca7431a2f67e8f1572cd8c6f3058f9a7b0ca9688a04b644ca0028da5fbfd42a76ad0a535334f0946edead4af8162296845e4d7ca2a7a432003fbb0133f63e596089f0995c229e7171fcf2f0e91e8834544ae91f3c1c5574556a101d2d793210e679092e967ef4f1ff2c117c4edccbae298a2a805f7b2caf8c3aefc881687709a5dea546efa4a476320c392fbd0e9e985d02fe859206baaaee2fb467ee64ab9ecfef58a3d0972995a9a326c0eeed600043ce746ad2e5f2e0561f3b61c1675c8a46e67cbbb0db9b7ffe347091a83bcf17100ac9a06d9b69e419a0f9812fffa18e376feaf236b9ad497d9c5069a9ac13a5032dee348831ac5dcb04d35d030e5d7fc56b148cce885de51f4ca235361a1e7044aae7a5085a83c20ebb9b551e2cdb558f9fd0ae44e0e95f7108b6736dcac66584172260c956b0bfbdc003d1bd92e69db7739625d29bfb3dbe0e7084750bffa55a2209bc0ad8f926531bca43cad4a5646ebb56540e0bd0f19b01e1335c40761c5cb8c024d9fcc1a1fb29994871f4ddd4aa7902b56d4a22ff70932e331cd4e1ca793d90d0d9a12b60a6ccc3762d5f896ec95b865aa77b3b099a7d1ba1f989274561b754a5e55249f1b9be200a69b3ab7b264b87cebf6b51b26fe308193dfc1c846cd0fe8e1ca676e6bf7513a4c46d32d2172f89865dda2ba072ecb10ac78c0501c10d74e081d05c6b799fc7469648962d87562f6d5beefe6934e0d5ff5d4cfb5826b809aedb2719a83a36a201f156cd416dfb326714000ba3182bd54e6c5cacb84ec1bf0c723f9405b48cf63792cdfb67cf43c73d40fc00f3fd9c500b46de533981dfe76e57eb858cc2fcce374c262df8e71a41f07b75279a4611c5bb3129c114dec30cf6411131e0b0c6a72adc29179ae66743c13e1310c29c2d494798647946be35d5fc6e09eacb9ae15a9d053225918186f1328dedba04f8eb482b8279cac3688fad60a7ad8c87a605ed9e082e6a3e2050c40901082d072b231cb7347273269443a30026a5c4442097823cf2de98f640d5641c58fd0b22b4773366f0bfb9c81286947884609c0a8eafa1a47fa5f01dca1fd1146486a062bc78b460053f51fa6c74c1dd821c9c07731b3402bdb116843b24c43b88db4c77d1c1c1afe0c618f92d3f447f2157bbc6972e1d4e489a5161322dec371cc757cc2b95814966a2977041ff0249e042e9b51e6dad1c580e741c42a185bed6a0242cb0e2631ce21c1370914bdae46e587137633d1d643804c6403fba45f400c7779818e783c10908424f26bd4761c7bfc927749953e850a9bc29f7e6ed3b320f1512bf587a5fc9fa344e71cee466103a3f9134e51a66a11982163e7de33a3778678317193ea765467e6df3940b2e9635f8e3f46c7e45fa94b26b109a2dcb0c9db482fbed2c29453170a7403f0444b4d7b2d96f84a6051f34327a5b1f1b999a8c8a913981f336bb8918ebb959358c3b0b9243ab3f4b9e59b49fe40a333c9de53e0efef1e4b9d36141ae693b05a40be8cdac3a340359207d2e22f7ad4c55f6c9a69aeaf34bf964e26914608612d0bd35239f0c7cbfa22d289d1fcd8fc321f96f0c33c48953105b00d058b1ccf489ab3ae914dd9e2aead14f2297b1456e5ad4bf81e283790f8c012d3bd871f477ed14360bb3c371f3c0a7d0ba0e81f890ddad3a7518cb1906a992c75c2240faca1ea4d60812f9451266f4ba7edc38ce27f8a04ad02e11c6407d2eb19efc87adc4e278f12c8ad8367727ad508565c164a860218196c0387d967a34b379c331c74cb101ca6f6021aad476a908c0abc34d3ba6b2fb8e87a2738a831332121db4d6a8a0565422b6e6195b87d367e8222efe50621ce51a088598adc4ba177035fe6d83aa3c91ff0a6e27908b3c329e8cab3c3b189e700329a18eac5f0cf33e1c30d458be599ecbc29c5b97062999c72a04a4fc1a3fb6024957447c961547c59c2fa204cc542466e51673893b75c5836a115783a47ab8cb43e0c513b5184a21ca732eb0eaee6da4b6baa41ffdd1fc9bc32c6efca0a3843d7c0a913105bb7b229f8ab5a98ff005d8649ff43b95018eb8234761ebb4ac5cddf8879d10469f469642f580a81a34673225971e8e23b1ad232559d24db60340269bfb3626e151dfc1058e3e96baf7c8060a113a90827dee864f9304f0fc145183db63437902dcaf74d3b2d117b3133b52a400a12f216b460ce4f096911082ed0b3eb4f9c66ccad6ae81e6daa9c413540408e0b9dff001b6c245f0286c6725000b903605a8c5ba41be3e6931a00dc6c00409c0f875f51c1cc01e6b185208f8318e8ff145a700033ee9aad8579879c89453fb37fcbbcdb07eb9897ebbbfdb238a7c2939d1c90bddf2333b36d4ce4b7679a0688f07351596da403cb7828ebf3eeb0e6d982210f03a3fdf7faf885db391a700d2bbcbece88f756e8cebe8f4967b1b5a8cb4c1663c92a25bd503ff53214f270411ba14db99c710225157b807ce3477bdd4c8112928739a4ef8db4d03948ca984c636e11696fc56ff2bf593e42c3671a9c49a809ed0291381c3a7f67526607eed6892a0b233d17dab2084af80e1bd5e32df2b151ef6f9382bd7303be5babc7d5d300d04d1038d5f9914581f83ca1af96008cc15f963fad8973ad07ce7ec83f400c2498a266e59da9b3fddb9b1b927ec4091c85fedd956a626bb1db127b0eb81ecea96856c2509e9f0979942528e8e51d17066654603d948424b15e99d4a7cb6a2271e4d65bb2cf5626c70c1d576ac4877570c1af1b88840e23dc6d0f25a2fba115e8c69fbeed0b0ab7dd792e546789fecfd3ce30f91b69b21014dc3d7f56a3b802f83d6ff9a25ede3e7310e68cbaecd03886a80182b9b2d095d52c9ffc4d57b2d9633da14a62a0eaa0e31b6546c154aa2e175b9255925f94ba0e4fff748f377569482be7c4bb5b0e7712c6f3f75c640e32b3fdb64284e6e919af9cdd43dc23a667bfefcaa628c92f3fc0d6adb936c57cd2ded1bf7e8ac0c5bc3c76a46c94fb3f2cac20f44b4477a311285f4b6c5cf441c20b1dbf3cc917257179fb6b4130ad3ddebaea491a375d9bce8c2bfd22a30c758e036ec413ffa88c2bf770d278cbdbb477d0883a6210a098670ce608bfbc0cf5d0a0c1876c0d3f9e3a3da0d1349a0156bbc5e4e07c48dfe5e066999e108ef26a9e9659de9ee2fc2be4ee4a929af37e9cc4a8e27e53a2d50205221d9609246a4e8498f0f0dc2d2e0fbf99ec326b44049d3edd76c5e2a216f86a2f9475f1e25e3ded8ae07c3f05962f6238791ad729af479f8e478f0eacf20e60a3dd87258b5e28883e860adacb45144582f788047dfeecdc28fab0fd6b5cfe64820a678a40851da61a6b5e13569a36ac37b29c2491601c8901ba0c8032bd9322443e9ad12c9649a5d73f133d04151004543d9f43e99810c123af304b47c9da52e5ac9c06ecf7d0358a1ccfd4478f3f7d0aaa959f0e2ab93023b30ac5afe1a9799b08b4ed9bc4dd5d46024029017db305326ed5b1fc85e165319b60a91bf194353b2dab05a5fdf1bfb16ed7be5475762966ce845a0833aa40eb80eb6d2430fa3b865d001579409cbd64c07e97ad76c902c8be157d4797bf953759a3425bb6206a928d0e2f47ee3c59be1b00bab3c713da1728f50211c72f0f1ed8e3f00422395374f4b07f60833a6bdae07e9afc0c6211bb0241d6f48f14925b1eedbe5c0cb6f2869b44cc471499f22aa38fd5805c356ece1489bf72fe1729e3e802f178b436590a4db200117bbd28fbf8eb02e245f3835ae4f2fa7c4f278aac28610610652194b11bb2de4014eed8157c6a33ca074ec93181df7de0fab280d9a447890021f32c426dc5eed5401d63dee3cb6de6fb136ab29db864c95229785026bac2366c903f319e94002b864fba5bd9a952dbde20e78386e0426f9354da588bb15cd9d32c30957d7c99e044c5ce7ada4114854678a746fa19e12acad1c85a9e276446b7e5382c76cb850ad4f2f589f33c0530eeb0834bd122eaa723bf38f0f5d17339893dcef3341bef029ed28ae5e4a968a2fdadaaf12e7a810c0f40deaa3adbe12803d39ae5e9099b2d0e4aeee092df4d501974feed95f74a30bad11229f70dc1d5cce5032a30c793c9963abd2b08b00d6c12e8beb2c2f8aa2f3d03984308b88a83d4ece320c440ae4b45285239537593d665e20f91c7263b67c88822412dbb073a395c9e4c26bfeb3a7459db06d00f325d7045154ee31d8fa30204943b3ca879b154b44eb4c12413a4233b8b29121dec3f3e831cd2406253d0ea917fb5380bf7c83c7a47039793641a0d82f8f192c6f52d842e5c3b3e8830228f2f0bbf5dd9728d698d32dcb35d96280d00ab2bacf0ae1d9c509bf0f561dc1177f6b509f14ff348755218d0f8a4e48f20857eac4998d44ea1de236e5fbe4fcbdbc8f220fd405b9e760e7843b8a26b07c64fb25ac85e87cc2c8ad52e07010b38633afe88016ec7a5adedd8402bea63adaf7892390c2d01d3428cda06498f696e8cd396c8a5f43dcf976f650a21b9014bfb6b440b18e6459cf163760fd8f7e9c74fee7f9cc70981c518b15f7ad36d098414bc16996e04ed4669677e1a2fd83caf222008ee2f8dd9fa0a04901ae4fc2e17639af078e1ff3ad2240acc3b78556da154a63b459058c1fcb135f447c6a10a9afcdd58d7358d958aab02d73d343b4d814d01aec092e69e6b1ce9a833d9061894b62693e6745a00e09d6d431e7317d3fe5e99152d1329a2c3a4f2f90f4540927d58c42ecfe519ea70df6864b8b58334025459a61b1e92e2fa73d28fd9ea3144323f441eb8b4f497e4866ebc66c8191e430473bfe5db210eb7b94f5f0a561fe74b42f5c6feea26857d6d8f9b9729f73f2e3928fff4924e40acd3c1250f07a2a5229b59fabf5e34ada661639f7a21f2f10f262e5510456ecd566684d4cf8c4a440b10fc958e88847088a0b9f6f036a2f7550bda14d8c8ffc8d85fa350e5c56438ac01e2ed44a95e31b36e76f3bdf170bf963e84e809d713bd2d0c298a130115505bbd79f84546f9b8a091181da10346b28111757e8421a6be4920c3dbc75acdcf203aa0ca4f3e128a0e0bac27339325054c5b7446282fa7e54a1b7f215436a1c3674390e865cc665112269d0f215dd4c77fc6e75b1830301708d0b5c518d72c00bc99126601a9daa5b1dddfb13af8d542a69d147c61c15468bd39275aaa4309613796db1c39066e0cec1d75bf9e1f9ed539fac83fc5c000795b06b881236704932c2e875c55ebee2ff2d5c87322520e876a47c9ba95a03b711d403eb1e757c1985fc9fc861eb816544121b62c0529b757df4e2521aa6bebd9874b424a5ba2b449d6dbad450408cf0c74775a491b841141842b59f9484654c71ce2774316b48e9ea2260a5ce0fe4fd0ec1e3ad8420a57444d1aaf375d2c8c3560183c147294c0abbb35648fef5d6619df06420244f1baddc6bdd1c02e449cd027d283fc2dbd3f79471f2d1bdc9de70cdd4d8993b701ef8f73c87268836adf86fec4603b5adb84f2551572b09030a7f922a5b7f4c212fc13d77b3281291163991317b65116eae66ec0ffedee2013ab562c9ecb108256a41f6efebe359bb0cd69b8037c143be549307feb6d979fc01210aa2776dd479bf8bf76935f069939613ae7bb9e3c9eb219ba4cd92c9c7b2ac9185c096eaf7b2cdab26d5092fac7d674c40402d256b61910d15349cd78f6f8787a50320091545faffd3b707e6b249ac734ad877376bfc1b3cbc06e52c3841b1f6a13844e40f37a09ab5a991ff81060a14bba478d5ffe25b8756b247de591a1f075bfa03c9115915d4d78374b04f2faa1b60f798e562b2732459dfb083c1a9803e8a8f187f89053d3b86e05d0116c149f873e843294aa4acd54717b1fa2acc2b83a06576fd96684500f6670670b552f6f65fb4ee0dd72def9ed14f860ae29ff63ffe85e41319576eb9e9651929d7234b1caafb5ad99d9f62470883a436e48ece3fd19bdfc00951fe2ba92c4be3c939300bae27f3b7cee87a813a223062716c784882b72d34fe67ec8b9abc4c79cc9f6b46a951fb392530c83d7583fa0626c3e624f3c1f04ac0d497514670a9489c567adddadca9431b476791c06010608c6e53e43ffe76c96a68537c1420eb8c969f8ad04795c9444a8676d9be3a2d394dfc679ecba149a251c1ff73f7f4851441648a25678199305f005445a734b8df348dbb49a94db20c2ecd20ff63d079d56dc9da659251b96b4521ef7131bbda3818aab3d6b381de96d045d8136e7c3b8b29b7395bfa4aed0d40de6d1687fbfc0ce4e6b84f3a8e640ad90b85ebed2ca64facf031f31744869715f3e283e1c3d6206a43afd4cc68481a6ab1ec2f36c0d126ca506e97d3733cc025ccf45a4716740cf9c5c9f4080d724c62654e6ecb3998977b0b9071e85ec51a5b0aad6bbaa25a2226f524d638b8a5a7520992cb8426bc8404a058718985e62c03be0adda0a5f108d058471fa73158a540626ce010b58908600c8641207d1baea4602f4828db168057a61b3993819953eb7d187a2f0720ff53fda8212802f2a0ff32322c2e0526b023e5c7e47bf3ffe20734b44c8bedb1e0d8b69d31f7eb9de69599b7f16a9aed691f79fa2e243054471cacbb311056e1ee437aadf913d28cca5844b89a11eabe0389ada86ae615a66fc928f5ef1ff109df909a3e70c29a29843b36f9411191b9dde381e6951fc6deadcd059377a32ed028bd10cedce7871293f946274b2243aebd5e82661f321ad5a5a3a3b4021bff8fb5eb389e68f180654e0cbcbebf3773afce452c66b427af32cfc85b7644e354cb893f5cfc2c69bcb37eb9124fdf0f90591d48be1de1e13532105cc9891653dc24f0e6d8418d5926594b75c1ecea426a37ce09e866041831aa4c1d8a44149757aaaea7aab7995e86edc1d54724ad0628fd4f30ff903203585b9e2f2e392029edc7414a32a3438104b302013b2899ffe4201d474e9a5955104bef73862533ac76990240ad324a351d91b9e64f67138b7ae26cdbeaa09acae017c4659e841c13ae833b35f9dd1d1ba6b97a2b89ae304ce9fe06c0358c606d85d764d275fcf47230fa69343cb4ee4aecb6fdffb69742c11546d0114c5319a9fa880d541cac9bb9ec0a555b94f9ace0536f4b5ee45ef7c00b75ca2e9f0842e0ddfaee9041b13cee1c8078ff918cd0194d7ca848660c7320e17bf1e75c8b9189436b8e976dc8e2a46f58198a81927c5c82e05ecd0b8ae380b87a28e08bcf34d95210227b0b56763ec28453eac18d385da322ca71178299d56ef5820f134f89fc872b090e2385b07b6e80d1aef9d4bacfb299490b07e29239289b81301bdc0c80fa555abadd739485a40aba06fb8b17f732e7d4c413f68c320b584522d1e88830a58f56f0eae1982af74536b16cd3da3c47f3c305ef5d0da27b1fba998f90afc6c41da4635970ecfe8020f4f9fd05d4ee408a8332caf3717cbd1c69108ef43c3f89b2b6e51ee77e62bbc5e7f310afee6e8598e74bc271514e78df21d6a1c8916baac40f57ac6713e268f04cdf2393c5026b63e655089010d87be19fc3504f0c36314d3f94e0bf89be3e8b066b9f0781bfd8a456f6922e79f99eebbe3e78ccc9829d58b1f7e61c3dbf4ec83efa8c3283a904ad19d36f524676ad77175b751f3a418fba4fed13da73ac4971c2d9cb8313a42e79aae98b2d8ec1aa0d8385434d10c2a85d125e05cc10b3b9435798260cc73a8edde8798e9147fabb781b42abc21f17412aaa821e6b2660d2cfe0b718b9b686fd24a2d1a15a7742655ef49108add4783e57500f0864e18e3718d80732e37fa3a5d6882d2978e696c3281c94245ce77ace4b044a3d5eeb254832ffdbdd78d8112e94da45631cb779d5de348cc947297a6bb5068690213f86d2ceaa6d1be6a3eed748b3dd1be030809003442f231922d566993cc015516182bff29ff120a9c98298fe74b2870f2eff35b9b3486d045a40aed1efaf34b2894a4bbab78acaf52a356c34a0b418e4a65c0430b66d307c4955efa2214f5375c858977b8af6c90423dec11c7f2491c6fafd894dd1e38721ef37f6373814a07a16ca414446360bd3c58b2c01ca460ee98c0338389ba61388f3809b32032ef0ef3675e22212064ce98d1723fd17b37a222e22a5f880a47a0e19ad1f7876978888ee2946a13730fb88b220b4092b73ca66e7d8ca7386052eab157ba4bec1e2d38e96524d94311bf146a766f852065653e8101220fda395ed0dd841bc95c8e08fa6467822a256c2ffcbe3cc39f3bd93ad75b74120d95f7d59fbe69ab51d78302bae0b6d4685b5a43da167be3db56c0f84c2e86310c77d40599e141a1b4edb28d002ee1072c2af7212ae5d5129bf258a6b89f8c4af3a506816e31b690c3864a74f277795b4394c081ecca7fe884f9dadaea70f268343e2c604661444b0fcc6f6fd21a6692365f79af5be1e41ee1e8d068f7688b6c62b5e548ccda8244853248143208e158cd5c3fb16dac0d6b03ea727e4d144df3692c565593d2cc20c25cc402694544ac54c7ca1166d121d973feb6df57cae11cc88454b21c42cff62ecb6fd4357803a88273aab6885e7cb0f0ed45dd9f410a1e8c45179784d2f488e6da30302dfe05083253f6195366af87e08a1bc846bf27ceb0ea2149035088209db931a6000d4eae22335c61eb977111f579744f66c2feefe51747083d9d109d9cbbdfdbf8565b3d93c71d38c8c2e309e10ecfe436b8638e745d4fd40da93678c083b3a630ca623f5a2736f93a820723428433f9ac0868a8989cc47d1cec34ed6bb25db443442e0c3c3240260983bbe4b2cf27aa581648db3baff96116fbda0f7157630942b5b8bfe8370971632b4a69d18144b1054c13197c4b8abb8dd055d569cb4858172fc663abb23b5d1b6b82b35367c356c81fab36de6f89bf88cba085d7fe628674925d8e0532c8bac3b8ec92715104c37952a0a422dd242bc9a4bcd62d559e903424a6ecb710647ba73adb2b7c560140904ecdd1698e91095b4d4268d231504b7c819e12ef6a9974c64528b40559ac04576952473603713c5614babbb165987c397796769e4406845b388ddca0017372437b6168c1d22de91691417728b61092e646fae24a7b20e8a76eed3bc3601512ec95bef7816dbdff247a8aab717baf7285f98bf9675f68db63e9c5ab7678b2dd40e06175a100686153f86a81698aeb55f863674e4b1c33c97268ebea9093148d9c0f37744883d29a77161729c756e7570c0dfbb591c0c3377bc31254a10f4c3ddeca536576ecf954df0a5ab0dd48192d4145aff01559f162685dae2f8225c15479987e85b2913ef7bb5a6227e97e74927b7928f9a51f7b0215a9421676757ef46691ee88429d42d1ffb3095c5b7fa8a3faa5b7d799962e0aacef68a460c783f0cafaf1fd0eb7a2b685fc1872183f46a9c4e18813694bd5ada9b54e0f414229e829f004830b790cc622789810533cb91a37fd96c6ea58a871864d944025e9a5abbae8160789fd1bc29cf6548470cca858ebb662df74beb08bddaf82062fe364a25571d28299c20b68da7290ac53821ce3200d172bf2a296d353d920d581580475d2a002e14f1c42fa44e08c78deff78c26a8dbddbc71119984be8cca6133dadff08eb67292257e236ba0cf1025b2e3f29fa055026bfd51044a75845fda369bcc1202b84f68f6458cf0a7fb178e3902861b2df0bf983098f18affe3c627639808d7887fa80857d06936d6794dd2b2d560b888626d183282bfddccbd90815c6c79bb3428fa9431eb7cc7d647c6569b8a12919f36085782689574556f9ba92d9e734b2e3e75269d87482db318dca0e04916418bc80f263f0ea0f43cd3434dfb949b858b63a78003d00556e1248093deca97014a8a09a25da70b168b02fc1647fa7b92d3ac25ec13e2c013232512ffc1720993ca28ce3bdd698ce2772ebd46440ecada56c7dab5cabd46e4ec6dd662a3201f6de0e7d6ba9ce93e9e018155488ad59d1e257052144fb811c5653e1ef5537ca6f1b8171fcbd7b4b302d67360a9c733fb8a216bb95d7da6bf597e30db8e4ecb28f0f54f384a90afb296ca4e2800b5d4a29529f1507728ad7833520317442a8c108647ee8d10a64c95bd8fc420a4f6e1e64613d321c32e71c7e6d36e874d905ef5777f6dbf5885dad28d94835f62e6ee657d2ef43ff7710cb255cd102e95e532d55bbd60da1c00592f69804698506632b7ff042a94d75c1c32a061e2bd1cb8ae05a42553856be3bd0dbcaad63068e627f742a92db5554d0145afb69c16b81be6b58d4dc52fc52a72e5676fbbf83ae230226cb81e51ea7de08e02f7e408b5f0925880dd0c32a299d61ddfd6bea2bbde77d0dff9972710cf3a5765b17d1e6b092e7a5313cc98d83b6dcd9e0b44abba89aee5f09bdcd28df215ad4fcdd2accb59f8c601c2b6d5e8473daf4866cb4607b152a5c60d19f8a42bb9997297508343aa2404f4482d19102ed35575b420073d563441218ae858c07b8bdec2551061a6245e0aefcf225118dd2d91a9e6e488b64cb2734ef784016cacce32615f04be56988f869834cd14f60ae135d6a6f7e48400a6764381fd1c037bfe9387bd9f676dc17d8c08ce6d081926bfb73a0743f394d749156311ad73a1416ef371146d23f32af407493d0fbff802483286d78515d9acbe963bbe78a993c8ebca6458551330be4d8ae43894fc51113ce3cb83f92b733b7dfaca20eee04653b80f4aad636ca61e28f60445360c4e34a075ccd291d0217395690afed10fa49b075cd38e314f77a3f0223660612b44d875c323c5ee63f74f9435a4be542f160515ad2264b06aee7807ef2e17f2c71dc9111ba4a53f1076442897e341376a449eac794ab5f225c8ba276c40e5aa501f3760fa971a272e3ff67ac8327104a83455392343ac8a9145ccecd470316447461b5ee77742b6545106f32c877384ed00e37015904d4a2fba07b2d02f63c45526207025c0062814e7a95f37dc5ebf2488ab235732e0f573eda62cdf36bfa8ef4a3b7e727a88093789be025b1a34d51dace80d06fd09bf402461c7662ccc8a55e164611db881044af8b8fa698105460d3fdbabd2bcdce0daddc0b0e0b8003b1af27c12ada1f2c0a73390f144e497fc2decb6ba000f9cbc03a2d5a5e255fb5d3d828e18fdac6b6929eca4211b23ca98201311b2ac9be1a659517d306e3668522d932479c5d26d497bd365a4011394453ef810edeff83958fe468b827e9555db70cf58d2de590a308caf10416535dbded17e77362e94a90e68337580d9efbd1be4e43bd15eb1c53672d27e1d8b91f41086995bb88485acbb1c39588417ed94d7e241276c97104898e24d21caee57c2b25683d0d2179516fad08bdd755fdf84c26e8a9d4bd5df902eee0a699a938abf667aa6b02ac1897d2068491b8fb4ef01c0b17a8ded106fd031c948a678c089b3cb3a842b8df580845f5a0ec77345f7d1e71f89b9801bf22d245608412080fb897f1f3b6ed8f2eeea459979873189d8a580d1187523f9dc63433eb5cc67364f9b8d34912f490fc6857db09e150cbb2801b78be3b6b101c8eeccd7334e92ff212508442148ca899c14ed28d47c615dbc231d539bbd8041e5b0baa7092ec576b7831b4e7fa46495fcbf8cd0b59e5deaca20f8cbcde98dde79c8f083b31512c4f85e9ebb349a336d795fca12c11f0e06312aa0ab5f59f4d0e8c2c029fbc161841beaa6411c7738c1925c7d80d3c53eabfbbc64858c5780436791770046171a73d7b1a7105466baf20bed683cdc42013e63d3f61bf787f48a36102b3400c8aef7dc4bed31cdadfb40e8f43b1bc9a15f690a4888357faeaddc1621fa9a207ceebc278a44d769e1e13fb9d92e285c5f4e6dcb6f2680c28e16222b79f6b05aecf94003cf679b85ac2607ce57cca265f1c8bc51c0e0480c8bd137c553aab3bf11f5a1817e58eb3212a754de32894b166c045c56d62a908a3ce2f03bd3bf1d972e86e67cf728298f843210401cc852cc14a493c34ae80554249f25b75af90f34f4b4d92a710dafa33f525bdcbfda66e8f05c24dcb328824d89a82191bd33fb53b43135f92f8230a7026182a5b7c155c81eae798a97239d04d4e46e139276b5861d61d61309475bb99eeeeaf25bc96e783c1bd2c30d1eaf02587ab667cf19c87d2f4b5980a93dec7d209329a0761c06dbc1744693d4980859a7a104423287a5bb6cb17b07b2d7ab98fa93ce2235a9733f9ebcc08590bfc92eea4f1e6286d96d125621e556aed8447e5c648cd508028250167a877b037f48025572a6ca06bd5e801b44b45f55fe68b414fe04b1b04471456855207b2319745d2d720fa46d4a099afd59c6c4775f5ccdf5948d4838b2a1e7874ce71774d8c66b1f22fa24fd4f94c90d04281f7a1a462d96dea99cb2c91101df314b40eb4bbde54cc6e95734315dbb862cdf52e5a00b67646240c832e8b537d0c5809a05b1c023601b3642ec5e345f2d41a40b952356b21fac7132a25e23eccf5f0e00a54e659c237a16bd28656a7668124a09adc815058fbd963a922516e16c02bd2f6ece1ee238a759f18c80f8a384a656157b4d26f7b325de06c06424050de28b17a90c16842a6a5bd197492c7adba797c391acf94e7588d51f56f2d25f23b777c7372424dbaabdb4004e033d55d6ac70f60bc1e3f281a95019383c92ae7e22373c210f88410c600097a1a4a3d28c5f5230490c6f0f47060b55f2848b3e7c46005e541608c1931a03c58901452f40a12ce607a3a25375e8861c7d254cff95e809eb272d16c6a40354bda98a0710f89b9ab10d46cc46853876c74d4931ccf077c8c9bb594ee293af235da780fddaf34e9ba4496bd1d6c90edb480c666e240abb37e3b42de4d0e69f4eec0b98ffa782613f32832c48d697e3ef5a3112252f13ee155fe32ae49e4ed55ed05361e47e7901cddef504a04a0be74cf8ba57491ed435bcffa4744f645569483842933959ab5375ece21eacede463fe7fcc0e1245ae40ea3f2851b0ecc2c323b6782ae545c8a7258eb6c3d0be212625da3dc63bc2bf1ee620b66b029f3af7bd07498164a85dfa32c19e0296285e2ac988bb099e074f28202226b3e3a74040294d3e38aa7cfe7bfc5d4125051443f138d08be2ae9242274b46983d70c9236a277555d2b8189d80653933632f854975a8327cd2bf89a182dd2ceefb759d6c74ecc1a350435ac3b46bb319d176dcc0139992ee9441b9d3214088bbe4b0876d6462a234aa38b51859afa54ed3fa4287e9faed49e0c4d4eceb5aae590938775d672d9c82b9330e8d84e5f1945339975120cc72cb5a799906f8dbddf818d43ba01ae6fde687d3a1c6919b6631a7d3b0c26ba7e9511407e3fcabd797aa98fd76c48c5df01118ba82d4e49f9e9d139e937e4d8d654abc7e15708a63ccd5669382e4515c51fb97e97b4c3679eb54310e57af8af09345e026595096c7d24139f0cd65000a0155a26b35c00abc7873332cea324bf89941ebdd71c52a60511eb838bce21409d1ef3c5e7b2e954bc53daf20da087d7c1ed34a740a53865c67cce00d7e21bd7e8a2dbf0247943188c2261305bddcbd7425543f342b3b72eed251298fa265c020dc0c17fa9e2f27b22ddef0e0b88077f4e59aafabac4a02d1f632c201cee20bc0b5c12a76dca1dd6ddae6d7ba82750f6d9ea0d160f237c70f8bed17150f9b0f204f8a394b966a0af10e2a2a868836f2799dd1b52925ca933c70361ef5ff5f08792200615cbdf1187b0f1e012b7ae0cf97db8b85828b2b0abd264ee569af1535918bbc55c62f4e3609a252f060de87d6b31175971fb480ce66fbb1f6db1789b592ac9d6381fc43cf2e5782a222eaa0a04648ff385fcf201619d68fe06c876f13ce834a01320417435c76717db7aaedb56bf49017703605ed485c53ca0d6615732e39ec4bd36585cf8954f57bc2ab60017bbd507083a380b94196098e83467a1065802ddae3a42171c1a164ac5dd6ba5485cd4b890f1ab1d51d1b4706f3b59144e81c18c364cdd0143a77890cc8432f58608c91d7a7369d9cace30e84f51479eb8482aa29dc15aa186a50be181633b0720f25e091d62d77a208669717dfa95590049173fafcab1f7f51693cd2c9270ee8c71e7dc27dcb8577c548030c615c7b995f811f5d1b2475337398a1dfeada51e5e8a8ef08783b0d475139d8ae3082d0f0ea093feaa58408a031d3d23945852cbd62114f59487b04025dd2794c81010a0efa612e51c234adc6d7a66cdccf41ef806794364360180b394c9218908ef1a65dc75ee878314d468abe931ae4042872e78d90f7da158ff21b0dcf66f4d4d0283da351675defe48ceaaeb5d407ee0ed60592521b66b4464d7bacf7598185d11197b4df8364128db14b54b5912e8cd3c786c575803b1a1e4de45b088efccf46ea958b098ea871804d1d07a5b6bdea2960c6f50aa87af1848b0b1ed666b8e86050e9f8bc8e31afa1f47739069b4d7e560fada07b3e0a990a00364ca46d235c5acfd36f22ba8d0392ea74ac8e417e4c14050fdc66c8338ffac8f08975f14a2cc74fd1a14f9fa0cb411a53865958ccbd44324e9dd7c615775e75b326d37a02e8791a2cfb09fcd2efc2aab3a3dde50b5d417ff3582f7d5e7f62f654598af37382f52568d9c68ab29dc80ddd22d05d13d64bcf72a135de1c3df9c5d69b8cfa05db33474b1bc7ebb2e561e33df8eaf1f21d5548872ee2c2f4838bb8479674a883b96164091a3a3c20a319dc1c2ead121d5e84858f4f3e900f452b578502d350650614be611fd72b321c11e8ca7097b4f2dc0240ab67d0a19aea918025370a23995e215ce26a3724883534dc9854ff505193e5d2c679089b4b1a352cfc3a2ff63a7f1528b068ac4d00971def5cdfdae776f071104a3b25226cb8c22d51b1102d1eae99d05955093383998c4f7b3a4c96ad4a4e5bb9adf301344105217ef5d45e1042149eeb481ca89a18bcf45a15f8a8ea311f4a924fc3db7a9a4677cefe273334c11277f6aa223b4e18bcf75c647d1b338979dd28a30dce551d7eb7d215b3f6fd7cd021ec032cb5e70fcb7f57ce1d1f8e4bce86a5f3aa881712f1e2dfbead47a0d3d5c04b4937aecd6672e708237c293e736e4e19b64c748c7721a9223208a98b09aff02c5263374f78bfb8136b2f184650233d4240111a09d3166160c56d5f6d25bcccd20c00e6451b5ba4d66b82381a932eafb698b91cb1e82c629d1af6baaa54182fa75c244ec693f884ca59a9c3ea79995269ff6579f7983d8bba776fcc145f1659aa44f162a91ae35af2e7a60c0c820a8666385a85f212d0bd0659c3fceb61f4456ce6428f4459aefdfba06161f591b208069c3042e056b0c878680a6084467920f072e023544fdcb45b79056fc50eb9febd12b5de227989f1482a1633ae5ff65b18dfb728eabd02932aca06d1b192bdda51ec69922350a5da285288f1a82ad4c601d21ec6df46e6295694fa28a6d99ae4012744197ae0fccc447fc7d8038ed8f43ac0f9050c52e579b374dec39d5cf07db14e0fb4fe282878a1012b7eaf588be0e548844f4aa6a804759b403a5ba3d065479b39e50dce36acc1d2354a8f3f986a21fe8ec4f7d4a68e3a6da2b173a744f7a5eb06ad893b3966ea7473d772035bb98e42787fe0c132350b60c2577e303c3d939f9242a9928fd83a0208d1009b0b2349ce4c60e39fc46af4b22958bba8d3c22238a4c648b11aeb9a22e8de095391461ab9d45f65f6dacd0362295accc9e6689ef2c79d4d69feada366f9e3b4da726cf388d9cee6f0047f9438a50c1b3d4c2137473451b462bb21946c0abb18725947753f08634b1921cbdc9915cf4ef8afb8b6fa59eb6e9d1189aead841c05a881684ab7e0a45f4dff4e052841436bb218079f03008c6e121cd24f2f08912e481f31d2c8525975ffadd070de633a1137214d6978244da29877ceda5a2627f57728b1d904588ece01245561c859b86f057330ae8d7a561c50858bed158821401d784d49589f5a60f09e499c85e0e95e4f5936d11a71431ae2fd4a30fad1a664bc2448b295747b171ad5fd2613d0ed8791f58feee70043af86e8d9bb44011dd3be1e0d357f5060e5f1f25fbcf54af0d9c18f091fc6242a0f4fa48179d819b023c3646013834d84f096cf69dad9226c2c8ea280da39f92324c85f7f83743b8f667a461d9efc6650ee51824e12f023977953de1a69fc49470c692fd9704c7cfda509220f3fa03046e1ca471d9085e88ed8e4a2814462328762c1e6362a23c59d3645f1f15f045025228cd0609969c874909d1898e268657efc75161b5e6ef11b8dec93feed5fedc7f73595249cfbce4436c22c79450bbc9e055eac2712a48a970cc3f59e3d453779f418768ccd121be749c7d8cb9bc9d8b03291de9940b480971fa5bdfdde485d76afbd4703b7cd48747ac7adeafb96aa26e84196701ee3cf86bc170ed3a12d2bc6d286333511468b445ba71d1900f28cf933b20850cbfab366c42638023d6da3b0a5aa1e33d638411c43863be3f85857bc67be3e6309909f9db081417fb23a618fe33bfb687ae29d5fee2c1ce4a2851de63eb6637654658685f8447a028bbea9b900ba4285a791c50f9fa1c5e289be11f589d560678f338e7f6c67bd54f4b911920b528175323fd33205accd0ec8560694c74b862ab071f7693b1fc8be0f194a114f52d37b0d8ca8bc0e384c2b71f568c6b08cc6d6468bb2acb162ff2e90ffae95ae8e5ee8f48fc84168f29f2bae775fbfe08b7e8d07ce3090c8903b9eb8aa3c6c51f7bcc3972594e2c3d42d6663cf0bb91475dbd0c04007bfc9d3844cc9a78528840a931e40108a089777b5c57a6e6a6349b0353174df034e034fec905b92c8836150170da9767ad8ba102617dc7437b85d4e2b96c45ec742ec8c84ec0d4ff015360183ae8957785d015156363ef7d8ef67848299f91ad021765492ef276c0dd620718fa5343381e59fb43b3762e340eac55d4be32b7452656285270fade185bb21cbce69bd486557ce03deddaaaf0a8f2e7ee9ff3c8e6241f7302a31a532ae8435bb7e09fcd81f15241708e995d43201879dcc7cc746894f44581b3b4031b88bc1d73229a44d0a905c1cb93d1ea3e6616ff1f513c61c12c0a43b6966cf3e7c98d74d39819854cc4333395e33dd459c9ea7c1dc8960544a43a57e46361aa53bbd1041704f2797bca855c3166106a2250599bd53c196f04b2a31774faf12974af1cd49df7b395a76475c71b2220c7dcd6ce8c0049758b5bfbac46816fbd99c56b5c34ffe10f45d4f9a6fbc1d957edd0701b7eb2baca4ae262021923c800e0e2d870048996760556a8e49fb77395aa14f8665b3e86cfddd58b1c33497f228bf85741c4d8d634223dc7c615049deb2d25f0a8a9bd68f9c8dac5e1753e212438aa85fe9729a86f4b8194036618992b31cab4cd60d2e522e6921018988acc986ca018fec76259fea74550293263ad46287aa2c4bdcef85773b42dfb54cfab9e48840fd264161129707425ccd387ed049f82537a6f99cb99b2b2df7127b35e5c171422d3022ac502ba784b15074ae23e287bdd166f888db25c31330d65e9f0679b7105ae9a8ba6d11f25926138f33a975bf4edfff5c96300871c7fb11853250f24d0083ec997f758f975dd1cc459c15046353986993d3b282686bf4927e323afe0f85419829c7d8dee6dedf059a8a738836d70310959b220cbc33c88c9cd4117fa2a26918121ca77e3954fd4852fdeb376455c04dab97e91b02853aed94f5b0ed827cc1ec7eac799c011f099341ac4c83d4b3dad901e0845265a0130a531c201b4181d08d5fa0982d0fc9ff5a100cebe0500b12ec909eed957da4e95580fa64bd0d67574299e8c7d1981abebc365b5e55cac78795237ee682059ad200c9a3d48e4833449ab2b14926b61e1b08761aeebd9197a6c888369cc42f5e3c0417982ef4e2f848e5e58434834f2a7dfa9e8f53a67eea5a957a5df56a1456bf34a2a9a498b3aa76f28b36a24318e28dfd5ef9bd82b62d3aeb27e7f1d02ee6944c7753be5d3199c7f57bc09e6d4aa8978b14047551720cd157855e267a35ea7fcad9a1f65b597a12433b513fcea5ff4f2b557aa6ec7878321dfb984d6811e463a9dce47a07c3ed9b68f2b4d1939c7636e5571f59fda1b802bff3f7b9d19e6c4695c9b717b0d40714e73ffd3dfb2fcd3f9b5e2eccd49fb289bc1ffe421dd3c790ca0198392ea1f7076456c6bddab0f27f9eef0bcddfcf99abdac7bf1fd7ebf402f96b48f54b395331c958cb286e7351787e7e860b32c03c7b5e7354d844f219ab8926586d1bded13ef1629243e32468bb42cb0f00896505350431766d4c9f505c14bee18c4350a9c04b3f0f557411d1979c64c19770f99df711076378670b30c5e48c7192fa1854549169771b4fad3efdd1d8455cbddc6e04c43a9e897adc6628f898838ffcbe2de087ff26d1329c9589c8d79a4961fd72425699cb55905f7308c612a6dfd666e94190da8103809ec36d68034387864c09825efd405e33edb5a228558b4413eec212663989c7d281f50d13680b2b3270f62281dd27cab0b1bc54c7c41c3563d6b733d5ef1396f0ed9e9c76304b65e8c8a822e6ff38e1de64272b56409d0f4e10087ab68e4a30a7ec18037d5a11c6eff562ad564b548c517177657b2015e45a79125913cfd1325c5ecf2a674e764584ef6ebac9dadaab4ceafb074af51a670d4983b1b7889bb28e9136a5cfc5a7164e2893be470210a4708833b5ff1c005d7dfc07249bee52147f0abf02d1a8dd95b561fbb21274d1bb4d319070059df4b56597a37b1977dbf05ebfc34f5e8b201a4a6538fd655854fb01018cb3edb3c594094b84bf76e85434a2bb9e247e0b7751024c0fa0994787c6caaf678f5d40a2941b31558e6797518cf123fc1b3fc4888f4afafc6324ddb7f3b6371a727e5567e3102feb0f5ca3677df0e0444a64974499fd6f41212064833d48078811a34840cf8a3693c0653a7952d76bc31601e5b26adde5287296ac1bd8c7f778a333032e9e42a91cec374b29a1b4993202e2769135d1796e6a9a946f2aef4a30354cf0e019cb61aaf340930e31554c1c18939a56e0a53d1be1b294bd7b48cb58409883f245be535a86d0208693effff081759d81c758a1a66e9e782b673ea6ec603ae96eb9933a741fbba70c2bcb80b3d7660c6331577f1f6da69f102610f3356ae17993095b0a80c465d0ad065689a42a5c8ee0a2d2c8ddeca66898719c9e3085cab28fdcd69b6a4973abb44e1469bc0a3ae419c99978358d993a60ffe451fdfe2203bc3248aec428518671c966ed946087b9fb25aac188813e83b1435ed00eaafc42e2f440b4992ec274e682070172d342c23a350f2bba7b3a4e8c57e2e439d61f82f0351af0322c258d4b4a8a13faa31afcd9f8a2b2c3eb15dc1ae2a808a1bed7a64794cbe197f6c60996438e27aeaaac84349542ce49429805b545a4067ab26686b653f07824b7dc7988f65d0ed5fe191f283aaff265dcdf9aaa769487e416f69a58359e7a73719c12988303ab4b8e1781bd3074dfdcf68bea662f6272eeb08ede40e49b95531daf919a652ad75b0a52388eb528ee8c8963cd4651da19ddc2129b72a463b3fc354aab50eb67404715dca111dd99287baac23b4933b24e556c568e7671828277574d61ca54422179ff56aaf041f488f98ca05f3e04960ea8da0883dc439c56a83f45c9b32bb2500d0418bac70c1c20d33a6386bf02ebcfccdb154fb4b321f015cce5b2bbb6047e53a2cee63b6251b16b279b554aabdc9c670fd272d92150b3d87c473f6d83009a3f0b23adedf18935afc2385fe3f96093dbdfd4d82ef2d769141729f827ffd80dd97c941277ba627f382ec9300981f71a0e33e88fd3071964917e53f4e32adcc0a3ef94b0ee9c443e9d57b126949c9a080c16f8778d2489e2f960c8fb16b1b656cb7bc0f1e63c7c1148b8484d66f574dd9e39a94e5b982a0f165eb290224cbebe4ece6e6fe06ab7e70b52f097f7f64e95fe5712dd3cfbdd12fa2a7718193605e63236bf343f813a84e014509903631aa12364890ac84da326987429acb255d1162a1326a2d27f0e463ad42f7702fdb4547220c363b7d04e891abf963d6f0bf797567d56f62f7ec4e6b71021a15e48c663673186cc9c1819642b3a46bffacf556baed3a859158a8f0a88588dc1a648d372a88d2368d616db7b528f8d36ef3fad0eeadfa3aec288e560a52a549ece76482744a7ad597d389026b1acc8c1fc008b9a990965d1631976e669eb380fd10f61555183b41fd9702f0e058d94e616c5e307089f59faafadb16332fb6a264f60bbf7a092408e5a530a8aabe5964814aad7dc03d2f3986e3e80f114583e606eca63dfd081f87f2a4f4fd18e63b00df2e20db6789143b6bf46b28f51ced22477f0e9da3664272aed340c1b4493f61dd4ad16535e61fc87c134e2ce61343e12c308060908f9fb00a2d2b381f2365363088fd5ec8f3f8d9a19be341c77d61446ba97a52fbcdb1a5c8b4108e0254e40be11cc37904ead5d81f16d364405c9750ed64385931847d8a004dd64c675a6699019926744260d608d5cd744d90b6819dacb840e718a038e89bade4575489a6fe349cd318f23efe1dcbdb224daf28208f8d95ba13e37d0648b1bdc59bddc4692fec3a00da5c672506394652c4e334562729ab05e37540480ad3e2a8cd3c936498a655ba23a7e73028645b4446d0611bafc6e870def1b82e12893d3e5987c860c58513d960463c541d6c37cfd5354a8660a70651dd24fbbd4dabd5d46407e3ec4218bef4da6f6145cec0a686bb5ad19b89a059507c1608919b6485c899b0d66607004498ec76cd90ce70d7fd5172aa0768af17f87f3463ce8b90537d037642b1664d0e37d875b47b519eece4f2fb39a758fae1e765434daa618b4de6d8308d53dfafdf9c9e510f33a922128598f0c95640da1ee37a79f4eb92fc7468254986dc24a6f6b5e64f585143cdf773a2ecb3100f37cc55f9c7c61797a40d1600a31c936860df36b1e22ff7144594c454d94848f10a48daa1f59dbd5ac283d213df5e87f460d98e0a6501d8d0f9f76e9b5e550eaca3a756f7642acb57ab3bc38ec4e2cff3afc0b36e8bee425f8276aa73073d9a1fd0594eff117930cdb7fe0f0ab97adf9fe9cae1d4bab9adad6761b09ad85810f83f158248d32f580827c0222eab53d0bc1bd2268b0d1f6ae9cd9d2922d63b9633f34d1a1b9fbea3012541a547857313412d5a8f871ffe005f60a0962632013468f5197204d0619a6cfd3a645d3c73140e4ab9c3bcdfabb07dcba66869ae4644bba7c1fcd8dd23d991ac8356b6a68646dde42d2208f726de938739f0042175b84a47073dd4a84443fdc0cc1023a2e2ba39a877fa9e960ef38f5b055dde7e9a80d13b147896ff286af895dcf6a9167d1f3637119ab6ba3d7d245d7ec71baaa0d7d6b73892d68dcae938661deb54b094809f68000d3dcbfa57d8da8f222696861a185a1bff5429b4157843156574444baac9c6cd3be941daa454351426a52dcb4f5169f2e4e29c5df8d1d48a27a28a3937d9a0b46032352032418468d1667ece952583e551cdc364121e71dd2d702c3c9c248a42957bd6a0432b0fac315602070ed01c2142a80ad26d794c2cfced59e1237fba2c16b1d0a0a33fa231c1ae11483c0cc61e0c09c5fbcad3dbe4c6c586b002d60a4ba892480d1ed4511a431cb718d63b237218703a2ff0c5f23c810a5cd42fb80faf1820d9a3c4f86b76cb01ce7654bdfb6954297631a6e1c4b885ae644dfdcaa142f9c229a707712b79eda9d215994e502c483be0b50b4523592a3a1ced28d0a4813d21b1eb1207594664acf0958f35a0401516456adb885282cf7a627a376e5ca77e31d10cbfc196fed062fd2ee4ce14d89e543e7d78b4cfdf7147417166ca0e6600cd51ebfc08b8185ec702e76f4cc4fe193280edb6fc3c28e4db0fb72f0688f7be99f939ed5a6b583001d1aa1f1919c8d8d7af7514d30988ccdc1d76430d0ef393985edb458022190670d6016cebc6c5dce06e336ce5cf4dac6a70fb027197c689ac9392493e41b8ec3158d3958c1deebdc11af877af892e36cdcb163be50ad193795a49a04a1ae70bf78b8c7d83c628f53fa40bbbcaf539ee2ad6d95d6491901f17d8769308af597405f12e34b9d0fcec52082ba33306e36f1c7ee4a48f4bb0b982da05d7f45cea64bdb6a94b9c44f6529a17ab384e5802408c479f245c5be0e180f2f9e86d36e86d0c9b4e0c6f9d9cc2f302e111786ea89f8e577eb43d37384b47628373b8c17f54d54dd5a43d262b51116569a0e80c4d7552e0f34e2c282a242965cd35009863e79b0fccc4e5f20565057aeee767bb09e398a438f87303bafdeeda8a9561c30ee6d8966087d4fc63165f1acb4cee4b3612d8c5ba0e1d73fa6f1b808271f318f3db82044ed72094103a439dc27bc66d88c132048b23331ccbe433056d51d24542e2e10a027b30d7131392d8f66ee64294aea873ca5c3c975f6ba0dde27f4348684de667fcc5f321fac5f982f45b506a651d96287fbe6f124382f65f684cbcf65cf847cbd210f22f7d94c9a532f4adb6b519e67bb1dcf92850e0eeeb59039bd1bc53eece8b7346b2353c719db47bc80e7c12762fc28def1379c3459d027dc32a72fa095bbba8508bc908f4a64e61efece2c87723d126055d6ab5d5bf18cf8f98cc8cfe6dd1b69aa90b9c9e5aa5efc03853f7bf98d679ad64ea9bab86be58f3bc524b216c46a964f46bec18f8f04d495d881c24527601c9b9174dacbe2f84330c3d1ac26c037ecaa86eb2879303b62fead912fb0f509996ae0dd697ecc601a03272c5c30619107bdc4e6793394b0834f55c31d9f81c722d13ff8f8f1c8c48ec2ebc7fb8ecbe7875b8f1747009dfda387ffeede48f405aef71b438c76607b0b3930e9fcadbb56d56aa2376f0ed7eb13005d09f522b9c811b67544d2104267d325851b7d5a0bbb3c461ca40901d6bd674e79e22b40b909552d639ae9a805497032de761cee0b27e76630e6d0197ada012715e1c5ee76775b524f58b24a090e876de5eb84aac2ece65ac3ccb1ac3908c579d4dead68b1463c270500b2031b5c3cf971994a292fd5fa5a0b12a34bbbe9663939a7c822cc4d522a454ae48882a11b27996ee87bd2ac7a0810de48a7958ace66c32d8494521a832e5d8ce274c207911da264fed192ff40e89691e5510d67c301f9f800bd1fd171090106ac8b2a42588f819e2e56748fa86a08fa69ab44cd865426a16add49f5f0b315e4a06f7685a15b5b4482a6d4110671b433c4a0f7b1d69019919361c928538e66ee1285da8204833bce24c759cecf8f03fe462ecdc07426c2cc9ca0b9125eca4e148a287edd15a83409521d138176b46a02a320485a5a43cfd8b57467bd0911602a26f449331d5b154c83778e4449b7028fe2b8415f7ab063f88541a2465d353555fb8409c419177ae9e7bf3fbce5a00f802f9a7c42479069f9f182b42c9d411993ddc2a9511cc43960e027e64c53fce407744b19ed54d2d92809fb08e5610c315a34f2f2ff931e4221545fddc3ed87a8caad3ad8b1e98710731844bfc08aada86200717720f58f64c001ad62290cfb7bb3d81ac3f68672b1f98b0d4aff520da7993cf43733a4553dc52bc57c197b7f11a8a3b1ba860bec3382d477470c1900245e15ac50410628d391cef93ef729227a508e3908538e9c6ca3708a7a20732dcb8824248d2e799ddf4b574e136d2d79789b3216ce25ffd39a0d6bc068dfb6594830aee1939a59ddbcc218a82dc866308a7dacd890fffd2811c0178ca71ce59de44b87980669b1b3ffd57d8f7f08505bd9fff0c8eb15f855db49f4ee4537bb346781b8ad1290f212fae25190459d5fe289f1b9eec82f86abc3235ba2001323bec4cb1129fc12a53d18be82e9036599531eb24ae4c010c5619d063f82874edd057c3356454c4d0e062ff205b23fb04003fd2b5468dd0d4cac94a585095ed6b4824cf886dfb198c7bf2183373a8c85be6822f032f5434e9938896ef04529295821fe51664c77a46efbe8e50e7aba5ad57fc1594520c2e0d050bc48d95ae55444bd87c74be91ac8537a3b4a304b0ef1edd7aadb908669f2512641e995ab9c4cc932af8123b3cf9058e38297284b310e99953f7a421331c56b44a11ad159ce14c7b691c6dc9f93486b0f2ca11308e9668908e9d14f8dc9f8d811031f7874b9a81d78177fe21af0e578b4a47a6cf8e186c095363f1651496d575b5d26492ba9067c448c74695564b3f468cedb82cc20f7859715dc532d4eb8746ab93ad815ed744e1079a5a2bdd0d11127d94ab204afbb323eca28620d1a15344bb2e18e400cd2df8c1468254b594a869645a3e011cee1e6298044124041472eafd102ffbf9f40cfa877ed13ffc357aada0d74517153723a4a27b1a2229696968029aca4a5f90ee0ecc04c414e805a405fd87722f2bef45e4fe02b46dfef63de03f4b16a80f4f165680fe31f4c01fc506a0ffed36715580eed22e801fb409ab0210fb25ef36755c7585c37d56dffef0556322790a6455806622ceb9361e002f6229adc9603791bbae02b49233b1fe82f383e51b33caa8f483c806e1cf256adcf0b7c9d1198c73e18ab2523b2d2438af3f638e817fce45a13ee8ce3556005865bff91478f1c869f91c68db90de9130631c7c022ee8e6d1013fa514178f72410e6115154019a902bc7cdc867f95bbfcac1000346d024a3da54c929e07533ef07e00d00c684b5543ed75737e8be160d44354f3a397ec8e9268816c6c7a6255660cf3855489d49ed72dd212e1f1d00c48823ac5390ac01ee3493878014c90bc774fa1382fc42c204b8190068d6b144adcd6723f5f9c56285f4a223503b5ed0f360314a02a4501908ce97175e5224e4cee92925d4c6e1814853c25608bc53ec1caf87148fd8c2b573844525609dff156f6272c63245ce37621e0469107b2ba0148a4c9f1325eff345302582af44ead0bd8e8097a082c054669625d534b44579627e9529544757529992e514d5c57ca92e892f544baaa2469d7a5f689754ab460711fd29d8e7f155a8c2fb9ceea7d3fba7b7e836edcfab23d8c0e9ac5bc309d47fccac083ce5ad907e627d5b2163b8dcb2ee89eb256973722718288a8c1ae96fadf5298b6ba0ae7b7cb37359da48bdfacce892e421ce9a4da396c3b5143200df48d816ab8e81de169da1e1d089feff6c773fd5c83e8f5a4a2358310f9edabfbc30f0e09b42f01e30e72684b511da62b183359428a55c0a2cc1452b4582ad98491a5ea6c4bf84eedf7ac5a04306ccc6440ab73ca5c0325068fbf68241c62102863a4e9318a3e5ebeecb4a1211671dc446b8d69cec87ddc0f61faa2b1fe7486dc6cf8c119e2b6b785ac054e1aa05a3dce5703152a28328fbc5642fa7b0056c47a6b5bbe71c97535d6ec3e01ec8f67a86f30ef75896237646f11fd84bf04b789f3e223086d65beb1fba306b06200b3f5c53938fa2a5e2946d55150f2b1db729bb3a15a3534978fb064f2513d3eb1f4dfc19171252673e4eab5ae825a356123b6fe0f75fd570d965d2e1feb0c2b5ef6b51adec7b3dec739aa37be599c05fb7f072f7316c0dd9eeaacb348622d4839dcbb9f096b49e68a6c9138c9266d59783280d23d042863676c04bf69961874b4fe8fde246412202fb1d9af668ddaa02d04b6d7ec87391221c766ef4c808b0dba8c2fd8e08916cb1f6515e5bf502d2d4bf5de0439499ef21162797f538d06ad82ec5a1a28623939b852d983598500453cf1235d1d704268aebbbb635460d471be8f9b434bd5a87e2496a1871df1c4854eeebc690f997bca67d61719a42a48c3942e76232a258347c2b8c0ce2a428baaa1b74d72d07d9b4e9dcfe3f5638b7d0f75754d93f1aef47735ce805ef0163403f0151e4bebb0c216bb6b3ae31244b347545223a0a90863b628ca837d19a43ffe2fb8814f2d05111639f4d37b56e2639f2d60fc273f3940fe9d5616a731c7c23949db223a6f3f3845e8045d698255dd61ac3e587a3f3be4a5561c1547e9604d1cc0c48f33208a64b65b221c4174e9fde1f3e0ae6db705365909a106133175bb7203256548c002b4d552ed3b4b43af095acc5a5e374c1f61075af882bcb6cd54c3d7be13b5d0cc87da9403bb26c84df7760240557ddc8df0eef7f7c5e4caae5a9b751b950557d84195a8ed3c4db907b46ef560d026112bee3d196f062d140a3eaefec17e4a351968cfad907ca25b682a3993154437cb8358e5f1a23a40443997f27c27fa35cfc8e0cd61169876588003f0d9b3f225641a0951ef9912334fb1ca8a551cf89fb0c821c64ff248a1e1945d06489ae5e64caba7fec63bea58bcf1f10c67fd71d2891f5ba8ac20d602673016f3c58b37f3a5c3cf3e133aa5ebda4de4f651be56aba881638ea9d05a52340c741a34f64125e85dde4b9685efb1d06aabc758ba4769439514d35f2ff3d2a3de56abbc0abcc243d773dfb5f9cdafbefeb0c7adfcd411cf83d2ce6b77b8f501514eec3a6e494054de1b908068c141bc006dfa864174ae66eb238a455914f168bf3dd7b3ef1f84122ddb950450eff20d663db5a94ffd09a41482f00567053e4ed798104300ab5df5aa0067263190d7e2e52806ce3f5beabb1562327dacfcbfc8f9a582fd57c1c09e090778115e7743a8832563a38ff03fd816938cd22890642e4d9b2e020fbd24c42daf23a8d13abdd283a7fc26486be5aed841f2ebd99e2d077db63868fea41229196c3d692bd7582ac05d9ccb1a1f8afb4776e374e300dfe7d14660a646bf685e4847b2cd8452f77e20843cc198cb3d582b5de85610d19d882978827e9d1b7e1974f90a14898e5837fe50df1ee34e44174f2331519eec749070a38d3bc2a94e01ff448b0d283755ecead32b57eeae63a03fc84965547c4efce6f0f65f763fed794c021ecf56484d7e766b540fbabf998ed76933f51986493a7b018e52fe90fb6ddca780bf51ef8617189eaeb9367cda8f1dedf91c5c6c291b9fa291ed7b02acd55be0c2cdac6a25c2cd50817335f64ce1512dc5f6b43ac49d497056f65f25e94cd0c28762968f7547c22a14f532b6ca66716203ab4bd53fca74d02e590391de612c5ad2bf88065fac1838e34c6e223164b43a5666dc554f7e86d508f74ca2f5305cbe3d8052e55359199f7d33f326530dbad9263ee0464f39a7f85d0535c496aa981e169a25ad355be5c02358ae8ef37facf3c3327f192eaa0850f28bf3d22c5aedfbb156f51ec34e1af10b6ba1e95a4433238fba2a1432d8ca6e3a59b393f575355a3d43168eba0009960e679c6d7f9e49b937a6f39c36d0c8cf6db636c6f887660b8c1a8e188f9abbf7b5cebeb680085593d6d972210cc544fdb7671d0700d5189e672eab5775601ce76335d390d5eee5eaa9d1be10c4ad9b3d548a2cb6cb3e2eb3f9675b13adf446c5f75f9dbcbaf6a026cabc97ea6856cf6da77fc5b5f8c5c4acdcc5e486084ab1f7ac92caa73690d55db92da579aa1d037e9d69c02c70d4c7f4fabe69800c089bf2c8bb37c6d21090921bbb176d2ba7b6ce9ec0431c465e23031e71ebacc656d2d1980818580ebf8a584da91b4b85953a6494921f82a2a93abafc94b2dc1e25d1306b584dcf02e7ea0bc88e364eb921be13ef9761f278c2eed34af2200fce4e0d4c3b365f2b356a82b77993ab9a041d082f9c32e06adb4148962ccc9f7869a7f47a74f924f49a51f77372525874bede8e0b397a400debfe000dbc4adebde157e3d36282e0baa824c7dda9e0bb88ccec50aa9317643599a9ce1023ba0c894ddf2b45a65f3c5df1bb556a0307b3cf82fa62d9956df394e72fe1a879a83ffca61f034622458e3f01132e2e8524086a92f5c838f9bdef544b9c059f90eaf873938c007152c073b414a02fd45dadd06ca3b575268b344f2bca00461182d12626b34ae4814ed1fc78a9358ec92d8574f20254f83966bbeafc892d058507bfc37e9eeb996b2f7ac8d0da16e9523f7a648babc523aebe32d5fbd4c3da530e245fee730958e72a6adac1e9239a5fc91d1f54c38ce39e7cb1bbe79a0c9497bdad1d1db3924dbc06398b6d1ada9ca548bdac385af33bce93f98f00d8417091a4e36cc7d5fa69baeac27634ed8abc99603d41978bc0f0db50f83232db40d2388cb50660ac4a3e53cbedf062f78aae948d3fc994082f7d1acd8108aea91c715ee59331b9efab8bbb30d6b9141ed7a00242fd84aa8e41bccc1f675de2f21832eb71e6854318d7c115e0ccf583b38546611e6bec7790c4e8a8589de57bc611a50349c23d69790fa90dbd01bdf473b7e2428183c886140ae44424a24e470b1b81ae827bc54735817283d9d655f2862a976252960c6d0c577bba994db90117a9a9962b4e42a2fa94e41d6678eee5a509360ac859c025dbb9811f877f580be076497f969aac3ac7cee32151db06f2e00018e1b6b73233a452eff55afb3c583f84b7ae0ba151e2dabe918137e41289c68c4cb8bcb75cd62fcb0e965b4852c826f7310c755b7d83771a0270ec34d43023b44879b88e545a79c167f37d822ee6e4183b5452808121323f43e90a89b8c10882811c73b14d915809cafb83a1aeaa443eb1050c113c42c4b80b9aa4b7291d68c06e9194b2277a860ecca001e5892356787f52bb28d0d929a2e40b3f0a80ec9d1a352f5d8eefabed96780061e2e2e8a8437217e4fa88eaf5a40b4489c7206b8720e84e69322edd35db8627c349204689ee6e3e06ec937cbfa1e81ec6e0628eb87989c288f99b1c0f893f23198a0aeb569487390eb1032950a6c1ad2e7eeea5b7173555ca40969d9e1c6f63ff31fa901eb71ae0621ec26daeef299dd915354c0f70f4dca619cb48a4d177888d8ac6ac98d03af54ac60ccc444f29fdd84846e2e760d71a11a2c67afc920e03d92e0d5d68fff0fd0eb8d3d4851ac7c01d9f491460558264e6c5be9deb2f65df86b42265798410690d2e24f670b664bb9f31f402d363597909324ffefc16c201cf70b37b3a5f0d20b670cb65476210e048129f23e554a0f32c0c39ddef630b224c32eb41b5cb02bbdc9b64e32a8f11f81fe92858e2a8dac8c324d26a303edb007cf91100a6c9c6fe74840fc8d5ceca9a454338c1b856c8a04f845261e1c715460a79246593681c7a9d5506d02a5dd23a44b84de1065ee850119888a569b8fda996bbecb18f79d042b283a7c1546ff8be515efa4d20624dfa869335918add388040335c8872ee24a19b03525b23b5fa50e199a70efafe743719f882d5f4ddfab80d4ce99b0708f42b282c27e77f844147f12ceb6e2aaeec78f4f5e826ce5ce993c6cd0d5aee3db27cb4a3115d447bbcaa5ff03794c0dd97780ad6713ed6bf98adbae688f9badb5d718672da7941e7193a35221580e336bc53e72853d8d994e14fe1a4041d8ef36717192c9ef4b212bebf74f3c091cb2fb382b6b5a3821ba15f961c431d962205d3cf998b5f6a116ef89f892148c13323fd6cc596ed30cf5f36735c63816d73e01bfbe94755cfaa6874d1192fba252542c00f0ab7e6395fa4c1952a3cbe2f517326ba9285e5df88fe4aab50a0634c0fb9c6de09619ae2249d9d2410cd7f646520bdab2430dd4afdab25b691a4e4ca164a20a4ed536a3283528085a7217b0b55c4ce9ae5ed1cb15cf6d8ec2cba4280550ce2ae84ba6a923d7a5b03135ac51ad81046bd5669c335db141e03a54ba28c7d79a2b92fd96469c9c7d299255c06479647298a9c3242852dad028b6bccd2219036d73adcd0371859a1664b9eb891e668868b9162670b4526caca3be8753ec7bdca86e7147e84257cf729098ec9e7f53b2eb703d277181cc9c8787690acc1f11537ca6b2f00d73018affa36d48afecdd259bb0bc9f59c7bed554c15dbc8a6a0b4501d98fff5cff97a90a50f18c2cd52489c8cc508a3f0fa758e6398ab75377ab08d778c936490604acdd41d7a04832daf70f15459219a818494269b765aeb06c3781b31a5175bb201a8af1fe3882ba49b9138179f5f749e0a1d30ed66b8b1aa711a9975296a1c6c6b3c421824f67a127e675bac82a523a3877c513382715d8c8df60a9d566fe569890b50ffc067eb8549c22b52383a1a2298d2ac146e563f4a08c8fa7b3fff54df449976f9dd384f2bbe49977526c4b7e4028241fe55137c28feb2a2f20f77fe49cc421953b8b383fdc7956166b6ada2622906dac899370a698739d541d471af885d7b3678ff4d898221c1d83344220a35fc3cd00cbc3a05a4caedcb0dc8b8428b1cb4856294617e9f59f0f3ea5bdb653c003501a57446ab0c1543f129542fdf460cf0502b061a570b80e52bde5affc42d606d3f9eec635b38d22c5452ab0fa966a031ac9f0813adb7f11c6e4b495c49b9c11364b194696fd0b4ae1ec7e6594c08112fc8425cf375331303c7c3c4b27f621f46245b723e864fc5f5df585723568d414b70c46dce0d49cf2428a39f869ae982ef00948851d9592a85eada7f62c5337773f8664ffb1815f90a0a2b2c2f94655853364f16fb651e702b72c06a3f74385fdcd8a431b50e2cce69ca70f0868b25a8c52328d3abf619aca22d4c4ca473a5e8e815cc864d288da3546e2e8d05ce8302921ec7a5bf9051951e19e8d907ad086be44e3ad05965abdcd117fe08e1b61f0e16b22f2529aad50d64bf1e240d494670598c33f3cf50b8d272634bf15dd76f315001150aab0f6818fc4d1334100f519a2d57ebb24245ea03a70e7ab0854fb89a5dd62e55fb1236acc71a959ef8d466e190795fac856749ae9166f7656349ec7ad0fada26d79f57b15554ffef47b54d0fd6e0d5be51f310b5d20bf68fb2c105b4d7d61e7aa3a86098150c426e928972a4a503dfd08078cd4d59d88ea2c3523649140a849a4ccdca5120874c6a6a815915dc2f76a3af7d29d86f1f54afe7b6e22d2585a3b6d8eccc9bdefca1e4716bcd6056027d4b676ac8086e0d223c0bc15e1c7bc114982b87ecdb7be79267da5808453f5a0f176d65c69e220526edcac45e3bf62eaa349c8738405054824ab953b2a95fdd1a851946224b32806d7d9ab6e921c840aa69409f0a46316816125b83bf05026a15a3937e21e230eeddbc8383dc683642ced542eb57376c0061db1b8e2b7b05d922508c2658e836f3d0e052f0863a8722b814f692a93eb14de9c4df29575a26b6215994912d584ca3dc2ffe5b29f5af0d5ad120ca65b426f1053b9cd2caefbe48687ea96a5a885c5dc232dc36331251878a116265d389823f4ff8804396eb6c379ed9525e294d50e60d447d302e09ec38efe72131f6ec2157351214f7e6fa5e62f6031b74eea1888a5f6859942265f3c9a20ec87c17350e326677f1d5b6d7452fde81770535bce2f46d30e1a84df4cb9b3f1eb10f5bef81d3b9386ec189e9e60bb1d840adea40ea4acfe01cde82900c5a00ded84b0301e87623d655d64a40dd80ad03cd0ab450ae5618055eacc4901ec20896a73d73684ffbf8b21f4ff94d878e0cdeddbce8b791a1135f9ba3363bf990cc05b085573831de92865d0568bd96c592cdcd2dbbcdde2e4ee0d84456ad98e3a2782b12998db61a2297815b831a87cffc82562ffd646e82241cb3af890ca1b22344073e2fb8ae253ba9fd375b0648d13a2378a15717052f506128e90527f6437acc83edf65eb32d094b5fc9331a9da6ca4f5b68a58a271cf867989beda9cf22c6e3557dec414eb71808949aa5f04674159e0f72e96e7e55c94c43ddf7a6d9d9fc891dea39c627114750a88f9e18934c3f671d3b90449feceb409e7d86b221390ce3dafa43667f5af15a729768ba20a256b13f5f6d8098184532758219290640841edbed019137ad45b3a7e21a7c47a641e1f3c2157f67c471c1c37135295012c8a6db5b6cfd729eee125e436ed38b0ad68ea9af3d945f4d672975271251960c622905c6f2db45a97a9900637172ea43dc310f4a5a23da0c2b8f7684408cb56df0d82bb5db6123727ac267f4d14b5848fd8271e65f1752a8ec8db3618bec87445e792f9ced6332661aa4d50ee92b23b8c68cb8551b1b3edd1d489ee072715bf8d2584f36518897bdb52277cebd547fa83a13c657f01cb508ec04ef9c9e73972b2af54cd74b34eb27e8e756e3e5b6fdeabea6b4095e08a8842f207a219d002a8150170f8cc023497fd2eac4a0c3c3254c7487ab2ae44ced0bccc0085203278783358081de7daa3acea8a424398352581082ef1699c6fdb8095007e04e79020afdb785921932dbe177e2931a86055076986c050ee27d99c8773e6c49e5ca525d5591eccae920906ff11f33ce4b00c1717b53576572af21fb7503e66a3c181a8a7fbf7f782a24fffe011108988e70b24f2e24ae337de2d1480c149ad01e069774ebebd2429ca3605406cb46e14f04ffc23929f9f22070030b450cb968b24598df56f47839851890abd85b89f3c8944f75a7ac723b199fc4e70b8328ca24007bc76c7a873149a41b2da5ae1173f2a8b024469b3326941a83c84d649593ad0050d794d9021741a2e3d7db7166b48708c797a51dace9b0c6f21e5db3a2f9b938747612574ba240ab025b2501abde620842f0be2db6eb237df83a71488fa4d7cbc423151a805be41a5670a79f13c6e3520b6826de5b471d06240c7348746f04eece4eaa852037980fe5ae4b938e780e0471fb2757003ba0832fe1b4f2c05fac648fa3962f41b11d0ef384f7479ec00899b10672bf23910450b2a536629800f839406a421f3321fb85e7426025d00a3001d0e2b651c163a2cfcdc60a59b3aa98e490faf62ff5bec653dd17377eee639119bf60666285492cda2ad2a08138f68e7f5ee463958e01aed53bf2dd00f35f1d10b788f7c7042ac7956837c82f0e59538aff578162b90adc6e35a340d79d8a95d242fd7647c03bfb89ea2cbe3035b3627a334974147fb54c7e121b0011a2b5bf3289a11cab235cb464b1071dd1981749558208227a56ec1e8fbeba18b0938796e8e70771bb800eaacd57bb509011a43e3a7eeb1b1d723922ff8f84e40353b935e8307add147b56985ba147fe92d9e2d1266590443e8fbc745b346d80adba6d0093d2f47cb294dad2d9831af199d572c3821aa731f5d1b8a7739600eed9ed91e2dd0a4f25a250fe718c49bce53a1ded9956f77558c4b3f6c18d14d88a5989d919e32304f1f1aef8ce8a97b95d81cae260c2c02f166dc0f8621d86efd973546f46855415e34ca304a5d4fec5a929f2e8db65ae9cb1ff4c42030714ac8394bfdc1556a5dc83842c0404d78b06132b945a886b25716549dab5646ce5389204f635c499aa6f0f70b7ecd916a145aa5e768d9bdce2fe37e9f3d8ab7f5e1aa95e5fa3cc4b81b6803d9a633054496f7fa5a0202d7b63e55bd7ef1d1038dc36d1bc8b00fddb0890d9425ce8eb16adf6974aee459c3e3937389242a652743538a7578ed4d0f08fa1386d921b4b259e99dc432afcf5e80ffc1c51820c1de220214924e80a3ad8fc6f9ab9aaa421fee85f1547a9e821edd3b355d64efdd86e27d3d07a8c88c90b197d08ffa94cdf59fd71c0c3bca159ea06ef3dc76764e279e701d258307cdfc6241a6bc58c1dbb0f2438d1c02a78970335babdb53cba558843fd3c01943f59fa2830bab65bd5c36e6678840735a7b73c418f5a4b8496adf866f0ccc1617e498761ed562391c56b06bb532d7ccc41ba2ecf81e2ec9e3e55697984edee7438befa6bad12e7b2175b0dc8be03c9446c84bb9e178f08394280296de8d32503639ec35ed5d1b20dfcd5d3368e74cccccffa5599464ddc7681229c220cc7e6fd0024465d5022259cbeba6927426257936db47618a32bd8f0b2122c943bd2bbd6587a57a2610765833cb10c6f48bb6492068ebe4f6016b19f60ff78d0c635e65e9fb276a3c1844f1ddd466aa22b03c5eef31b92a13ab00e97a1fbc9b05a65baa374f0b4c86d59d0f7e33b1d7b10ca30ef0e8ad126e40dfd5b08e18a21848fcdc70b523f1e568decc25cb56e4ad182d3720e03dda7a26d962cfe166dec80c26caffd2da9e4fc93c172616166123732f2a3afeaa74fbd4fae849a4543c44875358480143974367553161b4e4e67816d9e3cf767d043a9aeb2e036f52917ad8a1c39677e6ec90e011a64c7376f163a30a047a178c8a67e0f64d852009a3364876ab6c919da0ee5fdcf7286150ac7cd5e91e83a367bacf94f6c17f8a5b87dcaee99fcd64abd4ce68ae8f93e8e6ae0fc8752dcfd77903cde29f10978a7a6ca12723057a9fdb1b9c5f529ac21a2808be0860f77ae6c341200b69ced134c9b02102c64ea5566e59188fddae9b04d3dbfd12bcffd8e82b89432dc4011509483f9fb056729d1aa950a76b3d2b52b2b499266e1ae4a1867a638ad45fa6027471aa9087315e8175ad7673533a449e0b63d95d88ed9c323c4ec4b775853e3b5c4a1a6542391adf015ccb56994dd56d32a9a73534b479240ff545a7c307513df0eeb06bc0c0c901813c76e13d2078ee7c48f9b3bd77259b49b310cf50d07d36e36f556d4d0db08d32d730ba1a7a8b177ea3aadbc3a4a2ae8f9b0369e6225d389124582db4b7d68cc270a4dedc716052b97502593ecc46584a2e911f12691d752c4ca749b6e8feac0df2a847856d64df26f7c51148e652ee9a9cd9862e38cb063c7d0190e2e784249682a8ff9e3528470a242e430a1bab96a8c3263e36c708eaaf244a34b9d299cb4dc691d42349b768e94da365ec76ecedb607967e406dcef5cccb91e147d92267d617d7d3e88db2edb0c5b04481824b9d5dbec2457af6c902a7af016dfd21c202b9e8a07e16c3ea5f860a4b25842243344e6b9972b37edd418384177c81b13e2beb6ccdb001f1fcff13ab69fedcf1022ceefd35fb4d88988e218e0d69742509780d208b389b5828a8bef827e222bd98de43af72b777951c8bc3b37c1525b930bfcebbf27952beaf16f45b7399b3cfec2f8a225e0939aa930a5edba678ee869f5d41053308207c418e412caea7b69f96ae14549c76b84b591069c7cd863d9ae446ec8ea53b3442fdd2dc1c13d5c947c2b48df08e2a415d0597041d7b30da6f2693595d5d17f2419e75f67330c54df7a767dcef2e74ce5c11940f4c5065755f4a519605a41cc745fc138ee99a5f734089a72bc7cc598030101257f87471880e2113857b4975dfffbe8e4a578fc07ddbf5a8a2c3f291c00d59932b81370c141ddaa7cb660f9f0429d28a9785dfb98929922e93372462ab0fe9b15b307d2b10f5e40730c2749f88a16d7536fc6b2e1cd14e72780295b6d3671984bab76bf3de368d7612c63882e828031144047c5988820b0af2ce96b6ea3815b1ed3d3f581f84c758ae64379168cb4d16e8cd75fcabde5f220369fc8fc71b810e4399b77ee48b94d45acb3668889f402fc19052b7772152f0d2e77e64d9ad7ab40c08fddc3ae66930f973e195d5d4d172f227d57c52cf649f4f9a81b643924f55504e081f26ee1dd1eab788d4c50ac27ad3608922ab417ebad2908611248acf9510cdf51a58144430ca9002bca927cbca2644a5ab6e6a88e8d4f0907cece7a762c84cd8992ed178da5a623b819a9942a380b0fccb1d3ac8274868707c77a8ca20f5764a4ee1c3eea219013464724bcd6c0124fd14b47e30afb2924679c2a6a04782557997aed48677798de9f46c6d6e8e40f2f31d75183296a6753ee2a512ebc576fa02f1ede1d46a8a94d351d0afbd7445afd40d920cd873c49986526c5686a6c915c562f1f6ae3be187f88c08dce135378a74820f8fcd127581c224d4ae7e119138c993fbad07fdccd65bbb1314f047233d9f318c430aeee04ae3fd54a63cdd9afe9a0ebbb641b8f0fbba71b33e4b2e481a2de83214bc248117330ca024b8f75a31ca5e361ac75652d210ff971bfe6d1f4a8c620126b1dea03397aa7eb121249e538daaeb3014398ce0c9c52f7b0eba85efd0b00b73b12a752b6e90fb3229074f7c6988896ac6804e9d3e5ed32e9029a7dd05bd8a4eb307ce3513260a90c537a4043446946332e55312cd9af34e10f60eee891f89988fb90402be66eef532067f034917f3f2bd478ee443d81b3c64f60b933551708669b61c80322433606c50aa4a13ab74f4570bb8640bb9d727c3bebd2ea1265650471873b207ebf91bce53031e2051dd493befacfd843e412d49f29f54ade2c91b96275a84f1edc7b8b9d7f54723058e1787024a210c426c5859305ba3de504c5e8b6e83bdb35570377a48389be9c700e81102177a4ed22427ff757f1ff3733b0c7d4bf1f8c26c96358568b4e23ac936a914a6d807a6b5cb33ef2d37fed824208c03a7bda40b842908664c618e00b9bc6b21d7728b2ac1238b843c46ba6a4633a409e06e48c9347d33326b310e7b00419e305dec90a8e1de20a79dd77a26f40bc2901579bf026dc9fa4bc70be1d46d51fc7e27cc14200998c7e140ddbdad22f3ab41ef91224e4063b7da80e918d5c00c68dc148ea819fc1f47b5872502fe62ef72d9345c6d8b41c97a1a55b5af88d8312a4dc285337e81ceee89b990764adc6bf5f7b6f80171fd0414f6425138eed056b93cee4e894e2e8995ded1d871670bc1e2b1a6b33d7c39a8d308dc3e73faa0092897d884a6a574b3d724b8cf385e47cd4234eb198d44fa3e876e408a16e7a2aa5a67e8c2e1e441084206638b8f71101aee08145b469bc4c7713467251473f3a402836503f3250c97989aeedd1011fde5f39fe471ed90c8c69d61dd325d999a6cdfdb24b60d8a2e251cb20a229ab4a542466de5535a0f1d200ef6ab9655033fcd6f91b739202f1ed1aef7459341b6e59a2401b653116bdff0e5726dd56ee439ae8621f14ce90aea3000629753a1d037365cc6c5cbfcc49d68cf2a3de37348686d0d5289306a061b75a7cc6de5d4273633d0b91136eb0ac32a8e305b7a913294807dd13fc2987080ce5af23d80323c449e81ac6aa02bffe756e030bc261f5ca400db5ae2ac65352264647c3576ce77c67777ae9b1f98bc2244d406725610a151d4b302b0f0f52547494d1c9955492fc69b77e800c413c0865bd0d62ec6793ecc822533bccefab3609a01d70d2b2ca191ffb85abd9211c8778bd39cac31548665c2f8a94951108baec92762e4b39d06a8d3f2dde80ab41f92bd8f2cfc572aafd3a4314c97a69b2e86c84a6ebb8381c7e565e96f79d1c40cecaa4ae2ecf5865e05587024fe6573686a579abd05f3a4694f1b1305bab2ec63226ca135c77bd5cc3845f0175c247f297b58d5812c069681e37342396b661e192277b0facc19446bda3afa069c1c649704fcde211f2b80ece6260ba78ea0158a9b66fbbc5541b3d37c21d7023a803eb8d23a14220205d843ce449c497e8a0bd1e6772e51d879ac43accb2d44d9b9f38e8528602300c1801dae9ef51100f40cbb860f4cb151acfdd3dca90c4bba49d892a772b3be9aa974fb797b20aa923933a0112a5d54b74b006785a2e704791ba533078c82a84ce32a78d03b274ff49f79fc3f2222fd1510bf85899202b3e602728368ee27a6de21c49a834a5945623fe2f1c9ba46667fbb4fe67becef5142033bfc28b5951ed9befe953ad4272ae3f8bfd059466ffecd2da86872b56967bd95b12a5e5d8a7a08da1e037afd181925efdd6d85dba89b159429d5481bf7a0749c5ea9f7c3f0ae58e38810f5f0280288add342a08f86df76d82b6524ca7d9ba18bc76717c3cb89c65ef1381f6fa595899de5f6f604b62da95337ee6d11e3994e7333d9a591df0120741ef89a9168637d2e05f30bca4bffd6902accc07864cf85a3452c777121c8cfadbfe66fc3ffb09d571a42a6c92644ffa3e221443fa405b6747ef23907afb5a1a40398c944ae8f6b05adb6630e35238f74f391a3c1e7cd2cbc3132c85ee55b71f26acebe9dca931b49c05d8c148e85b179a6d12f834077dc6630f7ffffb374cdc5a2b02bcc37a13202d33b9c3efaad5751207123295f19918febf6ae410e5b7608d7daa08da7dacfb54020788618a81b8cd16a71f0824e04a261c4755f76674e7a9bb0063af969894f35f620709d56273ee4cc15fafc5e2597b9813fda726204fee8f4a9c07e4c53282c28b2a910432a960b569de2c58e58942f4e8511bcf800844ee09b2c5f11709a4b706f5d735dcd7d5ccbcd846b515e5b12ea87b3ef16fd180a079b790bf3046b7a4eb47530add59046e5749fc77d9b085e662fdc3474c70ea9587868a89fafd12224b19bfa71df368f180201e6008f153f28236564628a9056937e88750e81c259278f1114c7aaf936322a24e750d270e08549f7ef09f5258cae1aa3b6d0a8b229503e1f159aa107fd752920af504a02537bf64bd243040a7db0d37f1688e86980043d0e10084a670b1e80a5c44dc46ac510a94a321199ff35e8f67fd6a630e8764f101ebafc108e1cee6a85c8c9321ed0008e7c1ac422aa82904b41050f400b2612c99fe5c973f3ddecf0c300026102891eb00c0f35668f24898f895c0855b4f15c83ef76cbc225a048f52807fa3c01a3bde601f04447c58d93ce6dc45b0cacda4ceb414c4e0c816a92b423f1cf34b9c4c17190f40666ec5ab015de097ad73014ebd4fabfd8696e5ea5f53a6de3e970d1ee916b9e4b485da6eecc2688b61d9f98c00e23ffa3131f86459ac4ac472ab40a8c740b3d387b04a490f1dc350a15d9f85ff52558c73031a7519c7a0887b6329ad3e27e827ce5757341d0c52233c6db194bd4e9d24f182daec719af8222ee9b3f8ca32deec9c7f3747d5439f995f2a35831262d0f7ba21b769d6f23965e327a1b9e4bd2aac0ec6f3eee932d8ab798742392de74a9d9d3d0e60c8f1f1380039e65dca0fbb8b7a2a0e1ccdc796dfaed5c7ee15abfa49ea556a71d8084b69a99e4d9392e7c2dc34a9b31c4f510107698c79d6a66ee1e560821b8392da4811dc0f50180544a6051e5245231257105086b639c0de0e2fc1d305db4ca30b7b1a3c802f832be5b93bf139f86a1a1734b3dc80dc778e76b46cb762ec2d3cc491daac1992dd0a3a541f49a6e6975c1189aada0cf6eb3c698278ee8f307adb68c968c9c89652a69f116111ce12ef43f957314755a488612d630ccbc43095def9def53d8ee12f180acc85a65533a402d73c7e9b97823d0b56636313f32158cc876a623ec40afffb51673157e4fcc7b480ab17c1ac5be083a07b8b13be8a8f7917a3e2ab3863ce0753fcf7d88bcc7ff8bfc75060d70b8341731495312786d1cce50a972b5cae702162880fb13e272684754a49cdfceba56e5ee6c459bdf94f867056e7ea99cc9c4d883882bdf94d6c5edfa4e6677e751ec93ccee39c4c6ece26b0375fe66cc2fad73f192202fc32d6043ff9ad5813229ad09c4c8838623d3e99c04e9cf0715643ac676273e284a710a9f2f197effa22f86cc27af2cd679d38ab7f3df9e437a9f9fc3e54937fe68b90fffa99cf9f4710979faf946fd2fc0c784503f910162de847f3ad97723dfe99979232bffc574c47e90c2657bd686253b8cc65c6875e986608142225e57af3a55e3ff3ad58fe32463e4dcc87bc72081e6a3d8ef91019c301730c077cf27d6826965f555f9aa8c27981c572fdf84dcc677d91f1cbb389ebc75f95382f98cffa185c3ffec823ff98b12298e187e78d2c5b118198c72a16f34ca888830df121a9d6cf3c8df9fa22aea771fdcb65b6623e4443f34cf2b766623e24f364ecf533319a568ba6753621e2e8f5e43791f992e66cf27ab245cabc4e9c307f91f22c423e06d198180ea34a348a5b82be3a074379c49a908f3fc79a1071443efe26e5bb4e9cd5bb641ac83c715627ce0bac6f7d91f15dadf1f5f86482fff54cf29befa3817ce8fb5a42cc1fe243e61761418a6ae8d5a4f56413228e5a4f8eef3a71c2cf5f7eebc4098ff0938f9f3c5def84af6fe41ff0af7c09237b223b0163c2542287de250ccdf0c49957b4e89dcf872f3f91b9f8f0654a559425b4146c09e81706fd3e34afecc0c455a8c8c0fc7418c23e2e3ecb27f09def9b088ac10a50ac0313539ddfe3254c7f1cd6a2abc427d849f8e45bcd24e098033e22e0c4908cd1cb40e60aa01355288a9b89810226aed830b39fab1fdddd7b37c1e83a5e1885890b6fb80e83bcec23e3917d278fcff79d3e9e4ffe71d3610ed482061ee0a58824582004460ce97f0762218a082d188288056881c1900946cf3f5f5cb8a6d58b9f3faf3effa83defc5d7af4f1cc61807fe27be380113bf6bcf2b4b97479eb8d07fcc31fc182d8bc4c727ae6995c520e2b34e9c186b5a7d16df0bbd6ff25e7b2fc69a405c82a4e372f57ece783a3f21f18a89d175b46059e12a54701414ba2f5f5b42e79347501ebf954cef60cfb2f2053ce4da61ef9ffebe951733f54efece50efe40c98b8902abf6c307a9efec9545151a8e7a828d423c1e855a19e03e13c2ff47fa231b6414f99e194142a0618bd0cf4515151360c651424e1c36a85020b50991000130305548660a1e00052ab8f5cadbe5fc572242aae4c8f159aa614116078e24896f838d683278bf59975ae3e9d3def7324ea116085c3a131e331e03bae4473700fb6e1bdbfe73478e01e301c1f866990accfc134cc9cc73d21a63113c25864ce8a199cf1c50c8bc70a68fe5ca2b8efe1b2fc399886ce8afc2c64e4a0b8e731e355c04043bea36f788f9ec17f64b031c477f2e902cde55e581f04466ff27067f4fca361333939e797814b98b847b557a1d84b14374c85a3cb853d9763ec1863ad31ce18bbbbbbbb6b9c93183d4a068a258e00067520730aaaff7b2c5650471d1d5dab9c59afa363acc7b1ef5731d2cc32770f27e2cc26fd9e0bb59ecff4eb13f77dfa89bc2fa64d47bd986716d65e3c347d8ca044263510d86251417b503f8111aca0e347aec81fffd3fa881a5e26c3300c4928c2845e8e82a7f0149eaa2247324fe5293247d161502f571de52a1e5327860b1c00f5c423f28ea7cf299d2bde1f410b2a43bd4b01c2a0d86be19ea023403f1bccfc6559a45133e66d983a4a4b8d38086f60e27495d632ed692850cf9bf266f0148ee25151edc0e3f87de1939fa6a1093526c7b0fc313e3992a4a6a1213599473c85c519172adfc33ca0de6b1198c0f5085c53611a41af61807ade3b0e59c65c8c963f13c3214732d67e513029e542e47baf6fd051da8a6e804680d681245733343fd290a40d0df9355ff3e4d310b160923fbec8d76bc405a10ef3f0458d519c8703d47badf5941e810e7d44960599fab5d6515aea045da88ea0f23ccff3bca8a8a8a8a8a8a828292a923552915963d158bc29b028f993ca8ff3964066253213a10fccfcc37a8f15c36902acb4d41886a6090ba9f216d4fb31bc814925f3a8a0d09e17056dfd4a1fe142aebd0fa9aa7494f753421f4c2bb02150efa37216d4fba82768aed26168568d39a0de6b2a77c7e1290a88a2f8ac1f41d28609964529a06496c59065de1ff199e7f383f522c912c53126463c9d4a1c4725a0e228eaf287c812595f4c0ceb13412a4da58f08dfd32740bdf744608211f80f0bd338f262032e30403d2f09d4c3199ffcf1c3988b71c65fbdf8e3186b3faf72023de242e37b8fc463c83fa2b6812fc1bd08ee3f40bd1ca0de8f62cca3f28ef099e791c0773c276c4083255c807a2940df5da82d3f890e8d795ccbeb42957f4699711c4b22f3c992c88cb1608e3ffe6a3cc111b8883f525df124d34f7084295407f51318c109743c6189b22c7f24c9b1dc31be4b46a655f61875501999711cc972c7388ee628f32265463266f5e48b6590f1571f9645ab1fc75f8d38f709fa7e1217ba7ad6171bc590f5e4f8e38f63ec857ae32a2692411ae828bfa7040ce805a8f7a197c71b32068f4c90e97a79263151eb4719f2f5d055b983fc9a19d28649d37aaff5342f92cf2a7bb47450f15b5d5a4fb65aad7f827eebc4c5943bc86ffd48c6c41fb15743b662e293319c47d57e3aa8f8ad980e3ada9034deb73c2af1f4a8b2cc33c2145f1f3173e2c62062d1f8a2389667128c924a304a9eb826997ff538c66262fe461e63ae2783c6f744117743c5138704151f97bf1a3a7e78aa285b3f8e27905eeac83aa828ded04dabd54a8c91274e072752a1e2dfd062cc51999816582306aff49efc1e9a7f0555def19e4ae6f332d89bb020d471351c3de10432ec81f7d8f38a704406d25419f5a6a0deca5b79388f095f9ea0726209d4f35e09aa2ea8e78541bdf73455d88489519c47e551b990f8dec7caf0c71105728cb162389d26f1718a4c547c131d713ae84afc23e8777ada09fa5139c14fb42eaac1e83a26132509f43934e6886d3c8fc683187fcc181d6332efe51f9a7710060b614ff3e348be624930ea3e4141d69b19fc1432ff72c5bc626c6c98258d88f37843be6238d4e30d09d3335f43936d4a221958b9436684e110d83c2c86b9d8b87095161d85a9602de41885a944455111a9bc0e4c10aec60ccd39aa205f31bc2a9f26e6a13259c4298b6c3effa8827c98ec412a54a8784041e610b02ca35812916ff35eeeb0f93c33938286267cd17c12174a73becccf9441c00f65ca20b0a7799db83c73e2f4a8799bb7817dcdd924beeb65621ee685194cb9032cc50d7c8fb5b810f8dfa748e160cebc82d428c832df1c539c80b568f1f2103967d992f311e80794bba041e4484583230ea3775c5ab464d987b764d9f738eac6f7552d11f6c08c8ad2e867fe877aef65a0d67beffe24e9a1af18265d1a7db95e973b44b28c394a13cbe87f2e93608cba503353c93e7cc15ac8c75e7434272edc51f33434311b1b255e8a677df8fa242ef475feccd79441c04f712ac128ecc4d1bcf8346510997f9d389a37ff86c6e9f1fa9aaf91f9d7d9247e281373fd4c0ce72740bf98978909c9b2cf9523ffb8fefb1bf9c7fcf2e1421432761085af65ba4a72f4f0d4e3ea7b41e5fb11a581e950b46fb8fa0282e1f879d5d25ff217fd7da1417179157397abd57a8537307bf0f9c081beeffb3e1301fd7416f4cb00fa85df7be1976510b04893e0aa4a46bb6ee98c7aab95fe0f4c55fe929fe081e9bdc652b4a0dffbf8ab18f8ab300457de4892632e5927ce2b63d87b6663398ee593ac566b2cc99105964188e217f4fbc07c42403fef4bfe094fd74fe41f30df7babd5976f25a57501cf3b41cf7bdc87fa631ad88be7e1255e300d1ddce3c14c73955db6027556b813a66ca25c2b1d54c77f56ff7d9f57b1d567efcb6070181dd4f3703a3a309abd0f7160eaff1e7bf13ccffbc03061741d2464d005cd411d091960f9622a663e560e2be7f5fa72fe7bd60dcdfafffe061fbda33ff431f58e7e5df59d3826284e08fadd10e2e56666a646cbb0ceef1d8d712f32e70d376ff337a7c6c17998dec1f9153faa882501ffcdc79ff398f52a6249beeffb58e71713c335a142635c3fc6c4fe57c470188a7f570c07feff18c379e89f319ca210cdf91c882ad137a211cc9cc751a0e28963bdf85afc5c16e5b0ca20a67ec8e674e25e72468f0cf34f9357961904fffb1a164b6703240394e257fc7b06a2f9999bc7c9a1f913679e60ae38557c0a15270e16f3dfcb380c85c1704e9c7963e69cf96b62dfdb7c678c58b6724e0eeb7369f3ad1227e7e4b062b87c26593deb3f9c33089b9300367f43cde67d087fd13b36b11b70d40d588acde3b0149bd80d3a9bc7b94d0c57e5c07c3daec255f48ec658f44e8ab7799bbf7999f7a11b6a9ee6e67de806d8d7fccd7983cdeb87d99c66cdf830bda34334e665624fb0e084e098a03adc0df43bcb77546c9db8f2fc5ec4c1501caeca9e939509ca7460f409922103c7c4d43b788906927287e18fc30fb9bbc03dd17f839025bcf7b28789ea13a743f53f931b3cf0bfcf04b019ba213c43bd839f8907fad00d381d8af3d7ff9d3f4c54a3fabdd30913ef6fa8b97712a1dff50e8e6930d963c2e843bc07ab0cf18e4841c35f79eeeeee5feba1e619430463fae0972d115b01aa43fdb819a826ddf49f18d1eaf33c0d7a6019c4fbf0571897445ec6abf72c0b7ff5e1e7e56f7a31ea9d79558317f4bbc1b05ca367bc982f5c99602b24c591451b5b90ab32b7785c3333e615c69832ad199266ac116d68b01552b4b8e1c121bdfcb3ca2a482fff9ca09ff6252a8a67e771e64c901ff17d2dde7fa4c5c0155a6056f8fca30e88350aa4977f6634b9426c67e765cff3a30a2511cfc982b9c3b3b3f3a347ae10db791e999ecd66b3999fcd66b359cccf66b3d92cfcd96c369bbd9ecd66b3d9ebd92cc70cc76c6846fe6c86ce6ecc5a988d3f9bd998b130ab31fb3c9bd19809cd66cc683f9b05cd80663fb3157e3683318b3193319bf9cc5ccc5ecc5afc8ce7673a3315663db3d939fbd98ad96c36cb99ddcc60b3d9ac66a6339b7d0a25d12c078e21f4460b3658a84143684610d08f8c18305eb8f0e95141e7fc153937b01a3c53a58a1599187426e644e17c99666bc5092b5c2419cb68ab35dee0dc94e248d26a6c6ac61556886594c66a11231323f2f0c432da2204c9925c812b4f8bac1773510aa847b608a2a4c542bd5396524a29e5145c29258c2aa5444945d162f979765a605a4b40bfcf5154d0ef67b11f5994441aa32df20a1f366106c17af15baf45cc43bd2a1968c482c5bb82c5c382454bfeb909a5bc28de14d8ebd74b64a031ac32bfa035cf0ab798331988155231ab5045c94f64a04cf4b81c26078efc25672e1928e3f212e80dfdf9886c25b7f0b83c046ae371390b0b8fcb5b50dd02d2351e97a7680891afabcc087a1c7e02d56146201d43eb2aecc30b18384bfea1bd6ef1b29ec7e1281ffdba0ce4a9f0387742e77c9c2be155c9651e4eb542e7684da2fa6519c8a3d23af987e77595de615112e95c4503b142a213179a394e9c89e3c4c150311c3a71a1899e38f3c689838951511a28aca281c228bdf37dd8c2890b4d1b27ce6421ac71e24293c6893385a2c219272e34834e5d250a074335950602a974950602a334d08a4aef7cff73e26032a86250c1609c3898f9e2c4992e429f1317f69c38537656d140ab282a5df53d4c85130733754e9c799e55607fe260e68a1367e650853b272e344d3c6219b18c5854b8a95225ffc8fefbd14afed9f96fac82ca5280a9c042858cde448d5163d418857eaf53a393824e5555d5f728cc9c28ccc4325a4345c5a26251a1df9f311ffbbf9159511a88c562b1582c168bc562c5c21527acc8684c2ca32295061245511445511445f1cd1c15397f238b511a4814455114455114c5d60dcecd9bb18c86541a280cc3300cc3300cc315242c4594060ac3300cc3300cc350c55863538392b18c82541a0804411004411004c11cda0c0d18a581c0108c02ab80516015b0caf7382d6264629e16cbe88a4a03adaaaaa8aaa8aaa8aaaaaaaad0ef6f56e6cb5c55d13bdf87a159256a55e5fb14b9e5ca555455545554555555dfc3786201d869b7b6e9eb7a4cdcb7bbe3b8e9ede04ea3b97b76d38ba1567b25f677dedd2f5492ec7fdf547755df55ff559f06549bb62993edd37fd9f55df55fa8a4959b5e91bb876e7aa8bbabe0a687d35a99adecee2d37cb30a617a455e3eea39b9ee94868349a91677a97d69d7b25f6b74dcdb9dfb24ab775ff5e5ad3d6dd4f37f594bb9b6eea25ee336604cd009af13343c68c183360cc7831c3c50c9f193382828280827e826404c5088211f422c845904fd00ca0202020a01f20194031806000bd007201e40334e327e807e8e7e747c64f8c1f183f2f7e5cfcf8fccc9011240348c68f0c193262c88021e3850c17327c64cc8811140328c64f0c193162c48011e3450c17317c62cc8011040308c60f0c193062c08001e3050c17307c60cc7811f402e8c5cf0b192f62bc80f1e2c50b172f7c5ecc7011e402c8c58f0b192e62b880e1e2850b172e7c5cccf009f201f2f9f191e113c30786cf0b1f173e3e3eefaaef2ee9df5537d3fb42ee6dddb149afc4febb63ddbd284771f77733e7fc55733af76b6f5a037d68dccc31dc73e9d723c64d0c85b3d06e77553f1c1b37b116779f71135b5977ee6bfc4efa5b6ec732b9bff3ae2afb25fbb6aabf95b04ebb45d2a54fae6d2b29ddbd3038c60b081b28b97b8d9b5888bb2dedc63af5bc4e4abb656d3d2f8294926c2f6e3292806c2f5e00a5b717306200fd2825fdf8c0f0f1f99121e3858fd24d298da104d4637bdd5ddbe3b6b4d749c93391bbc3dcf42beecec3dd5bb66df7afe9dff6daeededdfecaaa6ffaaedb69e7744eeabf6adabebfb4aaef9b3ab5acd2a7eebec3dd75b83b91e7ee39dc5dc61d1f71f71e6e3a95dbd26c5b09d253daf6d85ab7c7c6e672690f549bb6496acedd3ff72c73f71c37dd242da0c3e8545151a86b12031918430fdf4d32961f0fe55f9d51f9b1474a8dcff2a19cc7f1f3f82486430b43fa5931a9293ca41f871686bc1f41123f19f3a1302615fed40fb17e1593121f871f623d16cf28fde28ba7541327fa5967947ed6b34ea9a91f22c3334aebf205fd3946922fb27e0a0f89ef8d31a9f1c9c7b126e2e3f06c42c491f8f89bb03ec77c488c398bc401bf05b4497f1050f95d06fdf971ac8913fdab33ca87a6f090f8616c0a0f85cf8a49e1d0c290f8537888f53836bee03df932e81f7f15930a8d7c883c9b7c13f17313562c041f0f45818267531050f98380f27066feafc479c1fbfc47faf1af8478ff3dc1ab094c795253de89439eca4ddf7bf83bfdd44f347661f41f9ff06076f41f9ffc8ca106623d13a9a91ffa8e56ff3d13264ef2eb7782df7b27e287ef4c70f8a1ef64e2443cbf5f9d4e561f9e533fa41f3c9dacf07fa7005cfe4e5678f50ff5cef722124ceff5f7a106c221263545449216d0261cbc13e34044921650fd980ad5315c117a3d471d47a2eee1738922b80cb104ea8f87e0828a436841c5c73d31b5a0f80aaadfa382ea2f620a152b00050aba0b294982a340f1b34a22ff1163d738b67aef8151fc8e4f501cfef09578ef3ec3e11f18f4f20766b17eacde3f8c7d6f66992e4a01753cc6928068980444c92cc3efda4f0f2c735ec574501d131f5c791e1aa424710ce7fdf01effa835f6562b1c031d3b8ac3cffad7c3fe5ef903bb169fc512c11ff8f58721589402aa9da0f8c992e82c7fe0d7efcfdac0f8030aba28000b2805cd98045fc7c0f7d0d2bf706607285caed88b8c81812149646659161f070b47991763384f6479b067c570309d2ccb9f6559fc02cb3fa2f741a498faa11454be78630e4ece594ac9b21167cc41d0e4bf89e52bb13c449665d192f396bc73c4972b5f9ec83facfff14a291e6b14c51a9b1fc7d5170d94e2b309bbf132de9c38121d61276e061dbf78cf8a955170cfa8c7f73248b903ee19cf95d46a2acbf24aac8189cb41a0f9715a2be12d917f7046ed25ff786579437b0ec28532952cf3c1b394ec89e4aa84dda410df7b16cedf3cce6389effd28e234792ccffb17f53c6f8c8d230eeb0b4b64892c51fcf238e7cdcdcd0dab147b60e2bc2fe2e7be84e1188a3fb25a22d61389a2c86279968da39802c682a5c8b0f7fc333e2cc68a652aa8c7ca5150ef0c0326cbf2972f9fabf52a9f8cb1897dc95cc81833e63a4bf20c41cfd10c7aff6674d4deb33428fea89f75a25ee6bc03d60f6aed69500aea28d8681c11bc50efd2c395ef5d07b7a242b3a8bd982e5bb92472fde8229f0582e3c822c998e7b962ad57ec24470f2449f2c5d8f824387a6259a5caf5b9240a22e6c72f0266f662523f2719c59399c761a91c2595a7f48e94fc3344fe49f1f93d2cf987959f9051b426bf9af73c9ccf2c4d0527e67987443d3d8e5a7bfafcb49cdf96d89725cbf27b57441c98389ce783c63d41a9e41f2761248951989744b0286ec23045cea7c8791b9b27392952fc4d0c474ea129fe8686a550801414bb00f52e3d6c8089047459911f8b044bd6cd631c98bb8cde9c6f469b5e549f38fd391891f79ed69e877b827a1a04bd1bef8ae78d9e377ade8fe5570113f7a2b8f1bd2b318fcb20191d7f8ce996c87ba23166cec0b2ccbdd38b5628386a10e724b30c3c59a0a9c71b5947e9188e44758ab77958ac2482fd9822c6faf1c6ebe1dd783fbef7e3198239124d719250708fcdebd80d0d8b79cc7b3812cd32b198d7899b41fdf42c3bcb918ce1b0e88918d42cf0b57ef047114741f1161d633d28fe787ae287620c47c932f13514cff372e4a74f6f069cf9f287902cf3f7fe8b69f26845859f985f0a178c4e96311ccce5c21f4419c30e00f3fdf7fa716491e697e497a7906f8ae0939e97af8c7a5f925f69966579829ef7e5973f5c8f634bcccf7cf3c3fce3e5e73a4bb10c32a25ff961b963fccf71597e96629644e517f39208068369201e3533effad77f5fbaca3ce52bff46feaf55960fb2b00b37c37a2f03b158e70bb31e978379d903bfcb47e6c3c7b18cc3c33bcbb27cfc9ebf9334cb1d9f07b3c9d988b155b9e3fba697f8df2f29bf2c6d4ef0fc4432a624324f16cc4c858e38f6b1621875b95c2c8f3cf1fb68205878cae428b82714bf153371ccc79c3557f9afcfc17abc5c4fe2901fbef9b5fc2cf371b9e3f54d2ed6eb3dd7bb1e87a75c67eb75e2dc27790793c42e97ebb10be71d300d2f24cd0ca41f8f4dae1f1f8f6318c3b9e091af67bdf9b9ecc17ab388f5e6b3cc13577eb8c334ff2b325fe69f6196e1f1c9bf915b39183a867f43b3f20e980696828e9874cff34e8b86032c1629be47622898c62796a22792ef7938120a0b4a942290257e987fcc27df2ba194e589a194fffd489ae78c2b06e381e97d6b044ba2b2c4e283630ce789b1700505f7e45f612860c65bd051e328a8e68189a3ac1c90c327e2671c59b2c65cf2f01dacf7bcc7de7bcf5a826ad6b983359ee2114c9c1e2cd69943f583a50e1d667f12e2cc458a6be57a72ca454a719151f094e932c9ef71ab6c6157ab9549120a09858422a5853d1d5421a7c828e414298524abe029f2c495192c431047e64c82ae074bb0fc562943966726a1c04c4faf78a8424e9151c82855c81771b98a1429677e7d787aa12b045d6589a7c83347a2de83788a243f120a09a58a2b7f20901213434e915262c8286414120a0925e6c9a918524a0c19054f993178ca24f1eb75e27231aff79747925048282414128a03a8a2489982e253071ec9c239c012923b304dadb189258b962d54477021a7482856aa5ca962e58a0e5ee6c40c2c47e765241452ca95fc9303d39c81e5e8bccc09337cacdf9c81e5e8bc8c844246792c58b298333a241472cac41205c5652c2616128b06c2554212ca283e8b3585853471157d926415120ad578032a680bd4bb4079021d5daec3b261aebecffc328a29b246f245d33c6f68717c9134cb17c5720457df97b9d466f9add6597a2e9736c5275daedcca64acdc6185e22a3944b1d225ca941c9ec88109f405ea5d72b802fee87dce9e6321c65e7e4fbbfe37fff0c27771258a64967928be188e2fe6275f6fe61d4df97cd6df901accf9c4c59020f8600b2c41107c922c9f045d0fe69f89cda03906fc98a78991686efd4c4c26e6c4bdce1c0c65bd79ba5ab924c1f17c4194956166e9adaabc55e8380f7d33da84fff470e6a6e585e58b51daf3f2e9fafc7a2fe6c19789cda060e8853f43a2a019130b49f33cc32c73564c0c63b64e1cb87a5679e660a837368dd87b11ebef6cc20ffeea7159841f3c3ded1a8b2bafa28c20d922bf45e2ca29e18ff05932a7b823973b601ab82768b903ee69b9ca2898067e99d693ef6510574665c813f7e6520ada02a3a06608cae013875f2ff2cdd6e31ef57230f4133fe6fd657e8c0cf9aeff30e6c485e4b7de643df8ae58b9c3e3e40fcff3c455be23f4632a18e3d385f00fb189900c491626415d653689ffa138cce506260ea65f6b130603c91566029327ee09f85eb2ce320aee11c5b3dc01f77c58b2162cf9c7fb4fcb2836f161ed3e780a8a5b69c93f5526467130d10666f818c5c15058ceebf0c87cca1d700fab9492a13021e3927fbc0b142550fdb80b4c7f4eb903ee5995514458e6420587b998facb1d5e703c712f8886cf3a71390afa612c39181a9ee10eb84757915132c65d7000733a60c48128832e3874c93257c75509385001f201e102c003b870985ae11ce8bf11c3a0380a254d23462a9203a6fe0fbdb9617691d282e274d00ceb228505e342180ea9c08c1875cf61630cd3bd118609cb199f2fcc7c637461bab75aad7ccc8f470f4d074667af91c7746f5ca185b8c5dcb161bacc9422c2b38cec02e640dfca1f24b3e738d3985244681cfb5013eb9004d10fcd0a1867ce20f43bd6a78c89798c6207cc18137c2922be212f718b69aa187560d48533b64af74efc7d9fafbc5c7a6126bd0fc5f9060e24059e447cdee7794f865fc62578ef7f26ef64d10366987fc820f03320bb87b3638c3fd330ea0f1d31f98dda439f605c64ccb011fb57e9212d43b387e68739e923c8e50d335335c04bf61846cdfc832345803601091380001074f00312c20cf9f822b3cc0bb34cbbbfc82cc327550346807a270cd55a07dc82975700ae3e4f6727d39180a28a024b0801764cea5896b3853a1248b0f2011496c443dd67443ecb8fa340dd91302523c1061416833a12503460fc52e59d9035108ee198e01ed55f8c091147df777e2f0ac14ce255689681c3bf6282be19c52a505c88c37000f5f743f1e9a1074c537fce12f0071f8c055182ef3af289c3e5f89e6d942713225acf8488d5973f823f7a2c97eb75eb5d6753fed6af7ae86f9db8273774193e2bd6c37bf1c43d413d5f3d4814ea1e3dbcd7ef9dfa64692d032b4798823a12479012dfc3206104275047c208d899847ac7cfa6fc4c9e0c859e65f96c8b48f9e3f0434e3ccbc0bd59e68a429741c4d36c9a41731904873e1cf57c388a13b32ec10ac31a09bfe20054c9742a20a43ed4a98058c00a752a20a6c496d00326b2638c440fbaa0a823d18323d01075247ab0253361f422ef710e03dc430ea0c8385842135442fdd8c3ab95268243217a383c4b1f78b5d281d1ef47d779863ec3eec53409468cb597330fc75cc69c04a800ec1e06678ca9ac3821ba90a359c8065c50989f34c8a3a3eeb9c08a0c122df022e3850a092f546ca3a3eeefbdceefef2fb89008e208991d62fc904506891eb87c332412a004123c64d10750028902844162872132120398d23878f168a6908b07512a90420b91889afa3011422564d160c2e82a1f59a6471b668e2cfb40323f2e08cd81897bf4333f68b53a8b98e5e36fd27af32c82df7cf36c523e3e5db7be7c1c1063f099d01c998fcd7f32e4fda84248bee232fffb1c8330e6dd8196e415e8281f623deca5e2c4e12a9425237e5cfce4e2508421780a196fe0421ffae518a05f6e02fd320fd02faf404647a5f81b794c11c35a5a588b962859f6c57cf8e0672e324f854be60245e6528a33e6d93aaf9cab73cc5c866432170de4435ed025aa86bc5c3d1529e8f73d9517b2943c95750ac01f4fd890f8615db6ab57f15e26717112f057e7c36c5e8c39bac243350f7b2914fe9c41e15f31d8cbc4ce5fe108619d38a2a3362fc09ef547b067d59c4d88388a3deb9bfcd73cec847d9313dee6c5f3e87c9dd73999a07036893debcfb309cec3f0c92476e2c43c8ef8acc74cfec489116b6a706a704e1cf1618f1f7f93134eb0b181bd0d3e71c4a7791f223f7f79e288274ef945304df9adf2717932813deb99d87c4d322135104284901c840840480d245e0013044b100304a9012408269008001902a435a4077777a3248c3260146534c48885214b1892c41021623260d40377f72112707747dd343a421121ee9eba4924084442e0ee34dc248203111c3f98a04853912d45326016b121c6b552a405eeee30341d35e1880230c0308b541171018311188e00c395a3db910c303089a127861c62b8c1dd3d865b0c0688c1033120e128280613bc7c208298360a196c32a800801800309f90210631088811396500c2c812468c304284112a4650b800922824484886c89004929c234c1c91e2e305476a1881428713242d9821688619213e2d7041228319909833c49054c3dd55b8c9a32ac94cb7a40a4879a44329ac9644cd04ee3ee466ed861f5200c003779fc1cd1a0b7767c14da41eb8fb0b6e2229002907d24e0d923667306286a698304445744b342cbdb0c492014709074a055082b1650080116c28fbb68718219243037bdc726b72a399361bf8b8692bc2b421b1cdb8fb0d37939430939ea80f707722375524aa10a52408b9090002a8d9649a00530f4c36967ab044832529150977f7181e16e0ee416ee6849a80f0ca01096278a2690666530e4d404d2a5e5029705f627828a2dec039c0c419e15e986a0c8c783244f11a818c180fa8311ee001f5d2c28c8d25cc9836a6d88881c3421716b2ccf8b0506326468d29356e3336688499094263c6891922424c847cd8663031b3c4dd7d46941947a2ccc899e1cd2820486a0241e48c0694d8327384092405949b8901100fd0cc8c107ea6fc30a1f1642c4186133431328ed0e0b819e388213e460c924676829b30665e2cc1a4f171e144171ad4858e0b926687cf119f9923fce0ee9eb644488e20f1a4ed3672e4694aec2f499dda7d5bd5d469b7b795b56d77e6aa9f44e3ddee663a6a37d3d1ba95a84b50497fdb3baefbaa7f5b53d91ae4911cb1fdabfe7677a96d27fdedddf4496d756fcbeafe96637f7dda9b7dffb66fb7146a33bd6ecb2aeda45c4e7dfa577d1ea85c52fab240fed34f5525bb4d95f643e55676dd4af6bb2ad3d10b111d0501f2ae3bd6297d1e23479eb6b4aabbaf6ddb9ae6d2a1da33bd2dfbf46ed3ba63b2b149b55a6ab3a5bfa28fe4c8f31839f2b4b4697df469b7edaa4f7b7d16c8d3587c71771c6eca66dc7bc82a60ca6070f71506990c88ec2cc0dcd121c3cd9dd70e0edca8850f77dfe1668bcffdb66f6d6a73d51c6fcbeaf6905b2e488b0d982d74eeeeee2db8d92209f71510e0ee2edc5ce1e6ee45dc5ca1057a4c09d615a8dc5d48da1255b1e042d5826bb9c2c287292ca2b0c8bd8e64b8b138ca113384182c64260b98c9c264114ec00716fe45052fa29b2a1c510408939bbe462f0b64e8b65b351502754b779b435f9d13d1927db3a939dd2ec7ca0ebdeb566daa92d2ce5d8bdcddb23f58204deb8e0947938dcdad445820fbb6ee740c618fd296686555a52040f62e89ba12b9ade86dbf2d6bf4b240985eddcec1c35d539dd1d2aa32b969ce682dda6ffa1addd221f7960eb59be90d92cba94c385e765d531c6ecb02815ad31f2c7ba4c500b7add3a94d6e9b6e9d2e455f686955d73685c1dd616ea270654d73ba9b8e9575d3dd3e6dd3a0e6d25555d2b16facd3b7fb5d896edb75b78d6d75bfee9df46ecaf4db7ddaebbbea3bed9c786e5bf69fb67bbf69ebee37bda9b735b5312dedd875ff5692329d434e21e6199e534ba715f344c23c9fa0b989c20a5adaee7fdd5655facdf4c66a28f8f8dbba632dd27623bddbfd9d24b4777b97e4af68156250d0a7eb13348ebbebdcac01c2dd5f24edd6a64fbb657a77e9b7ea667a7f2b515bddbefd6d4d93d4dfb6dd8d6d75ffba3ba74742baedd7ddb5efba4372da39a9abea94dbb9bb85b2ad7ba9dd4e1be9dd2eedb65b7597c496b6acd2d2aa3e4f6a5bdd25d575d37f27b655da34a8eedfd6f4ff66aec8b242ca6dafaad30e6ab863166024dc7de73131e0154c5881c48a0fb8e9a700680ae2ee31b42d512e555f7555d3dfef4ee7c4dabe657fb3afce69bf6ffaed5e5527f736dbadee5b56e9a15e35a7e638a1425431f3b4d74f57d589b67349aa9b6ea555fda555d5a94f2ff4ee74ef8efd5bba5ba6f7ddedbbeaef55cdddd27d7b9e5bfb2fbb7e938dcd7dbb9b5af609c84d9c234ec8e1b1c2cd9ca61d37730870db2dfbbabb3555d050f1c454e165869b27c8d0926ecfbe6afbe4ee2ddc3cc147938dcdf5cc663d50afdaa6ba174adff496bedbe979fedf257b7d9e77dd6dbbb3bd7ba94d8fdc6ff7cb16a1b94b6ad2cb32b9ba7435a2c9daf4357acd14595e0f88a568e206df0871771d376f786e8eb8c972f383fbb3efefdded6f7b5d52dd75f78f811e1c00e69110ad6aca6453520a92828c8941090d2ad7a69b76dbefbaddddeade7d7a25f6db9de4b45bff69db559f66bb656deef334a5fbc94d9ffe6feb8e6d7f6965dba76f59a55d8e7d18700479dabbaaacee5d95e9fd37fd5c2eb5d570bfed273697435f16482e97e27077166ec26c9eb644b95c8ae3c9160406c59bd28d829bb022fc5d772c8e76afab0ac3d2cab630c058e0beb2aaebaa4e493b23a85c9b12ed56480c984e8ecb4d1809f36cbe54d91c61b3c5ddddb4a9e23e9bcdb69b32e990d437b773426af74d55c2b63aa49ddb484beb0f1f241f24a0224242ee76d39ddb439e7dffffb6df9dd339b1385e8b011c00e69118715b5a1290122121b75d529d8484de9dcba53a212177ff719386093c6ed6c0a05982bba7edbb6423dd5636e9b66f2b9bb4ee909ed2f6c6f4aa4f7bbfe9aa3ab1ebde50a90ee9dd6efbaeac0de9ddeebb5d37ddad6d55df75c7da905af64d91762eb5b96eda6e247675772e296df79adb295955a477bbbb297ddd75e742a54fb914296d37d2d35e91b6ad659598dc34e722dd76db6ea57d43ca6ddb9adadc76eb6e2b9bb45ba657b76f48502dfbba2a13d2bb5d26377d5d245dbadb269bda84b4b4aa4de9eb22ed37bde976ed667a59a45c4e65b24511451451b8bbe309b8fb11376562bcb6ddb6ac6db7e9bb2fd392ba9f7e3ba9efba6b5f49fddb7e6d5bb764bfabfe6fa6a3a751436a59a4da33bdead3df3693abaeaad20fb92dcd7d552735e7b45f17ca718eb76599dc67d997c94d995e68bbed56b2dbbfa9b954c95ae4b634263765eae979f1f30248866d468f8b17a90f100c5b8c1b0c1831827c36d06cbf69fbba493bb7c77d776c936d33d97a5e75a9875d6a535b4f2eb5b1b99ed6ddf530b9299390d0dbb23addce45da4e69ab64c634c133111892e04ebbedf7559d9c585b119a6c69d2df762ec7b6bf937e4d6dffa64caf2d75d7b47d7fdd3af65920ee3e736fe22f09f8d0deedaaaf9a4bd776bf4bf6e756b65595ac44fbc6da760e25966d85bceb769350229d53cb63c9bead45aebbdba5b548e7d4f2d834a8467bb7772f30d9de54e7aa39a0d2dc1e724b370f5b921f499c722ca94a2b8be3657346aefae365d921ee5e84486eaf6bca8443e7d4f2f84104649870410b0fe0410e4e702506358cd0ac9e841960bd3290040fdf011af24a0423726ec08196145c37f850404c4af902010dc8926536045802602a708110399cb0e0080a0b3558b9fb91d10b48eb929a4b91360daafbee58a8d487bb0b59d5d7ddb767b2bda9d3666fbf23dbdbd6ee587705374d00983956b88731610ad3c43af0192edec6b7edced602098b87259335f926ee1ec4dd81b8fb0f168fbbfb70c1dd3df71cac00fcf37c00de6d692d93cd693bf5b80c47dc96e6b6fb965377493daf93923b0c8fb9fb0b178ffbffff7673a9d2deb5eff3b0602104858ca893841612fcdff46fbbc9a6aea9eeddfd68d9b6257a62db961d7aa15aed85583cb5da0bbd4a3bf7cfaaedbc4c4b6afbff2aed9cacf642b79d535325377577ed662b08d2cd16035a0470f7146eb674ee2cb0e0aa5ffba5555d37d3d3ef3c0b355ec6428d5fd5a59de4b6b4f44d6f48ee30b8f7707707135573d00974cf41ff5e187417fe6a700b872f3c20d753bc15600ec3cfd3187b76fc82d7027690c6e7d931c63af3c018c41963bda221e38cc15c3304e315063de392a6f36a25633df672f6a4600fe3ccc245c858f40f7b596f8c7119e31c12c93819e79597b10f32c6ab8c5fc03618eb1c8ee0d3600bd7604c136a5c05af32c65923e1ecb1c41899c43642fce968a29c3d173ac8f583b18c0ac8ee798e00f6b4ccfb32d6fe2100df007b76d3341d3bf670c640c0616e8171fe72d618c3c03d38c464ce39af706016397b19fb68da98225401973137b907fce514d8c31a7b16929f853dcfeacabf8675d01e1b01f60f0b95206bbcc21e884baca9e41c0a691ca471cede675294e10f63d0c76be1e583336b15668c31063116c239cf40afb0983dad049ff949cfb038661c8238dfc82bb20aad42bb76ecc2ab9c71e999dacb2972ce78853d252ceae0f1cbf8c32d208c31c638d985d528669c149260c62fe010639db1877960157946cec96306f38735ce388f19f4b0fef40cacb10c8b98c418d3c02b324b8338f470c65808e3554d9ec15ec69f8767e411ebbc026b9db3973d3c23677c935958c4a19731c642584566811a7ba18731067aec7ad22b7c5863117b302c8a42a3119c1518050fe7bccae0c6268dcfc803e38c33c678e6a0ebdcdd6db8fb107797b959762102020c8608cdffa8892f5e8e80b8c1134669133e2f3451e5426232f0204dac6007896d69001020d82040521c1817805841041d698ecf8c18ac27a889160580d252e7070816fe493113645445f1838c2a4df059951256f0545dc93c3509b02b54f169b1c2f3046145d5932baad8c4781519245efb78f0f704e0aedd6feb7ed3774dd60c2c1eeeb6b49d4b4adf556d753dfbc6dad475b79262a58044d40e586a11045388e0a7350d795403903394ad58619047ce902000c85797ba0c9710c002a256ad0c8a1e4fa922a80251ac22e4cde369d59063e07c443cbcaa218228167ce47809207b2ccfc70e0ca2fc06fc09e96ac8de8d9eb9206a052137d0b8866ed03b6a1840540a1106726601513a6cd6d0651921aa7600131475f9357904885243e8bdb48b136a38c203c4162f900aa1e8a195c7efc60b9ce1f5d846b0d820f3c9583a582ad4b2d7029c61c30680d861c30a0ad023b505ca1151e34e890102285fb8b006a252fcd4c00267ac58614b0315edd02a583ac01a66a8300a79e010e960893c48a35b0daa28d3e3f961813364ca156b243a679040142be4b1222987a84f9b1f5ebdb0627d34562dd016c69dc822e4b16281295a385c2b3c20a2cd4c4e9116a10cc810156a60853410460903a84808487ae0cd27a47f44d263f137401164793d5f0f2fe806fe7074ecabf111439b9e41252a64d58840354889c2638c50e6e9783aab0944b5687939be15be15a28e97e372a155d81045ebc15a49cf3cfd05e09ce100ecda05aa880a78a1c252c404ac4079d26489dba4b46db5198ec81043112246427cb8c0432808864c85145078af042468c1460ae74d0ab04a0aba04218117885a105241438eab23b67080882b4158810010551a4044c682010b489221084040620d500055c9060d167885072940620c9610e28ad08c1f9b9991158239381a30e2c8be0501e242910ea21f7620c00062aa6478a0880a4ce0090c45807e6033de0abc10a1880d167e4470e5801f7e284010203668b020b1127212321232141e980742fe929bf8aab00c320cf20b4417904ae415e42db949e3b04ea8e2cb2953649b4c83675e325f4c7e61d36be5f16365310cb38735c62b77bf295d1a477f20cad321caf3b16a215b623ad5f08a40d4f791a00a32a8c103c28567435aa1c00a4a94e743ac61e5c004102502c09341af18df1519ea0883562c1dd40289a8504bd4cc911a4420ad83942e8140da20ea8b22ea236f5e1045be330c4489b05606697c3ddf94299a31450f367851a25c31f3f5ecd513c25e51d8f0ad10068135b44bd7085f3df37cb4105bb1564344e97175e3f18c2e34f6488f87a5e35b0104c0ea66c55ae1c8197246b4196940006826d8b0bad1586cf8b844a580f39c1e2905159e10e95abd3cac671a8727a4a401330803687e2bf0a5853e9a165e8dfaf348ad75d6a00eb5c8caf13448048c710961bdc0158835e8c5f07a3c1ca6d05551a34c0605a25a43d4f05a7938610e1b3c1bd87022bd47d1841dc460891578390197dd9251144de0410ad1500b2c00b16b1080d0c3c27485a01119820089420521a03aa1003e547ab8b1001bc02009138040034504d1435301a92701bbb7006e5b04218061c2054a9020034f9ccc704486188200d9a1e38415363549d8d281222ae0a409928a1c763dc1d5b2410d923895515134e108463862c4a6e605031394200420d080111628c00e04409a01003004015294840a4a90020f50e131031924a102139000041f9080951c6e108010c0c0c00520f8c0960b4845ed5b11d1ab049303276c7002127480035984e041877d83a18868e75526a182133480013c48eddb0c2e14e920a221d42a3dcf811349a8000525e80007b258400803ec2085c4852216680801c570b113f3f23c8a1c385103149ca00424e800072c20840178d84107a91b640009c991167a684b50828f1eae160d54e4488992430c30f83c40871ca09610e12c774fc14d568c8b51e826784cf89490931052c09b40162207815f6417da07d3c659e6d12be8af3901abc839e08d4e91619f0dae11656262b4e9b9ca9659ce9029c61cd64b0cc315a857abefd3012ee331b42c5ddc4b0dbc04e1a5889718491821092b49f848c246055d54b044055b05630a9648411433053a5290a28b125da27471a1cb0c2d4bcc0d148ca036021f2d1f10c11231e30d44704504b55189107809c1941614506131a9a262c622b82339921a39f234d76573ffeed8cfedd876d3305bd9d565999ed2279b6de7fe233972e3d9bb55421fc911776fa5dbdead1292237bc7323d1939f2b41dd9ef901c71917878d8f7799cd8564907f5dade4d9f9c58a3f700eb81a02d4e784001ed9beaf6100f38c0fdb612f1000f6e1f70f101a8981c92b8bfdbe803438040e7034abc2eebe37577394010c36d25eab265882d54a448317973243872dbe263cb8da017057cf86cf92db02de69670b5a14fa36da5d4dd25ad2dbb7ebb9d76eecabee606bc981c68c15d21a8967dd3db9a3afd2d1d725b5a8fbbee77c9161242da40006068b26d261c6e2e9722b92e12129020454643888a201d11f9f0810a41421262d9f773a9bbb26aeed9f79fd8dcb3ec5ba4e748c9a3bf5b5d9baa365569af7be897a43ffeb6ddada4bd6da77435a2caddada4ddee1ea201d26fe9cea1811ed74092bb6f256a0ed5eddd430338b8e720d240085c0336f02150af7a537749541feecec24d2d2ff7a5224670a13222cb10464c31228a1151462c31e276c4081e46dc304266c41b61babb8a94cbb136a40cc0dcddea9b01cfdd5f36cb13372feeee42ed26a4fd66c1e2485490b2307117e9e66e161e597c1c092aa7d3a5596059420c807177a4fdee6c7bc9c6c012eeecfbe99bde6ee9906713bc745872f78c81213060027777da6fd1ebee2535074d477bdad3befd1bea3e6de7163d6da75bd57777acaa64b7ba9bee695bc7fedeaf6ed7b6aced9f58a6edc4ba2dfbb7eda64f3b7765d59575dbadfb152a97db296ddb663aa26da5d47d776955995ef796ee785acbaea9d3b3ec7bf4334524318b48401144c0528445015840608196056858206781222ce0c50241b8c0ea02332e907481015ca00317a0c10580800110032960c006068c8af0a0a8401814a89e4061052834c1040a3d50020528bae8f8113a355b1ee0936585217458b0a203830fea945d141ba47476a800139d1f5e9d2272a68e076e2738f282231d1cb8bb57c0878e0f9c765bb7cbb247bb9c4d4d6178dabf2e8fbdaab995fd877ad137dd496f9b6ea65f975477bfe9eb3e93eddd13084381170b0a14991468c1dd616e52604701233a50400877b7a5b9484babdaf6ec5d927d43b26d253d6e8eb5f90acbbc727c47b6ee1c4d29b7dd67a1c6df5427f73727407bda8eeccf76bfef4e3adf4dddbdaa4afba6ba2cf67675696ecbf8d74d77eedf944706cfcee99cd225ad10295c49c1952aeedebee9d6ed21422840081dee9ee4966399dcdd321d29615b9d5391101710c28bbbebae44e9aed4ae08b9e132a2ce159d2b3957c82b410411e3001d8258c29dd2ddbeae6ef76b0ad56e25fb6dbbdd4e36f575d97529556f9f4bdbbdee25f736dbb7dc4ea9ddb9747d1a4fcbf224d558ddee6fbb4d77ceb65bdbd3d837c7d36a46823c925acdc8aebddbfddb6ef74d7593de94050b2b37580980152b18707724566210011d812111f8717724b775c70e898010ee9e140128dc9d6db2b1b92121a1a31a12788004062081171200dd3d67c583401813024eeca00b04b61c59ad080181284c205003c26380000f2710b801011f97117520003b3283077c717fc0122e23ea20a1b93b0daa511be4291d427b53d5c6ba2efb4daedafe9bfe4ef750b9ada4b49f072a7d5ad5cfe5d4db7e774cafdaea9e3d7adacebbee7633c93e85ca6d25ea8d5dbf458b162d722cab6377cbfe781a544e090969afec8a64e35db257a49d04953ad1b69212fb4db6cdf4b4da6e599b1191dace06d42ddd43683beeaaa6edebaeaceda15ad6693bed6eb2675fdbaab6ba5f55a5dc765ff5a15ca8357dd995a8f6aeca537bb75b131212525373b6cdb3777b97048a0f3218c00403a030608901a60f443480c78722f8c0a501500d50dddd1d90020744c0012ffc90841f78f0030f3fd068800f1aa0a5013b5439a108882a2b1f22b0002f5a4e50e2eebe00290b5872c201dcdd17102a6089132ae0ee4e7b37d49baee97672d59645df060e1a4f6e7fcb3ecf76628d6aafd4aa6b0f21911e68b8dff6765326213de4fcd64306a810e9210a2aabbb2b4053c100951b1440e47edb2dfb1a19f5e00978c28914c44880172e09a0d202254c02b024a00a95044825e096802309f0e15bd7b2ee6dddad5b49bbdf557dd575c7a3a4becfb3b45f5ad59d44e3814ada6a9ab3e9e8781a932d75dd7d7557563d0013e6016c38400e77779a12c494db141d77cfb55b69e798f284bb37e51842400aee8e4b5ba2760b710f10e3003a07f0c21840090364b1620029534b5c46d4310093016aa60184b88ca863801beeeefb5dd336dd2dd9f89a0b953ed136ad28cded9beaaa454f5b55dacadade35d5a936f56d53dd8fa7b9ef5e5f77bfcfbe6afbbabbddf976c72aadbf9f649f4b997edbd676eb7ed3a0bae9feddb28052ddb7ed229fbecbe22d7ada6d43e59254dbf939b64ddf554d9dfeb6a6b4365ddaedb34aab7a9ebff3032aa9c7d3f62d75dad949e9baa64fb296d5d1eeda2e07b59b9ec985da4d3a5deaf4b5daebf66e425f76a5ad2a8b7bf67ddd13bb7ecb2639bddb7dd7e889655a5a559eb4ddfb4d8584b62d556af7bb16ed92ecb4dd34a89cdbaeaffa3c443f7b23b55fd51d99db644bdbb76d53a857e7b4955cd6f66ccfbb735b77efd6d627b656fb5b6ecb9ee62e2da949bf5d56b7643f92ff577db76865d5a6dc2ee99fd85cda6ea8dd74cbb14cb5dab3afd1666f502f8b9588e6f3ef7e59ac6eca54e371248428071200860439322ae251bba52ffb2eadaa4d89fd5a2d775b53a677d57f5b56f7ee92d4f6559752ddceb6ade9da6e25ecd2d396685b96beaed3ced6aab6876ad355bdb56cdabe4bda0d655362f79be6769bd6903c8ddd0d696955679fb61bc948ed85b692bbfbf1b476ff2c97535f7769555f77332da94cbf995ea824a75c0e7d9aebd2d45497cbeda777d3e7497f55d9a4d47d1a8feef7d356736dba91d49ef62a24d4fea81979f67ddb0ae5feaada54374d7add34f7fb69af3e341fda8f9267575675dbad246d9774bba6967d7af7ba6b8f3ecaf552a73c61c2ddd5a8245140511ea8a147d412dc9da9c6ad656d7bc89aea76529d9190108fac062821a11a7cb081a88630ee8e6427975393da2d44660313364cc086d4dd97769e4756c3b68b08607477251b356cbb88006a10408d2d802408608bbb6f530a86bbd79656d5d6b23aa40420c543aa08522870f75bda12dd1075830d77477203970190600053034007c0c2210b0e3b4ce5e070c3819ccab9bb6db73b97d52d213209409b7ac114140218810055088073f724560985c203942028312816c8c1450e2cc801cadd91c470130a13a2e8b83b92283a1dc4285adc3dd5c188bbd77498e2ee48366c1cd5d021073bccdc7d861d76ee8ea400331460dc2103ee7ea4000428400cdcdd080f375da4bc525490a2dd5d86275b9e0ca1defcc9942351a2bc90c09e30c9b98ca8f364c7131d22b427394f48971175c210c13dd1e34c38e9e2244b4c2a043b99e244cac9cd084e8e38f1e124c705276413287093aa265e62a818f13ab2a309172d2e23ea78132caf2329aa10796a22a54954931a11199af0681224e32f22404dcc1d132d31a98dc91493254c8e7ef8723a0026318660022237309961e20520cceb880602a0849123b61879401619dc872801d0bd8e84780c01e0f13a222300375e47620190c16206f0021c003300fe22b20087e28bcb883a346cc97867c98287f0c165449d971115f81429971175300db9232e23eabc8ea8e008490e1a7cd050c365449dd7112a1a3ca8302e23ea2021ddddddde4dffdd4b48afeab2ba7d7ba47f62733be9dd5c2e55426ab792bd22edd49ea72624a494db463519fb74e46e75b7b41bfba356539554dbd6b9efd294d8afed9d6ee7a6bb293d425a923ad56e3797d539a92d5b33b21279da6d65995cf5e9772cd48e85fa55fdddaaefaa449ea6db6da6b7b677ab54bbedb47d97ecdb0d7d1b3d3584788c8672fc5edf55ffb657566595d274e76ce9d3a6ad4dbf23fb967d6d5bc9a7cfbe6bbb5da8f65dff776ab5df4ad8a454367b9acae6744b5e56f7ef2ec947ab6ef6fd76df5af657b5066553dd556ddf25bb566bf7ba3fdd7159dd2ba93227d645c2b3ddeda4be3376676f57b67b6de9b32fcf5ed9dbbbea1a2497db29ad3b322121289b90d0d1afeece41e5b69274e76eacda6e5dbb958c7e3f3d0fabb6e9ba6deee7726ad3bf5210249fcba93d846ab9daafecdfb69b26fd5e6ad39c0dea79726afaeedbef9675aa19b9cd72af6db73cb4dab75b09fbae8e657335a4cdbaee568bfe69afab2ed94cb69dd33fb14c2b929a90502e97e2a819d9dbe869b51a51da6e25fb4d999e9ebd3dfbbabbd4ddbb555a4ad7d4e9db1d5bab41ada9d26e7542eea72d1110206bbbdf37d57d9be654a72736976395de657ad9212320418a8e5020453f8200418a01fd21fba3a21f453e8484509d6e07884c89cda56cebb298d5dcda6fa677afecb6712b12123aaa21240495ea6eb9204f1b08d46eaad5d837dded6da7efae6a3a7bdabba63655492dda4cef6dddba7d5b8b7ef6b49dd91e22fbdf71210bb28d3e97aeacfaaab75b4ab3ad45ffaedbd66e213424b59a11235baaf46e2edd37f537d3cea536a3a7a9efbafbbd5bd577656ddb5d8b9eb6b4aaecd2cafe4edaadb4dd529b3e0b64c7aa4a52a69df43bb3955d659f4b9d5a767d76b7bf935cf555429f56544416e4674fdb815ad39bcd0809c969b7a6ea6d3b39a9cf737ba8dc7e595bfa694b24b4e32297febb97a052a7762f2da9edfbae8a73d5b4dd2dabb493dedd399dfae6764eef3e0a43a072fb555755c95562ffb66e5bcbea403222e2e3e3e3820522ee56733a5dbaee9ec88ed1aff04472b97433b969cedd36f5b60ab9ed7eb753daa6429e56db4c2f8ea7fda7eb767a6de9ba1fc7a7eda6ed7633ed96bdfdcb62656fbfb72edd4cb677d5746955a15221ff4fdb91295173e9b36f9bbea9d3ce75d387217b19b237baa541b25bbab3b4aa6fba5b1cb2df01220bf242b71cffb39d5dceb6aab27781fc8e2cc8bf2eebf46feabe2bfb2fbb2aa9cf03b5a24f43f23490666fa4f6ebde4fef4e825aa152a7afb95b89ba6dbbe5a9b55bc86d2f497f08091dd5fe9f7d5fb77b1eb765d55aed67b9a5555d55a69df450a990174262e4797ef6b457dd371ef7ff65b1a6385ec8dd4b6bca6433fad9d36a463d8010e18103690790a21e3882f80042042906f447eda1929e1dfa990f9e1d1fdb493dfad96de776b7cd647359dda73fe4916cd4786da9ce89c561944b5ff6c87d579515e22aed56889bc391b644cfe31a7dda122d5195762be4db74e77030bdba9de39f276d8970fcffef10c982bc100c3f7b18cfc203bd8dd9fbb878daa6a9cf737381bc1011cbb6b5976587d4feffa192fee869bb14c8d3feff9663d39db3eda5b465df96fd7f1a92ebb4dfda769bd4dcd3d35e9ff67adbb6dd6db7efaa2babaeea3fd4ceeddb2e972af95aeddf6df446dfe285986c29d1f33ccff3ec0d950a799e762fddb68fe7d9f1791b6ff44aaaec85dcfdaa2d0c3f7bb7c9c6fa789e7f9ee741ff85dc5bba87fcec69fbdd35d5b946bfdbcdf4f43b46b2202f04f5aa4b686cbb69287a9a2e855ad31c442cd44e7af7b6d66affeab66dc95e772e55a2ee92ec87cae552f55db7ebee77d59e76a7bf6d2b6bfbddee5edbae7ddd4fdff4f6b95c6ac34848c8864d7dd3d7e8ddf475bb2696f521247454a3866d17a1b92b0b655b77bb9576abfb1d0bf54aea6f77ddeebbbb2975faf1423be9dbbdb4b2b967d77f269bcaf4f4aecae4aab9475fa8c6323dd57ef6b4ddd66edb6573386aefaa8fa4e6eedef4354a5ba29a91db8a3e8dc94d5f9ea555cde552db3ae46dbc80b1abb1b2eaab0b42bbd56acfe33eed7ee774ecd63dfb3e4d4929755d575d424463870459923ad5be05bb3e4f6daf2c90dab3efbf1b86ffa76ddbcafe9bfe927449dab2e9ef2425ea6b4b856ab7954d42425a55a7dab7789abb63d536554284b65df6e6b6dbddedf5f713cfed779b2aa99fdb29e9729b89b6736cbbaabf93de753bb1494aaefaa6aebb5d77afaffaf42cd3d3b7dbdd3dd4dba6babfb52ad3fbfb963afd4e7ad6cda5bfa6369e762bd94f2c8fa7ddd6ddee949e5d7fdd4ceff3dcf64efaf4b753eab6454fdb2b0bb5a60f95da78908c905675496dd9df4c474f4b5b25f6f79bdb4abf93dcd7b69594889eb65bf6dbcdf4aabb55dd7d7b764d99de4dbf56fbf4779be66c3bc7a342a04637927003023784b410450b4c703861e248008e261c374340186a80d190d8e3262a83a61cb51c3f68b8bb2b51cbb1a303498748b4049114d10c44640e27af105437793cf1407740b143cb8e293b8a344187046a6ef6c8400fb5c78f1e29f4a871a1062e9cc005205c10521445111145aa0f2f45453c98e00348051f34eeee3faa7e54f961f483e603093e6af05134047de1072f68e005f785ab79a804cdd1c7891c660aa911111800000000a3130020301c120b8623329148d303d7ea0114800980b6547c4ca04993308821851031c620200000022200008930a3eebad0d9af07d5aebaff04eaa3f0eab970bd72a6ae19a8bbe8ea4741d35f01a53322ca7de3c065e8bf85386586af80c50141c6577b3b0ad4435b58fdc0c1f1848c2385179f440eff7bff0619fb8bee030faa9ae7cadd5897e4edd4075175a564fcf7f2358d67c414ba2dfe047be994b5f6d342b61cd802ac1156b5465cfb422e47fd73a40dd2ad8d10fcfff4cce97bf640cb56e013816f2f442c4cc2b19ce0bf30e8182c40d1267fe00d166d01f7382613440e23f77750118683b3002449b453bc37ca9d2bbe0b86c98e18403ab25d096519cb2de8567ca59a6f3d6a82e2ff9c46668b54c0da36d77bf1c632ca6ba88190c411142bb108d095f98371b7be435c4e78ffb708c816a22c29ab52f0ed4489593855980d6383dd4a3f637758b006c6d01dc5e1318a31dfb3627e2b4b353a0b2cc0f370ef845155a3ca7620c1da08cd7427be7ef85b905bd048845ea6d3c9f676212566167214e67af754b2b3ca7d769b7715e03421ebbe87653b144213f06929d84f992e15dc818fc63d5466dc08bd764b0aba34fd41f079fdfb9920f2fae7208af389bd9e115ca65d0f0f26e6e602afa2491279bd65d33ebecf74b60f9367d628ea1e2720b56308c10391aefbf2af6967fa5e867a49f9765553030629685184854a88dbcd4e75aa440c91eba22f331666428df499d5ca206ff6fd6a9db1edcebba07933adead5c7d8b29c161ebc88fd3f2422e7ecbd2f7a8c90c4e98c15db5e06b96d5d6e65bb4b3f52702227c7a8341433ac6cd4761bb481a91deba4ab9ad78dff8a602d136c484458e58fba38b45f09e526081e9aca995cb2222aabaf12d4dff2a046a2e82648eb418439c365aec0d50ce943d30f206f41d44cc0b060b2a3640043032474f0c43ea990ca3077eb4840556da57e2daa2c1d546f5262f888d92d2e9594e75e02394bfb68ec89b4e2b123bf0003fe72053760ed03cf773a3283f5f54e9466e6090099505c7f58e8cb78a2972174cff099ab8ca8abecfefe0542a7b37451793f2fabc328b241d838e66b0dfcca822719e5e27bffac1a1ef25a19f26a1ef2f85b16d12280fcebfee6fbec6ae3afb622ccdd264c265332e055a97573b8268e31cde596fb1ff175aa9a6c600a19c1a72d3e49a0df19b7ee4aa284f70e7c1bae5cce213bb229075169d79cdb3efeb05c5bd5f98237c615e9601e9ea9d2200ff24f39f845994b5b5ae26abe89416e1df1b1bd773b403dc31313de12572be67d1021f606ce7b8461db6d71c4c476f6e07297e08071e5598355109c763c0c930b87f55eaa510e0b32efd664cc38ab5826c7b9800709d125328e38048301879b7617458f9b19e44338e88b3b2b0f369f97a15aee46d7559a40d43aa4c259314f39ea850dfe2302cc82735b9a4bd78ead771f312f940a922c508f134c11f970eb18882fa2c510e9d0d4fc42e259d968dbf59b6cc061778a683c39fcbd96614e21708b4b516c8fb6e4d5c1f294b6947940c78718f123332b0d9ac0cc20186fc5607d1bdfb1c77d6d063fe3512003b4beae456f7e8975c4dbccab46e014d8555b977f73156854b6fa39f2264e9f5459567fddebcea606eb4db9d88c219a126d168d83c06de7b962de97bf0c5130d8b77f19a2f250d869a2c31b91f3d7cb4ac26dbc588afbe502b41d9af9065cdccd21731fa2cceec74c756a66186dd74a5d552e6ec11b3faa47cbfb0ec40939fedd38657e785fc0e6fd12be89a1f1371d4fa2317e34fe0d677c6863e3b7f18034f645eed8c71e93d3ff987ad7ab74bfe04eb84bde3df0ba675b3383ebe3751812274ddfe9db59435317c601c9c1f61bcf4d0c53ceaf8fb149c39f4ac76c5a9b777f40cf27b3d3c0d7e4e2a13accf15ab8865d8a30392bc7186f7ec73f181732801d062ee3f15a3e97a579edf23a16fd5e1e39b5dca9dceb6a0fb2ef79ede3343aeb8997551a552115f848769bc8fb4aab1a0397dfa9b148e8f3bdb1d1bdda454d0e0d51aa6d0ad6b2c0eea48d329bd8c593194058b6127e00b1e72760de050c579f6f5a4bae67bdf9f767d8261fea4c74d154e99080d199aafddbc394b8c7f7593e710f7a529a91ce7c795d879d0c4e06630a3f84073b066396589fd0478edbb766f19a2140f47885954bf9a210688b934b035561508c63419f38c871013df5667ba3ffc43823b4dc6f2cea3daa2f1b30388695dc29a3e454eaf48c16211992f1bfe0643b862f400a5ff827cceb96f117f3558cdd82fcece169ce3a301406dc43d0f60f0e018d5dae19f1189c097b7262e0783f16ef50b2833a7ac5338e9699715269833a19e5f686c3f4ed8a71b73f3597c2971fbe567d2a77e750d6792789070cc57ef084f7a22b3e8f41174522cec4624c6ad018b1647e134f65a9d7811d001cdf7d1a4ef76705d819b094c78593b0165a58e254a605a724e3909de30558c6dde984b4abed24d8dbf0a3df2a9ca7cb787bde6d6d43811e4199d789486d141500f965f8e91325c4128fba523a96cfefb251e8488f838d48c1ba5a94708174c0e88863b3644220e1e9f8f570bf522dc28c9ac10a205e700f6e6d345f3d637dc2a8b857d9a040266dcf28376a234d106db35d23757e0328234d1d054f214d096766900ab6e422c1014236ea6e537842057aa5bda2da3c318e33f5ecd0e8e20d2fcef1dca5bea6f31ed3ef19473dbf04ba6f4368b63abf3f03f23db037bf8df540e7f1580906ac39e1fa9fc8600308b6f697a73c90099fdeb9cebab2ff48e9f734748f521270445d4006bda06ccfa6523f22fe1ccd3536787587a8ba4f508263441fdddef9baf07f14a741273e12acce8ef4fcad23562319e66f01ec2a5655bf482be2a089bd00fdb18a377ef5feee186a416e096f1764e7514f192c19f88a56e93608c82d6dbde51e1963fe99dea032297e2f57d1bf24715929e37e644733a13f6d1e127039ce630932f08d935cf72c73f1820c4f05fe2729acd1b59931753a94cef028e9869df99ac096d5f7a06219050ba6939c5e3fdfc380558428b6808ad35b0f5d06b06d52382e26b8fa29ad67e078614e91336e7b659279c17048c6c509a8fea69d26a29c3703ca3ab5805505787ce7527c13dfa129fc68b7534c2f7829c794dbfd84136d78e232a1fb5f82d78e1d3aa4153af748685a582b1bb58401e730e143ffa1f8f1418e4b7177af5d1f3f3946a5fdc2d473ee9455c15d525fd55533e2be6e32fde7ee581e3d60d374c8796ca131ea65caa5b02288ec1231bd40148a8598ec236dfcc18cba750dec3657c3e2cc44c8376c7daa54289e81041ac7f8936f5e99aeb608c0bd57b4568b07480bc07efcfef38d2991b899f1b2072f2ba234eb5ed80b96b12261f48b276bed6f1a30632754d79f9fb801a7bf6226e778e32434d3b423ba931e8f0734d7a1de8b0ee1c5474cfaf986b806060cf2387275e3a3e936b17f1bef1e80fd0ef358bbc53a5d1fd33f76309eb80cc6bad49ef10caa4f4b747249b705eb1f64f7fb620b1dce86cb9907d2926b54a90751e12f40a997ccae0a827e158effcb5193663d8abee0c2af2780fb97c1544bacb6e11ae6963a3b06c83c83f48a9146c66cee5e18b4f52af6fa2e626b9bf1d0b137c3e2d3861e948a2a05539923b77c277bec71f4244650b5db2a7fdf1dfc6140de02914229ff48a10a970169575508df356d6615107c94234d77b9b12aa4833d35be801555660f7ddf37e2de7fb23932953e86284c3e7716c65b1421b54de9429c85498a9a832ed7639d546fbfc6239365878e3f78743d0de345bd822de2dcb5953faa855e375832c29c0b0cc0a00b97c5f0768edeb1ce91363fc63dbb3759c60817c01a1800ef23eeb1cefa302a36cf3c0f8297fb2fc2aa045f938fc0c3f82ce801cef60c090efecc53fa92f19019d8e87dee72ddf889d803ed01a9440468271f8afd4ac3d2cf27a14b1518dd4b4868316b29b2bf237052c43ecba1f1d0771d0d2e362b923f0112858711cc70d64604638b8a5ba674bf435cc4d116af3fc4807c878b18c81b6b05c4070843621cd586b9c4dd1d3d1373d6da56529df804d04721194002268d07da968aa7dd56fdde24c533d8e7b90755f2b68451cf99d7d38ae3da752309094e6a36a7c7932c481ca65777323aed52c5799f31e2b8cf3c749b544e6f53db77f2ed7418ffe6b3fa5470aabed9ba26bf4b2d15633db1a5d1ed669870b05e7ef9377eea204aec6ca2f57cb9f3bd88c9f16795d20c1aaaddf397663ef4c0baf67dea9ae22de6ff6fb869ebc6b9bdc65c4da1a18f950fb3d354061b5769c789ea1fdb1a372bb8e1ff760ef36a6e83d94e40555e63d04d9cb4e4bb0804386d324db6fe48310854bf4f7ad3b7864660a7cd0a4eee4bf96ff6957c645b46e66972e11a13d3925776e798065478c400006e9d24e13e5326a9c6c04272b1492b1b24c87810c81baa947421dd6049210538d860a9f25bb2cecd85b2480323f555d939be3fefad78b46ec36724ab7c2ef9528be3ac889e81d3bdd38ad01403f978c944fa66799e75892b42aab0631fc7e47cdbf43d2d1a985d446ceadc4620180d044b39d49dfc82b49254958d92cea051b6bb1fcaef17c084dec4688c60bbcb0583502837d87c2edb0edc952396711a4c5b5494074b377f06d03c74e47230b2b958f43f7a63cd7b9f859af73af90214feec8626d3c44c6fb4c23ccf48ad5acec4ef357d28008b4196bd88f75a32cfff75c1a4a922dd416504035962033b7c7f4070310432beec60e3596b15dbb2deeb60ab6d84d6b0d233aa9002ad80862c648e897007a0daaacbe94158c044a85e19d6eb38a86bf820ddce3309400fbe9f67e9b5b060d52c5d00d42663f97a032ee27f754802a7aa7b50ccea5b278b92552d7378eb3cced4f98dbbb4afc4fe1777973563b499a31e9fc4096d94b0835755a2512ca9ec144119ae3065b3e145fcddde82caa070e41f8dbe97383879941726c783662d6cba12a68068c26031c91ea598aacfad90dd739e6a6551bb47bc2300e8c5d629a39d691457b5334249bc619121aea921d1c31f38de1bd3467f21737be00acd65ccd3f00457f4e8d5af34ceccb02542d23dbb6dd7dca2d424dea243a184a7e0155d6cf14b8457461b506209a4914cb5aa7285830c76e0455aa8ffdf4646ea1aabf7cd7b17afa4a0debc7c3f39dc9b0c157a1689dbe623e9b77f0080b752a49ba7544f452463a3713f7c6c71f6bac174f9c79dee3d6c70dbcac1ab43da11d0aaf2967cd7b78e58da8b73260bac318740d3836270228cc7f65ba1fb2f5c86e33115e4f8337eb053f794dfc213b7180644d44c51c273018060925159e85e76495203437f3ec58b4179e332e46f0ac099bdb089a2ab96c0299bf5e92c512bfcf2dc9c656d2fd0d40baa971c871aa3796c0ca3d25cee9441320a0a178b97b88a9524e0d866955064a92313c448490294c4099cfb14d570cf917063ada13ad31e387fda49ff97d4672b8a85c82f3fed0867d81002efa545395e36e4882177d7c51d7bdacc346eb2e6c176fac561ff43b3582c10026685d35bb87998da91aa1dabb1b2bfdf35a7fbe826288c4cad6096d9c2f8fa538eadcd714d37e6363211714aa7fb003e89713ce891e1a0d591db4703c6ab7606d0f57b9768659489bef32bdfc2abe1b3b229b4fd5af693133cc0ccfa29aa4faf05429eea6fc13fc8662f8240c088a0d172cfcd11cbe8d6bc4054da973b7b659fb5549853e260488a1066194fae767ec1c103516405ea850ecdba0597a64a3f9b994e08707fdcdb9a0ec7a8f1eff708e74a7f6e1975acd93b33f4ab9da35cd716114290b49e8e66a69d52354a82f4b511321b763dad297f3d3b885c7d1eba1c74bddbf26830078960effeea971214e128139b0fc8b94d763a1f592c4bc0875d20a3ba2c095faaecd8650aaffbf78d9f1874b5c7b6aa1a166fe3b8e64bc0783626f3b1419278bbfcb495f721c905104a6714d73d382d9659072360c35e669f89980e278d0bb3ff0f10d656799c9ef6b417445f010a4f0107afbd85d3c7f8f50f06be5c75b856143fc12933b1ac65290ce4df079e162382d2bdf6ec8877bd3b4b409efab17d7e44c999e7d4afc3427c18fb15ab4ba79244ee62d61237d2295fd4d804544b1ca6cf2347dc3473c48f9747fd367dbff17a23c4516fe9b9318fb74dcc437cdcd0f8f6870362fcbdf423b68cc758f2ac7f8dfcc4b4fa1bdd37f3c1342decc434fa0d1f6a5c3458674174d6cf7c55ac73d3abdaf1956d3eec77c06cdea11830b8eb25cce219c0cb3029e6198730cdbf2bbf7480d2dbe15503fed5fefa5ad632cf8801870796c79a29bddae75a5c622a1f0ee85dd5c4882deaa3bc4dfd429e6383ca1c6704b6638d9ae126089c315cb123ca0b93e2c67f39c3313c70146f11a929aa6e209f71b4b891ed1482d6080ed01a4ffc961e8176a2babee4cff48da412b7e165094b48fafdb6eea53d42be69084fccc1c41f63febd7244e9a3e38775cd8e1b42cf5053260b3b933ede3840a1c72f1a50031c3533c83ef1a02b47ce2663871e9f6b768c00f1705ed087c26bd81f964a8c981df733dc43c75bc71e830f2cc2e18d711255e9c8da905f43d4c659f450c9c0eca33dd67e32ba6524ebab2358309ed71aa59bb92908f260d7efe2f9b2597fe8182eaf5bca88bc8fc2515cc6e34c877524ae6d43db5217f15a92657e26c858a29e7f0d961543643c4538dbdb588c354f45e84f5313e6ba437f5b0ec2b6f4d11f2252c303bf4f4bbac44b838b302f099fa61e461a26f22399dffbe204aa653f41ff8f8fdc09c71a02fdefbf94f977058352970f087cf37379f70eb353f54bfc4bfad2263b0682fb46e89fbb66fcd2cfc2b146c2fbf9ce5ad162aa92bbe639bdc00248a5df4466bffacbca7ce3c4f4dab2a04a96af02083d9d9ba2930eb0aab397f38fa229a1e8e1e4cc1e0d0c11f2d67e5d0ebddbc821c08648040c10af1ce87ecb7430f88c0ee9ea45118b8e24f82c380b7fd0e9420a9b0f21bd86c2f9d58c600861254e0dfc20e34f0478bd843a3ca0e2fed90d426f55d8818eac310f81cc3ae09740184d01e876aa2b723330dc2e4085b210e06466e8970cf0f39635b756110e0b3f9030dcdc61db29f0dd12fe33933820c09a7dafef55dbcab46fa36f113f6e4089ef86ccbbc59e85639acb9e01206d01201c859324e72ff9f73af6c326904e827b77f019463deb630743520dda1333c38247ef06c64fdbf4ece87ffdfce2eb3739f6b88ad3043f40fcb299da0ee2432aecc5cd3d4128af7807278a666759dc950eb76b984def87916b796c947bec7d3e8029d01c09f805f273caba01729b21e84adfc48bef6839bc1fa7f5a80a7c1baf2433a648ae979efff140552f52c2888802522f5c008e72706c78ef40055e1c5a9cab055facac1f759128c4ab090be20d6b09da3bb7a2dfac0be85e7247c0454731757cac8deeb27e74b27960228738b10e3991df79b00807d23ace79e0b776a1a2bb52c002a42c35724c9980f5f71133361dfe30dbfb3a7321983cca8d40f16cfd486300534c8daf0bc331ea7268295725a1ed3532e1035554033365266cd6a4b70de098a10bb7a7b7d4767ab9a07c2b2410973302375afd568263cb33e74d660b20db8c045518f5ace72498873168ff84534cd129c9bf4571c2f7cdcaed57ecce71183d748da5932041e62434907dee6ebe9f2895e344e5c3407b822bd6f14e962e25d2868a6a7760328817b7d23b46d3868da6935731072ff1f92933e4a8cbb0c90e35cf6daa0f78022be209f13f454abec31796b04e219b8a4a98ff777250d10e2fc41781072f6edccce032dbe3cecc74791e0295e9a8292c151fdeb9ac3c47f24764fb525bcd9a8dfa7b1347fda3649d9dd330cfe4cf4b124e102ab02a867bd909bc48fc2c8ab422342ab64e00e0bb7164faf1faa517113073743e16673292c1dc04c945e77079853a519cf1f0ae6ec2ac3c95edb52e205078dd469adb7575575d35eb6452f6a7939698333a45baa933e35e52c2f5ea5e53cda9baab51bb28f762c26d858705e4103ec11414de4c8a0e14c3282c9604d4b66534be146cbb1c3302f672953047d2e194bd7da4faec4e360cff4ae1b8e40bf9d612262ce42fc92a6332d220e9feb67e089db0d1226555934b1a6a6aefe28d6986ca489c48d8e90de7f73a8d234d23b12599014295ca707821971e2d06d6c798a82cd5a470c7147587ae093b9ab74ad9bcbcd135674dc602286600918bfc51f28723b92d8c2781a95c2af255d8130c4c16ba90ab648adc91575d71a58d713c29fb668dbdc0650b07d1772b6391a712713793d40148f9ad19e7ffa0a28c403178be2fc2e7a8c7130c9c2ec44ac33a9d07cb3d8a9f6a3759edabbe137ba9ec75a868bf1a20b35d4ad7d606d916d4659f098c128244d000374f63e93de2256a0012f78193ccef1fb5b1eb3831691ec2ac2d339ae083d4f520f92d36ec2bf0e4401fddb615bb355f904ee0d0a2008e86c2e40b4f766e06e5c39a269949465476134c87ed8fcec41b785295a268f74a0cf0c159f49911f22bf5763cce2d9ef2358498a1e291bc0772be18bbd70eb694a8f1571fb816d90cc43235d832c81ce78ec20e6d39021ab30821041de92dac39cc015b89cc92191d48cb114c13a7b22011e18b2bed26991064110b796d5e3079b23d26d7e7259a33051b58c9dcce6b61c5eca868311c60fa0cf8b860830ad01045ecdc33d27c2f1f7f10f848097c8f6bd633723589c925b465c90032ce8de3102cd2726853e7d842de23f255eaf5a2c1f49a8e84db68f1ad331420442df3c75a8f0e8bff424194ba27034f705114a2a1d4b1039b1987e6170d01244bc5164df8d5036fcdc09153529bf0492699be504db4801891786b83dbd5f5ff595e57ccf37017f02c23ad65ea5fba91aaa76d12f66ab15ccd25b03e68d9e1c64fd54050b49b821a9ae5a3544ae14cc92f1371a0740810490ae32a589a73ebec362b5015c366d64d1976f62602dadf78770ace0c8ff17e4805f1bdb8bccb79dc6bb3605f15ec6ce0d2bc74872056f44d7c859a6bcea1be9c532500dbcd6ad250a575b769da7444d5c2b4a561d1845679708acce9a22247c8e4082947e7986720f57404f6aa80fd925fa5d52e8071b2c1732bc137c5b0033d90e014ad3b36257dcb42e8368e8f425da2b251529f704faac648f0762fdd07dabb26d347c0f0b5d852c76398f87eab5b17a166349baf093b7f93ed13eecdadc207fb03a68e9909ab5738b0b20877978c8a1ab806a6c5598b8371d273b37f94942dcc10f93295a0e5014670080916a7da886503154d2009c7ca87d7d06f29a95ee863f2497994968015f93f26e5fd770f143ce6c245c57eae90144fd18faa2d416033ebb05742fc1b8dc5b3df185dbcc4d5ffef2c3433ea7492d44a23461ec6509c85a20e3839e1695d6daf36ee0868d4bb346d06ee8ac0bff9d4e16148a211a793d137f621799fed7f17618aa4b838a0ec57695000f56a500455328a59a71ef8e8e12ff3e9d984b0c998c45f6df5dcde7346a5ff9810fe2279815cb754ddf4eadd0836abdd007919121ecdd7991f0edd2267a1415bb57b6751d02c4d5b08fb17ff4f3dbc6ad97e94afee6514834eed7f6b38072d7788c658a0b82aa0ad64c5449f27bad35661d6ce468fada5404af97033ae03661c46e1324108261c8901f05997a643ffe4cfe116bc151fa0051b94650f946a05b44803c60a998ab3d016106871257cd98e5cff9e7a747999608571b28574fc2cee9ce0a8cc0fc26eb0554580003fd11e01ee900bf52f6317894b27240a38e4ba5a1bda309f52ade1d88e0ca761f69c3cd9aee0e347833d523181e9214b20857a694b31c78d173f1d80c333f3889f4814a1c2028f05d375800f5aff1b57b8bfdd2f943abd0a6ff45a2098ad33487182deae294fa3eb74968ddde21797ea1b8b34ca7166069e06d62b62e865611e33371a98c2eeb3ce58b511e27dc172303d020099142244f88a4e08a07a8f631bb7d9b432eea2d216511f04f83aca28e08889abead8d61f111a947b12175a653504887f07cd4b59ae6903e8b51b54b69f04dc89b7b7c819d55b22d71c825ab4a4749242eed9655ce70f259604e008640ccf202d034fdd8682fad725e3fcd2fb706dce8859c1f0f77fccfb9f0b0865452c72f0167fb1b58ec44fe75894e84c1f8d0a169b4d8fffae53caf36170dbe918e732604a8245f521d6789964db2be0f809c605cd26f4f4805915945e76da3ccbff7d74a000208382c5085769ccbec47a376f826bc6fd79831d1ba9bad4597d118c5d0463460985ef394f814c6500e773bb3ced60717e75b811731880a464f9c3faec1610f8a479be451ecbef8159c8bfa6b539080c4225715f05eca23cc1ceaf5d440ef0bca29dd9afcb67c0f8fb7b0d465ab3bceeefecfa26a7f54cfaec171963c6431d153fee3ff1da5402b0dde673fb1280ea6207fdf298c2c68552ed79318e2c9b577c9ff6f0290b6536ee0fda70a838a6250e4be64c1fad21e381023666229d3a991204a5c7f9519282611f836a63abf86b2f358478b03bcbb9a757f10899d62a9f2bb93491468db4c1f506a1a7a12e3bf42c6feb9c8734a4ceaa777df8dbb2796eee2e7ff025eca23b9c889b9ad9508eda3dfc70f01872c2b27a0e3967e8e5601477e60c045d3b9f9d6c8abd0bd1c2a8089fc27db3e9c8b2a771ddcb792699904a2619c9fabaa1ad1fdf043843fe261a3e0cd441a267bdf802f8364df80c64bf84ced806f398b02b26e62a4c81a7fc2ffb6af1a713bde942e2e5ebeec683e6826e8e36675eef6f13e2ee147ba088c7c24b7be6351b6ff9d5581b8e18bdbbb07873a959959881588519166c73febc403940e54e9753c92c5ce191e269750effcc094b726a23dce7305f2472657c02cd4717f6c744e49489c50c7a8b15ef6c6b6061a209a1334f9e817226e29df1d0606ef07120be0308349cf49431e0e3dc2a7b361e967da29dd26ecc90cbf6a55a53120f3772dea803a861e66ddd73570bd0b8f75c388fe15e07e3ae3479ed3fbddb4e73b995b3d2b0de20839eb0c3a7613b1cfce44eb00193e95a8f0fee8db2efc2b381a5615a4cfc3aa70677c4a05bc536d2f46b5816274658459353b2129b3588c0c7189a45cf18235c363f82cacf3fc4762b358aeecd81173c0eedb9717614b614c9118bfa1e51bc696934d8e616e80dae151bdbe3968def00d94b1d704ed7446e04816fcb9d3e5ef968da9f2b68fee9de03143be27c47ab7b34e4cb1d9835f750ec166b434f4e5774a7d8e0f3bd3de3b1a538053d05fd6968b51a3443282b0cdecaf836c80b56706f8c03b0cef39bb038969bd6925ce7c673f47661ed2ed564cdba64643bb790a78bb731beeed10b9a4fc051aa35fc70d3a787b696e690c43bdad503a5cd04f73965d36fbfcc3b8cc059ae3343227ffcc7f03f9c77f05b0b9b50cc3032b5faf75a4c1af7d6dfb8d9645d97238e37bea92f2df9e6cd0c3223759dbf70dcf915a89d88bbbd7a7f9d9ab1f88c6e86e9af53c3ef9faf71f08624b5b17f4aedf9277960c0596d964f4e56ffb6e19b382b3697d8384467cf4168ed6b73f49d0a9830f471c8bd051f6cea7872ab68c4f6591de0a6f3ce03d433aa188b2f4b81635ece3936f986ab073358a47103f6b0ed4ba0eaa910be465fd91667ae0c65f37ba6b7698e506620008ffac681c1a1ca6eadc7a510585fdcbb92fbff6ecb82bfe71335339d62d84088af8ced566afd66ee827ef1e50d6318588e361e476bc185deb7cab94aaf1cec280af8b212fc8edf7ea5f0db33c98fa3b6f7ffcfe675815a1ffd5d658675c2440bb74301bb0ee6dd3c26e45f08382a4cbf7f930fb1f83b904b0ba18a0e7f458bf875f5136d7d59f10b0979a15f4bec27e54dce2f16c1bba25fd66939dd5d1efdb189e3d7bb6193991dcff9f64913e2197dfe19ea7bf17c07d99fd92b95072c6e84fd66a7601fbe5eadeb6bce7b993bfea9946573b5d8b4cc0bfcfa0a8ffb538ebf3d1b57ca0ae970cb5fd80ae85af612e84662daef988a3d8c5ccadb7a868aa0d62432e137381af2621b15b6b90fe0b4656b0afa8adfea45c0775d211dea456e277d131ed9214fa4a3a7e0a95d837913bb5ebca61650251ca9507eaaa8f10d7fefeb477c9d35431f392168164531ab2a71e7480f1554a7819e438b68cafa719a372fd7e2027ebda29c5145b23da75d39b6c4ceb8492349f1d68f477e3430a9df13ccb473a54dc36cfa82ac806222905643c5c2632bb4d754a611892e5868307b596411d7182796066963a225c9cd2ae85323ba191f9a82375ed8066f3c796227e8f7f5c0dfb43767519cdbcf1e7d9978127feace3701b03db856a2af5788579bb6ee4620f382a196575b520bf819fd5d12dd830aba2516c88d1550ec197705dcfe567c77449db857c75fe9444e61456472bfa13b33f9f572a3b73714d3382292bb3b2298f46c7e1ee414fb1c9dbd723b79e456a93fcbeb7f9af849293e56b60c3b6efdecffeb3cdafe8484d5d4ac6fcde15cf61b14d21e11bee91fe53aa7b0f48c3ac0159dca39bb57c8b87cd458c869bd57aff01d373f62045c714dc45ce4b4271c0405fc3b28a7373d077c8288379b1a582e7c55a3639074ae052fd04911837bfec9d2e63dd3b82b1ee3c2a4dcf8abab3158e4c19e6ce40bb439463119b8409fc89da8c8dbe128cb7ec514c523c81a640837bfb57de0c55fb5cd2f3680ca57a7225e948fbd636d7e015050a73e50d1d3d7d81b78e02d7ec57907ec3ec768a33d8cade07913d8193de6e68378ae887c0a12b449317cfe8011b86bf6817f93e13d57ac8978a5fcb79be62b2802f54519b0faf14a2676d7884b1e55eacad0781ab208725a9da26967c82c233660d379aa2bc2bc7cb4a645289f038e4f4c24ad75372fbbf3011a185d708237fb71618d6f7f98fcc89d67c8e63c1952d7f9fc5aad8d9e30e52fa9771a6cc09ffb92fae763210050de43d1eebd9ec5a0317fbb6b0d33522c6b64def867444f633607eee4e6f7613d8be6b9f3301bec2c0cc470f6c51ace1a515e748db88c3579f0189e3d7868ce9337ff66cb3fdfd91ee08fea92e0a6150215f9e7c53dc240cc8340d873b597062b41b1e3ce43e0a774fc93f924651553ac5ed3a7bed1ddf14f4e51deb45bc09064b09ce425d9d3e8b10e7de38351789af095c8a9c5522cc4b58c8c12fb41c8480633507c3ebb5eccc8a74763ca0921779089e5fe17a71706459990f9fc39cf6ff8ade6bf3b8b7bf53d5e197d9b15b31af91580af8737e26c60e27be07ad5063ee696f66923ba100a7d57f4abe310bb504113c7ab0681122896ae53d711865d90357ed4751d9f3d6c1d22338075d559ca740b598bae87a2d441d09efec5d4951596d7b78e9d4d59943a43e0541addabeab8cb91eb6370fc95808ba781b7cdbd128380d001b01ceb2d2a66b120fb4900686579c57e4f6203195e30056f1748fb497126c43da69cb65f49a22d9440e43278ad567fecb4304b3b65ba3c92736c3a4f4adf63e206d9c3e3ae3e19aa9ac24046e75b40e2e605eaff982ecdecf70dcf0b831de5e430a95c02483d3ebe230255b36028c20b6bf47a39334a1d9a20b3ad7042d9e1478ed7326a118b83ff2ba918dbe07bb92f4c35d126cc79e6a5fedbba3f21421d10f440cc846ed4d8b954afe601ae6b9fa90cf6f368f4298e89b3f2cbd46c2450dc1b835ea35049fe0b8107969646dc93225226d79751f4ee4bf26853461f30b6991f78a01a15e6db2b19fc88cc9faf181fe3945029d523adf9e0eff9af02e73fdf9e2bef5c7a58455fedd301fa625ff7ea9565f17c9fff659c58fab2e633bf01453a9fc531080e401f13b125961d1644070e1d71c9c8cd5939f36368bf71ea723b5dc0df0e67b46e52b9e9cf3e31c6d7881f1da1a4e8cd057c7a8f0b039e3be6d75587a8f1e3364cd8b0e52cc9886cececc4ccabee47a4a77ab11791947f660366f03c439a043e87054fdbeafe534a414a76ca57086ae7dc726fff0d8a8cb3246adcf82c12fc98b157546cec178ad00f70fc5ff0f0874569ea33141cea9d5bbd20d71e05eaac5e559d2e399db1aa728156d1415788bf88c3b6e7d393300bb74b4b20b0a662be13ccf6b933be76310cfddc4c3ce900db069c31ae3bb84f8bbac15ea22e80dbfd069b337d3199b5a7b2b5f90ad3bad528e9cf0cffc718e1e1c0147df0a0d7fd60876fba05bf288e2750ec3469525321a8e3912defaef2e80e5cdf0c3007d17b4664c4ea93b3931b26f07dd7565d7ce4dd16dfbc11c11d71b253cbe8f34f0dde877ea6bcf8782aa516e947d47dfedbc104cb99e63af35f0c82b366b70ce7f2b6f70558fb071a8e70fb65d22a902893b753be5cdc6fab0e046f9daa6dbc02fadd98087e6c41cf0f51e8ad5ab0427ffc73319eae0bfad4b10d3c543780ee0937b11fce26196487fe43bd0a103bd71b273e0b1042d42cbe9062a52c7ccd0f51c4d202db22eaa5777cb4ea17daa044999038ce89cc6853f13d83b115702033307e8e94e6e31b6128409d2314841dac18f15447d680950690a75134604bc34913fcb0a0cd6fa0f86e4cc31987b5fe349379b98a0cc2d331f6aaee5308fd16c0310310f738d89dc8c21bc02677c8d04a7ee0e0ff04a1bf83f2a94f58e33884ad4b324049492fadae61b8582f9d653a84b08999c0b5cd9a943a38181c7c57756b3f5381ca9fcd6ece468be1d9ab8d2abdc853cf5ac91b5d2ba4ea854fa47442dadcbdab5fc81444109953496d0b725955989bc3fdb12a0df1d37c95272c7a455ebe7c2f39b2384603a87c256cc283f35b2ee91938c274282f61d7aa7c5654b5c73bc7355d57fa55bb4db48d1da213a558a13257e40a56ab7dcd57ec59f82f624ba7a22c5c6885e9582054c937b6b21e5abaf438f4b53cb6966474e1a604fe0339678af0770e0e35b5fa00501a265186246f216f15903347d9221570254de4d68564378a049d2ff7af47093ead4d129924b5351849859e1a1c3e3328e8789953158672452b0bee854dee62ac6f3f4c44e6ea518426a771ac6a3e2e6035dcd309049058634066f5ceb93034c2c09036b0620b6c39dc08069b25ad2698c2de66059df5e04b23bfa3c5b3502be4c9a06b4d74b870f92dd29cd00ee6db9d5d89b861b1f25d78e445ae59a0e45ca59f74108c3e9cb1b5f6cb437154efb4dc4674df1d9dd5ee8e44203c22b79a3e7693b7b7063001c1806b4b04728a4d07e09cce3f2f003280271ec01c7820d46126adf76b0f2a367596dd8e81aebaff9a300c728d5f8ab58dbe8e801672c32d81901e1168009f446e1063dbf6fc9d6cd5fa09722678a95484e7003b783ad2f6ef101484a84a4083fddb288500133744fb48a90550d3438d7ba786fcd7a0b370b83e7149ed61f1989709cf0ba5dead55de2aa7d300ab7bf84b00337967a31a2a3ca3cbf9364f81681b7e6409fd238b8228954add41dbe8dd8441b390c5b2a9b6b189835dae0e2eb21756e04c018312b86f87a9a8e35935b951f123200404bc560765278d1a427379340fda4e22544d7a333ac1b09321e0b97ec1708912da2dc05ba43346199ac56521295729c79bda0bfd334387057e50a5b3a3af2d70ae8bfaae20ca830f02bc5a96fe8698a19f86fd198a991c72099ac302a06051b0fa7ac7a06d18838c05dae4bb550d149b664faba0014d53cee6a6ba89c726df1d88ddad09f5e135e108b228c59a22f4531f3a71024160d53c4f0e1f4da9f6a973a1c97461440555610078735bfa3ce1441929d32ce680879aaa26d80824bda0771b03d98bcdca4f65c792caf55fb33524f6c7bcaa56f6c1c5ecd0a170715dd5b817d0e6e04b54b2a7e70644c81b402e810b17d3590068695e3c9438a41208595720400a1851d5069b973804b71baa4c83a4b7bf2b526569aad946cd840caad8a9c635f45b719b4abc62bf622b2591752ad558c683d40d6338261f5750cd1c4b30f7479f2766d9d7978905280db186e05acd5ad9a2cb42f2e13410493db8b55369db3d138646390077cac1faf1281cb5b79379059755fe8a2c9046b81def0da62df9f15e8a8fcd17375f71687dede00c82262c6c6e1458a3b60c1ad5e5189e3a27de5a6320966033e52f1eaec66679bb0650a323dd46f3bb92c7dce89ad2ab0cd7510cfd547735018bdb56675fe2bced0f409d872eeead7bcde785c160cd04bd032c8036539be502b61d16e8ea823278826e19ffa6e9be53b812abd49b80bbfb2294ee85327111034b05d2b76906a6b9d109b76758a1de29892c47208e03108f168c82b13463399d6ce586cfea94e9d77b3d5f85ae2a29b1db2d1218b6bc95940d038dd0f7b9854dd7bd05d9edcd584b26ff95de6a1f3a7bd77a01326a6b1dd9b0cdb14c4fff83e57ef11eaafa987a13cc04def99853067b537078765105e8702659e55309558a10d1618a925b72aba2a664123eee2021ed930871b7a9c19260e35b6a57d7a7fcec1ffa259ba3b606d08aa8148136cd71dea4b0caf2639f60e517880837c1dbca22251855c124afcfb26090e705aa128c5517e36dae5e7c6d11447a814775025b4f02d5f05f2fccd17ff8b2938f8ea86ff3481f0a7e37c6304f18a238a4033e7e91fdb16c077f9cffaeb56ad533d4d6262608c9c0699e8d3b4b0004097a11692d48a7ba7c98d19eb13b0955b0694b9a74b6b628ab6517bdc6e893a9a4bd06b41bbac4a2fa063d7d142aad50112226ed040b9ebea2d91a1af42e740dc37898aa5a89ecbe04a403c9109ce79fda4c04fb5bf33251006f2ff98907569144652e0f73564ac6087bef0fff4e150986b9d5557ce915d0fa80e6f0ad394a682a9fb9385e3487dea7d13347d3552845ae0418e6a1c3a879cda23a5deb244b7dd8d839563398f74bb80c5eeb0a8374ef8b3e898d01ae3a3109b877efe54f090b0916d8e07ac88114a5eceeda1db2eada6bec70b6ed543f6016cee03e8a0bd252f6b767f978cc9f71c38dfd3a2283eee692a4103775418ab6aaded50de80d572fdae91040af759ee255419b2deabfd7811bfafc36aa8a291da27148d82d9666066a58ac43adecc2cc1f1f2810bd2e9e2b7ecf2c8c8f3f35329979bf8f9893d8d7e1047c5e9b00d6c9049ec3ee16b087191167188a571b96b250ffbaef3943ccb06d6bc12d5fe0d12df077458b487a85a4312c772c7a61bb7dd9573a76d1e6bd2b60184959fec56729a01d96a43ea4d31e74f903f12442163c1c543fd8f8f4c425549059992c6df6e3050afb3d5ca3f5d1aa008a1f99e135b90d74cc2bda30d1373af76dbd171665d929f72c6f93b124f991d1f8be254f7ce62b6b1752879d0c9782440a28b67be755c8ee263d38947d2f5e369316fc96ac7ba28517a7333b117d7f720103fec4725d671ca5ee1eee2f3c3ea6bca797745b32db33279709acec23236504b964ba0d33eae3ab65ec67c244a2cbf49530ff577d24e98bb03355ba047df4234fa9b68dd17bfbe53ffcff6e79bb858dc9081156b76535d9a4d24d4df7019896249652a8ea57196037ee6b0f318ad31665adea165565913ef939a697ed6c6f8d935f00d05d327ca3211ba883170c748ce810fd0f2e667b0fc4adfab7f1c6d8b91af5f86e4bc8739a24123aacfcece4341397579e021d3cf92c0c98dabeb4a57bffef4739a6e0dd3e84722f2faabe945064296049e24c470875ed0141b80c0c13f0e159528a420d5475e2e07d2547678b68e2c50756bb71753435291fd5166592a6262674defb00cf4590037f822625d3db720b1e550a1b7d21f942d7ec1a25e5ccdd6885ad8b79be8c285a1978d284b4916faec395cd3f51927776bd4af0b97cdc3c797e37060ce223d13ae378cd77efc50d3222dc132d6176e96a28db6891004a1f3405c6168fe0f419ed1e3f44e5d729b5a876dc7414efe950df14b5939939548a218e4144024f080d21457e37d9c17795afcbc85ebc6987ad1067e645421b60cdd2ddd8dc3f397f3e2e7472c7cdc05da70da915771d72cc067ba42305aacae235238a63e1c2c52e498df895de09aee2ed7410964df3e15c623a9fc64068ed4441eadf94864dfc104872bb95d4b44a3570d7500dbc486df232f4eec5bd8374bb03db0e6aba02ebf8e53122f0d13b7be73789bdf4529ebd7bd6c1f1ce8de9c82000bb5b2e34e4e6fa7b339fa2dd172a80f5bf43d16615129708fb7787b01361dee622037411b07be21ae8cc40046b8cb8a4aa3d6bf7e39abec24246c488670eb6400e6107f1931c80187b16f7fb89c82ede9fdf4fa454f418e07cd17469d435a2b846ff67f1b297730580eb99fcb4eb7953121840954198b28244d530dca6175f45069765594fdd2f3e14fc127c125e759ccfa3064fde728495f2a705f2440d9af2c5fd300aa89bfd5a4156eff2add9b55c827e8fb1ab295ca3a3a25c37811a7f53c55c30e949c2bd5c6aec79fb5c984734325ba124405d9d78e5e5531aef4dad104d50550b1bb1128672fa4880573fc68d54cc1cf3a5b6cc61fdabe43d3aa217b2369f4df961d7478a08d9dc33fd06b2eee591bd22d8eced3335adf785b405c8535c1a4b324d8457259e8bf0bdedcb50a9d7ca2db5af0412960c1250ec619966f483fdc352d0d9f1e71a843541ed8480c128195c37e075cd15b0a16e39d571e391a8f0816043aa1c91e259c7ad91331858f81d91e0e8bb9194b4337628c4bf7e104a277e228920aac35a3c4b2ec509d5d03832e2c57d6eec86d65a531a08a25c558b5c4042dd3226adcac88694e428b4cdfe6a758f77ab2c852f571573200d33504556326971a579b31d390f174d38c9106da90392a8337ac515b0103d3c78dcbb8dcfbd5dba5c034cb6c948771f5aa887d782cb7d3185b460edd9c9f20c96550b6b053b1563235b6e90b055530e9d4655c5fb562eb453aa1a241c3f042907ac48301f1ec5632c4d521cd613f8a4fd5f3f06153e1dc48ba0a8df292dbe7bedb905a625b8013e70de4dce12116609109407fa406c5e67ae6b32edc7f8357669565b6ef4b1a47835c0a6f8c013f580b6a273a31b798f1da9df704fad5a079e428a056e7216d60b9184e19025728da7155ea73142f9429d738510ed9e686e7dde27fe4714cb45f9f220e26ac92aa350eed84c1cc065264184a69232c7423fe5602a869ddac599679032a087828f5d4abfff51146af71f93894d448a3e5b4335eacc931198db522fb2e00dfaf4cf31b2744669ef175904f592174de70784f52cb0d8d8a2ff90ffb5556f6bec5979c330866b31354b474eaf070c9166fbf5899de35b1701e5baea9ea1dd31212804ee5a4a01b9859a75ede3271bc6b69f963369b41acabb196ff1395fe72d9e857e10a278e2b20a42cd3256b89b6d04ddf6999fcac4891103966dce9e43d38276bf4d8f5d961063cc247d03496ea05befba04591047c0f3be669658a679a88f24ac6c963416f1858b497922d73f6738b65deab9fda5cc51478189588d1b15aba56a7b1d6f84967bd7039187f7551324205be9d133583aeb6662843f40916794f1fbf81d1f2ffce3ae5261d1daa557e6b4835ba953ccd2db5c855db4cdab0379eb9ea5c111b44f2e71c1757c558968d97af134fac46c3fcf6386755a80d5e1d01ad636d9831fb9e3ec088878a1c1e05d892bc13cd0b6ebd85f0e7c3bff825c516349fda19cad5149cf6284bdbd764ec20525455999cc82aadb3f473dcf7406a527988e91daeaecd64318a44e8bb3e000eb4f75a150da6795ec4542c3e8e444ac7ac16ebbeea980678323955e58b13cba2146b06fd4c712a28f83e2a9fca7169471a31caf3594ccdf3194ed5bf8590438189ba51b122761890cd17ec37e51c4c09d1ef57c09a5486bc66236d5319c8a86c2569533866e9339d8040d8602ca5ce8d33ab8bf64a31b67ff158bdd9b1a4d87be403b738c34d61e76258bb107ce8f4ba6e029e2749092bbe9b73886e9e54caebe3acf929a1da4c8ee03d7322c9965097b5134b10bbd84d713415eb65d5d8d25d2bc4854559bb0812b958040a86d36a8c826d0e572d0a63576290b8916467dd6f020797843ed77fb2dfc927638d15fc44866c86e3aef73b328bec9636253372e0a800f0f471a9b9f14c38a7246cd38df8dfa7c4e0d1b2aa21f417466b9c04135e3a290b887f7a29deb048e212f96c2a8ec2873e2b73b258d8c91c298046057c589222757185472eb6a59050e264a2b16469fc107a1a56e1a8e39ad64f948696b739def8042e93711cc016c9e8e409c8427328172041606ffb1a54f37a99e581bf8d0137af4c3ca884932682963e6cd9a312b781aa0c419b1734e78d5e8e416446bd1e1bdad4504ab061dcc74a8351582a21a392bc31266e4948d431cbdbf2472792c68084d7c7a297e9d34736a0da1ca29ac830fab0f3158c159ccc1626539e5769e2b64d650242099adcb9958f17ba35818cb2ddbf95b8ee42c564cf25b93ed6eedd14eb82ad81a98c7394b813c49169ab8b89343546dec4b58ada177bb93ad1370f290e29784e2adc10a98fd96dd47d493c66546e1da2a1329ca2c5e77602efdda5a40e66e97c2d4ea84b48645756bc9a124bfa0ad7e8db4f2387445b48ac0e1bfcab835dfd0af83b378b41864266b2b8ed8a92dbe92933ad645041a87292ccbab26772c900086b64632cf57db022690d423cb0fb42296db6284fd24a13bef04bff72fc2a3c0b5664866282a493661fa5b15d20b1a4e3ea9e62062bd22a94e484a4cd24c08be246a392f872401a04d9d6992549279e72165c570a08592bbf712df14f67797e80b506f21923c90062f00cc91da21605602f634182e3c27920c8eab566dfd5069b6930ba0db8abb23475827ca1421836d7e593e8798f4ca56439f47d2c60e6055002fb9ec2613a9ab363970fa312f13b3cbff76cc36164dfb51668d4a20ad779dd2d4d54038a2a65fccd0d89c1c2e320d8403c9c2b826d7cfa0fda8070f977ecdc88c3af1725773075adb1fccf662160b2b9c3ce7b8c76dae58212f323fa0bd85388d418148c4189464f3584b7ddd25971e32145c453df6002a4e142a04d80af39b43aa56951d6d4ae08373e4867afd327eab696fbb119653680a1e7be9167c485b3d7fff561b728aa877fdaa8f8e349e69ad2abd6b3b44c1ec86378589a8c7015f30402da2db51172123659d9915c9bbad2ace177c5112767a180e84e9ebb706c067556fad8d8e4039d35afca2e893114444437dc6f4cbf41e37be499cd0d207b937324395585f7c08b76c496812763270d7b885cc63e892695e9cb5537e210826799b8d40cb3b517e3edf1abc901a5fb8a0034784533015449b30c97c8b4acede3b4338277fa60062b3ede6e892a35aac834e0e35060c3357736810019fb6635435cc4280a75274b37c7083800c2a6c2b5beecfdebf30dc3932be1ad3bf5b2c33e2f2b992ab1b34b8a0b91edeba105de16d591a1125c7bdaa84c322f8badc126a94d129e318bbc0aabfe282228c3d41465b0a24e0055e5dc51f08a0b58e7d447563932e2df17dc4608066aca99a1833884da98423408ce1d28fdd965097c51a190dca22de6b2542d9eaa06c78bac8167cbc447e6c205301d534cda0400c6e8a5c7434ce2579b2a87f18a0a894b95f1562ce53a12f2dcd9a4f0acf3fff2a85449ef219c473847cb83b4f3fb827be3590afae2d439daac85cb86dfc746d9811cd95025ff16e1bdab42cf4f283746a9354f9372fbfe99425559c09b12379407fe55e5fab363118ab25b7fc3fae2bea698575730b779a5ef6539091f34b474144c324a74f04f2b7c16cbe911bb8ed3fb7b61a63c25e6ae1646b187e892cb8569326346733aa270260df7b4691065bca16b8205ae3faa2e0edebab8fcf605cdae526f9c308a30d9c427025c4e78b091373d6d222e3a6ae1afaff523ceeac5e246af7a4ac616340875fa4202f2c5bd0bb4fa72a3243c35abe9111eef3fbd7acc2abf894f9e6b160ec0ad12b6b9abfa8420859b589258dc8b3701bd3e71e30e647e25efd9704f90ebdf47118f3a247921ff1aa006a1263c5513c446e2d98994ba09f52c270543c13d715bfee17b891adb3ddc2dfe16a4a82e8e742118ab5c16a3faa2fa45fdb264c8fecdb1b8a4c8d507cc7656932ecdb6387d384266c9951c9b7c873b594d9b31cf884ad542582c78b28e573ac0f5e49437f95b4bc7122a835b465325689095b8ee1943825925fe857884e8ade8bb40e6ee7e51368c0eb46ac05fd5dd28bae26589d4c1194ff4241f587da454ca86369c1967da28727cacf490460f9ce122a579e01e7310a5dc691536ef5a40fc504efe848a09171e032a1567e80e4197e087b7da9578d710d7d4c1895c2a78f4b96ed5f154edf1b2d9b0b04da3190515365c45943cdc773b0f1a1db2ba22b210a708dc0b6c95fc24869d97538f3e55d0c1d3c47faa462d2d8718e43b7d2b1820ebc8b2f64db6daa6820e7a07a120ba9f0712955e043e5e804978ad4bb5750ec5f77a92196f6d206694b5e622b368adbd58da42a627f376fb0f3a3b3a223a3135d5e8415466344f9bfe2e4adb3030eb31d7b0721f2f392abf4a8236a08b7834e9c3b48134bf821a200065b2322d5cebd279091cf82903611f6c471e8676c85261200102cbe645b5adb15421feeec5108a7e8c3dfb39543ac850f202f03e7436f6219cde81e8376d88fa531bd8e3ae50c664876c180917b0ed5f68f4ba8f1a20e2d035433d76a81602307382c594344ce1a38d029115e68b4d58139b593cdacf4d3d58242e8bbbd4e2d80efa8e8f00a09480c19918fd2c4c3e8e76cc655625c40fdfaec422a364ef383b1788ae22b3a5ea0501cc66347c566d3d865619c5f559530e555df6405062e79f82ddcfbb97ea1a1dfb52690b8c0c1dac56ccb9420f7bf09c311c7ff66b87c265293ed4b95f1f2a8b9ead1bc975933d31b7c080261f9954edb41fb646c9e40e8a1a12c3f88be7b769e7baa98bc2b81b58d61ad37a72ef6df8dcc943954f8f1c13fbbd50ba35c30b905c54fe29c8f554e99c74c5d4bb16ca1cc4d3d850d9fa99cb8b08d5a852507facde5fe8a926857aee60ea019a12720d8cfeaa2ac9be0db51678e03a04b2bb7a361ef395b8faeacb3fa49cf28212b19de857714ea2f3ca90fc459677999db4f6530e798820f14f5093254e243b66d110079c1ff8db2cc797b5cfaa093dee2dabe78ab896a64e3ba875408300b864316beba32a2ccea3115bb1845cbdce54eb17dc6c41db2774e6f9555cf66c7bbf52b901732ba0d6189699171720cc7d500c6bb1be8a81d124101b6c3b46f180b30eed4581d820877b87c1d04f2e2714498a52c7ddc0421017bde9fd4cb757e2653d96585ecb41f544c780b7777ca93c08b49acb64ea43634fe4d114f3847b9bc4d4565d41081e90f9282fd2e0d58d2fac23a6f73a302866d884a4c13e6e043a310ad4e5770fc3fc95b893d6950328818e355370a143aff55ccf71177a91a22d794fbcb902e146203547285292bb84579c614d970eda16b27952610f23ba293282d188eec9eac5f7116b5f9d0de74ce0698aa76ed05030c7a48081c0dc20a0c68989077ed1a313680484577a3a0bea5ef3388bb63713224f25654a6023d00f4755b642f86ff439441ae6326389e0bdb8a7b2e800c2eb131314d4ff642cc028188a34167fc8faa5c6d62fe287ac546d158258aca3e40ec0daf09c806150d24837a4363c33fca0e71fb1dfefbb97125133fc43dc9363d5de109b64af47ddd983307afc18b00a3227a53811dbe4613e17da003ded4e4fd54e95757051713f8f0d4e0eb7af372affc91ebd5dbdf37b76684f8e0bac67d337190b18e122eff08297a2bff3b152e106df3552773f7773bbc69cdb562934adcc33ab076207c4076ac7f0a44ef2d90bf640fe7d1116b27319a038262102b8580e30bef1d0110d6d941987160dc74a527c8d19e0ee4d4fd11c14d6bb7199572682db034b630199fb6acc18ddfc02504a00ae291594f94744586e2d87ca3ca59b9f240eb18965c066d7dfa5b4a7cce8704bc584e519337285c97a3c387130a0699eeec3587583e5fa356f7c82329eaf82e154696f2f8c5283cc7cf57392cfd8722fb04e82e27f14afe99d1f5d710d1df278217df7f100e63441a022530b2c2dba9e1dd97e2eb0acbf8d97299f27843641262523ad59c33d038b7cd231f7bc562ed0a7bde2710f3a8968ed9b95584c9ef2d15548a59a120d1daa05b258ce694719fb3fca6102ba49a578af724beb21c57e343b5880380c6afa974706fe76c9d8928603ff3600488b154aa4d5f0467f429fc9c99f2adbadaecb8e10a20b7a8ffa513377297d42dffc9415df306237bb6ce74a8a305504a9b8bd3c38eab6d25cfaa0d3ef54b29a65c8aaa1deffd194010cda008704a675c74e4dd55ca645ee5a08eae665b1b210e8869d3947d1b0252e9a82f7f59076eecaad90ae66b89090b549d036ba2a26bb0d816a92eab29c700cc7e36c06b01b9bee0a168f3bb6a8425f136fff65de5de4ca63e35ad410caaa6d2e77e58f597fbbc8ef0cd3e60eecc897926182b4cd80adefd2bccb3a6e1b5486710b9c63db10805e94bfa55150f9128c2b8428f101b3fbaecc828b21ca5fa0a47da97c00feabd89a69a2f995a74d5ff20a16266f155d1e0e22b2281fc56dc6f2ffafaaf2570e2d49b633b3816ba4181883275967f44b4faf9758678ce366b7e3a3ca7abd34f479195ceaf8f93e7af8831da7c47c149716c3ea0821f7bfd8d19cd267bc7c49ac76ad72536c3194400a85fef2c42c5720ab91bc1d59344779093f1ecedd0d5294a129f6aa86d924e12b34b96e3025b51454a1147f8d21f297aca4e439a69acb709b382ded820cf5a2149589819ce6fd01e06d42a50af868cb36791342ffba3388c97a304c8a4141f645b8450b76dd971468103c405fe6fe7ac4a5a412f4b85c675cc24f3508427393aa8246bc834d9f6393d8fcd7a1276819d606f289cb42a92d817c58ad9d5b0308472d7f9beaf150b2aa79c8104b692d032bc755ed1503c9908eadf4e2e6c2c6a6f0a7c1f2179456ff787ec5a2b6c3e02cd6ee51c32876a4959e704e883b7f81287eb678b1b52b36f0433ce5801dc2cfe5785aa37fb980867df76d6885729251ed88a01578570d4c196c47fb2bd26b3e404d16c7d8cb7b6a78be7150a15966196d5ed3c9f8f80e22608ec140bb593ad1cceb85912b2da333b144c89598e0b931d9be4666b017645afc43fd477b24829d197d4863bba90b187301f7e212f03935ec3c01b38081aea57e87694a6d941924584a13421ed55e87ed150378380743214c1d9c8ef35f88a915a997c9f689012cd6484e020c9fe50bdee32eab128c53abfe391f80241fb0209ea7558978aabae6bfde1aa5113cf6448aefcfb35ee1d0c5ee604e5dd7593f0ec5a229d7ffd2c88b93b0882200475cd0d625737d549f4a8ce680cd1c1235c505b4ea7a84094501d7456598a7fec086d180ce838ae0e606f2146093b215501d7d67d1cef9e5073648cec9d8e653f7841b216a9435d1b9c25bc6b27c841b5e278992136d43950ed2e29b10b50832379be0062ee742944984d743b9d1af4583940f81a97559bc887ef106737b89d1320df47a76e9a01e17347e045a8d85ed8b5bea7aaf659001f512204a1af8553ddde0c99b95b77b35ac0229f2026047a960c9d1a17381f0c9991e6ea5e1f35639129066ddca9ee30cc6387c7e7a1ba7fe570a4c5b771a060b965a2329c0aa109de6b0e9593644b3236527376d729e1ba919a635abfc24709e3cfb4a451017515d20d407706cee57d84ea4713ef9c65ec8c6b6afbd9a502225a49b055fcc3ecb048ba3619aac4afa5403a8996c203eb791935409b134cd2d10e9106403e69a50b2222de43b189ee4fcd639f4491e2a6fbe0fcade50997a0201dfe78dedadbf37473b63ad8cfce838e28bec61686e06230ab85d19d6c483b73028c227c89bef2e584164f92210ed212eb2a400b632ce5dca038ad86a48cfd32522b7b37a311a3b5697603cc36bd27355c5d4be90c21920d9cf144937eb5e80f284f8ea6c50ec8fd61efceb5f79b819e8bdf132eb6ec2cf24cf44edf08d4bc01ca4ed15c934a44a3229222510ec59a375e26a588223995280126acdcc647750d0eadae8bf9bbe56e35ca5b92d414e73cbd7d44eb624611c10b7b756e2ac940f7d23e4100f3a0b6386142e437bb0b9e56e21c64d30beccae74121daf6643c4936f43ad8d4e23013169827e012e34140b13ab2ead1658d25b406074214ddd207ae7fc549f1ac72da44def3f86756a05e2f6fd0005dbc832a22c9628908810ee48fb4f84192ad39c4dc9bf301e89c49153823a984f188ab21cbaa0645347058d0a989e57eeace8e56c5b4657c0cab4b96db0c754cec70fef7ce505ccb07d075f55e716167e07a879952123e98b776f538b28d04d6cd0e8ee0853b76d0f705b8eb1d9bfd018535adf496103d4b84614723c69e0e508381b7f73780bba56937249a06884289819a2f94f26f654894567637c01d3a120287a24c05d4a5f1b0f374cddc37854d2956f118a357ef5076eeb515c2c9dafc0e3eac1b0e1bfb877719b71dd3c1ba1b4f2717aa21321dac8e06625a0a00b8097289b04541fc702c89ed6741a3cf9e051dc18c50e1c5043459c8fddc6f2bf034cb4a2d411c8cd05b981db51ddce0d0cde98e00e89aff1f83fdce64352fc05d39c5391cfb6f45218b06f7dd7169914ed34c6b4cb1735572ab78fe5accdb333d0b064d4e6f231b8a7d572d0fed702e5dbeb23e9fea700eb6810d5517d28615b94ea3dddf65548c186e9a33e8b06c0623fa72fcefb7897f2bec02fda2f863ad42e37f59ae63dfcd1a31922b5c26dded461c46752a84ee58c928507705f815d6c64580d831b8e95cbc9fef655cca14a08854e7db4720f937aa93c39e835266cd3961a9ea583d903f6613f22d3f4917c4a0ce03daf2f1450dd650e5042922a91ce6d931a32f7cdf30c30858c81a4032b839bb7b81e3d936d4995d450532445b0df68da9e7540731f9ee76e9583255c2b227caa3db16298f0e45c8a146a42887d51af42113c7aef4d5bf05d476c95d2cac9672726f29c7c07b8f6f43c5248e6bebdc67eda7ef1bd8f4cf6fa565d0688908b2a76baa1e174305248badc66b883e19ebcf6b81da1f92a4086ca4cd7330b0b1d05c22ad7d1f565a245a3a50191f05b262c0f73a3872bbcb176b74f57cbfb0e1965fc22e2ff5b36fe0c92275427559c7051ffa188917786242424faae1c27a1139aeb5b9987589829d3c7347c91046a66669878ec90a8241cb5e08a34044806c0b7983fd0150cac5ea0f8ff0aa364226d5e8b3161c81736b6552a4bfae58cd2410c793e942d3908f525922ac1fe952b1b098e29cd01d4aae007605d853c57a67d38f805f2066faa09147accff055f2899d853a88bc709813940326733dbef3b3aa8772226433d72ba932c6ff743a337ff4c80771cb4c8a8d09eca56982ae2489ef4310230bd90c70c5f523a0943b063368fca49e650bbc28e646b2d0f54f02fb3a30270b9426bb2800086e2908d3c619e2c42ba53e60dd8550ffe0425c84648ad39f50f9e89bccc920e7ef11c2077e952adafd77357c81252acfc14eae7740053a894217d8ba7773b62ca918138e0ae781575b8a2624958b9e285a5bc83f33a116e69f85dacc1a4b3c445f82298100cd26867eb4046b6973533204648b6c0c428c5c29630ba9962178cd0ba08b2159a5db4df5605874668b4e20e82b8edbe03024d63c82a71b78d88252bc25570ab407158806e8bd272b6373cac17bb89a64676cb0c7ad05b4275cfe2c6a31651bc70ccd363c5c738498c6c8a6dc4ae47489205eac54b4d760f29633ffc7414b145205d230ab47e59a9b24ca65cd012e6dc6e7bd35a49cad478a2fd28da59dbe862c6dc1f36269c05458ece90743329b18b6fcf04ea8e6c7f2d9e95e07969f2ad6c82313738810b94a8cb212f19584ad001cd98dda7814235cba399d6f197efd0ff7f9f873e6c58d6bc7d427d74634080a8b77f2c466b06a6f5366adf6c4e08992add02ca0eeb0b42c1ec52650852b335bcc95939509338f4319c4ce602fda7a19aadd8bec14516267e8b8e63e06a4d65edff43406e5017f8f53f7c3e90920f640f523b22b5b023706a81f4847920b82219e8a1fb372d6a2cf84761446934b49db5c328b7d1450c1806769b2beb4cc2d72aa35b46d510fb954641ff1f93b1ecad7672894c35b0ca69d98652cf0aa564b340a521eeba89c1a0d1db6e95ca9f6d3c746590e672c4f36398b52e26482775b18d83d1d30a42e99ce9c1384192a7488ae970b76cd665c90ddc09e4be4ccfe9b3cd56da23a6e7668c7aa6317d6fcd633c1e8be4dc237df4488d025c0f5b97e860d466c984e0741b0eb3ad73fb2d60ab1f91b0e544371a29eb481da1a12554fc407cf6cf683e05e0e94c7e02b30fcf8762025dc68fd40dcff1217f8e8050d9f4433679a4a02174633cdc454a2002fedb65de5c5383e010f2dcf9e00011c588ac476b5fb7aec023fa9fef76c4a90d52e02cf2c55bacc529a7a72e6184cdbf872cd96bf4657b9824f2dd5dad742d67a71ad106f86a036e7b163e806448f3f2ddb963b8f7fada5a3302d8865532372104d304c93fb91893448009d7bfe2af6917a49beb4a39e0d1ed57825cf59fa41c5b374f20489ac6b2a758fb906e87905d542b4d9264ea5808eae4fc2869565adef64501a8f4e78187c66c8bfff7d7890fe6092180ae61661a0d0b49e2ecc5a404e3fcc5b655a4bd16c2f80e1d956b89d99800ac37ca86bf64ecdfff639de4bed78a2e79e9b34082e618d47e0ae4140a571c4593bf633c645105069aa323782cec0a3a2d4eb38c8c4edcde39f6ddd4fce3bc64e899210fd280705fc84534f3e134288e2ff428e4a730eaa3031308f9490a37d46284ea3c94da7998704a914288f6fb23473cf618879508e560a9e7e1042f6b14c1601ff1dff243f9a2ae71626a774ae9f9e7cc7117557334db002954e3e0411f44786bb38c42e5e62515629e78899fbc5d7270ada5e72fa882251f612a7c8934dc841632315360117c16c42bd782c19b31d654be4b9d475423747cc404f0904045b0d790ae0d06111e1bca20fc3a8b313851d8fdc79e2c955ca4d4359b2c7dca11a7cb4e2010e8ca863adcc9a319fd943a4e0c017b8a7dba0813cadbc745dcacef21f017116c594150120002702364950d26684d981a9cad39b459303d710ccc280056879936440bb40dedd591d824635aedbe8993da6ffa02af15169f2c1f06b32e85b95054c732bb6090b23216075e54616d86975514be651a8a8d0aa886a8788cf7134bd5a5c916f2d3e4ec0838978d2dd1a07e646557f9e81590562061d547b379c4711cac07e47c46a748d006da1c62378c9082046f40ef0be706dbe4f900e6269908c6b895420f3669f181b5cfc4a61e986e056de733d16dc5522efad9f9a529a63699d8dae32ed3b685a6d20433307a75177ca760691fad663a866c2227d55cf53b0ddcfc0eac275b9988226a24a3a874f6249f5dd307e7e7f6454c1ce55e201d74fd386f177912a4c2bd28235beae885aff3005b34fe4dbf155f7f704bb6e826d228c3d576b2ee7deb2d630a62d18df401e72d4433f79411af9913cfd9512b781685feb7d85b4c9129797ab80c35be857e94098185668b68b091b9a7fc388940808caeb037ae804a1b6099963ae69acddbc6254f6e2335ca93f678f620bf5d9e2e289c216ee868991a97a573566a921b42a8c95cbacb22d942e777359c3e91dbe06a0b697d41681a662c2ee46402c1c4eef50f4d8485d5aa814e628265ea096b64bf86f75952116e398a4b7e1b563ce2dfdcd8bcc0883b7c959a25f276095d1e9ff8acecd5834e1f0f192160fb51c4785a34e17094e6dc6f552340d39c87093139df989dfc16860e9a845b37a240ec26d2ce67daadb1526146b8c843326acfd4d3164b6e06cd41dbd2d95b2659c76adc67c225aa62e4fc05cabec1187890c26318ea94bec608f9c3deeab68297775767eb6ce653b5175bf54377e8d2252dac8c2695908800498ba23a1d8cebcc8e563a12d837e35d587deca8d28d752a0e305c683ae08ab1cfbb67544314d30558e2edb69d3f217de1fee9c1a9476186ea3a5cd12294518888e0e11e78a35195de4142e8ff049f06660b21f4b83ae971b0cd89318d67b683b9799cc81bad607e2b70c24413e51596278bcf3b8001166c06e6a81802ac6f1eff3126c108963e312692f830713acbf6ed781052b754824e91ff811a66d726365dca8a226203d6902c56889bd6fb9d6701fd00b88a7f8d16b078e18b4d318b88e4d9f359d6c15f12c94e5c38a4471400329c851362e60aa456733c230448be012e460d8c6d0c955314fb0594ca6311f44946145e3f85ff31a532e70cd513650cbd306b1b70201165af92d6282e9865f6ec80d99ecd9b4a0142a2b08794284e447689497d4d6b9d0f81a6276c7866270d2fcb778c4c17fa067930b082edb39b414fd525a5b3fcacae6ebb0f4616abba436193a5b518be309f6792344c21fa0d8ffce5afb86354bef0c79991c0048788f0f7fddeecc605c03f0f5236f413af7578f06d39d412d79f98f922a9d9294663f747523058e2ff7216ba3aa2e3c3fe3ad3859819a01e229a18b2690cc69dbf0276c9d3d18df7da022837403006b8014d681513075640a5b88bd02db0cd350412d19aeef0493e637dc4a909688c0959736e31679eba8de433194981c8b8170d857fe229b31d84ccff5c25430e14e555f84c79f75484a592531f604869126a54f48745f0971b53831db55f537de59b925531d165c46f12536b16449f34a6be4ea3e85d63f0997c531e5338d2bbc519f62b2760882400f0cc8fc328328390baa1fabbeda53f535f26ac12de9f5c11179065a5da2490fc43da72d707fd5c93cd092b9bac05262d89fe9af65e2cd71d300b511a00f91fc8f2275f402c18d210ec11c1e19fcff830268f0618a91db8680c828d7a7485d1abe20af4daef3623b8cfa4b1cc14d56a27a2ea442e983c21e783b08d98ed24e1bdddef014a690d6bcd99640d05fed69b22731b50245b26305cd1dfe45d5d9dfc5951c65ae924c54296db8eaded232dfed537bc5d116bff6c9078b8304745d5cb6ef5f463ece582385f9b047e24d37f0f2968f36d3c8aa68745bd8abddbe19f08eac1e256eb2ad09d31780afce29fbcfb1a55fab3abe3aef5032b4ed3af109363441e65df8585b46074f4bae788b4fd8c29e1f19bd748f67b9948416bec68917bc59154585fa334243a4b8a6535e29be945a41d1e4cb21b47143d32cd3792540932cd14c9dbd85a1ccf4b003ec29b79aa7040e3469d1910ca81e479128906c90f45f5bb3adde816e7ddedcce60c52f04f38198396e4b05445957057fb24f6e63d8fec3b6544b852d994a74c96137c530f16c584db4052330c9a6a2b3920b7de773dc6cc8a33b8613111d24d94275b1b3147673c9c02e668a1e5b707cb6572ee2add191ad9e0686a888082ac9d0781bc92ebb432d34fc25a5fa38f436d1a5321ceb71c6ef101c44ca491ae1277375937d1aa7f27065db2ae48717b068475999f7ccd021f6d515838799fddefb818f9be37eb0a4284ec8ae874181be6019bd6f900bc5d832bafe754a86314a49cf3857416e92556ce481517bab153db0dda986a10d32522f1559b34948c47dce4edf4346b39328c25d9b4ebb04702c47d99d2cf9af863a577283cb67c9aec46e5c70062e6048629fe02df24b216df7f1afdeb5462aa5efdae8c41b29222da3a0b835185a41c5a68c46aaa2b6dc24272a4f33d3c948016763f3a2a42f698bd8e6a02c4883924e6cef3eb7bc4343534a3d7ec494e6df53e07b873ec0aeacab1a8f836c9ac5d9a390a57843fc1235d383f2a2bf2d1c1b0d162c628f08d8a2939f319f1a912371794a4ac46526b3cacaea6c72f68b3e04ae69f0b89be493e490a6548f32bd56ac3cc6b3877815991076254cc9c8c7909892d8252ea78fc8a9c5384001f04278a716459cb0b4b1f38b0854242b559752388202da0908a88eeef17d17ca6e77f77daa9408446f7b99a20f60e820a57b7a8b94408ba77e04882d0fb25b9909cd37a882ef780c87fefc16ebc54d4974ca2aa2de229c998b8f396d4faf5659da1a64a41dbb6a7390baade543d0b3534d44e185510fcc2a40644c8ceb149ba0940d9ba1d3b852d90dd462dbc017f751f15bfd169cdc5457d838b12a9b0bd58b24f27121665ba441d161eac1c113b0ee34f212f5b40e2d6e394e1e9715955abe5990d92a8e1051b584b62ad71224c924b5aac527ffb9fc74a2acdcbbfdbd1178671b78f14dc9f94215386b7924ee1a529f18e431d17dae30ca674a49f54d115f8467f72f20cf1306a40a79d06fbf85e320450d817001311ac74875af2e3c94eb19abe3a4fa8c57792192bef621338a9fb5d730c328a72f8bdd254662ab64d5cd144a8f057200b202e46b5f0ed68ea3f6eeac22c65017abb959deb298fbd8bfa99b752e69c15ea16df3b39078209305c05832460d08c359512bf3b90ffc2f2236e247375374cd299897e8c38f427464ac05402ebfb3194d6bac1c065b190ff17869c1129d8de148aba7f2c44229f9b0b8a0958b5352a61f3b1ddd8c149e4987dbadf5c6d38fe7d18bf6b183711133af71c6d30321c3a6af571a9cbe4d38eece6cea1b6863e5dfcd2b0de27c1467685cc05272d33fe306ef31864d7b550b1d8b03c00370026010054544983173a510df30e479562c2271c760ded5ad403cb06e21ad123deef26187bdca6f1744b248d6925bad0c918b833e092c479a6e26f06410c4c7875819283b90178a631c2e74f6a6e0b686f7bf1fc8846a7e78e9cd74b9a80d2df6d12a90143a8253b87106f5c58e95ca9f37c03da7cc9ab8f86930c944740331218382588f7f59c536e4ccfe9c825e6774f637e5dec8be8320a6e1af15646c1e3d0e98eb773e30f6e7fa98e2373b751cb4a0f83bf35fa31836cafd37812eb8fcc0a05b7a0000b459f47c5045c63a8d2776c77cfe0871f167919d4db194095270fb871485d4247be9665010d7ef1374c0aed0c9abc8cc1bed69aa13cdee3c3bb9de097fed41a55320a0d9094c9ace1f16a6aeee006d1a089ed7154d697567ef156040e52b0530953199efb7481f9761b9e3e74a7c279472f747e26e1eae95ddae2f63d5addb1a1577e7668402713ff2564ac98c7fefae188498534b9d8fc9617fbcf1b9929ccabae4f8a459ecff94f6229002c002005b87f544a811989f6c21a8ed2c5914432f5cb3e8ff606d66ac197573542bd0c040a21d9dc6bceaf92975fbda22d15d20bef7e9a00f038316f46b2a5e368cdd283c4223d1168da985a425ed84069c2efe84964480b4e243f930464f083544f05f58fcd261cf154549909deefbc572108a8e97cc736e5709f094e62403050bb3906214f97973d7dc562ab739f2ccad186e6ee800db48ee92e8e6e8fc033a61afebf0b7fa4d1cc6b39c78c7ba5a41bfa2e927a624b04941bd90f544a208595244319c5da00fce57db3e6071756b0505c337878b2bc50e6d8e1ad58ad08d011b1dc967cd1d82a8918c0b86ca6baa7e0d0b308c17c9eb0bc688f2b770428e9e9eae92e17e372c4a09fb51b01a38f63f214d49cdd61a6858b8c01f2f1979410d0d3f37dbe070b5bb1bb07bdc2b0a13b8bc69e9b933bf850bd2853f15804d2211bcf5092ef4941e0b44cbf7534c8e344ff934621ee5901befad5e386edafbf2faf2ad28c0b35c886f4bdccd634c9c939a7d03a59b0280aa301f2736045582f5fd09a0f471550c2f800c9839839fcb3803aad61b0568fd6661746f5a4277055ab0c9a1ac0e893bf4471fa31320c286cf37fa9421daa12fa4501d78f37a07d7f4651df0cbf8b8b6172592fd8ba1d44d23122f270313d0b6a713d14ed4286e26c105b829647bab9a04175c4731be1d2b409506a5c292970dc9fdfd272275d9679389653b3a1f670e2d0b310c4e29276a0955e48b9bd600e9459de2c29bbff3f4cb59e91a6aa7711dab0bb66fa53adbd39bf2e2e835af465caee1965b8b8b4415e23e02cb9b5accbded8f6e37c613e7690676a5c8e16e31bde748f31618da938409918a52abafc81b2ff88c0f4fb6724f73b04395b5838e884398992086816f15a132aa9b25fbbc01359a37e0bccded3bb06017fa79c711ecd8f5d4079a05d0d2ed897ad9fa2dc24170bb3062db1347f76824c277a718339550e3c1280735e0205020320202ce0c7f87dfea927c346b7930b5a5b0862a449446a6ae0e067716bc5131f85ae034c56b595f633f01f0929dc80f991d8129c0e2363cd7c9a562001daed13b95aaf1120c63fbe8f69287b9b0be3c2fdcc4660d7c8c04694ad4b1a062151f12cb78092a334d73045534024c32a9d076b3db6cd02a959b28e3c488e1339ce8619cbf3f992097bea59abad2784f336f93c2f80c11eda3853dcf15d864fe677a45027520a85b88af69fa74c22f18e997c73d353a68333027deaaa069068e4da0ac883ec62d8614980cf250fcde3a4170387c120a8309f21c13c319148155d0d6dc8e8970db9197933ac1de31e460b339266088f232cba840bbda59ef928919cd951355898f354fa2a88ff7f6c40682facae5b06d5cb8c11b8c088f39c9ca43d8c3290b0ecf12017fdaf1368e9f15c2feb9af5499f498c1ad753852f20d6c29ca114ffb992463c331169967518741037fd482c7b1364d2412dc15b19c08e2acd307bc5a191835c01da2fac4940526e16d5ce5db90a0461694ab94370967ebf14b09731b4506db0d579e78deab858fe7e5092683a3502816b8006cc83085225c920b4a1ba098acb81685e2a9b2d6d3e004302f49d17612d8e8dbcc6cc0eb4d997c1951c6b85042615bbb3e4f848626fe99e62a5d348e1f124ee751378d7a83f539c43f1124998bd21964fa6c6e9219b0656301c0648e03d430de984893dd99351f08f9932d6dee2ba6645b700cbfca5e942aa00df23e7cf9bcc939f7dd09bb006ab32228805233e0fa84a2c23347976be23c6ccab24a6cc2a85332117490bf81b7ecc95722a789c3baa8f99d9605d10c8888c003621c4f101d504316692f80e073c11860f304de37cd023582d53e84d761f2df640c03fd6ff8d57c45149c15c115fc43b411420a08744c2cda551c303092ee8ceef89f572565ea4a1db85d406d7e4c8b0b40fdacc302325a3632b0ffdedc1e2751b47da28db1f67a00c6d0543ac84c6b14c17c1d09d592d016cfef91a8ed6ad344f32e491ffba7318899ee948b47dba0697c98164f76c3c5b1c7c444b195088e06ad36dae8f0a9d3eb9f826d7b4d9091861bce1fdb464cb063185e849f35b5bd04204e48a4a9ac835613cd0eafae834e714196814c84457bfafaae10e6911a73498c4bc6c4138949220375e52f924c25f676a3ca2b4c24429089934761160199f63c80e210690c8d865e94790345f2a73d4f3b3ddaff706bac7f1d2e277fd8597e757e889fcd7c792ca2a5f878d3d580d4187664f2982a1016e85bb0406d79ec2ac1d25f025c8a6128a5eb50e8d43348fc10a5ae3f738a5a9d026d41ea5e6d4593ad5d731403fee88750f7755c11f4ace23444434a8700fdfc8b70cb2774ea92d7882252efed3bbda5f89004eb6278553809f2594df0811cf141ef2b4d2b509ebe25f29e83e09a081a9dd8d0126d9aaba6426e96c7fdf7c41b6544dd08475f66c2101a158f94bb53931e7344aca0603ef2b7f3a4196baf1d9e275b863fb376dd45caa5dd66cfb4f95c381071d58ff3c720fb438fd1f3bc00c8946c6bf9a17754bb5bca5d77b5188aa5e4049d4d020da087c15adc86d1e50a117cc747ae4863be0208761cd4850b1254e09feb18943587620c9e2b3d68128e465dfb1d109557144d2357b52239c7588928aa049760808347a1b4bc8fb4c2a9472518dc942613ef1c15ee16c1b63773e76c5563bd534e34f866100978a2471777bb238302c551366779ea753a58e034559e00a6a7224602947e13fec90439b2ead9b0f5b6a1d3457e2c6c03c3638a820aba9e53eb4f73939c2b8836c87956b2c87a4e6d56d5bb778505498d6410278b471605344feac9fcf6e1b6d28ab5a4e69667f681849dff371b380b21c66b404960241ed197828717fe3e2fdd0254fc1932a328137d1d1be31a87fc5041edc6cee173fe6d39f94260912ef6c6a20c2d20ec9ec76038d8308073145a9c43caeb5c760c5c5021b2b8fc6415cb4016f0f3939c546cd45913ec5053c1b131c623d9f1349ec8b1777855da5052796ab539f55ddcfffa22b2274a55594e40cf8ce8ed22f7c6177d056c179ece0244f622108241e51dac29edd019f87d8823585635946be3092806a25fcc14089de5e15801edaa02ae57a528e90833ad3cef4a01d325d39ac4749b1f01a233ce8ca868028509c0c36b7ed4b5cd58b8c198a8dcda23ea80f6604e37c8c1dde9827070eb48f887743e1a7b0249c4d0bd4c044f722c3b819133b039d52a47058286fed1a0e405257afb57bd8d3eed7662a57e4b6e8be9222c36028bc1eee1cb531001e2ffa2e50c27a3bffe5f9005587635cc650889957139810c45a1f74897183bb6274151c724c703814dea35261c725cce01138e307671dc8b40666f3e423dcf3f1c2ada01d7aaf82c1dfedd27208bbc6fb7e1f92794dd54839ce65b184281b608407aa0b7c9d405250087402a6cc6fa7ae904efefd5908baa341680e155010c59257a49211f268fd560e6d82679272401aabfb59006ecd37a422a0b9aef4e788318247d449209c1f7a63026cd44e164d3c872889a32721e1cdd88eb21f44fe1948d1847d3f3e539423fd5acb66bb611ca063f37d97a971c323814af6e457c3391cdfa19513813615b670c6125411a75911c94b17dc8d2c580d52465e2661d322e9a1aa270a05a40eeed6c07e6627490277783e2a86a3c152df4478b8308a5f5f0af4b33cd39448ff85db334eb0653ff59292cee04a1aecf26598601298a8c1145059a6f3f150c5c5732d28a6f747b0c14e39008b15703df9dedc2110184da9b81e9ceddfec65030cedcca192d309a3f3b97c2c85aa555f24d4ca8973b3b716d05a4cdedfb98c5f44116ad569222ed71c580318be8cc9f5238335deb53396bd47ab37462bdd27949532b21770a24a7f4521e7c4e7526bbb3fd157523b9f8dc197f677965647d7d885bcabf0f7253c4f687b893b91fe35a667e845b1dbb3ec3c54cfa181733f1696e48b1f149ee65d6875c39b3c39dc55cd95746f2f35db21b82158529e96877d35f9f195f6af05fd398292ab46f6160f2de1d5b806621ccccd99000e2bc01ea73b45f6093f74c32e87e9cda82400710e7c62c7d762fb265e3b8e7c3aa1799900066b9014b9f690e998ce36bad86e766b36889ec500071dc80a5cf748f2c6e1c7f7e2c9b91213480396f60e9b31d2343368e3b1f8bbe53e0e6cbb217628d81f506347d7e23640ee376bba5178b9ddd866cc5daae015aeff5f970afaf2b971fd300513028736117d9c1817e64232f839abb94264333d8d5644817f5c15dabf7b24d4cad4fa05a0470ab7bcc0b44686b92b1ef6b39f55597f36f3f70dcdcab98d4e8518700c56b208b8263f03c95532b3f5b6199bff867f201605ef218ceca2d7605bdf99d7a17c9168bc2d722edb2f1c0623b6e860536b86db5c481075698b49e22bbbbe47482d50848cd8c131584ae4cfd78421d8f21dab8eb005d3d86a5c18e740c672333399a9ba385967cad86279deaf5a3816fe53f8293581fc9c3a19938d1819280befbc45b76b5cd578df1014190fcd35c8045ddf7f6ca7020c3706b87365bf8d27442c08b58512d75147df2086e4be53469905d827ded4800c9b0cb5c36979f3dc365c506c02cb8850228e13de352c4585c8eb229728dd3846711c5eacc4cd984d56a22a857b5e70bd0d4f7c1094f6905ef0fc5d5a5b3dc72de8214c8dfd4bf6446c341f6c0168256c238e09f5e3ef96967af50a3f30b1c126b6a23884a06f265206c09d6253d3c4f10d681c08783f0a4830ce64b6238ca9316391d66d14a5e874e031a410fa44ffb12c075a19a6baa48f273e8c0a458a125db93a130c497f03aee698bf0aa3a73d8db29006d947b9e86282e4883a5d7ad02682c56afb57ae35978557130afffa5fdb416deac86fcd38411e89d96d67c706bec6285e12c8db9f59a4471f3a37f1e0ad9fadc15a87e714d53507324696eab61af475545e35bb3adf1456e62c068f59d00d93ae5e104b512e102baea9b5681169ff36e4d52682212ead42d10fe6e42c0edea564d607214c1c5d59290e736898eab02582d1ebe52591ca0765d542c004463690ebdfb276091a92deb1702cc88c8d8f6a4b889b8b5538630423a15447d4321fd6117c407d2385a033f8ace6c1bca9708da7574fa4463bf9f820837849efdde9a17b92ccf301e6233f48f1f26014e19be8f50045eff11b4429f255089691266b441f269652ae1761696f2cf06c147207e17d839891b16b80790f7da5a6f68b6c40012d1c5ed5bd46a59d0e64302006eebe6ad20f60a4b0f61c5293d160031a200e4f2fcb72aeb302b016dca38d032409e4204808e601df99949a1c2b41d8fe3d5423c1409392514003c7b937d581d932828af5d09747b0ab360d10098efdc089e123a19066e328084f2ba15428377580b001520cadd68394c6d1204cccb564ee8d601b58d402d8419c038082c5ee68338acb18f05c572cae5560a1dde612d1854801c1fa690496793a14b66b0585eb792d0e20f6bc1200a00df79dbf3f1c5919a5500d443472e5d2168720db2a051015c6e96dbfa4ed32f9925417223b318ee579c4f669b2866687340cec63e14fc136c019c83caff8a63e388a60d1e429337975b21e8ae4392c70a60ce293ff76d7261147eadc2469ef9866d379e1aea256828516cf4886c7f8c816f8039e81e5f0c54aeb8713b948bd9808d792c226f5d21485aa06584f9b951ba014c3a050ac28bd25110104c1975b74f26b53e130482cbb0523a491d3c34827078fb64e694b7fdba6f25b009f9b793b8a59b6d91fc2546882c2132bca0c1e8434fc85160a70934bc5782b006324aa25aaf59dd5ada966c6036059c0c680d720de90f05193d9936e55855f7adb8f66c79b4f1f4168b96b6ac86546ded8a145975db22a5ae223cac9e975611cec9e6c29c2c10a7f52b77bd81287a7bd676fbd57670f41eadf88ea9b2ff5f42eb91e5ff9944f520f3ff19f858a0471850414cc4c7f0ff97400531cdc7153e80f87f0c86fca0f2ff4a3416dbbe1f4a383951fd3f99d5ff1b7b2ce981f6e0917668574eb41e444a58e921d4e39bf228b1c29c363f1464d47486b41383cc97a62b3162c0c1d10485ec87828c684d44384c26af694cd3ad0907ade9859260410f1d3858e4b0f9a12023a632e41576684c62bcd098a6c071e19f69c90f05195d5187e38cda5ed399f7dcd7bd7b996477b737b5cad630ba55aa2358632ae641acb5ddfd5654548af15bec198839babb6ca9b3c26dcf33ab5ccbf2a2ba85fda238cb4f8cd5d369fd7a56595c5dbfac2c9dc598db780d678fbb1ffbcd69b5b99b562eeecc73109ff66234138d62c1dbfbedfa1af56a7511a3c0ada61607afaa75d686fbd6b5ae73b1ec59e733a3b8dd71b898fb54aaf21d5667cbb57a77ffe12e55efa2adea5cac6175add2379fbbf3956a138df91a6f5191bdf520be00b8556cb441d928fb23bbc55a1ec3a725bb459cce458ba2c24d2ce2586714f30b2c2ad2f666dbe2daf9745d5e55bf23baaa9f2fcb4b27c4aa8ae75a518a3bffe162ee4556b8af456dc05cae678e8bb99fbb98cb9dd6a966cf60f0da4e745b61b6252e8535bb3b171b5e9da29868cbf1dd57cef3adebdbd5cd377aadbe4160d9c5e5db5579e9ec2d392e9879de41cbbbac7c5d5c3cabae9f8f4ac7d3dadd3417916714b8a6dc626b559b0b06eff1dc405b91ad9604ff7e3ff4b4d5cef3fe2e1666d4f29ed52bcc2a1ec3758e83fb2c6d5a6f20bff1f406ed4dadf1dd6f5dbde9396555acf5ee786ee01ebb76ff78ce71d91249ef1d1ed337a8719a5ee2de406b14eea3b6794dd5d27cdbbda86e2d5b62f472aca636b27be2a0be3a0bf5c56397e76c7878b9d7544defec6573bcf49aba9de7f59ae2c71578cbc715580e75bee95decea2db5ba764cd49b18ecb7686ff9a65e53452b90eb7eb7a2a253ddc295137b5653bbbb2d5edc8d58f7cc353eeded066d372edcc4e1ba8135bdb3e5792b4a6f50e7e2af5fdb6f15da1bc7b8e355d58bc9762faebbdb215b3b2c2eaea98ec5d45b14ee7ebb1d7b0edef4064fccf3556dcf4d3e56dea9f754d9f1b1df2a5b022d7a7bd6b9a7312fbafd9e35753db39017d52c24da9b70072f19b6a7bebc5471d7ceaa5bdf7ecf22cb8baa2e096797986cb6c9c76a6f4d3e569bbbf10ec4c6ad2d1f6614788fc0b11db447145d6fe82ae45cb8b3365b51913df5bd1515d9b366cb51db1da9b8728b2ac9ea2d16577eb37114bd358b8bb9dbdded89552b16bcc0ae63cfeada6fd19e9818bc98d8b5b898fa2bae17884fe258ade878d35f912dcad66c928db23cdb225bad03f199edcdf27bb5b47076eb5ed9d2c6bda62c8a628e745c8135cb75468b6ea9daceb12db2d5a86c565d3a9e5517cfea5c3b33476f56dd764a6f5bd111583bb2356e75b6378d899d63f53caf556f91adf6eb7858646fa7de406195d5556fb7b5136285fb86e63ba6b3a5d98fab3a867310abc07c8b966775eff88e9e7f7c0da23758640ba2375854745472b38a6c99662257b3caf3894b1fcfab0b6b4b3765d56dad88ec7c543aab73c981f8b4e83df53dded4eebe72beb3a669b97aea8db33957f2cd51dd7105a27b138ffd66f19bc6449fded96b4a88b5a1351b7a77cde670bc6b5cdc459b2bd2d96ea231aba9cd15619e2be2451667edada7250e66750b77176e2b16bc29462fb71cdb38aee6654fbda7d04db437db9981e8b9dbc028aca64850d676626ddc452ae69673cbf3cda6e2e30aaca9184531af59cb832b7a83f626dc76ca9676a8aee989c9b2b06679dfa8bd9de8d62a3eae53b6ec1bb53c0b77d1cf88759115ee52b29d654b5bedccc023d06e749d1ad3bb1c6a71d69e5ab8adcdd65adb733a6bebf59d85d1dbeb597bf58dda9bcda9f84437f1d41b783b77b75dcb69d928aca650768b2fa12d8084b4e8a2c5971644590c9105932c8ae4b92394a7dcc24bef980b7521802ec4ba20b90823c4c5112e74e8d9424f1a3d64f4fcf4349085047944d8c2882d6cd882860cfcf58dfe7ad6eb17167cf17b84d893ee21f2028d9017357871bb98f3f7012014869930c484c2a801869b2560e810fa228c2f6aa0cd1ea0bd14df032d0617314e888115c3672666560cfef0aa0683f747ece7860f1a1f27349f5c4f57554c5fe0ef9cc1c28cdf0c1c6a0a085340b0000664b091e1810ca89f3bb32e3f688a189f580dca210849d003a5f0ff3c9e0674a40129308387f4d20000cd00176806f40c5000682ba8081a526834541aa7c6fc8780d401551cd0e580ad1a5f80a911fc7faca7d520a2c145680b41000037007002001c026d68085841804823936806a039a15909d17023690a9a0d1a6836c26c28401b0a63288ba12d4315d086481a29056d0659028d6c4223d7e30afca5bf9eb502481438809640122124b04bc0e7460f373c387ada0d206d012316501708fbffe0d388baa0119140f44423ba41a388ddd31478e146d8afb406901838008dc61d06987e9986630a8e09680de069e0051a03631ac8eaeef95cef030f54e000180ec4407340487300021a0e3c340632a0e100f3000e2a1e5e4d2b722087991c65b41c52168a28b6a44170040d0222087e14c893070ded811c1880808106b6e062c4fa779e5787ada84833624087d0a88c9196a0025a045b44d04204c108681208a1d51518e4693b1c902009ac331ac427ad563352336087189a0e52c7195a11143b2c286328aab602969e566b23b6c7b04a9380051a8f13683c82d06c57d08cb4d85ab015f9020b8f3b275f553c867f3ff5d7752efe3416db9d76c31d59c0238c8e394e88ff3ff2345c4ac33d70048776d401eda6865654c3ff7f3ded96d22001b7047903090d97c4a9ef0fa35bfd9de7dda2045a5903ad5c6965ce47d34a1a5e20d1704ee4a9fd3f468197e7f3a7e2ce6ff1d731c7420b1646b0a8c213064f199e14cfdf617387cc1da83b4676e6bcb14366c7b40374859d2bcc2b7c56d4b1828d15645624594154c51528ffff55d82a80eae8a9a3a54e5ac7081562a84885a83032c59b29bc4c81650a2329e248c1468a265210a500d243070a1d2374aea21013059428964401150511146ca0f802458782f7849e27e43c41e689254f1899a3674e9a395dfeffe7a073ae9cb0e3c41b27c238713a51d5c49c26b034b1e446a64b9a60a009a1ffbeb3baf0aaa78ac7b84eddf6612518dd5d73bcab78f1aa979735aed29d7a4fe97a2eaa98d7f71656d72daee253e51272f595ebd47bead47bead4eb16d2f756df59b86374732057df593f03c9cfb0a082205156c91e590ec4b5c03f10d556b1923c96cffbff0ff4c3e744713ea277ba6eaace6fd6cec2c32b16bcbcbea77e8611b41931d86a3f9e4b7ea2381f731c39f506d68e58ec97cb45f9a072b9ae53ef290c7a06e25309d77f920d12c46e25d1fe7fa2685e6abced57fba9370d12c4f67c6235581671cf5a5da7aa7a5e2a1eb3ea1caf497057d759ebd87350c5633f03f23fbb21fdcf8e7e56e3df8b07c21980ce92e561d31bfc9de8b64182585b2dbdc1a4d287529984eb7bab389cd58ec4b4e414c44fc0f3e969c94730889570c51d2c812bb1e7e151ed3c0fb17a93e0bfcc0046febf7463e7ffabdcb8e13deb955be1be718e83c1dbd37b6ba94d95d906fdff35ca00156761ee1a9fbb363fb419e1ff7b94bd89057756101311bbb8889b1dffff6e6afc3fbffd56b931fe3f9236b73638dad868f383841824c020a1850a12603e13892a249a90c0814219246c20f1436a39f93a40114f55d9adede6f6a633ce76ab59ae6ea3bdf928997e586bf5359a3ff3d42b7a3b5fab6ed7cf88f54fef5cce88b734572ee733cf7cda7e89e5b1e713dfbe027ffa067f66aecb965bdb535f8d62955b15a75b4d6fe80de69e55aeabb669a617ab3b4c8c8594fadadd2d2eee9f116b8c55e1cf88f54d49a9ecc1647319cb478ff2c792cd997d6fd5b43cef2db36671506f4dccd688b5cddca1b76f9f595b39cf18ab42d07bade559ed7bab37cbaf3da23d78c9acaced7851158fed5cb39d6325a5a92a8bb3dc061f6c53a9d403f33b6571b6a4b2385b9e9bd87151075aecc49257e63ad7b9eb8b8bb947f0f464cb1b667e594cec3aac9af90e15f3f562b5f395025be2a0ac0ebcaabd66536bab6120e6377e89d6a2e83551f4fecca28a3b3eedde1b68753697e62056393ecb32d8b1bdf11b3f02d59b6235edc461c677e51adbedb3a57ab3997855bb69e2b18cde5f8ab19859b3fcc4fa8751e0fd591478bbce004d892647105c04c125882d20b600a208200800c4142072679a38d3c199a51fec6ce1004d943477d2b890a64a1a236976a0d183860e1a2b42bc20c49710bc347b0a7852ea8c1a386acca86141cd15354ed428a9f919e2cc104c868012228f1046ac01fab39f99cf1573a066618021449bff07f25ffc98dfe345175562e8c1859e2d5e8b2a276491078bc753a503a63b76aeb0a24a93a52aea50318514a493aba43163ff8ff463c6d01913851d104a28c63c31c709fdffb86fe2c77c8c4f809c2ae76dcc9818614763c6c48851e5080f041c8089384b5499c0064789374918a08ad3bf9b1ff36d1e8923eea429400c36789080c088228858a326e98121c60891064d151eff377ecc98181f23882a0e00f1ff7fe6071faa2060e6bf071e7e872a05d420a3430e217cf14fe3c7fc183138dc108216ff6fc0dbf061be061a6608c1ce3ed71eb088b530157a83591383d8a7a23798b1cea8e62aeed24ce46456575d75575d753c8e39d76da1de1dbbaf7bf5fe1f8c0c31e87062bee51394470ac80086781f0396ca00e9204cc88786911d204376bcf1a9214119203f6aa8f81ce09494f32100627c103822956b3285c807001ebcc9450181e223e446cf931749a43ea49296a7310320fa0c7511f364a461c4e70692d453534ac52781023839e1f9323e441f4071920128e4c3c030c90945e27d70fc889c780419f179604cea4714439af8d82f5e7e743953f3d15180d30f6095189f0802f0e607042838f9d44a283e980040cde76896e4630029994f19438c8f222e88f15162b23e6cec21fa3491c0eb7184171d1fa7a4a41e20a400c607eac74b8fac04bcf1911a12d3c3000af4f854e1a4263457caf85cedd1d35406878d8fd612424d5354767c7a33ae98c25041cac7480729131927883e482e1426254fef73966032fd8802c6476c29cd529e33767cd41f5e9668f021f239b6406769835df1d96004a9a5db0a643e1d7c7145490a3d359f2a5678516221cafa6049a5944e32d3678528494a396210e33343d555d201eca4f121e382541296a5373e69d0b0493a5224f271d3254d520237e8f17182970609092e807cee240105290420443fb32b2f485bab911f9a0c729068d4d0e447070e36659a2ca8fcf448e1cb0020b1f9d975099554c2da0f922050cac7d2e4a7af40b81de078f99922f4380c88d8fca810811c9c534fe8a78722886e5978c0fb8963896e34a0a1f2d305107bdb5fd091c1800f2d375c93940c28a53747535c704586990574c44297373202e0c5c8d1890022193214df1c15dd4865c0e9010c0f0460a52900e88c1d1e58020054c0d317321e47c8980514b748f148400b2d0574318090ad4d929c0210b0c1155b0843a7190ec08162db22009519a602546c3490a033834b029c6a6bc2d8cc78c20539352a164001aa7528b522dd02894525d57218a10214c38c373baa002205b25380263bc89409c5e8c24e13600eb2ef3821c214ff3f6b035c0202cc83244cfcff4c0a1510d85419502ffc7f8c2cab099e90b243ca16ff1fe306086cac28e10a9923fe5fc60046d0336b930343eaff6773b20861c99e129cf8f1ff3e2798334c20aab90001c08b5e355f5c0ea63907d3fcffb30fc0cc3ee8f281161e3e3a6010eeada67da3dcea7c51aa2fffefc20b2ee4609a83b9b8f5066e1529a8f7962d3d70f260cb83a42526fcff7b505bf2e5ff7fca19321d6cf0ffdfb3539a4c21eb51fcb7f0ff5e56f87f15febfcbffa7609e3bf8c359ed3a6035b5472071c663d6809437400ab85a0e75fe0f846160d846b912858c719fda2a0a952851c8b6e015bd44b4a244a9d13a28c3d512f39dea2be1103c24c6979018165855c5285ae063106571d3f13fc3c288a7591133226644f4666a6e7f674866477c94b6da98bdf1b359141eff57bc032222419cf64ad3ece6eeea6478cbecb7983bc776ab29365a6146d12b542fe73888b5c540bdadf5a1e7998bc4e12ac446317badb985d72437e5cae5cc929bc27d9f74f0e4dc3dd9e2890eff1f46ecabae4c81ff5f1215c444f811630520c7c1151c6ce1c0c88152d99cb213caaa9461fdff57d313a37f62e3ff9ff6e4c7891e079c3871b2c6499aff7f27a913d3492f978b0a6614b8f2d254d765f9b5fdea61e63f6e5a6b6f37d3bc01ab2cce9a561a2359619939d38655e332cdfb2bb195b5698cfe7859b3263f622cd30a37cf16cbb459d9238b55e3326d8ed624ac89100db6d0408d065e34206a40d4644b93129a3061c28689967e80ffff30b033ffcc73676e1d85d174f541053191320c6c7f81e9d5a8f74d67339892c1128f754685422e5cdcbd0cb0f873ef2128aa63526392ffffec2a5b92414accc03492012f03a8c73aa3d4cea16cae666dae5f6bc36cee0bca0e4bca969c4bc0fe1f0967a96cae8bababcb0a833cff5b59ac87c19b18340c7cf87f938601faff5a303831f0fd5090910846a5cec2e3b9f66e62416c338d589b357bee74bc4c4a4aba2529d9a3a07985db8ee19a1177c462c1dc3526f6556781c8c2f04b3b26e05886958ca12999a2448a88394aaa38b15e7ffb5cf9b1eb983be620875868473c9c0c8cec46668c633c43339231a24628e3589b313263622e9a5ab1bdfb3e576e75f94477cf461e06a6e27daefc0b0ceb5dc575fb5c7b2b97b58973edd1d62b548c5aa0ac4d56b27daebd4e867f575defef872be65f319fe70af61bd0583879e77888b9bd5dabee0b3022c994ffcf1284de7e8516eb9da2e80d6661e737cd436c6a252d40ea459206a684799196d1c2da2ce1c24b7b180a49491ca341bd16bd4a15a7402e169658884ff4e6e2d64774a755ff4f8028bca9a0829808c642b6afc816c0ff8f612c04f7e3d486a2eddb0f0519d1b68fd676e4fc5090915e6362517146d3dcd1552b8ba675129e27feffc57ce19265a82f10258bb34096d43dc4c313ff847b84ff0e7c4b742623bb457b8d782c5b62cfc6395648716a2c16bc402f6862be3ff1d62f65c88035dfc9b0cec4e02de262e8d019cd576855ea6d6f5bb98613b212ff1f76c102ff3f80a8a81ba7cae5a286fc5a1f14d4d9830a6222ff3fcb4bd00c96b372996bffffd966a11f0a3222d240fcf2bfe463e969a95c5a7af2e1d443a95cba56f7607aeaa154da23eba37c4a62da7b9894a46485db1a513417b1b853e3a1ee47d253b9648facd253d9b4140c624f1407c3cc23cad75d3ceaad75f6d873542e17cc659879c5f8edd79e15d0cedb59c5e9431153807d8449780b0fc05a84b042d9015ee1ff713c0d4711c240130a6028460ac3dc5002e111c318b848f8c4ff133d396c3364738239bd9c4d4e55f8e4fc99720484e019fc4901180688e5c80cc0acdbe6c80e65d777e4fe985d8e14e06d1898d1464539ad50414c240a4a27c6af2f0cecccf626c66fff02eb274692078c2fdaefc70f82ff13ff8450fd2ef881f0ff27923a48da204953068918246090684162656fe1aeedebfcf2f4eeff4d387757bdbcff9f859df9a120a33032ffff55c27f19b24998b7e23ab18af9259e58eb8bf24e2dae0a21bb5afcaa561c672227ee9d7a4fe9aca5b3163f773c62a67d11956a56691654f97f9e0f0fd54ba4e26a89c7d43588c4f158eeb998d5f49b6847eafcffefc4c5ab7f5ba8330e8923715cdfe71543778ac4f4e3c44a4a1849c987d2152afd68626a122e2df578ea81e3eb556faae27e57fe1fe8d3e2edff0f805f152e66dfa9759816e5cd3f0b3f23cc9303624f16b1f1ffbdadef118bfdfab51db1586d28c8a8488f2104ad08596484ff13dd472c66f1b98339dc2f9ade2212527a8bb99cba7339224e88b0f0efe5e5313e5e1ec73e3dffcfb3356e54e875f119ccc39de55be20bf3519ef0ad6225a83da29af70cb4f6c45d98891cc93fad2767566428a8872426244bc7a27a2d31d86f9117e3892a6220514289f9468396ace37568d3bdd122410694fd0a0932a0c82ff0aab7480c6a0cb4ea166aa145ef8d2187046cc4631b58e4632c116596ce9efed5cc683f039b09f9591117ff73681790f9ff115e896f53c3e73066811c7b5acc5705b22db0b8aa417bd7d4e273ebdfee3aff4e8d831c9ff99fca2719a22df97f2bff2f4295ff0fe1ffa9fc3f08ffffc1ff7bf0ff53a4fc7f142dffdfc1ff43f97f01fc7f00fe9f83ff2ffbff27ffef04a81cea7cbc71b5c442e1e61a818bca9762ea1696a73da25de32056b95ae61ee5d2529984039e5f206cc04d4802e4c4c6adaac0dbd76211087ab39aee6e7b26c379abecfff911d5eadd1c5577bf2aee3b7ceeada92a9c555f2e072cae2a155fb78a87fa9ebcacf66bbc5dabbb7662257d6b9cbefc166dcfc01a4677d7b5e95cc3c57eb1de586f9b6fcb8b4b4bf7f36dedb47e46745a36cad6fa0a2c5a4adab21a92c5d5b3b9f3128fdcc685f9acd9b3a7a770ebdc750a6ddf3a4f59e01031439a1882e7eae7ca81ab225756aed4ec0aa0eda27656767b27050506507044414a41115836b0b050c0ba43cb6a8096854156982c2ec0c459e2658c163867aec031820a1c3950e058d1446889d910b225164897b0118596e831c4c812437846ae961093625282130c494b9ca92dc1845d020b220384e2e8008ab334e4e308d113e727c44e9c3d2b0b03bb156f41bd0a4fbd81b7dbed0bcc8681ddbec06c1858df68ad3755644a2a4f4d25997272eaa6569812a26bdcd5b3f69a5202dd535efca9f714d5d0531d4d5dfd9fb888f189de53ef29aa7b2a79aa53ef29aa2827d500fe4faa31542795125456745c15e3caee3c755376ea69ba3aba39ba353a32ba30ba2e5868bab22560ba2b9d932e4927a4fbd92345478ed41aa933525dac4c61222525954a11a578525446523f846e4652525213e4a993c40f336499604ad9ffff04e80444aaa06e1310d126108ac243e7ff3f4a4e5499a8301ba4b8f77031fbfebf89ce5a64f7ff3540bbef89f694e6a90c981f0a327ad242a509ed294f59e40f2e7e6c913f86f861f463861f4f9ec2207fe09e7e385151821395938d5c9b9c06b92b32677b7ae14985a72d2410b0a61e4d07303991d3f343868f2efeff49202030e98073e0a9061248122f281d405420a1b01719a4890cf224949d205580f080e24206392245466a484e609c40c79aa8358a2baa46024922880da45411536fa69e905248a40a980086a99ece0b52c745a7a58b800ce20499840539d504699555f50559e585ac0aab6aa2ca4352ed40526d92ca01214c904270208570400ad10999915634905620ec10007227809dd82eb7c3415e5d415e6121af2820af7290570c0c0962080ce49022e410a69d17124b05ac11482c1f142080a4408ba44007b9cb82dcddf0438112855289d617d96403d974492da6ac3814ac212958c92c2d44c8ac1a5805f851e34729e588c7c30e0d1f1e50784891346cd8ded8bcd0b0d9806a656838d58476f0ae24d043d2b04002281208e908c43489c0e9cd074664464403d09146c7151a5c7834740015d9a1c183161a4314f18a2c8d22feff7340f9ff1cb52b16a80c0457103c8d2ffeff1fd0f280911a3307d23870a5860c071e87961a3570003550a606d1bfba8fe88d2bb9e95c3cafbda93e15137d9b68b4b76e96e789e3170d5aa7350c4cf8e3d9de387a8b19583c727bbb8581f1db15da6a360c0cbde72e0cccde5413c5a769cd63c72aeff91acffc0566e2be02b3dafbbd44ccf9d02687929e1c8a430efd30347662d586950da047ef8e276db840da08b35100f246011df7c81b2679e34ad50de48d273456b2552136fe4f6cbc441f99801599c0988ab5912b012cc58b7d64024cfc9f38c8930a24d0fb53810f6ccc86ec500d32cf1a528c17d20a5946921d25c17ce48db424115983fca1e9b133274e9b3465c48019f211e285768536a5ec34c2a35d49d12ccd06ad461ea13a427384d6089df92c15f3f696366e2da6bd30f7d2bb22e79dda2ab640e7bd75dea90afe73fc19328b3a481ca7c7fe4ec81afd8f186ba8eab0c87cc79ed1dbd5ad75dc6ae7f8ec3a17b5ba028d97d8b1128c55a1f112fbaf7871ff75cc7fbf1f31979b2283bafcbf2d4f21b63cf5ba654b5b627517cff356ed6c2fdb9e05023a2281ae48204c026901220384049014407b820e20832020839682a6b8c8a033e84802bd183d5ccad89941c7cb17393a66bce1f2021b314f33d27039a1cc0c315c4c30dbcb93195ab81caf18a132030a97a8ff7fac87d9e6c8b6bcf16b34851baba571a3f68afcc980fca181fcc143ca60fa3f77a40c9f0c3152c6125206151960a4b484e1b4452c698b8e9fda962396fca9f1f3b325c89e2d4c79b65050670be9336723cd1ed0a263e6258b8f8f61c22cc8ff0c6a96fb9f3dfdcf9cfe673f663dfe674dff33a6ffd9d2ff4ce97f96f43f43fa9f95ff33dcffecf63f3b9ad9fe67b5ffd98eff9904ffb308fe6746ff331dffb3a2ff598eff99fd9f41f03f7be07fe6c0ff0cc78c81ffd902421c987ae7e795585dd17c8554447ea19e6ebf67476056c30c0cf93cdb896d26bf29c72a3ed6ecbd18b53760ad4b67d5adaa388b719940b6b6378e8ff6f60566cb74b5fc1ab3ce7e11e58ba6f30b15febfd003066905467e305000034c18390c1d6024a06f22616c114614615821a528e1a1cd17465fd4f8e227cf9e396dce90f9b247cb1e2a35f640b9da23b5a7b607e80c991d449d2d6da95ea1dddcd6aeca8595ff0fe3a28aff19511740feffab0badff0772dc37912e94fccf14e80286ff59029cc8ef552ee79bb284fc71e9e7ef841958d60f0519914e78555c347121b4850917407af4e88933db72fffff5b4d17386a6470be924ec5f6f6bc4fa4437467926af67b5c665da9bc933626dcd2ddc89eedc963db23ccbc9ae9669ab542ffb3bd19d6dd6164fd952a799b8e3484bb84d9e8dcae5a2a27650647b2aca4e09b994bab88ec02eab2bdfce6aaa4a89e720514b418d5754a8af0a54b7356d655f5373c942d99a354d7b62a0d5d2aa7199d702d7de1acc9d677b2d061eaf3e5eaba39698d628aec4336b58ef13b7c49b326b9633591c2e669567da9b69d3b239936b9935cb972c0ebddc5ce2e1e12d66aca6d6146e259e968985b89ad5d99c5ae2d923abc4b34756cb1ed9291d3a6ca9aea9c544b3299713ee1f5692b96979e6d63c2f564d9ca66b71fd1dd9520df26c3cf158be46f472f4ea8b8b594ded5539be00abc0bbc770df63e7d51adbf686525921d78d87e536c77970b25be4f16a5ce58981c49f697910fbedf684134fb079c28327ac9e289a73868a0da8d84d21c5142a4c81c11457528c91828b8e167444a0d101124513515c89c22a8a1b50f800050a0511152c5051050a1a55605501419d38759cd441aa43838a22aa98429289ca72c21d1b76e6d8016367ccce047684ae20e20a2e57e02b7e58b1851563ac10c01442522461c597155655e4a15571441522dcb1ddb15528c113c19d33774ca0dd01a3e2863b41aac882882c30c862823c4de4d1c1499e5d9e262964a0614105162460d1040b2f2c66e02902cf123c5f5d5aecb4e8a145921611cc01fbff9f538502cd09dfff7f137950f8d144591350284025e04c000e293972b0a030040171106005852dded1f50a310a5cf76931f0aaabceaa5b88c6dcde238af2956bcc31dfc4a055d77dc4965cbd697a79f0b098e76bc453b6e407281ec0460e4c98ffb31b4c483191c484fd093a1e9eb9cac6b1f2ffc63866feff5865dc5b53e2a47188718cfc5090511caeffff38591fd5352e6ead5cce67dcbaec98ff54f3a7b769c56ecfe5ce5c655ae1aed952c9e2305073993bd362e0f108d4798909fe9ff8343849c08902c707874a093c4a905142a8046f09b225d6ffff376fde94d12283bac464f98aa636ab1dab553bbba3887beec12b041289c34cb4c7deb19a72cc85b4c3405bf25b392cb1bd09372f925d2debe68c9bf47f66c300506e9ce03ab2ab6580fe3f1b22bb5a49a04908190087ff1999c40dff33da9bd9ff6f09667ea74c9e1b2937496eac9b1a6e7edacc69b3864c1b2f5aa894b559d206f5e9dc559cea4e866fbc673cdcdd1ed53588f9084d9ab0585c38235c457cb6e4f9e6cb45c09517e9d2e437eb9dfb2e5a3407af3da22ab1db6b87990b0b9083cd166cbafccf84b650efb85a00130a20f63f0380bdd5845c1cb8f68e201e21f43f4340c8a5e274ed1540ce1164fe6707b02963d3d944b1696253638f11708c6863c499304664a11971856644139a11a911448cc8fa2f6d5da6c5e5723e730bf54ea87369c3056f38cbcdae1d46ec9135d2716f0b75362dce8875d758ec76cbf3ed12d3ada6a9edf65b055c796933855cb59e69e3d94c9b528dcbb4417cee60cd4e55e17027baadc9ebd923cbab71d98c58d72cdf91e3da3cf63bc4ea7078ed51e3730771a611dca95ea2d9c3d570669759a2a88e97a6adcb1e5923a6695a8c85a5ad965ed5a8d7d256eb7858da6adc6234a7c51ddcda344d9be337dd296ef7f55a0ccc09b355b71063a1efd4612c7c622a7f602cc4588899969c4aa7aa9d7a556be3991fd1abde3509b73a176b3d9698ca24cbc376d923dbe4a3a9fc6173531c8fa198174d8eb1b08c2a4d9b11ac646fa6adabc6652ad95c0fc579599c2d4dd3e2863ae786583581bf6b6dd9d7a2b9648f6c0f67da8cd823dbb347b6ab3479c6c49e3371a6be457b62140811b38bf31d25df71ea509d05aebc34812b37ad70972507ae3c07338ab38ad3957375f3e85bf3a801576eb1dea68903ae3a3ce510052d87246839f0c6b4a1e9c084a6c31b1d78d04186317ac8d420e37404930e6e78c03c2cf150638723ffff3b389181828c07343250658e94612a43eb81891ea2d076b062872b3de87ab041e3018419bc502960068d190bcaa4f161860f331f803e58d17cb8e1831e335ecca0e04313667094c182071e683e9cf0c3d2192f67383873e4cc0cda0ff8070a82988087aa323e41dc088206441340b8014203207efc80e7872e40249d8173264c10ba4c0865a0a4214293059a2f68a6d028a13120883341ac430819e2064d8827848041081684e000cd98105842440941a31d795a0e4c68698048b3d3600da1c11018acd9ada9a9b9420d0b6a46a0a951d56cd1d43c0de1046d882b6b485853e5ff9f0727446021a28b881b1133da1a336bb810f1c398b2734cd69826748c8d313171c47c6922c6060e7bb20800071c7058b921cc0d655954b801471d196c28b3c1976587306bc2843953c39e1ad66439e2ffbf06a82c4ed068b042c3922c776698b3260b17ffff339c33646991a1d654cd8357ed78a81e815667c3c0bec06c7962ac0a2f566fc0957f81e97c8baac501576e75f6052f5e08f3ff05ca972f59806bef4b1e1870306ced05c30b304000439d7fac1890a862e8df71af0b95179abc809e2f4035dd5ec061c383176ab8a0c78e1c17d69c7121cc1717a6b850e602d9e541cb00bc2cfd3f92ba4f8dc76c8ee36c07c042172cc879328cbbea7a5110e13f4794cfa1af69225d5981cd0a307c2ee781f151ae96472cf6436f7033954aa5120e5f4ce41183fd166ddffba6964c1730315d9ec408d3a5cb071d74d9e1ff5f87ef3f870a37febfc7a507be26c13c0aea08dc217802576de4ea27c642f6160547b160eebdbeb7806b8f4a48c96d356bc45bb69a45ef3a666d356b873af74d44c8b5b76fa833e7596b13e1593caa25bddb72c49612685bb0d822a7638ec7eeef3c2fe6189ff927fc75cccff582df0f45b31870e5bff3bcc5ab55e0ca7f3daf49dcb489020a14e8d8239a94dece8bb91731ee7b0cbdfcc7f3f9ff436ad09819100454850621b319b302663202ebd4ff173de98392ffd9174e7b3e60f99f59f03f50f960c5ffec088ae6221d336cd2883113c6cc173358cc50310385ec87828ccc0ccdf8cc5491669a7e28c8c8cccd8cedf8687b68f23f334276b57ae0e1ff813d30f1ff5f64c41f0a32ea014af83d34f560c4c31e92873c240f73f8a95ee3b53cdb13eb566eefcab351bff3c45db99b896f31f76bbbce96a40e3e74207300238723726021079e0e60e83004a9c3141db4c830ed50ee30d301073275c86421e3db41a7fc8773f83176bc8ca132a6c918a7314062f43c57310f6294d8f90eccb9ce430cb449b8f9d3dbcce5eec89a2616bba1668b725acf1d4e8fbe23c6aafdff8e276fb8e0ffc36e98e18610969870d0ba018cff59111b3f622c1c90c08183ff37e2b0e7ffbfc430f03f23bac1de20f443414636ecb1e2f3ccf9a120231bda6ca0850d646cf872878e151bca481b4e01d8e0b3a1eace1250b73b46d86064838d1f0a32b2e1a6eecbbb719bb933ab38b5a6bd99a6bd9942ae5cce6796b61a3ff3ef88c572397ec458b99ccfec7c07adce96db2c983a60c080c1c96045ec37c30d1a986830608622c05830c318194819d0cc9064861f347cd1e0e33234fdffcb508b2106283134f9df5b3bddde3a62ac931f31d6deda0509f253d7a08f8fad26b67f3c97366e97d87ef6c66b122cb1b7da118bfd8ec01f31a85ecc7fc092a358eb1c834e9805794604061f5fe6b804d69636bdaa29ba6b9ceb7c89436c1662b15b048ae52e5b1e8538f5e0bca88753af674f8c4fd2053b2e7471c185dbff8c880fa595e7d4a3d77ba1c6ffcceb05dcffcc07ac7a61ffcf7a2f9cf99f75bd60c5ffac02ce5df869614e9c353f1464a4430b61be60f9a120a316a6b450b6a405305fd50f0519b580d48211d902d982173d5eea54ed6edc56de7ecfdd77a4b758b3a5d9af6ca9e2cdd16b6fe546fbee7a074db3665a9c1ead70779e8b3ceb4b0c623cc671966fd40673e73998539d1915e583e2a6ad668339dddd5ead204eb9b9c4b49ac26c6d358b397a85d8d234f1e55bf4fc3fd08a4b122e0c6034cdaa8fcb93ff37a27b039798bcb6efe46280ff076ea1def19ba5820343743176892253a822051352e8291cfdffd016cce9f6a910a68294ff192f97f341a950c3ff8c4b852bae56a0f1ff5f2b68fdcfa6aa56c0f23fdb22f27bb5820f1a677114d5b140fecfb48a9c541b9d62a1e9ffc35800fecfb26ebf55b99c0f6a0bf5db91b305ce96355bc8905bb660d932654bfa5b885b8c6c99da9224870da945862e58ea5481d224d542419516282d372d0f6821d222a4e5674f9d2c736671d6642113a64b96b22559d0d9e9fba12023aa2c4e4959ec0f05199159804814f4a080c4afdcb95f55a8b3bfb2c9c7dab31aa2e3fd783aab2b258b4b6a2a952e265abe0358c49ceb80b808cf63996b9c9259f397cb05792ee6723bff526e5a6eda7a3f7d83660fe322362a2a2a1367d5c77f3cc79d9496ca1f3b9ece9aa7c61c732f9b33871bfd994a1847f9e8610af711631db158b63cacd30fa672675a9cd51b4bccdc61ed7e478ca5648f703ccbc33631399549a629dc26cf44f9118b01d7d5e22296070f1e3c6c89625925156881352eb3ecb918c20de156058c2a09a892a64a08557421e0090106117688f080082a883045042d1190444080084b8860c68a102b3bacc410210a2b442bc111ca1180ac1c6165052beb086223904034c211e408524a30a1841c08ff8fe44912e28ca005092090b096b0c395db95a12b5f82992b56087025ebcaf0ffff8abe42650f95394ca84ca10216840a0e2a3f4caece7c61e203010c84aa1f083f2493b10fc26061e2c10760554c46f800c7073f4c52f0c083394c5af8ff3fa2c130b09bba55157f819df8dcc19c1906a67596c8ef5518d817982d717a5bcd65a540754961f22fc5042962fec4e7a69242449eab970286143cbd262946527048b121e5674f143a51e44469b3260a99285fba44c11265caffbf10776d155ba0f7162edead204e7bfc6e1f3f31deeac1ed2b6eaa2abdb75e065186b901d4ff2340e49778ee2d9bb3d5aca0ec0025852782735cfc9dea35a6ebefd498ff7e6a0502b0f31aa75cddc262b618dda1717ab755ac84e7b17cda2d0d8af8477b3174b7dff3029df90f2626a5cc8ffc0590432cb8518c81985f15779eae16b851a04d89abca3731975d69af32b2ffdf5b650438fbde2a6bf3fb8ae4e081ffbeb76ebf554438c08103fccf4110bce354266e951780059e7b0d754e532ea9a65b19519950d9cf1ef2499c364fc43cf1f244cb932b4fca9e2c7942cca51713739cfb9c240df3d4de3e27352738fe1fab93e1ad23c6b2f1e06189c16c2d0862aed03280269036c0b2c108575def55871bbdfd9e3fce019626908eeaca2f56fb0f476a704483aa47d12ce47878d35f7a31fff575e3739885fac7c9b210abe94f4cbd45ac967ca83356c90c7c1938c9604b0666324822033a4c82b2d013aa502da8db841633b8a15246e831031ca86e89d312214b9296d4b6d3fa9361937103014bfc4f0d395d83c16d8527e6eb0f0c65d798d8812b9ff269321bceb0fe6714cc76ffefd5ffffc80f113525f9cf71aabe0ed64f7d2a8ae260d10fd911fd7fa1ffe193c730ffdf2b79b61df38db905b283ef282b7babe5726a2e7776fe4b797962bede8abbeb4be459e31a239dff3f168b6b159902478c45f6d431c75d641afc1b7b9cec8627bb73868c31cc972bc62965c68e1ac18c3ee3551013b127bea599a8f73ae7ff8d6307fccf88fe7f16670db99e21d73044e379ea3a3ecfbb7b7a8d3df33caf694dab77c71c675ace2fcfa711ebb2ebdbc9b015667be39c678f58cca6d7d8bbb99ccf4c7226c914aa0d52c54155a25671ce8df0189c006447803fc16de85d64d7a07f7521ba0b5f10486265812468125f5192a624386e699ef40c92a72f55a9152415fcbfd6deb2a596f3ff46de71efcc551b00ff1fb66bffb32ba822eebba3dab595d79b343f1464a4c97c982e5866a426b5a64057a9f8bcf8ca88756985a89de25031880ecae66701ca857bc461bedadb777a250d1d90feefc4fdda934d1169cab358468ccacceb9c4d20e6c3cc89146b2a977cc1b111df76c460bf53e6896f3a0a456fb0c4fc1a979478d861e6a6d28f5fd362bef2a3deb9eb6b5cf7f1766e1ec9d67ddcc40bc4e93bbcc5a3dee78a79aaa9a86a5ca61014bd5498dfa95c6e686f7a04d6d01cccc29d70abe8261a89dd1677bff65af2140ab6218748a2845208a908a384086031246ed28215f9489621031148ac812720718d330c79929d47c8619dace6228ae42bf8036c83e40456016f4892fceb3d75e2ab5ae91d915fb4579ed8e27407b9d599ab65108ffd4e2c76b13197a36146f1df40d8934840f8ff0b5c7946735f918e297aee621966a3ec973d6f27ce2b2e6695a7640e9942bf1c78e658e321bf8ef98f5f14bd3f62b05fe0795ef588c57e1df31f57cb22bfc68cfbff800ceb926e95c889f9bafbfdc2c0fecb12274431df5bb6dc5b9de73175e5c6afdad7d89797af32600b04390246064602980d6076c26ad8211f0688aebe84babe80c2befe80a19ed5ce011ad0917340d99b03a4b039a0040bd21c30c12b306426e4bdac6655c11b248d88e13abeb85ae250f4068d9071b5d4b838bc2a31156287167e841502e02b7147b55b9bd53ea32af91178546f59661573bb717a8c322dcfe9b10b3756ef506f54cce2e2aaad2ce9cbc29782affb92fe6753a7ce58c729eec5f5ff4ba08298889709ff33ddb9e3beb7f343414671666d7a677a60eec870e7855ba5e785ec5d217b67af482ff7cf65f4fe3f3fa9e78bff99942d4b35dfaa76f688c532b1f76c29c4969c07e57f3681015137a80a4a92978787428c18312a68f23f8bba6a27b3aa604cd4cedeec8d57f19a903c925723799607a4e787828cb8d4a4e102e323f47285e4ea5c2417c9d500178de42a5edcf90e62f0de2310e39e4d931f6f716c5b8ea23c779dcdbdb5e59768f21bc49a365ee22cafd92036685adcb54736b5473698667d8b63c6b4eff405ee1dc428300ff57aad2dcd13af9c034d8bcb455f3737d188c31958dc16d8ce776a25b058e55920e6261aa780e7c5a7b9556c019aef94705fe1eeb2a50f8f65f45602313bdf3c0b04e3736b61b1dbbbed47b41387193d3bc7e7116831b088c7b69671a3e8d5f90eef10a3792caba95ead719ba6c64a80a7bedd9a368dd1f2c86a8c96b87875cdf2b0b81fa754ccb34716f3dc45d7a2ba855615526262c7c5ab4bdbb3a7be5b3dacf75ec9f05067b5f74c7bcc47f4d438abc2abb1dee8b55d88d152355715e9c4d946ecc6ad0e799595d5b766f675f355edc2dddd28d00a6f119b337f3c9b1687ee20cf3a178518b1e6b246accd31de83d7548d3b5d7737b970ab6b7a0c0ab7d51128dc3a5b9edc96e6994dab73f1d4594c54b71da268542ee7cb660e27dcbb17f7e5599ba63d0255a11e669dad8adbfd88965da5911adc09b8a9db15b72b372ab720b7a62339650a484506921c2091964082927442121659a261aa8089680988a50dc8a5bde4c0d20ca5304a48940c48622189ca470f3e66f0717d18f1f1d323861e16f490c14400a6b10b02ad6aa814d108ab63942a34030000000000056311003038281c8f070432a95c38931f14000453a44c94505e99c9733d0a21a4882186c80c000cc000000001002b81653f3a33decf6ff80a715229baeb7c07cad4f221869ec38af96d91ad02a959595a3f93ff699f197c8fcbfdd58fc17e0434e5df7074eb3608ff6a2de81eed75a8a6abf8d991d3edbb7bfa4e61640dc81259fa633398158004ac533b5802db3f90e74a590549ff8a2e74aeb977cc4ae88483ea3c328a03180e2472a6e25de334a1ac06848266912f7eca06de66ac9b27e122d537c26a3c8219e98ef44f13cede641d7cb4c28b98211c1a1b5da7ba3d3e71df8ef1eeec06e3dc18e3876be13e893b77dad905e33acd08a460eefe1145ee38138a58443bfacb00fba9f8deef98b9c688c90af0308a1f30ca80053f18c971cf1c808a8e8c84510edafa8b6e38e9b8bba17e1b1c6d75cbd88fd24dd5d4b85ce6468df006f4083af4a8b60d611fee1a58b98a51eb558e0c4cbfcf70db21d40cdae5457bed428f16d710e67ce788f74e636794bfe9f0f409a7b85f224e6141538cb38f724c1f540929234018198a4e8195617f90ab076707d03d9b381a912af3e6297f8da083a8d51210ea7179d842d1428729ed7871c3b420d644f0f35c90c21fabe9af8711779b1c6427038f1033590bed19cfb39b857dfd0b44cf21383782947e5a8d9f2b8b73ec3cc2d686531f556d49f881f0fb407bdf85989398d509bf77916733b499d5d4b9d8f0332fed95ad8c4ed28a5f4bb5aebe7b03be660dcf630ac013e790abea49377b954bcc88026b23619e438e2edf5753d79dd4d6bb3a7accc301274b2e14ce90fd12880438c1aebdb1a5765496763dcc41442b54d3d71717834a6aa6d13fc318c9db2403a66c3eac6ddf7b3ad587ce51b3a052217bfecefe8202eca4da565439dd22c3231d3f9d915044aab0d072e5a785202f5259e7c5421cbcf2ce020d9b07ad283bb10c89768f6ddafb2f168508a920cccc8f5ece4d1be2a24838e6826d72b07ebf4d9d4d4bd391adf685544c03cb74824d86e1e3ad4e0e90b51fb5efa8f47915341173e123c7d40318381bf6a675e537a90288eba67459bb65741a0e438cf22d3a4457cf5e19f187a6a55d57d564633854507d94e12811f8151c0a8e71af1c5073fe5706de6a2ff41e632bea329eba3e12a8ffb5c1e5aa7d706e34d54f9e832fdfd659985a1a8379ee1e3533e838241d82a61dea0e9cbda48e3b1a871aa9b707f48ed0f7c31c01f8c2d047d330e3c4dc14e1f3926ceed71508409e5431f4971f851cae8b50e6ec40c80c85e10aa88f73d818629299ec0560ac1dc3799cbe3e46951fc6a85a89d057c1c095aec74b4a4ee3575a0a005d4680e358ba793dca7b6439bbe7b07c432f1bf1307e09bb5264d24bc2441d049ea0bc5d9ee5052bbc306343ba866afdd23a2dfb038941a689db4d36cb6b5f6fe23ed276ed8aee01ac335ed99b98ba8b606a0a1d9013acceb815d8ca46575fd1e6871602df429085b6f86437471e99c68096e130a01dbb94126908ee2ce82b4da90cffad659abc9f7799c46f1a9792b6f2df56576ac34d532f99f063871ff7f44fa1f2dd139a76b0e0afae7056b3cefe6c7ec63e0ebf0d9f3c74466b766cd316d7426030dd50198dbde0bd785d6b1cb6fe8eec3cb21983e2374e3aeb2ed14797c18f3be4990f860a94aff84e5f1a30943c5923c1f73b96921c9cf47eecec77cf4ed11378f8d94e8630c3b4fb42003ef47fac4f494c04ff20b51085494c2ec63bdb3276d1580cd6fea43b081fb98b2b8078508f5a668b15c19fc892ea517505cab1a0ce600ce3a974b6712ab20477e90f9636f4f12e6a82a45d8ec065043147825d94cfd29f45614913b92c9cf05475502b2da187ba0a3967f54e0e4a0770b00ce76b86c68651d6310a715b5837cb7257735ab063b55b3084fde085ddfbd11e4cff372a1a67e25e6d0429556124ab77d1be0c0f58e47656b137dd87f33a9e9be702ccbedcc8269db90f0f49c2a0d502849eba5c39e2f105ad837dd68a3fe60fa65cc6c364d2c60a362c9e21cf94693f33312e02a8ef1db6eb424ade4b525397c27ef32243500304997280cccc269bdfdf0a5514a841508917809227e5decec2b610c0ad7cb1d569130481fc51b1ddc2ee913ee98ddba39a33ae49741b23df74dc8e2d54a58c1735ae1a4400c1dd533f6d8fabfca16fcb32ea87a64f1b03d9bddcbdb8badcf1bdc63f90dfbdce273e382036c665f8ecc547c72afdb38f3d5aeea883c6ae8e72a2d783d6954e801840706f5c12beee6b6ba9853a7a5c522e8a22c4be406c014bcd8f8a434d6fb2d8a386f302d9b3a454b15b9581152c16185daf44eaf0580126149177a5715c7e0ed77eeaca16a82d19b7c8f456dec158a5a2a4c9cffbcbc87101a8771374d2c641f7caaf471516a0f689af9b2c8179a08046786074140e084ec050e5fb2c8331660b3041165744652e8f02eac7db0b711ff28f53a6d54b29d9a9bb6da972570ccaadf473d0a013976c7273d0fe2065ba1eaf117a75dfee468e8854849a4abc3fb71e0904af76aa90d5b26ee043ec1e7d373f2581a7031c348f6144fe5e484a23509310058a4ebde9afa8b0ab7cdae22da44d151f84d35732ecb817f43cf8417970f87237c138ce11a036b488aa764e562e64e8f76e3b0993f423849c05595e828891df86b7097d1e44b10a9ded52d7ebc3f8f7bcfb7b649e47c6869cdf41df19bdec3598176b05872848d4b6ab3c7ff89356dfd2cc6d93bc23cab13ace02fcd4cead5ad84279b833ce63ec02200d19dc5f596af5c6a2b11cbe39cf6c48abfa82fefaee5508e6ddd6e0086d2a1991a85886c16495fdadf478063822ba680aa13b41228e1424d3d12bf8bccc44dd6c2c8f6077c90631e103c15e289606c9bdca4e54bfb940eb10c47e442202540887f5c58364df8ed3f2b2dc2bf2cfc46c802cd8ff60d772f1bef0784275e3e5b67563f7ad67d0edf0faec16b5568234cc8cd5db0af536812bf17e77db5dde3b097a5e4467fa31c909b68e33a662f98a6e10f5a6f99d379304996957c4641579be05e6c773949b693a20120ecd9b947ee86e5a97c9f45a4192b3e0404f723111793f1389cfd56e1b178a1e1d8224dd5c6024274c954b6566eeea1f1ee5c6307596e48c0a663a8e2b37a6c0b80fc526d44bd99867f9e4bafd85a0a19f6a5868c726afd913943ebd058f60c6d111787dc5c8a4be40b3dfa7f6033b02b9197996384a99123c27f73a904ee48798471606af9cc90d6e8d50ee44587e9c045ce966418edcbbec8d7b5e4f73e61805a7b4ce05a2535e38a4b1b23e62e0fa9d2e1efde312e9b8044ae8565c673f14d174be01cc6ccf0935541acbaceb187a8ce1008b7f1c7d3e97b14d1d4ca675e205ee19969e902f181778f6f1682da1ef348bdaf6469727c05149cd1f6b9805d4917ec813233ea9e5511eaf7510f0c1e68efcb4acbd6ba52d020dba9df510b6c15429bd320d71780a1df2a44efe3f674e073d4d36b22b67ae463dfa5c5e9155a8a15bd2b5860f4bba7c79124ecbc7f8266fac003e7be04f15201a9825d2a3e55e632134b2e172b217862f4449b086c009bfd7ecf6fed4d299c632ea95bee3ea0b297db3e517d2b19c84ba244c1a45ea6a10d302750a81256db7644467b7e7386668f6b5054b04770b370e7dcd7988e9c68aec7c6bb9d6e9b52f9659544001039b0291fac9358d1d8e2b854a3a67cdeeaa6b8040bd32ec9d445fb510938c4d2668d0a4bb3ce7d368b669b8bc8b15af5e87d47420f9a647b05f70e92a534adebaf853091e270cf36174a37f469eae03b22789f0b0c517e951f67c99b607c542e7bd983f89c64327180ac20a93276df3df1260e88b3a946a009aa5939b0c3a8a56f0283a15d8ad08d7da88519dce52c90c3e00d7876d551ae983a3e490f064d179fc4ac6811f76d244a1082ff0e3f830a86a72a8069338f0695058b85d70954049b124df71e0d1aabccc9fb58aaf68329567e2d4d19609b2a7b7520d755f6be9dcccc82a09ab66b8cf7bb101d1a1cf2061bac9cbf17a9b67c63ee92bcf37f692934b150a25a51d8d46157cd6ac5cd2efdcde4cd5b24e63b3d180a26fb3f3e36139ecaf1f82110a570efb6e9cd4c4859caf7926252aceea508254399751634bc8ec01d8540759301be5e1e7038bdaa03ffa2142bbb90fe370a99eb76b4ef0b6272be4125b1eb9a0e6e0e571d705b957ae2caa7fa16dffe19ded98cee0781e23cf3e7b771539efc945dbd8209e312bb4ed3a24fdff74788989b5a46f74861ce749f13aa94f045caeb2716959ab654570bcf99116a90ba86d38f21f583064b04de772f4dc9011ff525b73b803e1c3935deca6a516ab15930e6627579525e77919ff8939e4a57fe56a2ff10fccfe517a43ffad1f679b9d918ee9c735bf7b07bfff8a21e34cbba6752f711ef4445e4617d17727f160b7ee896c3b1fef7fe6e27ff2adff4effe8287e51cdf71eef3ee44bf1b16d7820aa90275dc9d6ce3f6bb68aca363685b02dc1323ff546398895d011fb3c36189cd43104cbafefef95f6d8ad7ad529b26cc6141f67494fe4f413253c64b9d81e5878401b5fbf8666036dab1912180f2bfd8f6ec32819a7b4e2aca31fe8c642221fe090ae41c4cad759d3b7796d30cef4362b7683b5d7d2211b23bbfea7f226cb6aea658d8f3864ae9576cc33aa6c67a58a5a2f81efde6d76035f85bcebfe2fd468f7c5d5a8e9ab81832b67862423fb56451c8e1e35a46637bcd7c9e80a1deb7d8ef27ada1ffda5b81416bb312cef0a7ece167cf36224e602b479875a9e6aa219742a3f0c4b191dcece303ea105e62afab81b1124aae61b6c39567adcf6d88301b326198d9b5d2e354d5b63cb3d3944e3048f47de824cd34fb83d0c7b2fa0ba313724b73cc479ab5203787bb36d13008c3b8b2bd4f6ccef8fb6cc502c9cfacb3cb2040808845c5101bc7d9dbf9daad1596233ca8207148cdbce838c0011541b0adaf4c35132894e23ee2e0bcd641a5bc63baa468d14676c0eaa4fdf7600d1ac611c6d79618a2d38e62c44f13c809fb9caeb8b3e17b31bfc6dc0efc028bbe7cea8eebfb50e11b86226e6336243e1d2b008af9b1d668b34aa41d39878b3744dcd1e9dcd9eeb4e60829883097a1d14cad0e62bee94a7d1c835c44799cea12262e6954527808068267e8691e8185ced04c696b04bcb423911141c096cb205ef8a7d5064101c936305ae8ead823b58ae6a4b93177c20784b4d7315e83fb218da671ae09d30d5842d1cf1f0588edb95b337d6506bb97d2d91d6549dc9ff43a187e20034086de3a2bd355a1bdd4316ee2280da9adf3a61e6f9661981eb6dcb82f31fe355421c81d3be4baca7f9697f1bd37aa4f515e37faf4073a8cd58320d412287dd2debf6f6848baea49acff60528163905d266b056cf51b13d9d2f04e7fb43010e505951b77a3a6f93c1a7f93cbd9689ff0bb5e163fc15077d6d0b9824cd3732c5fe03c0c61374b8607ecd67d3ffd5c0ae66e7d353be81595ff0b3e657500bf83968af2a6322f02f7a83a3df7fba48006dda819d6c354f73eb5d06c0d81e9faa13f9149b0416f4329ea9569b6d9260f9ed34a71d9e216a8bd70d16a011d9ae76df8d11129201daef0eb5479fb4f5e7d63ece642d4d9484a249b5da6aedca4c68daea19529047bb3624c37da1b4ef27b1a6365d413e18187b1489ae082688e2b9671eba692afbbf3bbd1d44a666a1f863384ecff59ceb037a04187e696ae929328d0546d489d152d39552176902f0583775691e4f924bd5186acb0f662f1ab13bf8cbf5a2154e5d07fca6d5555ae3d65597e0d466314225406ac088e4f9dbf19162d885bb599dda8634ef49186258ac40166323c499c87911ea19df912073c3a3279dcf3fdc24de1468f0392b30932dd52c31f675eea88a35c0c3b74bf50d15756fca0a15acb6a91f3ac1a031b61ff77a37a963c47ddefb5918e4abd44b2dd990d22fa42426b9ab1c746200582fd33ca680c619ca4d3c4f0387d5461c146b99ec699554d71f94a10073a4c1681c713cd40e991ed383f79119a7cdfc430e861160fba1c12b4906458816a31379238e8a25d626f3387084cc2603e47d8eff2ba30d4d34ab3ee3a7ee6643f7a3ab5a93eea53b912de13fdde6864f034d1bf30f85794ffe12577374f60da728988c1d97bec8e7d4091a98bdbf6ecea5f9272547b70dfe09af35c1d92e3014fd70fac110a56a74488d3609c60f0a3d5477dfdb373ce6f6cdd23e96aec1e122a8fc70bcea6be514a0e308731ec97cc600ecda469fc0a8a8c11b5902b19280bd30c2670dcd9028a8892f9d651434a4aeef6221a06be079a17d5ec90ed9afe463461cd259d2e53498c44e954817093d39f49e85c273c4ba4c19fa4806f5341b7e31fc2259d16f7d732bfc9257dc97c323f5f574b26eb00c687127d4474217f65178289e0e2048c26abcaf824f62fbc5a9e865ee43dbff68e2bfd5e5f92c25f792117d4001dafe460504da11be9b8c8e75d9bf6e103a2effb631d3ae964febff849c974bd15136dfa5d946f6a227d9f127986241356b9eb8518f5ed0383cf4291ec6861df1ac2f4c7f195337dc9aec14525a8929dbb9b2802d8c73d9a0d656a2ab0c53cf7d4b0dd15ef8a258c67155e86cef3b1a1e28c0c81d35a53f7c5d54002a1ff1620c012840d20a0866b552964ef52a7727d1b11b517f829b6183df0c1e06dcd3d847318d06e3c629bd6b70ed3a02100b74db470a8d83689ec94c562a16af00ffc4236a6c951d0d9384d189a7c430c4239ea79bb21ce8e47e3916250644132f9ea5e203628b283bf26058013d4abd0f3a7f53bdfd3f3c326e223dd2f9ae8ed69d43f5f21935617732bff190e0f8691430e26c275f66eaa4e3504bf997feb1dd6d0e392a2e44f62da18ce6c414168ca385e23701e144e7dc833a723eafb732ff360a11326af6db133fd956a21bcf147b9f0e906e48433a59f23dd7bf071b2450bda68ff6db481f929cc3c869b26713c054cc7480c6f14f2a382c824c503c8373e85827474934a322ebc9e156e230d4c7e7b0f12d2b9c3c97e5ae5bcf1ef3f7e82aa23fa651131eb6c15a2aaeb3ef6af2c25347b282ebf83bd5195ec6c3b2f2de81c2291ef1793980a4dcee711dcf074e38cbccbf3fb6fdae34ca9f5c4f7738f7504b2754902d74a78ddf323399ebb07903342a46f89eff0927d797019d2aeee0d21f1928ea0ec89f94d2197c7dd18316f67204d6e6496867f2f4e263368844dd0d8d42bd3ea23c2dc50f2a13f1c92758dfe9203f4b4b3505abb7f10f702ccd4cda0c914d11d3fe978ddd960e2f131d386b94cedf70dd66cd37b1fce7db49add6ec00f6629870684e2a9ef62131ab6c65c519926eb4eb3a747ea2c30ea2d676640aa86069209396c9edc2f3391bf9d87767dd5773003621d5669c3c84e9ba569ae5efe2a3853fbe587e6f83f97eff86841314fa53883264876191df44521b9ce746d8ae8a68877a3b616bb817a1017d610d179ca6f4c251d82a31bb2fb1f103feb4f36d9bddc7fa38bd9efee351301f22e04fd2241069a8f194047c6c5fe60f9149d9dca4d2673869a61bbe92c19f3695ef64abcc247dd54005dcd1bd2f15193aba6067749791e4c56ee27d49fd13ac682e5ce2bafeba413a6fde14ffad45d3c684a312a84b8dbc16c800439ba2b3417edc3e51b1af3a3b7215f030f2d3f9a4d04d3cf4a9fde26b274ecfc2d075b77d4035d71ee7bcbbcb7a863034bed666714bd99c99121d41b9110ddb99172e640894d10dcd700ce9676d52bacb53b0110ad9dd231236e672896fda0fb33935614bd67a2a74c18196b500d1f7be9b94ec16ea2c3652ca121298b0c90259cc58d34051f0e165d7be4ad738e80f7313d87fa85f768984d4104276fa4c2ec9f8b5fd4b9402fadd7d3523cb523ed3391f12beddfe0454ccf984bb92cd10b65552401acd05041e9e8cc9a8ae47ef005cfcfa3550b90f8629ebbf3767a05ef48ffd93d4b1136f3bbb7487a17fa01fb1a6f90ebe3eefc65c986182f6c31c5485efa1fde2d10e4f2335a1b3c42f9da881dab8d7bcc9da3df0765aca2375799997b387e0786ba9137d4c5b767c4eb70aac9b1ab067ecb334d8f8c2bd15db6b9c8f7153035dd71aeb0b4c7ef8c967a1edb5275edbe97855fdda12ed0d02c8fa3ce0efeef70f96e1c7e64ffaa74fe37dfb8968b6df83db33649417018f1dcfedfea317d98d9f582f9372a8a8af17361a0b5a8a3c7dffe70c7f2d5dfe8e872b65989d2edc5bffc3451cddc67c06fb18502888c1515c7b3ea7b6154204effedfdfbbef40c170ce047c656b70aae0f9c8543098b12eac47123074a7c8ef5196291031a8fc58ebed6e96ab048f6ebdfa7828bc6bab902e701b418b5f59370be6a8e725dd60f21d1e754a726ccc34b2b8a7f5c0dd9ff1874e25e199e6a7cfab294de11bbaf2daf976a643a87b9383ae48c28a5785ac730952b33bb23be5a4dc2d76a07a3998a11e1536417f17cac2f315085ed7d7f3872dc5cee54b1effe99ec598f2c0f9c98d4435c09842cf4fafdb91eda4d4b69bb66500e61df7b33c120dfeabf81748d886b699c41798e27870df7fe1d22bcfd8a7f4fce25f06d734b85c639b7296c61e4d60624ae5070600d5461df269a81d2e1d52456ab41216a02a55b1af58c9f2247a3e6eb2a97260d40a4cf5727b6109202a126141113a9ffaca5ae5902168c22f6708a3ec942e0f846c81496654bfb5fa569993b43ad9d4f4397f51bf8b98cf0ded4a482c1836c2d2ea6cacbfe3132b26f7a8463726b210099516549454c4606d7ec92394ea53486139580209551fb9a19eed0b38e9a0e5184356af3def9b3556ebb267ddb2dcbe5a6d67e4eccbb3e07faabc3b790ae0fb28ed3342d2980ec9d8cfdb479bfcd62a77c595dfe9a72cc35fff66c98d1fdd61cdefafe0f1af9c5f76e79670619f7e0573b6c0c8df46fb468cd38348e838483a909b9ae0db235a57b2f0c20e2e8ca2abe19f834efc831fba1db8f12e1819dcc9712b8bc516ab79665918c2638dd35a111c0ba22c0a4fbb2017f4862b6e8705b9b00e64e138428ca5510576837f8b0f8e4da5c5308faae985877a0b39cee9b105ffb451a52acb7bff3adbb8ccab89bcb49cc1a5d6588ea2fe945cf1b1949d3bb544ccce558d4a5705aceec4cee0ecb7306e436d98691543b839157329ec4780ce931e6b247ef08901f67541bb5bb02c2e7a52b58942e0ecc2f731f032f66e2c176631fe0e21ef4005040ec17b944ff758bb9625ac9e5d9312ff4da68fd32be12def3e76c4d363afdc73028cb016727007e690065cdcb786f97938ab106c2b9ac409bbcf5d2b7e26735e0fb40a417e67d401a2118b36aaf135a9d3dabfaad707258cd61bf5e90c50984c038bb32ba7e256de334ebabcd3e7fa6caf659c18b84a6470a25e4ff89a90f270dc06b283f662332651744eaa6e771a53109b62adf4fd5ee0be8ac503476e72dbd1ee40ad4a9c742a0c8875c266cc1ed343c65eb9ed56db97fd5dafd27126b93ffb8dbbd16fe894db40c81f11e21e11fc851bf400973ddb8251e8990bd9dbd70f83a469d11360597355fa9b5dfd08df1353938b1af76cf518c34ccbfc9dcd56ebd9260ae4397fb7be195d3a89a43dcab2acd0b75e705d468d0d885144783cdfc65e4edbe98ebafdb507f912c7156993bff7dcbe416994e81a673c73b5698a5e5a96d0e02ca4fdedc6f6443843dec7d4da41dc773f0784cb1fd7d5177e1a3a26b45d38fbb82ca6467c5a4106b4d8b37321f42664ac990119a453669d6df3af3febc68596b3e05aeb529de8ab6f4e9a2b06ed2c9a2f675b2df9dcd6e7846d9c301f61d7d1f29201693f2adabde507de1b4a6520e06ed2cb3081a0298bd0cdfe1e89956048c06b7c7180097f348c6310369deaf8d089f10943a791ef17d5e6293cca0aae29386e618febcc46de1a5f63c97a31970bef7fd3a549dc5a5a2bfc3e45f9ea5e3f2ecf41f3f84adaf5aafd454e8590088f3c9dcc95a19a4a08fe3b6c820ef3c52d28ad9918c0a34eb73863a9d288c275be99baeef12fa0f996ac6efac0f51cbccf61eaa97dbd1c99677ee82dbf041d98d54883afb2691d5aaa203dd4fd7b3c4b9ae7e545bb0440be58751affb658c7fd7ff69da676eeb6e29abbd69270afe296e8a2ddd8057318938dcb2aaf65f8217fb36322b944e4b94909df9da82427a7b38271200d2424ca87f2c0cd0f9d004dc5cce11ab28c0cbf2c3e886e771d500b2abb12e200fc59647f27867bbd879ae81580b815656f05ecd748b42cda3a73c31e11a27214ce68eb3c1d7ea9e0fde100398b61efd74660af6b986e1535201a82d2e2ce80a2c057e8a9e4a63f89c2051f8f5c8125824002aae4cc2e7147f3e0b0a6709fb6919862a8c61c50f19e197eeeabbea267b7d884f429144a8ff2855086e7e0a65cc6bbb421079e825a801a0d41e46fe0b3eef7068cadb2707334d6d10142db7ba368a5aea128a2a620fed1909d7fe5d2cc936f566d8bcc7006347d80fb953e1c754157c559c450aea4cc4f75be3af513dae5d5ef6c5ce045d405dd172da788ba399f2d8eb4a3cb83bc1262e000a59a567061a300bc962fe47f0b84e0baef3cba43ae45f3da10644d9189f980b532aa0a4cce110f474eae35a8c5d9443e6b32c584a884ae5b4cb0f5cd0570d13ce299af233a0699839c76b4e2c64b4f1e3f5c5bfabff2d16fa8ef0f8c30bc74b7cf2ac97c5de84408773d6ec44c65b069965a2fbab487f129441d0db6544da6e2f5cfc986627611208dce0a26ca5552e363f3a8cc4569b7eb541da0afa0e8391690c78b5013ac55b47e3a7642e07c7c01f20d175e1106a3e383cd42fc43f0f371ed07f950b2c1b603156cc507db1ce61833ca06e75b7e29b266d271e26cabba40851c58bfe858c102db0bc9692fe8c8992a2d4c53da1d47ccff9d7a0c7cc0456262ab832dd0949bd02b6d4f74479493f4df626ae33d6f3831101bbad1046f6b8868724f69b940adc85ca64c3a120a780eeebfce7a2e290f2578a62600e36be5548726e7d056fe55210cd66e01704e4bf6cc9807448c231ca040b2fdff17098289573d94ece83f8d973c623ff23416742e398828ab3e09e2c0d0aa6d1051376fade7c51f55a61913f916f970725ae4853b57b9d7a7109854b049da1071083e32190b2221de1e097b2cb0054d259d3a6270a19584d668447674261601af429c69a087c44cf6fb9ec75cead07c7eb990be73a4711700c0deaaedfcaa1367efc76039d76da316bd885d96434fbba0d486c723a5678e20ccf93aae4b2a739fc147530b0434f26efee326dbb7554fb05e60a41c1bbe11b4372c3163197481765005b7d4a1ce63d7dbfce007a51214cbac6aef29d59bfe0b3776f6e5aec55e4781390e8411a3c0e3e4f2e333398b466a126830890b70ec7ee5d6f144cf989642cb0845d9639758ddaf3d57112a2cbaf6ab54296eb9c1bf33df332d5672900d323019e869cd44a6b9a18c6563f5fd23f2fa1fcd3c13a061613669f02fcfa2f767f69b58d0e404a1133dd998ba8041ac96a07a77da1357ec15704beefcc614fcf6ba5fe486e4224b4e3e750c462e8b340414bf4973634cfea821bb770db66f5e469ec217dac12c8d20ffcaade38dc33d6a774513995a0aa6a018e531894ba489a379fa00d4413b78a00a27a90b86eab10cd1ae549a746bbcaa542a394047f06c8c689f6309bd4149a3ee01f32e8ca40e2947d84a958067109768e24dfa7a6bb6d4ef418e62df911917d2418dc90eef1f4f6cf5af2f63d9609b941970b01c4cc82bdac2730025f56b5d8c528a9af7cc3ed8c95a5272cf3bdb24d728da0f10196c5b3eba93bbbe5bf9c26d0fc2b9f77be34bccde3ed4b9d1215b0f39bb830c8ffeb5f2028775bccdba2ff569cd715b10ea210a3143a83aeaabb5b07c57190b7b9d07c1a713792d5f0ec4e1d15ac00244bb3f5d63555f5488219147cdb2772b0ab843a95d573441ac5a0672b1cedc35e2402776b2db7e64e32ed25d6dd768e3c70b4ecf3da40197cd22805efbc81aba216d5b20bc78d954771db5b968ff307a6828155fc816494dfde828e8ab5ec1e749935920202c55150e06df356dbc0ff80bbd9f6db3830e40731386e35bedf854254875ccccaef0b51477b3995beedfd930ab7bec50fd2933b5021f52b2ff555f4bc2c576e352dd1d634fa5a628d8a041e4ae58f3f988b547cdc237b2df94e54ec6d40f14fddafcdab8e5d476b10060a5b80f1919467285eaa8c33ab3176c9b38d9def14db84f567a2ddd592917a29e2c6ac22b6b2e812867ca3db22fcc0b76c7414138b6040cab64903d8891cb11c161110ab8473a6cea2bb0cd3f6bbe5aee53718f105f8a705e38259a7e6a3cbec4fbb17920dc01eaa706cfc40892a13999a739658f39b378730399d04e482ecefd2b66084e10cc7bc29b9648958611a5f4857220cca94e84106f926a7277e46418b5963af15d9dbda2c6c91bff08d204dc2511f1cb82a4a4127ebc340dfa0b0f7c1044f33819d6d68a94bd279e4068d65b2283a982cafa65276659896e52b60ac1a54b4c09bfd081c8e1b988fbbd6a9d060ff316aed98123c319eadc2f397ad0450040f307c5c0516101fc97fe094a1b51acfd183a9629d8f7aa69b65080c0f7d74f86481e8ceb617c8339defb93576986dec8c687191a7fc790e8cda620078efa7318d9adc2422c35a26809b4edda26366e541bec94b6a00a6e16ea039846f320ebc61c253921a18d659280d38e3c58d69ebcbd443cd58451152d096a3dacfd3d59908882a9d8d8b1f100bdb891cd177567dc25dbcbc08e816d3ff8f3014dd8ad6def86e3a2e5c7003e1c85414f97ecef44b12e9d573405cf52f08bb395deef824dc266e87013b9b5aad86f690ec5342b7d956b565477b51d6fa1981bf98eea7aabcb9afccc9e4389abbad909deeff6ab1694afa15ede98f06ee155cab1196a5807b2b9077c761fc8597d1fa5c08093dbdadc20878fa28df7c144bd94d8f33daf021d0d334ba4f616402d4e5116ad6462b4625c9e594c95fe31ee76a563883a462434f752f46436d021ace53bbeadbc620a0b71f2be8d66c72939e34f949d95df00c8c6e8f22e203e500aac9f9d43d89826173c37d1b3cf7ece39a32fbe8d9cf365332cc877a5817799dfc3e2ed1a5b16688e65be0ba4b843e9bc84bb31f310778583036c736e96a49564f3c0590be71c8edfc8f30e9bb15682b5a7f61c6a1bc36638e2e54a31fb43cfdabe1a684eaca4f952dd55b018042ace969732bdbb70fd11c44b53b6ca24cec73eb909041b41e5310dd860c9d7a8636d671e3dd00b77e52139058f7462cb9d9c6c69487cd1f9ad23f6e3cba989b1e2b9cdac957e06a9e5ddeda03da672081c68dc6becade5ca7d72f2ad8ef29fa4e35479da96fb9d55d68e546f60f4be421cb6648dde06a67c68860ff6751cba8397f18bccf76981b0b1e58fe125cecb2fbf16c4699bf91ecf2e91ba5977438728ed3952416e9507fd56652e0eb535323e26425f3d947097def8a92231a90976b74e73ee58f868eb284b1af61be40877896dee38ad19b8493e7d43b879354dbed38bb225539f6f68cf394fa72d5c6c1d3e57a9ab39eb7cc6e2ad8be0c383aa65ae7b434d6eafe493e19f57dc306fee7d4fc9a57850732c77e39c3c41d1335b7beddff3285fea824f11d04d1867722b0ffe3f1bf324eb5aea291ec220dee059b620c4684bfcf3258f0f93909ca83ec4f8af97cec9922923c8bcf3ff32ba3634b45994ef39e045fc24efe394afa6cd37c6db147f58b7b787038ef93ce5a54cddebffb0ef50d0b1a35854995e62bf547cbd9ded5095d2945dbd3fad7a7e388d61b56a76d399160f03fb51f17f1f387bb5bd51962e24eb4c8b86443830f6e6b9e4bd677de8399ec61f4dfd3b9c6e60a7cf3d2d1405b0425aef02d71e23438beb4c3c3cc89261e43ff6572ce93da08d77c24196d3c3cc029311e8ebf8a6d2eba13e6189c1eaf8edfb5b0b7bbad783f4f39daf01f830fb1bcfe2f7997f4aa085d9846b8315d8627c9546d73c81825761245edf8d504780bcd0917456f0fe30e919cb810dbe2ad1ca137019c578246d019ebd849e2e556af0512238198f853f1aa82db8aa1dcbab3ce09f85c8e1076cccb0e0039c7574988c53a387565132dfeb36b25b65ca8eebf2ffcae64b87033352d99580972d77db82f36c89ffd8ca7788c9b6a5cca97b1b01a1eb5d510e18cffdfa026e814f31712f85be3c2eb70cd16a45aea4f3b49cb56441b6de567c207bf3fc17a827c3faf6b724914b930914a0569db525d1fd99f01a2b4f365a5d2c4e5ae0fb17c33b4f7d698a257a93330b4ab1900bd3ed6423b670011cc8952d30f10de5aca878d76f07f2c225ea6ab9050a5732828aa6011fdf87a8004c518d604c169882be5a88c2147cf5821b43a89cb203372cd94a12ad692861303aa6155dcef6d4be5f7f479eb1efc25e9569a5e64128d2fe9a3dc7dd4a90fbd9da3842a644ff1b5cd9236b31f35311d5934a8c2ff70fe36b8ff7fa7f63c4f439ff9f3cee3eddd7ea6e4ac1c43d88116f02ce1c75bde428d4b0afade99a166e294ada8735571ebdfc65efbc2fbc9d42ffb39653df99c19dcb1cc7ba3338eefbeafb539fda5456d2e39976c0f8eb5732d7fc45b1afe9412b3d277d59dbd5d27fb49678dcba7fb474ff33f5f0f1431a1d7c20ed4c5443d5f09fd45911475001e99dfad2902914f1b9dd4e98f2f38b3172f160b31b7d05ef33176fc9d8940713172c4e03689bdc7c3be503e86615de325c18e6347c3d7b3c237c5aa796c3cdcd0fb3303abebb914bc7009602d956e0b1df855c3dfc5d12237f1effbf2b1c999f52932b0681cf352233609125821d5c82d7777d45e6001b72bb1bfb18e2b0bcb4e32bb03d36dd825fff21aee5f71ef07d3ffb9b5cf8ad30275fe9791ab63320c26ce2a365b7fe1246f732650925e3a5fd6a248984569687d982c63448bb45d5d1f77bafc87ba879dae169d924766f4a628c63ee5fe69ed1d881e62da1bca31c03ca339c863d00615707940ebdea193751d5736f1e00a7684550904b0330d40d783b67a3782fa287e42c4b78e7789c1758f6d56847086e4ba8609ce317311f37655268cde8bf54ff7d87a62afae06204a50bffaad16c5ca5bbff0b120d012ded1da1006b71bbbbe00e119100999148214a6635e76693b3c77a6c3f56a9e82c235959ccdb5893d88bd64fc851c78c2d5dcb89a6f6428b9426a02c84e629e456d66a052cbcbd7062f29264a27fe15e5ab60fa550969c2e9259a902b2ce56ebf07b944adffa39fafd9bd3bd8e91c376db531c3db3e56eb9e3f9bfeadc27269bebe9be954a97e4f1087c91dcf33f3f177e720ad2049e4d6e9f6ebd2c4f97c7f411b99b40fd52ceb3184bde0cb16c549f5151a7e31c8fdd9d555d7a63d6f1c8f39ca166ffd676c97125c07bef4af6cf0572e6419fc27185d3c70c709a39cbca02118106d0adc40adbf58067001424b78b3980b16257e99cdb444fe8ddbf3427efa8f18147865387d238e0d6c89d8b3393f3076609a15d964e0cd9b6c3b4165812c9ef94a246006e16f1039f99cda7177890f0abf77a2716087d688d0d14696ee0bdb4604e9cefd39f750b588f4d10fc1ac85ba0cef03b2c77099cbdc0c3175e750eb511eb22fd4f80645fcf23c28fbed26796790b9700d19fc80fd97dcc219780cbf95e3d9152f3055dfff47edaee5ec9ef6ef98da0bd2b774904af584efbbd794598ba83f057c699fa036e34ae22f8eb670fccb7591b920fedae22b6f74ef8ba51f976c39ca92c09943aeaa4163d90a19a5d59c881d471e661047227e411a8de50ef487b8fbac859170a3b4b59f6b0fb626851f6b3bd35b2d14e3635619240f9c5a8fc3c10f23227313b77fcbf0389ba7f8139092f9c2767acda781180032e21e07447184774797446388a0717dd0660ff32017cb7815fdec4d0f37a39c3b4478b9554c47ad27e4dd549400e0fc317ea684c0b28047f346ca9b77f9150860affcea819f1a2c75ee58c512851f5b073e882a6ca818cccb74e2f628cbad64ad63e6d8d0fdbf2b369c08c06c03c67c17f064020dc3818cf4cd2823a0369d4845c2063dbac87df18b69ac50a7641c30db0f7aa237df9e91fa13f912c1a5f6868eb7c613222ae3f1ce10d76a572e34b9e3d820d2383ef9e39b8465a719987b337bdbefcf3b95bd801689e71115ea9efff155b65e9e93077c3a1d3c77e8119b450ad06f3f37c3478ee750a3c6a7b3c3ffc1511762fc3fd9d93b7702df166dfacf9079ef127263cf1629bc999477ab790fadf03f69f0f15c81fe477de2193d2949c858eb68149e1fbe178171b55487ba7acd13cfaf33d54e05b531772b53fbdded96f6e9dc9ee6689ed57355860801da982c320af8232cab2756dd8d1307d8d13868181cf6d096b5594e7d774210b6639a0e0bdf2a520de4242c74cfd61690b1ded4d4392ce40f8f0279699824e319033dd0da525dd36663ce81346e267cd98889fa8b76c43a5859440d5c6f54eb7d4ee1bb0beb292e59a02ae7bf9070e1f01d22caeec32ef2bfbab25089dbb5a85d707957f53cdf25c2e06a4ed8f81e66682a0da1178a6443954d27ab51b1a2b5631f73629db81ef4207295e7637770a8f7dd004f983667f8dd6127aba363812e63ff3848096c3aed7d248e3e289a9a10d368feb2ee51e759b1eab507e2e353e632e62a8e9968b4161e19d123ba42f49d206c5a05d06051bf12c939e1b41549c232e2124e94ce09cd147efb24f05c71a94bbe88d28bb5661728e83ca11dd5fc963d30a4628685eb7bf5d23229fb8134b8ef40202f2e3aa68d37fe950b76031fc5a11aea68a2b9ab265cd298c61d7084efaaf78fc00effa7af4fed567e23cba097418e7cc70920e78ec1ea187435c289c2ed967fcabc99305ef656e557c39363208d378696b67c50d914c38cab960f3fc3b98b0d66a16d769433150593536fcd24bb5394ac82a8fd1d0c4164822498a641325eb3256ef674d22248e0b6688032bd248537ecbbe343de6de31b32eba8e98bec2c21064c403d1ba69029cecc64ced518856336a216c5d7ac119321dc8402c88b421ca84aaa77d7c81ea21c5c19eca51261015abb85a53741c64d71f83f04395cd6aa719be8877e6146088edf21852ac689cc7869c363dc97563b2c0366205ee386095319a49256b1286c318b67d08f14f1a0055b586a557a35d9f4167b1f2f3b95ab19c1101d66e0960a7b97a9221d17a3085aee5b12c7ffb58ee2a0b36c65641f75a46bb570ee287cca3a4320eebcce49d42623c747454dcbd18ab44be001e1d45801acc3bde817b38804863031eefbed549a1cb9c39d60a63ec73032da8a55c48c9a0a3b4586707983ab75edec0ea6ded97b7c88567162a0f2eaba414597903ad33d43144ef5d831dca394962dc2959f1f79388b9bc9f78ada96818398728a3f56ea4f81e669014db7a73554ab902ae737a6d4bec91a5a61c54efe3238f20af663364b0fa3b386d5c313e9c4f261954d09176d4dabe3d46dff3845fc5ca120da795c4978d7389a15575f41712d68d80f2fdb443fadb4b520cdd338f3008e42e3193fb7fe83e603426030d543f5fb4bb8560f71da01eb8e9e47277a74ce51d79c815fd9a38ae8686d461a0e41422742f3fd789f22b584749c88067fe226cb92ec1db82f0ac8b400ce472a4a1ff2a4428edd8f2f8cf0279f9d583e4dbb5497e41466b241041eafeb50761183835fb27ba626908cbd2e70053c0e1496037e61fb5358a454d97758ee3bee96b5ba3b5e0c1531d09300f4f8040d6e15f129fe787481f9b4e92e35a45df134fa136ec5a40a60a8fa5659e800d42a02945a113422425d16c2cb1df1329adfa0a3d15ce262ae5dede04a743035db78285e77100f296eee3ae6427dfab7bf2a479a66c9a5dd1d15befeb547bd33595edb0616acf351a2f1986fa02d3b720ac51cd64eb6e1c881987cb44a848fb923c652cdb3641683dfa9e78ae43f3a57ee914f909e2417b658009d0b8700de1bc6ba414535236e9e17e4ba7ab119eb25f1ad3d8d58c1a89eb1f94163fb84cc821f8ea8171d4e7f06eafa9bdf24105d9348560116a179adcc1615f37c4f541758d59d6f7b6b0ec1456c871e369809753a53a0771d509d525ad8e5293c4f236f71c16cb801220a3207281a62284698a32429e90778881c838a641586bc920cb08349b0955406713ab998ad504d769f90c4d7daa6decf2d5c1695fc78acbb0d0be7d8e08870aa1227c041d1e7d54446e6b29a18a10223becccdaef37ea566e28085f4303debd51d275313b17443785ec643c87f47a271d011c5c23dd00c2f57fbd1a2e22d5e66ad55f86b56297c2522b82a34c2bbd465c7443b057e537a3b4d176b79ae8c6006128868d53ca67e01db007a5397d5ae590cc9b00d803627caabb0a591e61079b93f96dbfd35496e21e1c8d29e8c0212f4d12f40aadfa98f3f4b85bca9fcc8bb3aeae848cd8f55537f8b186e8b4b89127937f5f7ab008f1a018df9fb5f44e95b9e3b51df6b6e48adb9cc052341bb2de9a3122aa9a48bedf75ff3380db073fa6055d0794f7ae80bf50f6d719f6fd50b3901c2faceda326ae11f5b04f6e360c19311b092c73cb8dc1b311b6b1e8ed3da4e56321d3883033d5df4b3a044ada516df3484a5ddb8073ceda2d0f076497221e6f1e3980608663dbe3f63ec6d921f5fab4f6c7ad4f3c467fb844f174ea327472d39f69d236d1ddb1469e6777f0be190fb618c36f13173b82d55743c334b99f077b2af127d6c58389d78a7175f50cfc073f8d937341660eed3faeee0b05cbf5a758f88ce3704c9fdd339e1310ff3eff0cc8d97470dffff21d60fcbe6d9fcdaedfdbac3fb8ec761dd421d7cacb26a7a0733da4f773355c26ee91021b87dd1c818cd034d02b27e4fe1f1658c4dac339615ea70263ee95652bfd67e73c1c432add8a4bea81c81af2b240662190711749f7bdb7b2006762716e9589b7537c47793c1456ab418c1108a58ee6e2e344cf1d34f8c9fb47a0434fd5f6223f6f32d56703db65d049306e19f619340e5ea7b6c04de76c27d7a0612828cc00fee376a2c9e7c29e73998992c3cb5b59f9c96aef33f6319bf45b8d644994f3acb33359db7777969fcbfd34f7210e12fe3d6331391b74239486f43bf44a1662f521fb38ffc2b4451a7709219c18e9d91c94a50bebd2a642680e44dd0a8b88759c80052cf590d2d9a9f8f9d0c15ea6289936a0919ab36a4a4416087cd1e7ec68cdde9f8b6bdce985c68e7408b4c9e36a4c089f1ab45aa83c786a5327e3aa17c3c797b67ce53ad6a840802fcb0e3366fde27669d660c9fa0e45562fae4734449bda0ab40cf4637628835e196fada1892f047776478f890ea329745cb37c16546d4b77d43240fe6ae61444f20eb23fe623e9128cfb64f43e8158e39df0f8fdf10c7cf7410cf0d01804bc7522c75d64e39f20bd73bb6d7a263af2a8631782477b90afd2296b69c5724081bd4f8703d0a8043b017553e37d46b32dd266a19895364fe3a224cb40bc1d8473faefe77490c228bd5e6c41acf76cde150515446121dbee03cf355f9d7735c2111481df943560c484f8b91347e833b0a863a5be7475734a0975164b81ab4167db0d4ba918c31bf129482d1e22ec952fd8b37a3b8afab8c90603466b92b0fb5dfe48a6cda89f44aaae1477dc20d222f0e52584bb2b707a23c5592f0271f9607919632e5789849a02c69c885fe754f41b63dae9aa44e43071391c54744197216c0d454baf2e40fbb07f5b6ffabf62e803c0cce309eb4f8599f65384c848ed9b651fe5ad7df3d7f1d16508777a5fb0350e6a6cf5f90eaa3f1a1538472a7e1872b3b6763c10d498d8d3cda817b162441789a38e292146b99c8aba9c0955a0a99130d1e28713e04515067a864ca192550d0e7cbed6718c6fb2cd5a51190818513c8d9bd82df22a25689ed26777d86cd0018d7eb1352ac186b8fd0774e36f3c94ff0991e7a3e742cbe406dcde30c30817f8b43550bca460a746b28b02548a0b375258929e6799f9f419312fa02689c0c22ccb65d67800a650e002256b400e4072d437f0c1a57a30c644ae88999aea28ef5ce22451b6d0c97e29910715f381b698d1ed3d87bfba7b1dac2e17c00ea7c5a2b288d953cccffb0c37b8c9e308e2c183a59d98dce755476f3f9e4161e60f319b5ae4cc192233517ec3ad2c48d3b8b3bb98bb906cc64c9c10e228fe28fa2e5b1f0d0e8f76e7ebca2b85b65453b804f23b60adf8adf38fbe344afec71a3d5b0e67bb69bca13c12eb9e710e23167ec651d392903cedb719d996b36dd237b6cae707863d6a08bbb24d6f6c73a1b025c04a5573f163d9dbb2aabdd83074a6c5691de0c0fc40e0b8de8bcf700f68fb15d2fd28829e03a545df1848f0e18db14100a1ce97c9049e4151e1266adb25664bb2a805094883034d2ac66ac43f5b3f2ffc1b7aa22853715020b6d656fe45d88fffa6bf78939e6cd8cef0896b9495d4515b20dc778b1e8cd3aa885a0446d427ea4e427d67accfc365e725ae25fcd9acdb288d83d5793372bf16584780998684d6321dac624b18c1f640502bae57d42f89599e8bdec1585f0e9d75ceb7a87f547267f82e6579cd1de4aa62ff8c9a76923dc7d957676991ae7bd215fee49f821bd7b9279718b00a9f89afb42644d48a72a0d59f0792d3a7732131054584ddea63ed0f9c4d1a2ecbc67342d6a184dc53f8d3367aca9fc25b7a064cf6d4118b798596f8a1435af3b7fef353940da51f31475a600d403677dae6a09542873673bbb8c7328467aa7bb8988ddc1da5ef4265d6c920ce0cb04a51dea3e71ac7ff303fe5c6523bc454d092b3e6f79e763a8f0d0562d2754089aced904b5a53ee0582697f5737babc78cd1d48cc5a6a7524d502a9114f53d096c6a18dc3b79caf876c4235614f7dd4fd40a6a76f7bbda8f6fb02fc22e7d7254b4a1cc9a895d65f13f49b5978688a41a7c6d456bb3297630561c5ff928c4406792165f081385362b98a60152dd2791ef2edd45017f669592b4f3ab0324e17199e79ed3b4331c6be5fa5d8f9cc7a1cdc7e0aa1cd96baed0f2f8bf9667e2c06d33d996cff80624ab48ea5038d1720efe62eed8378453e2c55b084e80ca06feb8dbce83f511a73ef156afa2917b8260b221367c465b43d1e8832ce7f45b37fde81cee101089036476774c05ed61ca0939590de435fa6b266bdee37de098c489c246cf6c09b7c0bf447dadf6da60b3a9afbeaedc7fd1cbe7b05a89188d06d52cf3b5bf696f9aede110e09c77a129f93ea01523044270a528cef17038d9619ce7c688f65e1dece142f0d3e4d430b09590f0ec29540e1b7ef048d4a9fef35fcd337110a57e8ae4ab8440a1c0046a492c3bbc413bc63adcb7ffeacb5db96969895534f4d8104fd7ca4be6ef547789a827ae177cc35d624274034d1e39212d2a309ab073841198cfccd49905149ca9fa261b04fc23ecc5b3d7101d44b89cc37a4055e98c5eb4d6734719b970a43645e9bedc5eb3e936052287d6cfa598c991835a86093129be2dcbe6d1b01c2de3c53bfa202eab9967ccd08cf17bd8d746b5431657c6c586c69f34cc5f21ccc24e6b1db7daf0a47a97c523beea0a55fd86c1598bc1791fd6b56cbeb7f0613a137100333dab77ba5160fb193705bc7d0cc1a304cf3f205d6feaf7386d46d02a6d1e29c6810e42f0ea1619c04201403bb302340650c99f554f99890bc147439426220151b133bcc78cc7f60462709b988f1708695270ee271ea2e4c90b1f2d11545b7010ef840d8be0b7b248f50ff561880433b93cf72d8f51b12a56446c2604064f7f56eeb4ffcac0cdca969a24accd95a5a4f921e9717b3a0f18305996ad078d9c979ea464f28be184a53354d3c66b8b82470b8acf811db30cf7807f519a40ae471dc872c7e5a83a03e6840df3beab8fede9ce262ed862564a7c28c058e66929ef410a4d13619fb91e661e1e0b507b0e1f9117c73ff61103ebce58298b9ad238fbcb91347127d737b7490fc568179a3c273e4bab3573b17943b466546703c3bb49a7383e5018c58a7b62f7f3847cc41e086bdfd860ee2df2527fb5b0d692fdfc5bc7ab8bdd71ab3141aaea47399a1f8ceb3af4b559aa5532f98a7710f9d1ab0e6dd828695878e17d321c5f8733d69571998b5e4693ca27165b0d3858feda978c5f2353eda0cc9481e6349bf298a9980d709dd090075ed0825ff3897aa9eb8895827089dbbe01ff2e9df4dcdba97e788b2f0ead0104fb4e71d59ea6db2a4a9571a1a2441f5a3e01719d727d742b5b801f65abc279dfa8814b5856a6f99b1e1745a92fbac60be95c230e3dfcc12eb9a113d90b0e3f1a9d0015e5e47d061ff92b497957ca3752670ebccd7ed8caabb08abffcbba46e6358cdb82a63799f28ab7bbc87b5316579ca3070b0f8d8ce29c428bdb8f72dc1619cd511cafc49d0bf847747a4efb7165fc5d693888fba31e85d35e751dd37c752bced668079495d8b6b60536f5143bf0eda91d418966f7dd17ef998c11cf50fc7e2c663cbade5d7d06795cf7be4d6c78aa6ff4f211d9118df46fd40dbd069ff7b45f09f7ccc75a6c42fb2c395f09d503e6e813d0a7230e51b6615769d6e9bfb20eff9dd9bd40e93c3613206913d9418c8265669076fe067c5600b1fbcb79e4abb72f75dfac2f681d430353cad2976642db88dddc9f61fa1bd46da285f9de7c7e622e22b58c7f90f7cdc3f696feab9e7ba86dcdcadf768277b3847fa2163c78f8447abbcabf8e19ccc3bcac7784eec0a3bdbf0f31fe38375b7cbd04277b77bffe8c14afe72bc2dccc97ea5c113809073e16523e76b21b7bdacb38489816eebccfd80443932d459fa6785fc0c43e72f200290b8dde2050f0cbedbe47a465b1acf47c4386b816959886f3b8d74c0e104d17f3b05aa6bc1c36b2aa68d51a0d9c3e8045af74aa35509178aec2b24e61335032ed109870ca75f01eb8719b4ad60743ddde86027b6edbb4fdd023febfb4cdbbebc241608bfeb02c1c63e9dd090fabbf99505217efe8931d5bca1b3c5bef436cbe49c59978ab237b9169f7034f2ad6ee5b1ca6b803d27aa7e749def932d68ed2f46176dcc0acd9b3a10f852cee1fd64be2b477df667bf9ecdf464d18c42d2d38adeb2da411775896f70e6fbdcdff01a45e28283916bcfd581560e967a33788c34ac47caf90f7f6de7dc710e3e750a1655842412dd2139f9bcef0a90efe99dd76ea8130ca70b132701e3e9c12fe26ffb4cdae5114a41a9d0a9eb1d8cf3b7addf3b831373ab303c7b929d4d6b503b69da5f94b910bee037e4da2ce7a244818380825fd5135228a94658668a00e18f132a9d5aee043b4db0a2819ad9d8d04be09fd3c0b6d39a1433d32cc55500f15b961ddd458de73ad1c7250adb5418d14af8565b4b8c692437d47d3ad77967e8ce9481da85df1a5bddb0a9a9898d1f4b6b44b796466a5a8ff461d314ae964d044a9aab9f360e3859ae1f9ebb03a438de3227f8e38bb2414831e228ae671b2b73c19fde901f05689f478f23e1b14bc616b93a62e704293aa25745cfc9d3c75f5fe7b84571090342784beb05a7123cc0868257360cbf6259799e73cc199b7b41b4fca964574dd10f06e610d32ca10fc5a7a87d9eabeb2ddb3ff1ce62cecd1a0450f9c7f1cbc1bc677bb0f32282e25d8e1c62340ec3f4f16ba2b7ae9d40bd25ea0f05712fdd5f00a091f7afdf463da17dd875249c65cfc18b340e2194004bc4fd6c88fc0a100f1e50bd0715c42c54790b049527efb48750306b2d953f1cdc1e4a879f50cb0d33185f36b8cb713cad80103d2ac1b78f8165d5720e5af664e5aac5476ba32e5eb6f4c1b92fd4ddb7fb890fba4ef82c2fe204b84f075719ba0d8fc9255ef8836b175e520928fe6378170bcd4cc2afa1425910e13c7462b85e85763f6a9e3e0dc4fd2f900beb2c599437f2f8c73cce1bc28861da5b466ab55bdf644c80068b9168a29ab1a5dcbe7b6acef3e598474843cd37b8dd64772b0aaa5670b86b89ff5034f377f0192a5e928f40e21d35cc6a79f072a7624e59e13d61fbf1282d9b07ef5ecaaf056df1b001c627a58299413a4f62666fe967ddb5604563d6c91c43d268cdddb3e9fb488a47a66978a553f606838a36db13be02676ca26193b65a4b078bbdfe83ba12c0acc3960e4c07814ffd4182839389b6d4b8b67c528540c698a6b54340c45be20b298b2dc525a844326dee488dd1234998613159e8123664450259804522604ac0fac67e41c733e5f4476e9eb5f46efb34691d8bad5f524e563631cab0c04d563ff8a7ab10d22f49705792d23c9a91f90dcba77e6ee16c064020269713e420b2bf221c6a17e6ce0c811a532859f5cc14d06e6490d8072ae0e807c519b04e21182a864445b0683d3bc90d14c7c003d185cb84a97091c528534d1e524cc328cf8602adabadf73e0a6d568e5d1cf873ab238d033e535d5312c053706e1e8e566249ca6bfa0101527502c1a10ddd026fb0ff4c8723b39671580d3a1d67ce9a62c4558ac46a48a56aaf901b1e54bef3f4ddb04e89ff364f350968ceb0411f1c4c94593422f665a4d229c4e0bddc30308863d838c1ac1e7d2765474c640921014e92d4076a3110ab322b32460fc8775f775bc14320e91bfd8aa030b247d616dbe8c544710c087c02b17810910d5af7f19bdc75a45e2c5ac14dfbc49a9feba3dfd0c94beae45190c60ea7e8cdded92954a68256292b80b26a3c80ff8a1219db27c178f551993cf9496e91a0c3e40fdcbe8ed7447fc2de5132970c569142ab509f0f41ba7c5b2b6eafaafd81a75954d84f8e9d907744eadb3a0ae299772ea047af65021c0607371421df03b1e99c77ff91670e23181fe16b6dafda5ed0019deecb626190292affb15e863a5b3800f2fa8cf9b0fb4ff970fcc3b22375385ecef1e6156bbde34bbc07745e83d8b5d7f6603e760edbabbbe495a667bf880e7ca1aa6add7fbef3ec12b1119d388c7a2751d5bbf53fde70b23a5390239f4ccdac4b12993b35ba2518b33342f2dc3d1c078cf47238d77ce8b28d9b12eed633d88a33a5338b10c7f97c67daef08ef06c6c02b880a4826c70ad24b764b3afd83660630d0d4b4560d559a2976ef1e1779fba1218415df5667bb03611f7caed10d4dac0b14cecc623bcff281d0f2a4e8907cf37591bf70b9bd8d329d8e4adc5360f3d629e67c1d56cef7dc6f2076da849be5fe0e1e9c515b7f1c66182b920d5e32e597a723ae1ef3bef5b4a3801db7b501174da9edbdd66ab008d7ff9c72a63a1027e0454e08b0f7811f612887f1bd70356539d9c44ac0f2b79cbe693705b53dccfea00518a7d9fb9c140b7b697970665cfb67b58c680013c90c8f6943ea8ada7b2873d77e6829d2d24e5a0a6298e46f08e04e0ecd5fe73793142361a4ccca5f8948da484711c0242fac3356f183e5bfcf72bf665d94af3e141bc3b3e79a6038fea39668f5d79b587fb93c5fe997b1d2d58ff6593bb9c5845115a91886cdeade4d62755ebb8c320c64326a579b5709a42accd11fc2a597fa545509be5d1419e8e3f7960dcd1587e746a33a0d379071b5caf3c108322099ce35df9f463370ee7d525f65ed1ec0846373b8d21eb54320cc010f49a34ed1c59bea1021c25872996a9a8def2942d46f8b7bddf27815a9dc664cb1c27c79966edccd061cbb3d65a0bde7cb5dae0ede65f7b329a02792caf07e1cef2d604d50db00eff8c07046ac123deeca9ced104378ffefddbf02730b54cf37c6d09b654bf978e395dee2f93987789b74548b23fffcd2814ea1e4131759f40e15677fce1ef0af1c8f3f30643729421645d923dafd574eaed82e86ab232e54719195bdadd715cd988bdece70481520963e36810309cf17eea41eaf90dab7c2d7eef5ba1e8fd9ef4f8eca0086ddd80df51b87c4c82e78a408e26bc016a6b1a23d678b00909eb4773ad733e84c9da8ecc5280ae38991ecb5bf6f86c66f487839f1579d5383acb78d20836d8fb2860fd47d2d8fda9203e11bf75faa67c5d117a4290f2c06f72f3f1cf1b7cc39f0dcba3b14ec3eccbabb9df6db34190ca925f991ccb3ca0b9778f7394cf1c98d159e8e7ca5e2f62a9b9304224021be6d7a8f72a0990d247f9546f461744e8f07d5285c606ac1133b9e78c4256c96daebab9ebe1508e25a38cf2e0392aa677085fe155cf6c2de81cd1d00010303f8f860161f4e9ffe004763ae1e7829ddbec746633e2fc3bf3b84c9cf13678467916ff7f936c0f7bd677b7e52bf258a24f25f9a2ad7e1f78dab07b09175b907f3e70fbf5ac9ffeed0f8c03a389ffb377258829d1d963598f64313de113892a207b8dd803dfced950a246e1b01026a81208b482bf72e3eb6ff7e3c563dd6696914918303ef952240f31dd7c1c80ff8c416992a152fee4a1cd294754b3ba3f42d6345e2fa36891ac8702efa9d096c432e3a96a4f3b82195b8af6ef9bec8202bb93cb3a5f0eec3ac07f707ac6c8cdfb6589a239a0fd34d8649e7707363335eaaaf25b82c2620e5021fc07d6e35836d6bd794ab53c9841b3c04b572cff3ae5d94381d8d332ca14d6cd33d22bc9c32b3dbaf3e0590a96b100d323d021d1d07ada5392eccc13f2dd0e5476a00a7bec8029b882bb907f3e50f01d15538c5d4c4ab0a181f1f20e8098ce5d499d79e721ba12c15991091a8ef8f761514604f9422f06113ff5bb31379352d425b6706dfc5320aa2c8736558bdc394864db83eecd24cbd3e230289efd339b885691ca473343a2812ded4d10166d48c297ea63e918c2c937a1718f3d16e5a569f2088ac6325c05f6095f6e6de9b0ca36d4635c31655de9e506e9a3ac6e3a79dcb668db2476b890950522c4acbb7a36d9182022233f070ba76a1cda6b9b45c43f36fcb340fe66690a406ed3fa79d84e57a43fcf137f3f329be05e61434ba2c8d0e04eac838b6fc19555f1be583e60f4d941456fcfb264a43c2e9b97ecfe1a5a19e637e474a9a259dc0b9c62f3eabbc07dc393b64d7205b3d27cde6ceb407ff33314b07dc1cfd70fca38b345eda8576c67d376b7f626c5f558dc18c355f72e44179697ef4164bd1e56bde1bd8f997c5ac5ff8236709b8998792f6c7d6fdc7d7461287f1e61538115f362df9a89d5a4d01d4c534c4742e22bde42e356a48d6d2c6e28b48cf27524505bb35305e709ab36f3e937b4582194726e4f67f821dc6fef6705f5b01145724ae5fface30508ffa0f3dc6fdc6ccb68270a455c3c17e146f14f3520bd208067de80367004b54dad74e10c9f7fd4c29a530cc9670f8d1693ed8afcb7bdad319f1eadb2ea40903d4131ec86c0eedb11cb2476cd11a50601c3de2589b9196d44b27aa780f1ccc9d7c8e83e1c65d295e2ebfe8f91533c2cbcf4513bde82f15cb9d8921a3fc4b489d35c755f62e42caea2c89f309d86795cf1cbc96e62d04f20a0b5abf436458a7e095d8d78e6884fb622eb3d21cda3d068d506a077d9ea5526f63ca5eabacf18db4d4968341826899f28e38de77999d30f3e4af51d887435f7ffd54e88970e355fed1fd6ba8f768efe6a82a2fb3fe9428b6519ecd852fab279fafa9672169f00c5f0153160aee1e9f93f6243df9e55ce8cf1ee54b935c31f95625992a44b8ecede42734052baa02b148b28358f2868f143263717410292f4348ca00e73b99752b52817638735257ff70d7747fd6e7bf6d05c11d90eaab089357c23c2a009628401366ed58b4b8f85a8116b156441b119043b4503fa31ce0fdae0cd8daf14bc26d711a35633bd67da1e1fb6b71e909c6583d11fc97a3a0dd6afb1967d665333764060f3a124d2df6850a6626dd3752215243ba1bc8ca6c34da61211999568a7da3e6dc3b5256647ee7c9c0e4ee337a8de6e3a703a87e7d654cde9fc4418bd43fa93834a631aa1187aa79b19cbb09e2a1a2c80ee99aab43b3b25d154615ff0587f18a3858049e8b052a4c62e8df24385ad920ea453336f0b8af453c2828b815a09c5b85aa2889c2b8728bd78c489767a9c0aedba67bb34aa74ff980dae4f53dd3e1c051db725f6750a3d23cbae9fe8f975d3fc8844dbcc37a687892ccf3d976ed0924f44b9d0bcc0e63cc06a62dcc8b79871c451724d3af1100d3d4000f2df5e2d53319cd80d1643223146893b0e1ee4d1bde0d508ba20b5eb7c3d57252e94b843a1e36d356a2a05bbe07d0e5528047ce09521412b3822129be1c8c771ccdee50043cd635812573cea92cb55de006b9099b3c2eaeea3ba1a1f6448982d1b5444cae61eea50ed0bbe647e0e8d02c014901e720cc71312eb655141815f004e3b7dee563c23546b783136b19b3e42649b856ae728e710c09cdca97acdf5140dd9f418ebce29a3064b3393e8958b79f1ea367eb754cbd5a10752721efcedcd2c1f74c5d2f5da945a342dbdf861a6920f31522cdecb3c68075d78a1be36ca35803c6bff3cab67e0dcc3a10502b24e22f0ccf8a9fbe0791d0b2c2c08aac6a3e1e308d6ce9fbac73221977e0e726f3e4bfc58fe071b15806c9575265f9bc77ca6c2f5f95121c5cd1836f768d63783b97e3379f4da17fbaf4ba6a9b7bd085b1d13730ce35c7788956a19ebea0a9e126202134b500c0e9a91ead95ffdb08ffa8f2c6c14b269d10242ed0f09fa6d3b7b69a8db8daf0ec27dd2abe76c8797a158ecfe65c88c5449be07c0f22149d3093dad1745635773bd24dab288dd9bdee133631577914c8757178727641a8f12b245927cb2a909e8c93a7983fd04b99b69e42804cef125bbc042c5673846d9c3cee29266a04004d0faa929313a3100bf2497160c4a3288059631d895388544bd79b5f84497328da47b8c068458f231f8264be72661a197cf49ce25ae7a0177803cec41f80d3f0b284cfdbe5f1aa665088592598b9efd1391a22a1f36177100844f6d565857b7456bce8ea4cfca0448e72dc1a75fc13d0e423d9e7dd3aa9a68a5cda056f64f1a34e93da00d0d83d440173743920c34e97c451e24925e41caf8d3d38fd2bd3b93b822ac400e67a6cdaaf16d64b052b83c942e8a7de8af10b6dd008ae9486ea85eff8503f0e2c49310cdd3516380604025d63de4142ec17f38701375ad941d154dc58929e5975ca2ced8f968986f949014045b34f95d0572428253f3f75482baa396cd757c185c5f03087c15c3b4137338a8d32d41405ea49706e251046ab6af0792fb233ac2669a0aafa80e9df59be904edee69db2f82cb23c1645defb87505d354d00a0cc137210eea31cdfc6f666031006c30ff3aef2151433ad0e7b35fbbfd71a6dcef6a6b2e67018ebed95697345c8428b3864ee6d9f51f0e65a1a5e4aeb71bca48cd5257dd56a831fc6b32365430e9f17b3643e61b458494d9ea434cb8ae98a0c79bf5897f09055aae12894b581cc450ad93c1a07cf07837f5dc1760e5dc36c4b3518da3f6bb7053f75159b5090a6540b60d7953465e71be1939a8186fa54bb3d56cc0918146db41fae33506aa7dc86c2a611bc2fd9741927ca35c63fe155751df17dad16d84e3c513b98f69c44e62c13dd6bc3fe827dbe5b36c773d7d5e23421ee0997f5ae5daa59edfdbf94f648601af709cf7d6decf9384d15ca361f9b6dbe601dd573b89c3b7408a08f17d0a7d757a1c5f130c5bba9bbe6d3bc8a99bb3bd170fe395c78be8b81c7596ef2d30d90a0b39177a681d29539a6fbdf49023a0fd7c9616dcd9f0de6095ad637ce76944262c987198b6ec0d50a54780fd0d50a94351ba30396cea2d4e9edee39d09d1809d3ead31dc42fdde62237737c58423b72e97b3e25061a4fc076bdd3d1bae78bc733c07701c1f3ba15fb7cfedbb7ba142ee8fc7306642563238718bf9bc02186cd1fc06a8be3bee59df80c8a7c92d9e29da2dd3febfb566ffd99e03e72dbcf42169e3c5455f475eac54bb7749350d476c729ef3c0479eaaef4a5b99632f1e41ea5565f30183f2da18d40bb1d1f2270f6dc15d1c5ff0253ddc211bef284b3320abcee887df97c42559db646634f1b37a502ee3a99699499355a4ae543a3847a247b03eda020458ab57e38e67f47067d6d9779c229b76a862f99c0a07fcd7e8718f266e163efc7944118894dd284267dd8f05e19326450e5d4f9e426bb999d6e84e20d3e84c28357a9c72f248c2111e615faf807a92c407fd0ae208b61c145ec8f93e76c69501374e2513603fd09433e45ba90d2e390c39ee07961d9ff78eb5c095db50503eb1eb6597e80e1d615a9fc4a1ac1d74706efbc2db443fcfccb44f13b00b4b0c4bde124e561b5638edfaf0a68faa30b8ff149d2e8ccfa7fccf84de9308dc34c03b2cf0c701daa9827160aad40756198363e14bcc6789fa6f3eedc70bd566ca6425b5a41924ca832276180e9ec10f67ddb3363e8da5b282b0c89ca89a7430e853c09425f300f5a21a04925a59c20403732c45b63c29ef7cb7613dae91fce0a02055edb2522bd1af04f424b178fff0e9bd74ce10ec0992b9cd6aab27bb2ef6ff2e87a9cdf838260214ff2e0a3eb8d7b48def852a9746581e27142745779a60c57a218be9c6bac0c6dbc4c3598a8242bc6c37a41788b0d34db8cf21f60fc9c674959440dd441dff1c9180632ac328f7bd4c9855500d3ec3a84f70645809c3ce3d1180966ca3e77ed45ad2c133cf9eee72a7c7903b2ce2a3441dda2a5d80d72c68a1331e504ee33fe761c1789798d860035aeb6732e74676b128fd9dcbff3dafc01eb66e7f11fbec5cc3272eecfd1ea7656efda83ae6d00ef34b1a41be477afa25b00224c77bd8a3de8a6932845c421bd67e3d0ef93b5e6ed07d3f7b1cfe80949f87c9b8428be54bc60a597184b76eee72421bc421d924ff7d05e05f69a744f95fee54ccc4ed7951e52d7cde6bd1af23fabf1c15dd146d9be94caccab9c6515dc995b16cf687a1e924fcda00cdab41c4c048696a77a2b92a982516f21a971cd1c3e26e2b910f359c56dd255d1719146a77a70016db222fba196802eb025fea2213c46a66401a94cf695ce5e9e3c4f9c57955bb262bb350bced420a49add2fc49efd482d88b31bb3620ec497dfe412738b541756c3c25064af33f4a344730eae6d39857cd75652bf6212c5d5a68a5c07d9ec713fad3f95fa3e78350f73b8a980dadf13cb2b8cfc1bc8a9390adc3915462607fac57394085b7dbf60e06fde4df4a7d6bbd74d861cc13ead97dc02bb69d152e9d9060cf84132e5fa418ca2ca1af9f87737edf58773becf6ac1ac3df2fb4abc6be18262c090c07157582b8edc590c08a2baa8a1a1012810f1bfc3ba997aaedf179036c27af08960cd0877f986adf38dc77b0a9a39bedefc6a089edc66088ce5e6757fbf0a5e95c72ed81fb2e04a47f10e80f6740b31e50db827cc6ef0bfc1b2328b07e7c457e435c0afe6be3b807c9f177a3b2e6eb3d265cae71c83e48bb11db977bb34e7824296e643cba44c58d12ffd654dcc471902365b8b4860c4f7c6474b1cf942fc57260188acec50c3dde2f1b44e3b2c74f57c967fa1664a950f709de1f337aef1d6f14cd313789be248fff5037336fbe2ffb9fe8ba4e4a1e4c4c4f143444ec18bcbced6bed705392e733e96402ce3ee9516ede7244436b1c8c75d86c79516c311954ca6d5523bd3015f9e2227c598060cf501ee3faf3d9333cf4efa1331c4bb419f9d862610995ab0677f0604a41e3f687ae01d3bcb2f20edb5155bcbfde5fef3d90005cccb1727936bca63a50ca6de86d1c25452f3ee97f84d64866a61fd246198ea109817f18d938a437519f46a025db8e30275548b7b4beed6f9e0fcef2ff1ddef1647309736e8e18d84236a4815d09786414fb190eff0ba7c763d2754f24802451edb51fa8720081496763c2616ebd4650777bf51e3c0e489ac08142bc0520ae5169a6fd614537ab47e94555f233305852affd2ad55cddeebd3bd4d2a988d6b218fed77b6018ce3a508fd1a3b7d59f65999a095face47108af6f681110906d195e05103669f2823c2e7bf004334f3e734006639f5f09276bbdde25eed8cc6b4a976b6288f61136d6413eea82994ff7fcfc1ca8ec8ff348df0604718fd87d377f04809715b82e5781d9ed18f37eb326086b0e99c5baf166bc5837b6f22076b98addae21093cfc96e9b46bb76c5eba21b43f1ed96b29390d2e4056fe19b0dcf1d83856ed1210998748982e1f8aa9eaa1db6194d9f6f8014859a38c3eaae51da165f49d14bb3960af3f9ec678d24e3ccbf8649fd86eef506cb58f9bcfd8ba9b501a9ffc03d2fd700fbe614aa30f2642781bbed731448184b102200c5e8a1936de393634e0759c01d4d3f74b90bc2e0a0aad7203f2d88c9b78ef90dc4607aef30ff0d158739087fc97f5343f18f6babbe6c0c2f38a8be19fd8a2cc2b05c0a39c1823193283132f3ff74421c4a9ec44e9e371542552ee39d6ed43f7e564e65d0383f66be1af4d43442e95293e40e2730d1ccc9ad094594876af69d010d3b07ad17e0e9544f0c4a67b786e8a2bb3bc6a096db6ca400134138cad1587fe3223e9e4d2c0cc34a3f78ed2789ac79b53d354924f0c99f6cecd04979b35c9975fa95fc8d95e6b78bbd37ee08d3ec2b337801226d03d8db2973266e7d27021a4f58111e72eb69e9612e951becbc6d3955f41e57289e81d1dacf6558f780ce2b2a088d12fc0055b990b2ef393eba4c6c3d08d798db33b98c97c52bc5758d1ace344c12512eaee01cff1717c44f65ef2ab2b5883a871f1236813510eaae81298c82db9d4713b08cb00bb1eb37e708c27460ffa370290a2e6b7fe162689ca9fc6583907800b15132090a2c842f3a1573f68322e8ab5a0d25f90154f54e4449827336835544cd2139105f86f1c01d9d47524cd90dac41296d7e749ec968ce4105107305efa04e80c8538a6fbefcb07fcfe32d4de067320e2811f801e7933755754b7c72abf9673d44b409adb08715602ac83cad99da8c134629763ba6891ce420b80607c6022a8a40f701dce8e46442d0b8fba7fce34436b3ecccb15da5830397c4b14bea6371f9406001754a98c8c61e94da6a22eaa66a6393429ec4b76d397281884236342547f569ea27a1785c72f3662327ba501feab393536fd4509f1995e0a6654bcac595011a57b7bb6c55f61b468f66b12a9e83fb5a6c705d1a2b24aeb123bb008e0ace0ed19629fd6cd63a26f4fef800463cede7cf1cd9c2e11842233eb261ae25ead4095e5a3bc76e13e6b53c01801e5ef168ec17dd55c229ef59fc4b9f173c09579d410b6f9278d7fdbcf84c41882c88d0891f2e99b5f479c678c4d648428463dc91c08d9d070c04840008335c971d87c845210dcffcd96af2f2297e564cd1efd99b35e8c0713af85e2eeb60a52ef0758909e060de3f2dc1148c96de70cc1db70fdc555273db43c2c9427588c537470d238c17d67ef50985cf2ad66e23669f5b62028963c9a86cbc5636ee1d824ebb24a96ba706b4b6fd428cf97707d20f9584abcee84766f0e90c70a26cb4e67d3b4dfe54d18ef087c029ef41be8fba6e517092b35a9f94a753f72903b781609c59e0aebaa98bb198a72ef24d5c90605bf487fdbd0c9dae6ff6b4ca82ebeb52d26d4904bbc2633811603913d689fc63b8db1c2910045e94ebe0507ee7a1c8b1b88d9c2e529950755f74aeb3a9f1f204d69494b411c2e979cd92751419fbcb8667063f5be6944edf8520c120260818861e95c0dda006719c8ebd807036ce70f1cee98fea94b456c6c675d25f8c8f09c185ed5f45d0534da16c63864cada7858d65cf3730d67b4c88d4f067262acf683cb15d6aa2cd631913cd986141ed73f218f221925b10411bcbdcdb8a19e9005850ed6e2692080fe06499c9f37a7a2695c0123bb7c774e7f1cca93b152d73491ccd5ec44ae1e1b7efa2733037dd75ae5845c3466d7349ea51aea7cf3f8713c08014e1a63bc4f4a91a0d1a42c647f4f09e145e270e84ff9ece8e45822e5cd65cadf17fd77f6a324c0156fc4d8b920bbde4b85003731feba0915eb5107ac01518f1a9c36501892405f43063e13d7933ec0dc211f685afea23115a19ddde0b43f73789cc1e936b1ec0b0c0cb15cc029b2893a86a794d45cd25116cf38ce37916c3858accf299cd440f71f9e5e890d689668a7e9c0569401a0441218d29d0fc90e0d49e850d10b52d322e51f684ae4a4d750b05a6326bc348c3415c475afcf20d229e529c1e5db3eb500e55360324342a83ce6fe2f58c1c21cf0972e051bc7b1d5ddba0a2dc6d372745a3f6dc916af95900de7551b7394bb3196549d376f98fc26895be2b7704e9628ef47824b260d2e62d752571ec431f7b2b5890e748aa52b9dfe6332c0dbeb95b80032b1ecb87a45802156d430008f4a7ecf7c343f3b44e20c97aa32501e8cc530751a68bccd176bb57dd4e4812eb5ca27f3fd49f826686d356f2eeac38117c84c7fe7c533c26082bee7034983b5f1234fb0a1ad5b291652bcbe94eb1a8093eb4721189cf7da632a20f49f818a790bc950672c5de019b0f4805698fb80df02cfe00324bf08921f66c9cf6f1914cf7b0bcfaab535e00de6838637f0ad26cdfd8b429958bfe391ef057b610b5b1df87701b9f0ec2c584792fde175b0bd94365e5f0723ab123f1df41a0a205bd67b7ed181ccb32d201d035741b28de2240ae53f9759d34e9536f9b214cbba25a9c334cd26dc7e6745369d0d8706b52c007471ba6df49bcd0ca024cec915ddbb6c623a36b7af090be7ce2acf3a3a6ef84a501eb2badb0dcc73872a8446ac273981dc3d3f13bb1f56d362e3fd060d1e87a38919682259c2ba3390befa158238d7757d25cc1e1a14849bc2b3e85aeedc4d65fa56d7616703963b354612caf27b7dd711ac57c95a64e42d7c84b0f4798867caa48bbfb066c304fdc5d215408659f10ce91c8886c3f2fb236e3d0cb342272ff066485414f72b52d5281216c8c3a5b425c82e09e74f88806f4d4d6fb4ee47a3a7d0693fd6e56a451f998b6e724bad3d9f08da128192eb61a7bb7c636ba9ebd1e1c6659dca8167b8cae17b38c7fc385a06f0b177d208aee48a137c3d7178af91bea7316873bafc8be57b504bb6e88b6a937105aa58849389a7cfb16a2d41e0313d77fe8150103340557042c900d9d29345679c45ab40c422baefdcd74b365d77a57a1e51bf6a823f3121022bc442e110425480512fd59883a2994a9fe28723e613e6cb396941ac4e9c4ba23f036ac54a0b2e1b07c6231a245414a0b1556ba4a00c847581e38b6e36bee081309a77a5ed3fb29eb5edf6223ddb6f4c42ed63aeb0480347ab89833571fdcb776c920ee8e064846071b43f6e59f2b898dab450b7de00fbb1256b1bce28c37ba532d3cd8b82024a6a4746815c9589c7a711e1fa83bd75ebab5b35083741bef307baad7b09d42e3571955abe9aced0b81b86fa4d8074764fdb9723c6c41906c45fd4ded5486756f7ccc44df9afb204c2583671b9063160000f664b33558259076c028dcb971ef366f8e797060fdba98fc5895919146707736bc036ee18708a119a0cc76eb0f577b000f81b7243465ea5ebf7c52d475caa94df78bda52ef17b21ca31c035bb82000a4291d55c9a5cfc6c9dd4560574196a1555fd70bfaf31597b9a86813b521098c7ff22a26bce0cf7a5959153f7d789f8ec89afd1836e9ff69dd0af3fdfb059c853a24027c954d0c21ede430e0e924b59519bad9e0fad6c925d426afa2858363be97b6f1a8e6ecb458378a534b513994e7fcc6b0243476c8c880f4329b860e03d2fc0431e562d754c6f22f1a415c3a5cd87803f8250570b6c5a6055588ad995a3f88ccefc823810ee314215856c8945b77f674f1cc555de700f2904b0650eec3fc62f623ba58beed73d4882ab03b58c8bb6960c235832668c9ecf8f0ea73210ab5209f59749034efa0d94dd3c6e19d8f4f387e37031c23b425253dc6b4420e2eb602fc0de935e2e836d45e1b8e3e99c29c24add263f673e9cdfefe538e5f0ecb32fab19aaff6a4c904b2ba463200cd59e6822a495a9ad63344a8e8226061209e5c1b6c774652c758f031a8fc3eb46224185a5b828f9597e3de05f35c60047b745df9e97db9bc307a2e95064ca020a2ca41317beb7b5f8981dff898a737352c6221f4fc38155ccc2848788fa5623b19faa9db977f774c744341909fdc566a6d4e7085503d61fe82fd2b1d9a47403221c614c485df89652577212c1fa939691fa6613b4c23cc6ac74b51abfd46737a1e09b0c9fb8d0b54d5150f61218ca8c25eaed9fcb13f3841e02b7eb18ef9a7d07f650dcf475cca8a49c11a864747e5d06c66531eda18f4866096908ced92c25a48df791d6b2ed8e530d9320b12af602c83b50b068289482eff953e3214e97008bf9d30e9e28ea73c5db3bacbe44cf8cdfa31e79923ad464685369863323e927188e0ad1be62f3219ea5d0eca7c15dea041df3cade70f4b51f8559ef72961c0e6930b30b4d2390eb9973533d35d982ca0baa218c750fc16988bce7d70655e7622baf7705d2af3c093084b8ebdb61d493e92e1dbfa86b23ef3b3410ba1be0597e77255caed24868cc25aef77b7ba997af84fcdea4e77679889f0aa286843ee984b547df475be24ced15101b628224e9a1164f95561768e37cf28537cd6c9b5c8418fe1f0ae7c518ab1c63ca839dbe6a60218ce413a8094cbef2b45ae1a71b7d4734e689d65e27cb3952051baa97e187c166b87ed0add5aeb66a2ae820164ae1829d4060e36d7acf1f63ddce23773a10b194c86c84cd5c99b1d75717b776e76ea5b9dab88b09f7797f8b189f06d1c50f65286f327e28352d21aa5bda35d8a894e09b86af7d0d5163ce30e5e64d463102c78f2ede16cb42330f4c2d319be614a6b88a4637f1e95365cb0ee401ba877572a35834b119c6957c57cf0f86066c71afebbe2afda9663245e03d784a433776039192299e7d28691da6992a63a66fb857a52424165f9fbefd4c86908daf94524bf7fe4048aa23eaa7ba77cca5a38fa6fe75431e5743bc985c39b8e7fc74649b45b16dea53fee1ab6b00d86d79fd874a3b503508db7193e9185e505706cdf0ec5f1ba09df4f774d96f9ecf3c68450db10e410fa8484db62448031b8b0f26dc79dc67e843d811b210c81c4317929a5b3d1f9dd204110d8fa89621cf306b5ac4e266f457e4533934c28e5de0688dcea11d3ad216ed659577929770516b0a4b6ba61f42449d8673d0e8d0735c89c958be76bf7a2d546b8ac860e50522fba6e3ee51ad443669bbece79e2765138d66a23fc3a7f4a5ff7441e4884aa7913db239de36412b380a143d566a40cc3d273ba06295131958fc23b5035ebfd33a558947ad067f61104a725dab841ccc1111e8e35c1abb62c1f2f150e0a5813589a7d2557f2d36a20ae60d26b138dc628766babad8dc00c56302dac8ce5d3fb007b7ad1e0759da3f021f6d8505f405ea89ca46c92a177494d929660c4b175b1161814c1b8254e8088e5f415e782ac7d7ba784e472bf68d5501bb45fb8613f82a7386cf5c00ae701bffb7d70f043e287ddddc7d7bbe0dbd083b7fc6a3b35ae34d91f8c9894f553da349ef79b79bcd25cda307bc4b03ab758674efdc64e2fff54671873c8348eaefd6232662f55c7dc9da0b3ff801327f8ee5fde1a0e77ad79b67ee1f06ada7f7ec4fe4f5af3008c020af2efaade1c093598a853c57b9660dbb0bd370887c3f781aded691721a2ace85de4a63fad3e0df30fe3722bf43ef78a277139c5dac7ddafb5f406a798aff26b14ccc0646c623583eaa6b4780177a7cea6cfb48f24cee763e7ce3cbea136d77bdefb6351e592f75b74db591358279c2258377ba8f2893830e826def19bf8b9c5b242cccf0d46542af0469aed20e09df9dfc9ff0edc37730374ba2d9af268c095e0f45678a19d2b2c2d559d261018eb6a7c0b69712874c70d3f10d2f65f830e12f5856df66b7e8c7d28efcabe3a902375fd7f0f03bc17fb0741cd6bc70bc5a7b68c18cbbdf1d5704fb6f686ddb197394336348ee17a84d8d15fe5fb17944d4f5ce8e423c5f3f11c155f0e5de3a93aa19c6309e2604d8f1bd27f48ed02421b80ee73943c73f5b24e26cf18934762b5fd167b181a025d56153face451d49bed9015fa6c629e859dbb765e342881edc06ebbad1f7eb437e40e5d162350eec7c76f7ae16cc404e07126163a777208e33259d27da7ce6893728cc5fc0c7ea1ba0c6b7b83ccabc691f5c3a37eb4da96c0226c7eea6fbaf17f73f57f7f8201ae3e73313f7317e5af0ad20b78a41231fb6ea53b2bf4e463eab6ee876356cc0519ce873369d3bb73b3c5bbdf35ab508659e8f374e2b7bff4d7a8fc3d88b20e1ebd33738ef272ddc8fca9a59b04cdc7d5f2c11c212f831c37f7f229a5d71f151598cdde3f0609ab10657cd1afacf46d056e1fb1ce8cd2417ada1bf60303e6bf8df89377df089c5f29c2637a5b8eeed5903be71ca0632f0b93d436871edfc80f18755b386b2be62cc9b3c9fad0f4c97b3d6ed673e996472af801e2be322c57fcdf749acdf01fa3b69aac3bb1b1a3f182849fac3ffe2180ef2f1f79ef276fccf92f1490e39a0fb07ffa5a7b8c0eec7e453d8e3e9d098c45a208d9ec59dc0fa5bf7c0f6af6062300bf15bc32b47e5cab98d093bc2f2940abf66d5b009b6b6a85b40665094e08b42061db22d377ede26df7d0b288634fcb0fa53bb2c7e38ab1c559787e979ee53babe3bc5f94c07741579047cbcee4d4cbd37d6e31992dc0515e685ae530c7a74870a8183a26b6a2c2f944700f4e72f7629c85932f8fad34166ba26cdd51dcb21c163255d497fd8ba11640fd50deba4949a44c24a7d9f0049cb5bebd0ec301033729c681515bd8def1eeedbb5aefe5fd6f7cb4b38214afb339bd782d3b1446d5458308720a793bf618d30467459cacf03130e253cf703d2f8e74569b52fe9dcb8e0f162bff7d78dbe2608f7acd4dfc0834b3e5b602f799d1ed8312371d7d3f676f6b734d1f30520b94331737794c5c8672c8bf834b96f8be733ddfb66479f98b9681552fe59b1b806897b2f4f3053de698c0b37dff0839798dd4d3df3161992823df9662c4c7d87fd2bc022e78fd13bca05316816cb44afd9a1dc0f71ab177cf4583c6396c677c3a38572da71d1f953c0b1b1dfd1a92671b8388c4dba9bda1e7db5bc1323f5b4e71cf740caee4c9a624cf0b23b7181583628cf74f55c5c646f29e56a9566eb61f66414549b8d854d85d8220b0510ef253844a298a03d49704cdc6764256870910985773618cdfd69ca1a79069d889a39aa4dd70116daf0448c9489bc28cc659496b4515f2677248dcb08590db751aefaa6c9cdd4954dd63bb3d57e50425be4e5e82dbc95b20d4c86f794e83fb558c0346a02f76d5f1718487f5c9ac27b69ae28eed00b362c6b1d16f291d9530a20b7984d3fbde15c7685fbdc7fa8fd22ab051d3c3dae11fd8f139f793ff45045b98cb86c8a07d9d075ef72c1b91d4cfc83ba1f94f9c514b7c98df0bbf1871e48d5feb1b882d9fbb7ea72527a5c38d07e7da3841740369b0dc0e47b8d0bb4a770fb84b0fa53f1417784da035e6e63ef6a83173707fb3e727c1a3242eb71ccd475ca70b02f804047a374266b2b50168596f29d9d0fee097c3224f99827e8a7ba4167a68e8608c0bfe8693a55e352f261f61cedbe4abd355eb7f7ec3497f6a8aeb787831fe0d90700cdb4a599b7d90e78a00f6b8dfe1cb7cf05198eeaf879bcb6fa4483534ec1338ae9fdbee794cef620107cf2906638af58a396ac93ac3ccc03cbf7f73e3a577824de174a098c536c35d2dc5a5e8e17b7b1b57c1e6a28d12eecae510d870ace620198d4350a6eeba9ce60bb0393c7e7b15005de7dc92dc449f5278bb7a1bd32c3e675d3e12bbdef8875a6bc09e55092be129435943128e6127ad0ee035aa7f09318620d90939ff71c0387cd8ffc5d2f3b91113d47be14578cd7757e37a7406d7d3aa61ccc2ebeabc81d5f63ed18e2728cda1fc69f2fd3e6c4e797b235fdb448ee8f76382c424c8e9f7f66584e3ca66eddcb8e1aa496b9441a8691929301e5230340d9373a7dc53c25fe9216f670a37e848572c89b0ac60f743fa71279861f30f59eb2d6dcbad02211d7033ba93b9a79b020306ca19b4b3f7753d9e7c7d405aaee3184098615dc449221595c6f063e8ec10162f56b49207c3caaf434982d7f6d347287e8b581f2ac1a99097a662da2d4444918ffe51a1780b90de805ac43f6039d71a88609dd68392a2eb40efaf2043a8b666d8d22168317a281c90d762cff4b42fc3418f58a6c594cc6e1c4c280c3b2a3cfabb7228110229b7d5cd4aa2049dbc29aaa87ea3f70c44ed4660403b104f4ae980ffca380d21dc2756523642e02c382c36041c428d507c3f81ada67be5d836488afec6324894d28d258f279de65914c161c799e35b4f2681bccc0d5d1da9f143db85dfa16e20a83f0e810590ea36d6e8c504e5b99e58df2a1c95ab5b8f739778659846917e0998dae4dc33b7c6a6cc5759f2fbcce84f0de4b356236935b9b5bd6d19bc804627b5fbef208a15a4d49e0c798c9b9807486e9c439db4c345cf3fb814f9491add7731514f4d597c2c81b1a5651dcdf65500097dd0a8cfbbc603f98af0cf9d6c3fc1775dc62864e3bde156eeb2c44f438f456e42b25afe280ab8d4150a38220d2fea965d3fb1d9439b44d408ead1611300d577d701d2f3c4822d4cf98280a66fd022f06da43a7b526b3561f3727173a7b84d9c8e1d78b67203e97ebb2506accb0bbfa92d6a15369e9424cbff95a3f0ff5c96ebfd29ae17fdc586ffa10c7d3acc5fdaff4ceaf2f269258faf32e1820bf82df3ed608a24ffdfe32c6d77f48f0dc34b07520fab8af97bfe1845b8229db14c718fce73ff3da945c92006a3a3fe381b546912d0766b5c621ea036e3c7b757fdcec5abf3a8fd36353f269f4a7f7966ea92b9c4275ada1f00e9c4eb90547da9430b7a0f023cf19a93f6e46ed19a053f36619eddb5afa2e0a1e25c96b122a9a150e311573ce512ee9ac5982c38ba8e0cb2f15c1452aaa79d5f615fb51c64e1d72f94ec50b554012b7fb957b55b4d96f5ca29f3b41ceed477bdade2cf247abcbfde74cda8ac8c6b1cfe0b852de710174a3ed685f400d60e8037fe3717331b9ddce402081095023b0d70dcb5b7f3e9cae4206b9d89def8b00231e2d17824c01bbafef57dfb94a64561b4eb27bbf6b087130751ef4f316e2b7a4ef1b04233c5f1ef2a37a64963c5408f70edabcebb3f69afba2f0a3603e16fa3195780ab2e36210e9faf66a378c1d1ce01f508a3bc98de3ec158affa0e4df306922b82dfe8b30f65b44e064b30bfee1825161466bd6f8dba374da977beadd76a9bba1fa1ee8f793782baa8f747a3530ae28e24880997175f4245dd05ec1ee86bb53c5cec89dcffc77935209540d048ee7c5cb103c10a8b549073033936c00cd989999999965d480c1409b4423c2289aa0945252ae6945a03882ece3183eabb69452ca2453796d21a71bc7746363b74602b9132510a60f2c2e2e45fe797efce8984184881824912019047bebd7bae7db9c5344cdf3b4411207faf6f756f16aafa50b480491da95e2c4695b77dbd63c8fcb7a0c0ccb109722af052481700a3133cf5fcc174a4df33c2ea45d48c7893ccf8f14f438c14acc1b1eb3e174c145930082d7df3129a71042ecc610965f7761f9f1230527f8f1eb63a4a0c7097ac41421e31d0d6f4e19613c8f3767f33c256120f9836ba829f7da7ac96e79f901a9ec669dac19f373d907b6f2154a4d1b63ec0f95a112023e2845f9daea7dabc8ad6c0471c14a18247b78aeae6c35fe4ff708699e070c123d60dae4c9986ac819ffe701dfca971ae2a6cfda2a3cf8abfcf7efd721b2c73f7aac640a48bc40720765da1e25ff42e929df0ecfcb2996902bfa62e4756809b9cec45c2b45a89f0efeab9fa5d43c1ff24fef68c480640e8a29d3fd726a5db22f39e8eb54a4fd7ad5539a7148c7da3964ea6995727050aab1abe25a1cc35d90bce1fd6a0d75fad62a315e6090b8219343aaab17a147a9b50151d3d4cc9ab5fc96cf06766c156e7a2b5132f535b86cd4ab5d33a7ffa8067d49f94be6ee48a97d2c2f306f90a461f1a5f2d394927b218586852b7d68baf592d3bd366688352b2c9b1696174ea79fa713f3e205c919f0a55b4f5b735eea5d99a12967f7cb8bc82ad75d5cb60b96167e6919425286fd4fd6cc7c3dca7fc8ee060b193861aa77df6da13f9434cf3306c91856d76b7f6bbfeb21f7603a9c4ee78be70942228697282db554296ec99c87e1f1faa4b9dfdae9da6b9ea74790958ec7884184d30183fd258de7596112307472cdf5e3b5182fe69482e781595983e40beb543735548bf1a3765ec074e92da4882e25f7ef4263e34ca8da0cd72de382aab71a1942ccfeb9a5b6b0dcdb3374c6e8f9daebb80666c360791e96199068a17972532c1525bae6320bbc2c95be768a2dc68458e87d95887f779b314e4c1017922b20234d2f35945a5299eec2c2d9b00021b1822747b83421f7a6547a1552bf2f6376e99d36a4869050a121f68cb1aeedd57d6a84640adc48dd35ea664a7c2f05fe75cfb2ade709f5bb28acb7a2b71e42adbd4c0f0afd1ea9ae537c88b5849ae77171691932039227a4ce4f66adf96a9f5ec5903881f15b736855b53fb187694252ffb01943d7dfde221358356484badd2e4baa97f01aab62d5e8f9d662aa791e181225704a468c9eedad87454892d090fb5cf61c63237bd73c4f8704092b557ab367f67faaa7799e16922328e52955b337b185a835cf638465ffc74f396d8d2d5484cd7446c9187b7669a9e679de6879274242049554f5932e5b8a9c33cdf3c4703843e0656c5d2e2e4fcced6b9ee74984e090b7b4ebbefb522ba4791e212441c84cddd99c636e639f8400c1196e2f764cc59e2e8769123816aaa7541963dedbca3bcfe3243ff866ff382d52f754a7d33ccf665dce40121fbcdcd4983eaec7fe2b3d4f0cef0b919521243d4888a8172267caddc7243c509f8935d4c898b5b25d8101c90e10327a8a7deb87502efcb15486e12c454874c0ab397121e690a566499283ee858a2ed99992e020396c8c1ed15b0d3db52037588fd32db33bdd5dac699e4703b31aefb8cbdb2046168de731b29d1f36484cbf35b6dc35f336e29be7791eaec1720eb5d59c23e70955699e4723060ddc21548c98be5a9b9ecda07d3aa3f2e6ec5c5bae799e66799e1fde1cde7cf13cfcb0b01c8969e9ec0a564c20835cb46a79fb51a9e497468f14f438c1cacb92f1b2449e671d49bfaf8d2de716e2dda7799ee7f1e694f13ccff3dabdc1967a0a69bea757aa5d880f8cf83fa7d86b685bff35d73ccf8f1fad488f3056ded1e0c28bd72c1a98d57ce1cc42220437dc13af5766adda4bb1e6799e1f3fc208a3471a2b5c784b27c8f33c0f8bc7ec8a9122a9d4bf72abb8fd7bbb312839c3a5d6ea2f2eeb0f9896ab3dd45589b1dbc51de498eb7fe99022be3311968dbb1c796123880bca88415ad9aeaa2542f7da540ccc0abeec5ae776a16a882994c985c3792bca618e7d15532ffb315da6791e5d45581ca6b32fb859c594d22b7a8fe143d53ccff3c4781a8c485bea6ed142f59cddd0b9e4b36a72b8522e7c7f43feada5de143b61bf5b1838f47abd6ecf6ea9afd3b47cf732f5849bd82d84343e34ea94b6a41af357af5d12d2badb72bfadf963434ff33ccff37c27c6d4b263b8923a648f79d906d27bc6f3a4e1ed5db53befba6cf5d9ff50a64cf89df9b61133dde7db50f95a8f77f978c9b16488dff3a6563287b1d8985aaea23ae456ee795c5c9cbf6863b975f49ad9626aa46dc50b167f0b35646cbd26ba43e8058835aacc4c6e352ea6e67958181b0cf522454fff13c25d225863996e7e6ad88c16530dc405487db8aadb4f8e76f93f99cba005a6889022cfc768c1be962fe5a664fd4bb98605a6e5791c0b546972ce9233afb614699ee7799c886b5eb623e4794ab0825cdad8e7a34a4e61eace6a782555d05a6268d762aa94bd1252e4f98f375a8c9567c50429786d29a3b71ed363ebd4c04aaaa1dc7773f8fed879b220a8893d5a8face1e24a9ae7e99106bb6c8d16b13ee4ea9ce67936eec2f28637cbf38c000d76840c1b43cfda5ad79ae7e90205cc5c17973387aad8653b427c5f9ea7e331ea8ce4e7e61239f5efa96acdf3740b8bbf1c89799e1f4736409ee7c866d18cdeb418d914613940199cdbfdfc34e54bc590e6797415618921f22020c33d64defc9d515bb9aae1b0b8b82c3f8ff3c68c0d18cff33c302f1c3746726a75d759ea65ded23f8705c809da4a6e28355a66e6c44cc0ddf8a1d6acd04a2ef50f3176297d47cf9342ff461f08a3693b5ad59c2dd19d6a7e642ab22e2f302d5eb8bc106959791e22453665940039f4cda96e48f1cba79ee779d8dde8020cdd45f5ab3932d68babf9c235636b0c59da45cd96e6793aabe11078d1d8daad4d8a9d3f955af33c9d1818961f2a5051814a4c11221a5879ba78eab9d94a98e92bdd6a9e87a5e3838bb7f0695a54974ded27cdf3c02c20a810f2729b29b1ff7acdf35c80049cd6d3713dccf6edd73ccff3c410f9e7c9c0085e365f8c39e5b83ea5d23c8f7be7bff8918b9fb93f42eb54b944e47960586260381a964da70422f0e57fdcd43166ed39a6791e239c8e101f2bb9d88a945b7546f7a8791e164e3fcff3fc00d2c3c8a25146081ca386cb186b97f9b99ae7e196cda66508b76c3a1ce6c083afeddb87e84c514b4ef33c2ccfa38e088793d21ae372e81833fe948b9ae7799ec48870382c423a2c2c298b8505a6488785e5016a03ea80f480ec003e004d00040ef011810f6cd1c3021e8040072cc081086ca1b201160e68c01d868508a737dbb14006308001982d2eb085053afb4284a315e880ca0528801698c0c714918004de700d0b0bc3b41089009109400023f0005d1270c01b1c23311368800a035aa2466501890529600309d0a2d73b5b20a0c701846cc000301d280022000b0706b00101e40502b011d20253010064d1c9400a43d982c71116874a653b0b27e6e548872f70e2e26eb80bcb1b4b84023b84705c58846c5a8408e1b838c044a58425e60db70009b2b4b32c952ce943d6e5c5bce11dc864d10a14234082c489ec66078a112a01d3f2b2022092c9042013871a960024f3031ff480073bd0410e7070031bd460063238f28611378ac4c07462f0c2f9c41a325a64810134522124076694f020009938d07004204588bc4e1e5c743a5fb4a1b219401106f0030df8c00761c8421486982073022d160047269341146488c0923f545e96970ffc00bb1b2e2e4b04a615994c26238248d091c9a891c9984102321810814c26d384cc13b448c01032994c194b50c2015c269341c28f212d03c884e12eefb56c44a045cb6476d3a2128254c980cac65d908a082aa0b27197cc08603a3ec82081160878e9784ccb096b8180cc19cdd99420009d68e9c4e4400b039c219379581e9256c07440f0851606c8ecf3b4e1f242a48585f9401f607763035a144093c9a83c301d1f1eb3425adcd80d6b41802d685100132d0af081cc1edc0f4d60c31b48c0c0858c135e3cc637de6997160dbf70823c53c890ac80f3303db2c8228b2c00b0d923319d965e20fe6206a70c1e3e603a5e60c1090e021817d2ee832c00b0e170605460b67344650344005a288007990cc933cb0c5a541e2db2d0801659842093c9282464b1021cd060065aa4acc46c0c4c106f0e6fbbca7389cc0922b4408123e3cdd9a8f809046ab059a3478f1f2250e1c01bddb245ccfb180f1a1d3362dec750515151d9ac31039537ba8585c81113887102072088e0071c319b76e1ec588408565436eec212f3eec262c4373bb0a0054abb4913323cb81003d32a22100177766c21821f327023831a11a8687cb89076f74ecc2b69d1c244112c0822461740ce00d285ca8aca1bdd714d8c19bee194e1443869a8c1e9780b8e70b1e1b4c0b4b8d1e285118e8b73e12d5eb44b118e0a607a53040c4e19ed1b35321912226c7c0827080c1a9d4c866408990c8917642c17994c4605420092c990040108990c091c445438e0ff7623864aef53d1c4745a5a78b32a1b972230eb6f5d80f880f1106cc741c02d6cc4628d8708cc1a59e13c202a3e56f386ab90649121804b87035bc0747c1c792c3030fb220758a04c8684069bddb41069e91029b271956e2102b3463861c0747cc0b8bc1069c96408f18a974c2643809241b8620f6d94d186ab203ff0810f906c846c5a3219122230ed1d4ea7f385cbc62c183cc668c51e32990c4cc7070b4923603a416040d2423283344ee0841ec46c5a8a086979192db04293698945d6c786a5e3312d2c44389d8f79c341c0ee865a051c6a1573b074fca5a5c34b868a8f3796080654565438f0c612c1000862b0854b8bb30a08546210d37137361c76052b32195274a2118b10840f4e630201aae8b12a9c8ecba08d206dc0c0747cc4b4bc96c802d3f11717d7b4c438114d4c4b675b62918701025081854c868404cc2a479e8a1b2dadf21c223b54b0030565ec20c38b1d2b6312831d0f30a38b4c86c4c5a5d3f982392e2e404a544c544c418a37104cc747cbcbb2f0b2b5d20241f35c5757cdf25b429a9180299e90c96408d04587d3e97c91a9081b6b74389d8eb7ec8ba1e2c30767e35ca894e209998c292a500a4194e208a5c04129da28853b18316f781967bce1ed83145c20c51846bc0c04906285145b64badb856c168d8ee1b8f4a6e5043e607af4a665480c67c3810ff4a665c8166db4d19b96216d6c5665144e188518a2308528e610451ca2d803088e200acd6432bde1a4e13045c02019b2e938090cc0685f30386574381cc349811a1b358c70c6e07082b8b86c179c21cc1923932181018c0b8773c6460d1818ce4b19301d8fe1a4804493c99008411fce07fac0c608a7f33430ab31e3136bb811d38677385db4f1858a0fe70f6cba855b8aa4a1e2a3136f74a20f9ee0c2133c3cd1034f30c2139d7829d2090d1022d089338000021200618c4e20207ccca608275638c1062774a06f584ef4e00406def0c5fbf0420c953ee243543831301b70d184293611824df8266eb0092f78a20c13b004193431071940a10832b4421371940101a1b0c12632191227611f46bc081b6d6c605a36fb0213b32a30bb6cb401e36cb4d1860b46b01d57818a0f23db714dcbc674d68974362d1bf3389de54d8b1bdb4ba4d735bee1b49461c4886ffca9f8781c1537a28246185dac20a6653b312a9c33c8f04245c8a6c588f7e8488c211290c878210924891764321936baa5d37137cc7821c22b98040124c1864c26d345c7cf8071de14e16c36402661824c26033389264cc215994c86063145cc7821d209831219c864d08d219d55c10b914e18944804256440093232990c1b46bc8c49e08112756432994a18209321792a3d565e960cf74e102e605e8874c28881d9312a21874abc4a24229321598f81d9312c61804c26f3da85744be701b9448a25d880004bb4e01243b844ca64326c9011b35937dcc5d1b844153231303bc62536e1cde9021315c864326c6c382d302d301d3f6363d60b4c54021350c0841a994cc69bd345260831844c74262c704624b61089254402072f9108e2452434120d88444a1d96a8638e3af630863aa6504710eaa041d711a48e953ab6a8c300748c820e4b64f640c71ae8b8021d70d0e142c71874acd0d1003a5248e6d0c41c8ee8c31c6f98638e39d898638c3910300728e470841c8690c30d728c418e2dc8710439e490e305729c2147b3821c2a72641000094b64587c7c8bca106ee9bc14a8f88071e1302786d37981d9703a1ade1c4943c5c711974dcbe330276663b67d38110e4c8f6e01a2a2f2a28637873561885168514207441ce0107f3884120ef172080a180216886089d84222cc40c42a10b1050420628c44a881c4100e30c41be0e880215e5600071786d8c2100680438d4c66d3b29a2e7c55549a858d3554380644581ca6088b0bd650f1a1a232083c0c028e4170e20c42ac0ca2156474678d6c8c70bc20441884d06432192085200021e2508808f41b9a418c3188954144200171a842140888431171c4318738b69031a22284e32288336432246d786184d39b161508e20b827882208690c978a75d88908d51e180e009d9b4a0a1628a4c86848503ba8aa8f4d88288c7882188934c86e405fe5f840b219b16340471814c26c3468f1f30fb3c3fb600c00a7b0a7e78e1893902f18740482110472081e38d406802b146208204c28b409000420e1f9b963fc4fc41087f10838b0ffed07f18c3079df1e1a3dd0f77c864da61b6f3851f1c010a4d18f132fcf0063f9cc10f5ff0c311fcc0834c19aec2c61a2a3d7ab891106c3acf8971215de4b9600d17174e085cb0868a0f173e58820f4fe8b81b1c17170e1a7c5845269389d9748a70d1870cf4a108903ecc41c8a6c50f0168ef31bce0c30a1fb4071f22c08704f041007b30c51e3c6189391411c71ef60044c5c71016a2e2b22a3e16c6dd6889d9748abccebec09ca1e2c30b3184b478c7dde0c0b84b91e6105181d9001e4491c990b0d162e4616532246b6c3a01ea7aff99c4a2fd696be89223b3a4cc04160d5b3eca95906333f49ae7e95e9357fc538c56c3c7de6352cd15e9fcde76f3468a35e45aa1a9b15eafd44ae75a3156bcf75cad6c851edbc75b0393553c36e647beae58ea6d55306feb1edb5972b27ea948d9ace81da76a2ca1840aef94ffeb98f36bcd090726a7709a8b9bea674d9b6a699ee70bf697349e8929502986fa75b154652d4bb19abd285d5921fd7c9ae7f1964ecc1626a4687d0ffb29c4e9ef1b47f1f86eb3bda7be9eb9d33c0f8c28f41f1d73cf4a1f5b8d34cfc3c2d9b0a8492874adc596d733c489d988b102135038d3b45e42bd8adf31f73c302b67987c421153cc316345134fb44eb9aca8113a97fe4562e05eb0a7e0794c3ac1d4afd5c89b109dd3b46951638513b311634504269cc8c6c814ffad5fc4c87963060c4c36a14b1d32fef554aef49a70b5b0ade6e5f7fe2da5799ee7f9a18649265291b34fc73ab58498eb81cee881cce881cae881c8e881c6d882a408269848841a5feb5febb8f06d4c2ed1997693ca6c476b9dba6162896cd7f5b4a8a9facea16152894e76f5de397fff3d53426143fb1ef9d347f7a804269378dd464eb16d3733b4c4e84102134928a6903b2f6d9aeeed4c2281c894e2458f4fbd6484491da9fc956efa44c831bf244ce878bb54e6277634e4309983b9438d29bd37d468931c8e31e5cb9636d3552113483ca796d3dbbf73a8fd3379c472c26debc9398231f7dc6a73abfcf8797eb061d288f6ab9252ceb7ddfaf78c70a5deaf52556b252f2ea279aad4eb14436c71b237bc372d312e45c8d082892298da979d88adda6e4440304984eb6ccfd2b3c6fd96251344b055cb52ef6f4bb49cf281c9211a2fbbaff7bfca4b932192e2c4de6a67fea83d15c2e5f743cfe712624e0a04134274d36d47d92b9b39653630190453f6147f7a62d86c95e679e258b9be165f7ad6e5cc0942bdb273f4163be6af57f33c2d300984c355cb21e7ee19673e18980042917b6a8b15737f86ed0f0ba564449d4f35cf86fcb04f7163b74ea926a65c1f5838bf11a30b0f98f0a19b27fc54ce559b1eef410b133db0b4bc28c0240f8d79add57ead65bad0c203054ceec0104344446bd57ac7d63c4f172676e855287daa5daffa55d23c4f19267578ec3526aa4aea95db840e30477c08cc113f41054ce690ceb1b7aa9d576afee000f6405f6cb1720313393cee76af90ad676bd76a9e270d9338a466db9221d5e8b6316402879617201d1fd2e1a8a002266f488a7553e71c23e64a29cd0f878969813171c3f73fd610a9f7fc35d4da804a3153949a67a24f6c25c64bf04cd8c06c35aaf7fa93b139933574b7757e5675cf9e1d4cd4a0fc924bdda9edad4e4fc3e2fe2c2669402d35537c77e6949ed329304183377eab953d7f9474d3f28870f879d23039c37bf2d4a75aa5f6ada186f31b3162bc044f17266650c814a9542d29d4edc7182beef2d60a26654884684286201e3019432a84ee6daaefabc2fc8879e30b159855791e98179895672286303c222a62ebe5903da4ec6efc3001035a77b4e83df56add5b5f58ce5b29b7da55aed2f502b3fed4d4daa3e71a2d932e28662ba9e718a17aad50a381d930d4840b8f957b5a0c31a294ddb6b07891695384de789bd3c2afece70fa56acf10290b49194cb2c01222e6febdef7aefc342abe263ebf618a9376b2657f0f5cad52543e6965033b1c273bb7e9b6ae632cf6552056fe8123352ffc5a831c7840a2a265378fa8ad1f9bb35cf83021329a45c776ec5d0dad7586a9e670887a371e91692209844819d73f54f4eadbdce4ca000019327307bc3c572e17ae6f4604c9cb0f425969e7bd757e4ed484c8bcb86c1a409df54a66a27dfd66a07264c1881c9129436557448bde5c81a6f27e68d2f7aa4d163458de7219982891258226092846fccee9fb9973be245c2aa5a968f166226c79ac9110e606284d69890b59542d7d25a9ae7e18149111460428474ef6e177bf5f45c4ff33ccff3c38c2e7ac0b8b800e9d1a3c7ca17cf93039321742bf758af7cb7dce906311142e36e5ec6ffeed552ebb1d2f15ed7744c8280001320a8d6d91862db47edcc040ef5ae14a36e3796989f61f203549f946bcdd69e6b6198f84000263d50baf469b296cc8407ed7132d4dd8c1851b2c90e583984ef9bfd4a5c9a3a9d2f5660a2837fe5da8993a6f4729fa711e3306098e440512ec4d6d46b95dd7ac3c3e8b811ce18c904074da1bb6f2d3d8608798a05734db194a99ed5d1f60f2025b058ece8d239865662bb7ec5ae725c9dd2d3e650aa3294b8a295a143e7e62a94b462b922d4f6df973d7699061b4a58e189a9426e456b73b913a30f25ab48bf90937f6d2285d866bca144152ead6beacfd48ff1abc64b52d17e79b9f4db70b357d728414543d5f477f7aea57e6a41c929524bc9b4297bcddcb669949842f1fad78ae1a2b796ca5220a686edad22fb4dbb4a48a129a96cff8fa9c6b97614e89c73d3f5aab1d3b6b450220a6d88b5a5b6d7f2d7a41dce1a4a42f1b829f7b2797abb9cc61c792c3f62bc041e73848b0da7250b25a0482fb55e8b701db2a430319b6531a3e4132935865a324385c83904468927d872ad53d9f3536e49699e07c68b924ee8bb454c65424f4fa56b6236eec6172228e104ea725b8f6c755fd3b60964c8bd97bfe8dc6a5c9a50e83166a3429b506b9a89d4891d53d95662e66498c0670b199f725c8dd75de2f3b94ddcedaca577cd12ca733d777fd9963dea96548293f3376bb50e9f37d33c0fcb6a4a28c1a9af2542c8526b2b259360be1e7babd4b57cf63c3fce48e379369c922b9448423db654e8357e42844bf33c6d9444c215b9ce86deb954cf511dffd4a7ca5d4fa83163304ae84874093d36d6945651cfb1fb0a1d22f7fa56dbeccb0b4ae458ee9dfb6d672c51aa2b81c44ae6f639d71e33c7ea9ae7791e20258f40b8d84277448d9c69973842ad6fb9925ad565da9ce6793a9c1a9434c2a9660d55635c9cd2db171896edf8468ce711a38411ec7d5faf2edfa62a73119dd843f6eab5540bed2a823966bde85526c6d8622210575f7addb2db6d6b8878a8bd2fb69e43de5ca78665c3d155a407075c5c8a80b131e379382557283944224e45ec45092df66a88ddb6d8bb4aa50eb9f62e2984275a8c2fbd27578af4835042084eaa9bde72af5297ba12940ce211752f846a51a7752ac84a094ae2488f90b7f54554959a4a04f14cf535b2d5769fe968280904a75dd5c8d862a91343dc02b3cf08258058e4ce56725ac6841a2bf9c32fa6efb5ebdb52adaf791e184e0c96f8e19142d5b621e78969b30429e9c3d2c59837b758b6946f699e8753c2077d95b934993f75acadf9e11b8e4b17cfe31b8e0bab51b207955c972f759eecb9b7e6791e27e679f4a00f2164846eb735fe7146491e5ae34afaf9dc2733d534cfe32578d0d7cb58a57eaeb544ab791e229cceb3f1e30803e9e1020d1ce904312942c91d5025f4919c26668fd36bb45a95d8815bdaf7546dadc70e651d9e73ad29eaa673f99b4ae8c08bcae9194be956e7ce613986f47de563e3d354c3a5440eed8cf97a4b33bdcee471682a1fb16a8f9a464be0b0686943abf3d7b7a76f1fb23169b051f2066cec395d0fdb22552a287183a6b6d26aee33572a966df86685e8795f3646ac8551c206f48935a94fcf217e5e6b70b5586b979225d7ac4bf33c67f400b22c285103bf64b88f545de1be4a03f2b72eb7576bf52f24f2030c202b3145c8d880a12941c3eb6c4f7e5df4a9a53c034b559c9eaec45d295d062d649498c1b1c5e89fbb669752cb32bcbea7cadff57b56ad694ac8c0cadba57cee256c9ed4185eb2af7d8ce9e9dc730d4b0c1ce679809488619be7435fb75091974d0bcb4b911887c99230a8af7c6ba952da1abd83a199595a68f9e1a67682922fb495d615bfe65ea35e5f66f14d0b91259478e19ff67b8a2c21f7586231255d708fb5852b3d3a4b6db12f4ab89018396c8eb9da6eaad6161aa9e6783dcfcc67aeb4f0da9d52c9e1b68490514916b66d723ef564ce8891e6796a5003ef1481e1b8f00c66f03c9b67790e4b0c4ab0905a3b57cb2da4b4f1525770beaaabd53dccb488ade0ab98a37d765cbf126d4aaac088f86f55faf66ba95542857cee9a39a5b8ec5d73c91454b76244cecc5e3a3740512205dd6ff6d47bc895eadc1ea1288942739f5a91b3a4d453521a384aa0c0defa625e8c9c35d6a7791e1616981655f2045fca75d2f47f2af9b1139ca9d64d91a177de8ec58bc4a0050686f3b261795908c379296353d2846ec47c57ad117a29b50441dc28618232c492daa4988821c634cf03c3e29d17961f56285982b2d5ed4a353d6b26d7fc606161a9418912566b74e7e4eb2195926a38319b96384a92d0acebb5aa46f86c7d6b9ec70f2548606e7335af4cf4d89235cf537204860817a9624a8ed6d312232854662cb75d737ef445f0575cf5c8a95fcfc588a0a99cde2b94cc99211f423b63e97961b7fc752d045c9a99107b8ca14afb66501204d5f4594ac6e755485b2b0102b6874aa9867011356262b81b673c0f8c901238d0625adaee9bef34fb07c8eb3964bc885243bc3ee0545fa41e3b538f5c2be9815255ce8f329b32d64e53c203d6d4bdc72c994b8eaa77d0e8b35795a2f3a534e9a09ba64a49d94be6eb3c138ff8097a20164a7290ce1dd2f50fd1736b49f33c2f2c3e6489aca004079b0e31f4f81675f3e68d904d8b26880acc7b1e961798152224b168b6944abb504bfab21f16ce35e1a72b64ee5afa57f84a4a256fcc1d533dd6fc78e174bc789e174ea797c415ef39b5d06fb34d5de8ad60c949359f1d52987ab162b5b59cf2c6d95c5e118e172c2f24ab48cd1142cf4fff78a953c5b6c4cafcdaab6aba4d85c274dccaad848bdd2d2a58637ceed0d2d4b914d33ccf0f3356d0e831468f9537c33766d480e4149eba09f1be55fed6150c484cf1dcb64eadbd6cf53aa952b84f4a313de6438d5f6a891d125220a55a75fb7cbd8e5c8e6231a272fbaa8ee5266b36cff3438ce7f9a287182b319b229a349e07665b869088c27d2e9638e952fccc2e148bb539f67bdaec12eaf3fc2042028a768cf0f55a47cfe8aa08924f24f7adf15256eb5a7a9e1f3f5440e20985fee8caa5dba4cf65277e3dff654ddd311f274e2c47e4da37b7d3859c37f1767fbf71325ede49139a4e5542882d4247b4328150b76dcbd592abecc6c433634caefbb117975f62ad73991c7bacc8bd861a9618875939c2633c8fbbbc1dc21c171fc289390489253ee97ad6ea517ab716aa446bc3a656b76af696a2202b2f20a1445ac68c9f6aea945ddb249263e4ab8b4f11a36c49ac3fbf5be9e553be6e23d1de7a6ef79b1cafe49ee67948ea708b913b64ca53ebbbd5d880848edcb6cced5763e4c5455e9ea737451ac91cdd9bf2513f2bcdf3b01ce9c43ccf0f182fd26363468f8e1741418f1e47fc043d7a9cb142a20312395caf5309b956f7958d9048981cda7ff8329f6bd53ccf8f1f415688703a603c8f10481ea10fb577fe762143e859f33c477c08cbcb1261795932d6207184529d505a8eb14d9ebc3e481aa10fdb2f6c0933e17aaa791e161697b71b359e6785e407248c586b19a2650ff926d25f02c9221643d6a9a12f5544234d9f09753f64ad140b4812c1bead5cea5275778d1c4068f44028d8c25d5e8ac4b0d0800411efda5463e756af738e0e9194c36e8b6e3932f5244102892192f2c634d3917b88edaf41528874d4fdd2796394fcade67934301bc6caf33c0fb7bcc0ac704808d1baaa5237b7dcae356b020b0fdfeeb94bfe9c2fa65ee37107642b5b42880d0c1e7658d50fb552f7da99bcf1a8832ffbb78e255c289f533078d08139a6fe9895524556690ece73696bc9cf69fb7472784dd92c3777d7f34a7158dcd932d93287ee11c2011bbac75e285fefebf686d69d8edb8d217c6dabf170c3a697542ad5d8a75e896d58c5f6a167cc796b4b251bb62173dafe6dab975eaea1ddb3116aebe7a186b50b3d750c3dd75859d3c098f4652386ae2d72a5799e10f040c3af72b656d7985b95dd623c0fccf3ac90ec80c719d862f86bad7b994917baf03043e672cce9fadadc8d322097eacb213fa67457e34186b7ff56c3869cadc5121b43a6524f68ad42886c9b18fe1b653ea434954388f108c34add9e53e92da1e50d97c0030cfdea144baefbb93fbd181e5f504dcc87183cbce08f2977aaeb2152c91c8f2eb8c672b126cefd6dfb1b1e5c700cffdba34cf40fa52d20578c2add63af5bb5b7e162c5615673061b3cb480d6434b17438a1cad773cb2c00897d26655da8b77dde081857dcfcab5d5f4d6a1ea2b6c7263edad2a649a5414785841e9b396ee1643fdd8af791e1e5560f85832b3c6ea9d99e24185b78a2c2d55eaead7e2149a5a88f95bb6ba9a6e0d1e5268bfc82d53c76ea9d965c0230a4ea582424af6ca7da9965672a9bce0f184d66825afcd850e799913944a963e3184889f5bae092a515dbd1d3b6bbf31e379608670381a1af06002f27756888fed91c772c4e5050c1e4b60acd193a1c754b5a12a61b1ffbe73a89961fbd33c0f9f01068f24f8b3879663a7f538f140c2abf4cc9ddff4fd5713d90dcbe3710444cac308ea1b21f75436ed6e4e874711fa7fada62dd1ad624b8f0711d4428dd85adcc678d17681c7101e6bd64e5fd11962a99ae7e9220c1e4248f75227a494626eed6e1014435d8e4e2dd7d442880710142fe69831f9a374e53ce058d6d9e87497bdd7291e3f4099542e57cfa975c4cec54a0b0f1f6c3edafc864cd7a75b65f0e8013f6efbbfd4fe972bb9e0c103e63a752ad79794b1e50d78ec801dbd97db3c15dbbae3a183f4b0592d4608ad979e0b79e4005f93bed4d80c5b5b6dc003074921f42f55b1b65dcbb140b4d9dafbb71e537d0916bf90e95aeb89e97accbd023975be92fbfb76ce982bda2b7eaaff54b73ddd0627ad788b48296ec61c7b77c60a4d4cb95af4da4baa505b853f664c7137f792f3b44e54e128b329d4daa22e4c2e1509bd4b9a58d2e598fea302a95acbb12f4cc456e253f8efd3a788be9c7364a650c896adb5d0d3fb5d2d4572f57dcecf3de4b74c8af498a98e72d5dfb5368ac7eea9e7c7b6967a7ca250edd0ca84fb189bdb9350246dbb10522c2d4ef5da09285ed95935b1974e3ef1df8bb1f49cdb748698271c113f5fd7ca86fef7a413dfb25d59b16ecadefd4e38d1d6b7ce95dc3f3d574f04279b48d532f9a66dbf7ef74413ebb13bc530bd54abcf34cfd36996934c3ceec45042acdcdbb62f2d46584e30c174753af44d0ebde7d4886fbc2383934ba4659adef3625c75f82f38b144639eedeb9c7af454fa49257257a7e5fc33bfdfda354e28d19a295c9d5c36b6de53454e26e114b9b7aa2df62d11bb24d69df35eb69693e9a39348a0e4a71e552e7d8e8ceb50d4d65953f62fb9627b428753e40c6d2396fcca50f33c312773ec5a997ab1e5446d6c324ee4f87fcd31b7d87425f5c70289c4ec87923e6244ecc27996239d18307a88b1f2b264b89c3c02d1d16ae9d31fd13e8bb102c6f36c3c26665d7e73e28897ea12b2a76fee1b4b278d48e49e7f4b0f3d62b76270c208c7b6e942acb56d2ddf22787d3b6d48b9668da58351c42b750e9ff24728d5518cc324a225d6daeb776aedf02d18ce09227211d2a5c817b75bce9b9343ece6ba5aaf39a590a7dae0c410fa8a2c39458498b9aa799e42ac5eeed2c3c7ca3a933b21443264bd6d3da23bdf18d9179841e8ea4f9c307fb5653c89631791a385585a8270cef96543bededcbb150886ae50d384bb68933acdf38cb11253840c6fe9040184534abf2deb3e66ed4ffef0ac6f1d7a84a830db7371e207e5db9022f4523fddd41a66e3a40f8e56a26b6fd3d7dabcfdc7091f36b5e6506d72225aacedc1533aa45ca2ed7de98fc8891eda23b7e8d0420e75e52ac1491eb2fda5b474973aef729a87a5d73b7850776f9fb1225bd92b35cf434285933ba8e548fd77bf4ee85f6e4eec90f695b6277cedf8fa434eeac096af736f8bdaf1a7067939a1c3335246ad14b35cd4720ebed4e136eb75bc34bd96133938e5bcbcde482573229838ac5b2e55da6ea851134c8b8bc7b4688cb0c4b810383cb69fc97193b5d5feedc91b5437cae5a9fafef117276ed04ca78dcfba592af7491b543fe652133ac788d8a7e0840d8f59be6eaa11e25b469a353873ff88dd11bfb9d79ae73951436adf966672df77cf90903434dbc45a773d9448dfd190a9105a8f8e1e697a1a43c8c91958cacd96ce7553cdd49e98613196caa9d7d24ab4a8c03829432fc657d64da14e0d39139c90615da24be9dd627d6ca190933130cca49ea3c667dff2819c88419ba2f75d69e57bea64d002c3f21c4ee7240cac155955bb5feada1d18dea5f4ed9e317ab958fb4273ef18b6cd844b93622ff0b72b85fc1b77bded82ea7a72ed59fae35e4c8c132ef4b264cbb7979f26c5b690de3254eb767d99b93ad14237d768f139e6dc13290738bf11a35d5a345d6cd1c38b579c64e139546d112a5c4d355e2758d844d4e6d821652fadd6148161d99c5c41593aef522d615b8f2c8396119c58811d39659c8992b9a5c72755489acf98bd767a6addd39c50e1b9fb33e74a9bda5c6a58a680adb9cd57c8ad969e421a96e7f9e1dce29246c78c339ee785c80c4ea4905ae373534f33a5726e883b4c182751606e935531649cb0a9d5c5091496b594cba9d4cdcf199d3ca13197d3c7fa25c7d6bfe68565c54f9cf08d9bbfe2f73a69027fea6a6ba196c99a2d262cb75c5aece95c638dd9121632facd4d674f1dff1a274a60cd10ab425d1a16988501b2829324244c5c9e4c9d336fb5223841c2b2e68bdc7fea7672047eedf6f5ecdb088f557a724bfbd0bb96c649115a9942ad543a6cabbf699e8788a7714284862831559b772d3286c6c910d237e3b454f9db4c87c68910de2f85cda9a590b3b4d2653b5fdce024086d2962bed4eb9f053901c233a529a5c27de8f8f9091cce317456f5d663c508c9e811a4071827e8118619273ff0c550bd67dc8935d7636171de1798233e444f7cf0ebad73c412bbb7f415a447182b5c78d1cefb92c6113f8119273d2001c3090f7a3f2db6992a19baef1e253d38d901daed568cf58f156f4e196b9ce8e029eb32b5966a57cd28c8490e9c6bfae7f8cbcedbd30bcc4a4c113268708283f70a9b1fa77bed5e4a61ec8845abd40f31d49eeb5d4758247fe9daef620ae5ef2b52519f5b6ae7947ba212ec70457a08d593156a88dcbca3158ccd1e63475daa217b9ae761c5632aa5562d539ae729c18e556452749bba88691ba70b76a8227559bbc69898a162d23c5fec48055a678c3093f3a5eb3d901da8488dbf389726b418bfd73ccf8f53f86bbd9e7bf8de4b0bb1e6799e87053b4c9156623e70995a4c4f514aaf2dd61cf1136860368c1e4b25c748101fb22e5c70e105192465d8510adfe6cddb538b3d51439ae7799e1f9a1da450a915aa27c396e8e834cff33c23d8318ae57225657ccebfd43151a046cec7d7f22d5f9542c1ae15e384681728dcfd639d14b9a4799e8d592f54b0e313f836d762272644881f0d7678c2a98534e1f2ca5e474b073b3af1898da947ac9df254df03e60b3b38d1d4f9e862c72698eb76c9a9e45e13bbe81936ae44ee47cfc42773e41055eb5d8f1c13ca1a426835db6b4e5f5fa231e4d81bb3b7ead5da122e3de4567352cf16f9c3d85189cc64e41ebe556c3946094c6ab1a41633bd2b9d042e3ff7eaa973dbc4964463bcf2f5a1c7f2f723f1cd29d454f14a47db5cc773eea5655fe664cbe9c0444b91a37ef718da39f2bd4c8e17f2276226877a2e33d57093eb970f12fd2f612eb7be30b57b442ad7123eb696b9da11eb4ff56ebae7d5ac35c2173abacd6e6fdfb265446aa84cdf17513adb45287684f2d952dfb8915384eb3f3a5aeaf17731a7391263821d8940ad9e1c254bf7f069438472cc35b5afc7d02eef3844ee72b4389b43ae296d8678c89fbe84aeb9a54eac10beedad76eff317b313e2adfa6f8b75bf7b778368e77c4fcab63d6db9e2706e57be2ffd55845c096255538a7439c498dd0bc43e4e0aad5728e5ff5240accc4ea61c5ba954ff834a699599adbf5d8ff941574adffcedb27709fbc078a5f263faadf850e2c32baad5deaa7bcd25947b58a8cf186a093dc7eae9e11372baf61dba4b969807851e2de52829a7e8311e5aa2d4fdb01dbf650cedb883eacef7a8d7befa7fda819d2ad4c46fbf3e3dd5b0b1a30ecd1ba666aa7c0f653fcdf3a060071d1a53af66f49af2872adfd1988353b618aafa5f94bc5b0eeed03ff7a97932a74e79ff60471c34d1a54ec99662d8aab11c79dee1c4a4f105173dcae811c64acc1b5fd060071c5c63f894abe2444e287576bc81a9c7365d432b3ddfeb98cdf2a6008d1d6e60f51a6ac44ecd0d3da5791e223f8e6ca70304c8caf3ac18d9d106d5f82eb5d44ecd35b3e12db6ef17674baf943e4b1b3bd6e08c1bbfb66819b5a167e970588c6c87658c1512ec5003dab79cabfaa74afd1ecc6e5cb0230d8bcda5b22a5eeb956b202bec2970715922693c8fda8106e7af9c7a5e88eb971b665d58d85350c61a3bcec054ca876f99fef24534c6ca0a911d66c06d6825968a933d5ea98d1d6548a6883933ccc6dfad9960071954af630d354bdd52fab360c718186f524ecbd66f63773ddac8a221851d62686ba184c86cbd4b4c1029ec0803fa36b6585b758e49390a3bc0c00c57fa87ddaf095d62c28e2face60cb54d8bbf296e1fc60e2fa87b9fdc29d763bbd42e3855dfd41576720ea506b3830bda3e21b5d8fef89cfe16f69d17d15bac215ed418ecd00252cbb89c7fa9d56ba1981d59e09456b95dccd599a9f4c60e2cac7f7fb5af19d9710564af8ee96bd58aa9f434cff3e3471a5e021616377658c1e5dbc5fd47ecbdef1ac18e2ab43a7c69bbfd533df21d54e0f70f1fbb6cae2c39de3185a6dabaecc456fe7b753ba49058a1ae4e6931cac46b47149ed3d53825f6d0b2a47e0714d6526cf1e2f6ccb810699e0763b0e3092f39d46d394e0f11532734d7c92b3966099fbe6ac242a8dadaa5f5cda98c094b5357bab4522d413d5e8f502aeddda75af33c5dec5042bfc78dec9b2939b42309ae1f7db726a2437f8584dda6bdbd69ad65ecdf113c35452f9b62ad793f344262f9cc5fb9744489ad22f8f34dd67ee6b94904b5b8a1770c9936dba4435864e6dcda1f7b8d99b14308ff98aeb5592e6a6c15045e4feb98d8ca1d406864b9bea1f4d07bce148edd440ea9edf6b43ddd1d3fd8c4c96e116bf5b51edbe1034d6aa97ca9195b5ed434cfb3a3074971434789b211e1721e3477cfe1f3d792ad879ce6795e11981d3b68ecdc6b76891ff9391dacd5a81573d6d2ad9476e440a94aa658620c1b11bae679c4d881036d5ec8fe025920219729f5dfbeb962774a852c8e80081b6b649750f2b5780b591881fd6a85d672c7ae7dea29645104b58f3dd60f113a5a6d379d225c6441047c68b5951ebf56edfba190c51090ab4d4f39df5cef3769b21082eb4b7edb9cd436561a0476afb6bd5173ea4a19902c80e0c9fd295629554af65e1670b057e9cd53738dbdc5c76995c50f906a75bf54b9f4cf9f2f59f8c039d71a5d2b6267943a8b1ea0c6bb9c337abb73876e64c10357cddbb1542ed32df41f59ec40f325b78839a667f3cf4207ab5e3373572a1b2aa759e4c05f726b19f1a1f50b5d7cf342a4a3791e1617173762822c70904d592d776e4c6b314e89c5375bde54ba5f8ba5f52aa4c0a2adef42de8a1a1571a990f28a9658b56d89ca3decc7ae90e28a94b89eabbebd9574350a29ad588b9c25b4de4b2df51e145258e16a21868ffdf953c8319229a4ac023da5855e2726bfe74d468a2a52a74ee7d4a5d7b279bd48494552c8f82959caf5d2231729a8f8d4d6bfd786e9593594728a5c4a516e62ff77eda9791e6fe9c4a49842b5ca47c7d2ade58d4b81d2f3a78cf5a196b83d8d86480a29f8537aef6a6b3572eb5346a18e8cb9444da9ed27f7468a289a3d6ae4d8d3a621414a28fe7591a3a5a8b1564ea040acfd2e4e48b14c9d0b06299ff086af9b776bec7542f4047ada0d1b430b2d54f72199d289c50a2d74e61431bfec96c209d7489372bd96a2e59a36a1f814bed69627b59d6c0c4d24a7ed8fca9f1cfafe0ec78c4c38b596b2beef7fe75629984844cf986aea25768999c68b944b646f6b0abd71e3f496e2788a25deb5f5e7146bad9653cd8c954a684ad4fc44a5167a639095184f4303b361b0144a683ac4c736e9aea2ee49acd592528a7ea55accbae58b144930b78affc821c4ee9f944830c71cbfd7cbda2eb696e5474a1d0cb1bfb69cb9a3568fbc3965a4d0a10a3d356db4d4bdfc4e9943217d9954e33f52d84f53468a1cec735336b4eeb91da686a537cbd24981442686941929e647b61448ca235c53e6cf5c7aaea5d779821447b897905a6edf628df8975e292af728a552c88845dadddbdd3aa17d5e44729cd9dc72cdded35262a428c25db1b494535bdfb79a88b5dad9e3f55e4bf72f5310e1ad9b141b4a88117bd5c820e510e9d94cd927ee43afdc8d967e9e1f6eb478f13c2d518df6375ac0781e4f3104af65f78af829f743d6f4468d8d19cf2324a510fc12a35ad6ba3319bee6795208e16e177228576b8cad4c9ae7491984ea86bd98abf6ca75464a1ca9b7a5427f4a5304f17c11624fa9fe7bfa5a4a20f27d5395d0d3060894d61b7bb68ee5a7aee679369c3752fee0d4b2535c96969da6f443a2f7bd48d5734f77de07e48a1a26858fee709b0fcbce3546b9d05a9b69f7e03cb167ebf1f2d69f1253f4f0983a2153576ce16bd7f1eed1719226a4e4a1b92d6ff2faf75cc28407a50fa1c64795ba2584cae811c60aba410285943b743f76cfb7dfa9199b1d1443fb562ee65afa2244584a1d58b5e3e27a22b667a6791e97e789d9b4a821a4858be77952e8d0902e1f41489943528ed1424879e36ba619489183e3f6de7222c6ab31761cdc6eaa7a8e9adba7c9f920050e9f0d51fe7a52ed5d7f03b77e6d97594b74aca51b1a556a2cbda4169fb16c03424ddeac3dcc548a52d8f06ed97bd69042cd36a11da4ac019b4274b6cd391ba4a8e1bf314ebd18b3b5df340d0bf53662a643f69a5d0d52d0c0963b66aa636eabbb53cef0ba7163bad8e8d0b39a41175717db53ae799e32e8262fa5523184d873dd94b1492183a2574fdf5beabad77a0da739650cd9926aa58a3375b2d452c4e03ae5eabff4e29d979430b0c4ccedb32d05866f29b5b7d6aa849c73f77af780e9942ffc4298bc25f4528a17da21a45a1d976b23c452baa0c9becbae357fd69ca6702111ae942d646eb2a418be559abe9ae749d182734ed1c3b5edb98452b2b0ccadd163f66ea17e6ea560217d4a864f31430c5bf215503f624d91fb56beee5981656397c815d1b2d4561510afef96cf9b19325354400f3576bbcfb03ded9c827bbc147d97d599392938ab72fa7f53b49c9812857efbd24b87aed7a64b295040af5e1dbaf556e3c758ca13de374deddbca35cf33c41da6a5138405294e68ebba913de5da7122a4496942f3f6c839e49cc2046eaf37fd5a6c764cad4eca12d03f7cfd568b1463996f064c8a1218730e777db532d488856c5a623829e0a424a1df4bc82f57628917f14b0a127217f3b13b869952b51369e99cb149394252c414ab564e25d4f875916204f6a6bc2cbddbe5990e24a508a972b16f9cd4575a9988b0eaa5e69661335f479e3284978f3d75b6ae3429e55284b0d2a92fafa3f66e73a504a19f31871cf25720b8c4df5cab87ccfbffb190028736d6f6eeb88adc6517527ea0dabddfeed34f4b3da7f820d1bf6ad618be6ace5a4a0fbc95915ae79473334fe141a742548a2ad7b957a62941ca0e30bb655a9a18f7ebce2f5274b0d0a25c9baf514386f0474a0e76d7b775999c9853b77e304c4b877384141c7c6bd65aaaa596a9e4170b87b22d56c4fb8c4f9d0b1458b07c6ab9234caafc8f9c7e852643ea2d72a41eb55d9ae7e9cd8e81e20aff842a1dc35ff6ba5a2b56426f25c5d87bcec958f1ad9e62abedf3b64821ca2a96af440a19c3d75ff4aa689bacc89ba657e6d892014a2abae152bb54db5d010515bbadde3f6effd267ee29ba196aa61663b4afdffb0628a64044d95873cbda9ba197427da7b55e3b8496e6261452b484692de4ebf435af87320a95f0a1f5925a6ea9eb250a7cc9d467ead5574d9fe40928a1404d935ad6aad77b23385040c19ffb8b1fdb1b7ab53ee1cf97697bebdb36d7760d144fe4539948f76142bd92eac4737a6d7dd3e2aacb0d82c20976a749a5d438a1a530c9781e1831a06c6253f5728dde63e931aaa6393440d1c4a644d78590f3eb8792894d94dece68db39e45030c1ae88bcdca9c610fd7a41b9445bad2d75dcaaa9ddd71c144b28c5d6febe3b39265642574b8db6dd73af6931cdf374502881362166d2865cd2fff1e37958baf7797ec4b46c27c8295026919e12712fc75a372a940466624f71b7b5889b438e1289e5f42d47a89a5b7e23d2a281f1e12e6f63dc98c10cc240a9a37f1f722d536394c9a598226430143a9c9b3346d65e7b2ddb35cf8350e6f84d0e1b32b7fbbf2c3d01450ee6fca1bff5aeb0656b144824849dd8dd296ceeeca13ca2b16d8a1f2a6faf539b9085e28856dacdb563c6340fa5119f10a1864e25a5daa64461c410e6b83c02a02ca21fb1dba429ad6c29a9223099536bd68eb1edc72889588ffa5f4a9998e2be56010a221a2ae5d462ef3f3963eb102eb31fd5739e127727144330c694628fd2d1b56b5a03a510f9d6a3c4e857804208ec640d59f5fab79052415006e1da562dc484e8ca1ba2c4d1dd72954adc2f31a1b3a0086291fb736977b92e975820daa16794d23757b71d10d898336f54971e553b1c180fa0fc815bb6dcd54ba92b441504c50fdbff8e1442ec1533722840e983a75e86321f976aa9990f0b5b32f49879bde4f87b68cff653514af98f3910143d24335e9c36f97a42d40e250faaad5b8b0b3d3f74bb2878c87fa5edd7d3d43ccff3fc7097b765b400e50ece8ff3b575cdc3580983440a2876788be9b1f6d02d943a70ca4eb8546e277fa3d0412d4eebdced66a39518650e6f7197b65dfa9476bb1c96197ac3c7cee380baa5b4b4a5b4d22b86c3cbd6ef356c2d975b6cdf80abf61b4a68b965bb6e58fcf4b0add4f82fa96b03e27e8e1813b645be8d0dbbdea727b4bed32a626b78f5fc6d2a4bd54edb5203a796095563976d1b4b03fb460c2595eeda56d1a0696db65a6c8e1ea59ea17ded22d6f69981b956a98e39456550cc2936dd5edd88ed6450df982d35dd1ec35beb17cb4f89b9136231ace2859ebe3dd57659181a43c97565420f0cca7f2126f5eebee09a6a899d29af3346e70594b6f57a4e86d652ab7521f9135a8a09d9bff6dc4a6f388f09285c785494c9b221566e4f5b507caf9653bf9a19aed402db8656d131c42ca4428a8205a5921311f973b854174750aed0895863ab8c0abd7d640566bdcf9b9e68575ba15461b9d5d0dbe598906a45cdf36c84b4c09800850aab61fb6ca95e7ab7ac35cf4306ca14d8bd5d4b17e953efb9a04881a53fe4ebea2b0d9428b0e2b68c8b516b4cbd6b50a0e0d26b4ebd67a5c92534509eb0161f39dc6c8a3535d53c0f8bbbb13067a03861d9337ffc92d51b4a131653eb3d6dd86ed55f83c2846746aaad4c8d746d7a3d5096d07ef9e6f3af536714252cf6d7bb1073d9d4b3258129521424f8420ed52a4ebd92296bba4039c22a63ec7953a9c8e902826204855aa9526c29b6be264a1196ab978e8bd83b9730351422b85aa9f1aa728e0dd1f3006508acd29929c61a1b034508cd2d91ddad277f5bacf9811284c5e4985c2e6c84fbfc050508cf33db6bead72edd7f38d8ca95cadfed4abad8ff6055ea4398507a1fb05ae4a71cb543f8dd03b7d23bd74f97be3d751eb8d36cf68ccc1f31de4132c7fa5074b05c13d353af14ad66a3e440394afdfce44c849e517080a83131e75f75bdcbb1508ece5991f1f2638961c1e90c2da79c5375d5f78aa5ac9aeb6acd5c811a26640c29ee37bb56ac22cdf56cfbd02975ac708a9ddca65e4f2d755bc5bfc49eec9dbb7c554542658a2d476477b8582adc9f36a2c5a58e9e5181fc99b54fcdabbd7ceb149f12ae4376ecbdec3505ca7565dbfcb771b652304c8bdac3b4d9184b458a76cd112b86de8de2316e2c75f3a6a278aaa9965e3632ae87c2a1c7ffb7763952d6a06889c95d32c7b9ebf713ee34f133e43e1339e7897da8941752ca3966989d68df924a8d351762364eaca42e657bedb69e899b705f5e9e8f256bf7a40994cfad5c9cd4bd4ecc04aad267a8cfdb9f23848966daac9cded5b622a74687c72590eaa48ee993e27f261e966097fcd74b4ffdad4a8f795482296c2af7d99f71374a38569dfd9ab644c8ea27b11c61fa4d7e8c99734930d6642ab15bce2312efd2ade2e27b4d8c471dcb2944ec56539f7a4dd1c19475b34fad3162afcd912d3deee67c1b72cd79c8f1ebf8b2dfca5e5c554828b45c717bb45a2a4af908f47aa5b7bb90a3baf58e48aedcbd7baa4e31bfd688c584d892aefa55eb9511bdabfa1242bcfecce122d67aebb37ff2b57c5b11f8ad317f6ea1d7ba933a8147221e32a4a9add3d56c15bef040446b9c905b273fffe75584c721da52bb7419377a88c910a83de5763947a8e54288472132d54b77acadd7a91ae24108b754227b68fd3f15b2161e83680e3566d7968b31aa7a73cae01187e3949ae963899bbade1f2b2b2e2edec53b1a8cc6f37016780862556a540c13138f4038abf41abe4f9ed6b20508b41eeb43bb52e2f10795cea94a848dac124261e0e1877f0bb5948f127abaf53cfa901871c295eb310f3ea4b5dff9cc50b1f7cb73c0630f2e171973dd6cd6f0d7063cf4a08cbdd792374e6f977226e09187f4587b72c89f6b642c9675a87491e5e460241206411083000043d8a60d00731100202824200f47e311c15cb2903e021400034a68468046402c1107839140241245511405310cc3300c0441180461148559f10e504bc5b20219742fccca3891e220a5472bb22eff84a0965b470e1a9124e54f06c197707ea130cae7dfa40577d635edfdd5d3c3cd3f0d4aba8f7603ce958787bf70ad9e0d0569904a859d7f434c2922d89326903dbc44a1e93e09b5f20cd33dfb1a585f369c1a937df4fb87eb95c496355a994ce66668d8633434c4d7f0950611d288882c73e764b81880d29db071642d21bc4218a8ec895eea23cf282315809261ac0ad1002462f9a4df3841f7c46e49c83dce47165f647840ac5c5b08ca2f802224c9de0f9630602d276a2b1e54d35343422c400ebac3494a40251cae75b9918c3bb0995f92e5b20c765105326cdf1f76c34820d7e012f8a9943550cbc891e620c685c869769dd03801ea9a4f0789dc4d914f56dc5b33fd8c20e79cfa4778bb9a4b147a4727c7ef48d5493b9303ab2cbca9d5824f79877c8d1a196955e8cfc2350e188ba85938b3bd90577d19c4e8b66fa918aa40a9efba83c240a107d124851783712405bb897dbc0a1e99e62261b5c4285bbf99c8ea57b8b04739994536d1baf36588c4f22bd6e65b31c8ca3520b4f8f2850db5fa2193d313f56b8c00e477758f57f9ffcf9252c93998095eeafe827e87be62fe496f27ee99b5ec50a9cd8ade8ea810157e3c8e300922ab4a4407b083012fe6640babdc9d115295a76245856099c5d0d662dfc5d36f6837155ff2061fed6898d2a303e9ac3117b194848c54728afe92c4df1d683e9886f3aed12c36bbdd84ca347fa80d3e1ad120133fa101c924351360cc98bf281aa1daaf5dfea251fde23c0791fd5e51423cce55e5f8b96068982c23010aa702898ec7e64e2f9549f708f486c7b5c427d1e7bcdf2c831c50ea6e6fd23b981004723bdb60b659a632c223972d85101caf14af44d3385dde0cb287d06ac42a77051c084c5fbff8a1ec917a7ec479fb162b624ba49e3c856203ea50744d4e28f19ac66d5bd482b8779478cd1727567dfcf7a1d69e7a585551cb0663ae3c214f63458eee4886ca91ef54be9187a6a3cea1ae0681f4b5d15cc5cb581bd90825c9647a92a8e9766d6795a59615042961cb22852e2d1685eac7c3728064c95e87e6f916703d9c1cf09ebdec58f654c21d6a035ebb062970e2e08327dea875ff25c37329a0705338aab4f994797cf6fd0d1e401111af494832caae0c630981a36118985795f91084fd2dc40f40bf3aba25f56cf98d5dc48911f0344171200074174da604bc0be143632dd1455bd69911aa82dc89fa0556cd9cee6fa31ab1a4c5ccd8720bdd3a52f593a4ff72274d987518a0473e3ce031102d76437200277d58bb0f8bba80a299868eca82bddb400afcd2d5540efa9e991fdec4248e11f9318a70d6e8904e3764ac8bb9c40fb2415744c7df6d7b56afa5475758a2b194111ea14edb853b236126dec3dd7239226aca38bd1693e10fa23411b2169879723e5493c96b081f2163338008d04f3e3b8f2f957b0e6b3251b1d14ae40ae5102775d5625263218675f510aac8b337a79e968f59fae4ef330bc0e4a988b47c755ca2340180ea494035a61e50cda64224b75c4224b75c4091644513c7c4b3c38b29d9cd1ce0a3864194a7fa35e4749165f8e803fa5df110421648a163460b8d28d68c126d476d92eae81f61338b49fd57f941e296e8d8bcd9437e496e71916020b818f6e5caf0d145704cbba13f97609d9d40c5fbaf62318f9e4b8df86002abaf4d745f4cd836028c228a65a7407c550fce2d036d8cae77003f2f92b9f3ce8a90b336a1615b58fc4e919637892491214d2583802521a0fbf11b26118a0296beae9a0caa0e14b725ba6a2e9554cb2a7b7535c05c8c4f3ad37115555f8b75a5402a04d442aaf217d42e778bc2c53eb73ddfda446f7636db9b16809c9b6fbc105f980274b49c85f4e86808d1c455bf45411d31ab2ed280190940d161cd3a462dad4cb95efbb676780cc4085af7d96038be28101cb214fdfed42342c547da486962dc0ff7830e8988119dc7781d500ca739231abdd4e7bb0b9ca0857965c59b92b7a714e2bff8fdab9359bdc088bccce6cbc815d5920a15d3bf3739ff2cd8e43320db1e4b9c9f73dc7cc152f3b9ddfd131af34920c1ea925552b6b04a26dc51c3a8720fa71b3acd89f1f8fdbbc80cee42c9083d57a48a8fb5494c4329056362218ebbe0a0613269c2bec997740b0e3609b05e91f7c552a38baf906102ce96ceb63b46dcd9c9669ce70c39c86f02944a70a4ae7e1cedae228e2c0769d7761474a81868100ed911116f8ad1e39cefa2418fd179361357ab147a7a09e85f75accb9973d50c70f4c10ca8ad2b66164e9790e97c3bd2ca88bc694523bd6525432a0b131cc189390c422859d2d3cc3fa488931eb32c071275060423554148feb06f2fb3e90ffc7994dbe0f3ae5d8ff7cfdab8460830faefd9a92f43130c5115d4499ab7395fccb4cce6da7127078a924258ef940f0ce68d3d4758d397aeba007e6ffc03621c4847aedce062ac4ee840a664037156c7d16d5029edcd9639866ad2886705ba7e613bec9bcb920d4a8f549d7dee84884b801270d9734f37ca960adbe2aebd7bcbe15c030cc1333e6f162a47923cda252dac20924719921c4d9e50b137be6de3038a599281635418d703a0264dc681f44033a7a5b879f23eb928bd438b09eb7b187d91228e6a5e81345df5064b3a3f9e2204b417c2aa74ec961b1c569b892f839dd578e2415b8401bd3ae4696262371af82c30d684e92e6f1bd62b1739e2b472176c31f569b2fcdb78e564a6fb9691dbe6b4048254fc03e3e8761949bbcdbf8382563b40254594c9c654ec05a91e95e13d67fd6e676a5c349fb57e1ca70591e41f1615380f34f7f84aed6dfd993a424adc18a5eef54b9b5c8d2d1407a0a909c202bc7561ca14b7bb8123cee86b2270f35576ab59b7849baabda6651262ff20fea5f2146f6c7921249e1df065161c6b295ceb9f64f8384170c0c232cf8d04bd2b40118dce5be1138293c3cea857cb50a2a32a73e2cda8958937b356b313b332a31f03f54ebc77aa0f3d98d85f55cdef1be2a30b9aaac11385a791e7fab4c39d44da9852fccd81821908a0cf85e05f74f25c0c3f1fbc8425eb1850030fd5d975d4cca442b334f42c801b9c2f4b05462259dd7dbab53a559c9e726d11143c95d179a3bfa6a4fce0fd1806adc30764fbd0f852c0a98ee604872a0c3280829d954be59d0a526d1a3367d67d42e23b73a4843ea8a73730a08c7e7e30356af636bcbea68b543d029d1eb203578c64f85c2453f52848072b7d1814e0520854c20e8a22c2b48a03b497bb1f3d739397ee0687e80ebb5f54cdb024d189efc859199e43595f34e1ff410cda1b11c0cf6fc90dd45b3d742352878293d018de0e240e8bd1b112a8fa549c301d83367e4cb423a5fec5b525127a65555069275d21f75901a18452a26dd150a2a7193a4ba993b12614283806669e6c632513241c2097ef29be5ae1d800ba8f3f16474ed4401f738bf6c9d679e345d6d1995afb313659c4f352c18a409bf0f2d4bf73829ee0a0177ba373a750448e703401272eb25e07075b6c4a0bb3181a24b120edefab769e969ce527581bef7a245dbd2aa22947d86043dbc4a620972a41784c13ee196f14352d9a855563ebe9e3fa1526b548190a50ba475974b936f88f11b47b3640d41e83d1a31b8c570a764659126f4b0a2c9613de0aedbd296098e44eb1c186b689461ada6c309a684ad2d8a470bab7200956a6dc16a6d7dec0bbdf31ee38cc08994cef1f5c9434f16a56620786c6d13d1b704c120862a726ce8d266d51c088cd8439737f1e0dce1f2cd5df3e879502cb340c3b01e230a6de2899dbf7ff47e9e0d859533cc47de981a89a199c725cc2b73645b8b4b5742dfbfa3f261f0d42e07c5933138877131548f1e8411f2d8b01531a56c3cbfa33e5509d20ae3ba5219977c35ca391a1daa9302435747e35280bb846fca148e84908084b48b18d08a10f1b0e3060263d95d94eca6b7957e5a1ccb9804952ee2a494c4219b725744f13a032ab676e2b4bb1cbc56912c5865125b33d71fd8aaf51e5c7acb8c990a001daa141fc6fd64a620b88bb39cebb9caef1018b6aae25599b2e05ad51b4e074faeba205beedbf68f2ce2d700cbc5a0ff37f879315930c4982bf1f7e0bf34543963031a1f6c2138e774112bf34268c41bd58e9460963cc9664fc68681a8b567834c982ff439659fa54aee6865f7adbc701dd355bd2ec2a1ce784cd44d9dd3b687177d00dc50d84743f332f2993574f63002b14e83c70d623aff40c0ee064e5b3e5a2581a63cea055514453571c1e1710f0de7068b3593c379dbc4ffc41c043608155487ce68910b234cd37fbc590de6085bd528581b355c2d2ded0b9f388b9fdd3af2bc735a1ab53cb75625dbf83cce8a90d4f83f593299305180696117ecb61109d7e48d2330104ff38d9ee5965c18dd3c770506044764110aff50ecce5e0bc4330acf8e093f98033700fd7ac8df988d869ce2ee4886bae871901096c9de035fd41d8689159e974afe27ade968d01015f860aaecaf2b25ecea14e0035043d2d8196130d27476e5d12576a30a2018066c2095105fece884a1298cf7f6815e826a882d971f038b127d730924044dcc10908839d2566e48acc272beb31c03ddd0ccd3623119be605ee115ef2091b45d18b8b1a35f090f24dddaecccc6e0029360339b93a9df650fc3e42e3d1e5da434a1e1925384780523ea27ec17a81e818500a41403e777ea86b83a42200590138c856560b333ae153a444cc84bfec38812e76a658d822ecdbe11661a6f1034b4f983f736cca78d497601723babe7492ada938664cd0a7343ddf437f2f976d01ff0f9bd9755296d91c1c0178b59733691bfc2dd55acbc0f33bc78fd3a8d5fcc080bae99480757b108962411ed3b408c8ea9571c49f36954e2ae5068ecf5703ed835e76d00a3105f0834161788d63d87c6bdcb315d56ad45a472a09e945d72efab8fc9ec24b0ea23784c407377ed013195ac200fbb25375b0d246af9ba9100f96b9c73a48ec8430973c67a884506a8949f405970977efab20ba527d46feb3f57963ff76bd8b06b7095c4cb8ade062062b0a02bb872bb777578ff85b0fb3acc454586fdfe2496bd0a9db22f7b402339330b14e7b06555adc4d4ca2169ab51fa15bd4b138d4d6112210b971883433aaeb17a0206ca988b1ea0778d7be03921670fb4e5e74d9e9404f7ad58cd18176e9ab1297a78e07bac262ffd16f15d102b7ffdc63f2e7bb27e191bb3d7436fccbe14c065833c4d62f8578e322db5d479439f9175d3511fe22504bc5c8f3c2dd975b4a32f9ae408ebfcd698fa4b8e2e44f1417220465b141ccbfc314829cb234279b1a2cde2fafbb77000ae5458e3fdcb58aeca48af947eec0ed6f68c1d85198aa6c730f2f56f2fee83a7083dd5fb4fb65449131cbee45af4fd89ec53295629c4110a885480e76407b070f5ce13e90fdeca21298f1abb1349ab7df47f9e3c9a2035140e3372687c0507d226293672bd146bdbe6ecea431328796fa7278b318ef07d3417e99bb11d7abd55c1a9ca2d6c6388bb1345fb5a16c74f0f966db7177c40d37c178905fed3c21ab7ec59a95c0ee720c075ebb7b35bdd108d7ef112e941cdb65bcfa84e40633d17b450a72ae8cf0b41fd43bb4ab4ec9026055a1b0a7dadf752a0025cff43a6b5c5fe210a0c99b800ac6c06d7873003c9ff2280da6db8821f8c27bbdada7cea6c7c32bed5bae73e1d9a496e5d370dc8b26b8de333f6433b82d657c6e389bcf5673c165abc5f18937eff17062716fdc72fe0460610d91c2e284f6149062c84bafb58323664eafbb5aeb7dafbf646894df34e74e27ad5008c91456db3049dcfd90ea0dafdd5d9ce96521f832aa4541bd6979df23848a97f5a2dd9180af17b3cb2df9bd180d5235345f2fef2ee7d4a6e00f0253131f285e099c75b563569f2116988fde34239c50c0b797b02ebee2e41384eb1a92d973ca51c4915bae46ba084f3907da4a7dd205020f3c73fb0a6046b6cb539a549b9a109b4ddab0047279c6fcafb6434fd70bc1af2b76e41191d298164cf7ac988c281db51ad4299c44ef7af2a9e660b4e6dfd2a1fc69a018ac37a4be4dc77275d32c45127771651bff3cc0445bbcdc023a120f37fed67a3334e1a55a9ca00e4347cf004284971475044831d576579d7a44f72f9fb68a2001e402ba15295ad55da88e8b487f9dc485e2d1ef55ef6659296a3ad028342c906a293523cd1f1a2092c576f22695e3b2146651af5f48c5c6606b6bd41e7b6cff14fe52df998da9552fdb286a15a01fe1570ae8b6137db58ceaf0e24cdd90354c8616ca2ed4876441daf0598c7a302f4f985a1bf8c0a524706de83aea3ed58e8207caf6ad85573c9288d324a79c73707d21382300f58112c39617c4130b5ea94c5022dd84e82e2ad14356d0603234c8142e9b0bd5d41c8dde298d616e3ceec3e627a69beea3cf3abdedfc56f5442ede97dc198745e8a968190a5dd4a33ca137ab9bc57323373c5e9d4dbda1c7ccf39dc41be3f6436238b665c3a67580fa1a0ad80224bd1862a11f6f0c54e172f8cd4528d90e08c754f3702c77010ddabdc1bd1d5d3ed5dc18190fc0eeed92d9545b84428eb682d167687dad5f3de2e703bf3fbc1deb11d309584043e5e0f80fc9ae2a21835bbb157cdc439044d1ca2dd6b5e522e463d15dc0d4fbd7f45876d32ab961ebbb8b15bef16c9cc2574838758bdf6bf2ad99418a55eb930509c191800b267fd9c32bce9142ea2ab4f5103feb084f8ca24ad652a575ac6c584dbacf9229ec0e3adb1f0bfe435910b28fe99cabaf764c87fa16d157ed68a562898c521312f5edcb86e8a70a59b7ca7e19ddc8d1cc3125b0253bb37ede35a7c646b8af90c3e541255b99310f20330172227d42bcc4bc29dd7cf6bbc8d6a50c34651ba30c5cca9c367aa7abb9bb49904caa8bb4c774537730d3b3696c30bba3293d9a63b3a93b98e9c1a6b1e7ecc2a674621ec36da06e605024537d5ede4b96ae3eaf5038d2242c097223560c08cce03ab6b46988fdb6ae67a00fdbd86d700f5bfa34c44e5bf736d0976dec30b8b72d7d18c46e1b88fb747bc5286084311b44dca1682dc366ecf238298d010124899b2835b30a02b38ee98883cb77261a911097b195f019af98c9c3f54e5a903e5678f4c10d2af059c09631bd05a8faf8616535ac96cfb4652cf2587732fad46a74c7133b4407f8601a7be242b3eadb0f9118077ca2dea5e3a0aa447a4a5baa2f1d26a8eb99efcbdb1a974b04c34baf66db1866ef00841871d5f80d7b730ccc3627cf48bf49e9a81e360793b5c887067d4a21f09d18f9eced8185de3a478bcbe43b270fac23dfa6260471eeada54f21f261d4db761e468366329ae978e0d2cb8e0f44bd3ea46e9a94ad9ac7008378ca2a1f7e91f9a03c63048f3726662aef5387be18061061ed3071aa0c51becbbad9b92f67d10dbee088c46cdf45f849eed6db0c07a6541f3ae642cb54ccb8e02cca8590bb9c704323a866c2b19a1b71725e1a15849c8580c26bb4a831fc132b3cfaf32b8f2c1bfccf32681169d1c924affa2709ed36ed6942e5a07a21d43f1e8b5856c4170d4fd51f523fbde2b6d5dbd6dc6dc2ef28274b2b7e4584bc65497e08f77df1cbfba417073163cdd347333e1eaedc6c1a13fd97b8171dd6bd7d5a8be0ce8f2313e63ae6fe08f6050b5adf4a057931be02b90b5b2dad6d0b91fb7e7c003800d722cbd41d7de48f91441ff19b6f76601d244849c48b33fe0c4b0ccbd9d5a4e1cf1109201bf0470239bbb7010f8489a05aa831f0941ad2c1aad370312ddc9d7301a06fc66e8be0130b403cd6c12cea2f8a5aa3fb26805d5060486fd2cfa5837eeb67b57f587173fbe13f126c6765bf776288458330a9ec1339d06e1c61c89dc9592aa98f228d971e16828cd6f0b132c2a1025f1d354c7a66239216e214241ceb7e34f3ba0fbd58647bbfd39526569eb3845eb0cdf18d33b4da149f50617094163c438568dee1cfde15171a6b71b20f17f4c381b21f4a13c49284c822116de96a55dcc2d374e79c5c36ee83c2d07007b42bc7b07772f1b9dfcca4622693b9ad5e0d4b9a14187176af98b38decfd96835be51ca437108005d987aba856d0bf1c01d0a5490eaee54a4446618297973ea20a998b5a80e62c6c28a89a36470a8adbf5ed03de50e10998febf9c2489f1408608ab35aa47ff38f52620e6d857176fb9f8800c6db41150355841b97ba06b73d47a8fc7e8f274e7d1e341a241bf148876c4efe1afddcda4c3c1ca0d88bcf01fc2b875210283f0414414d01431924a421c433b07e004d2ceb202162a4a54df86e51626306ffd97e3e5738c2897af05c0f05fba6d8b9e428bbe7809b6d521e1320a97242da62091d10d5c20b6874c25cd0c5202b51f1e96642bb9c766f77be60e6ec9e658f1c2afe18b6e409a2a22cef02f8da5ee93d422dadee50575bdbc14347f6b4242324e86e3e47fae3b6c80177870e2dd83c399e20dbff5ccca70c62b14bc55ebf27aa1eb8cc809de0db437ed1f47ab779ae60850623a22698f5b9310263cab86205da095b01e998f67a47b7e736dd0768cefdddeefad9b6b0a6bbcf50eac44e792aa1b5a32608a8acfde74d27a780dc85010a47b350f54193cf1a71292e2eb6f473634ee621cb8b4c5103fc33ca22a3f5e22f392fd20756be6bf5440633e470e0bdeb0ad92c28f1f3cfadfc642d493c211f40f62e28abf3ee8e4491b05eb047427a048088bc67392f0fedf4510295300f3f30ef3b56faee90583401a338b315993f2a469eef46adbd42c57edad92b39750a66a7f50e37e2686ed5737a9238cf73df134e858841c5fbf611e80109e562b9a52fab924b1d063a58ad5c5ebbd57f4f2380e436a48404e509bbeec0729df30eeaaa47b7f1d2a30d3881d2ac746ca0e9c024cc1ee1e9fc08b31c3eed9107cf8fced38641d5c741d4d6a8386e29b0a1069159b1f78a7dcb8f2304f47bdcf680f65e71bbba72a149564a52ff116fadb6a1935e242e8250230aa071fa9f746bfb2ac2162e183a7a35c243d7d62309401e866940a88f3d632ad67af6939e0376cf1599a7958288ac545a1ed09b8cfa9b64c7c4707dc4434055ba45f7694d49486211726e7a97ad89ab2808ab7e8429a0a878d3de916a9dccbb86cf44bb1b8f29c3b57edee04d4e1ff91b3fb85d9163da7b45afeaa6ea9126c62c450eb30536fd02f8bc2bc9f9a3329e52692d3a423b6f7146a58f8be5b955e3873f4b5be78d10a3daccf544037b7c48370ca94eb458d85b128730424acc68efef47cb2f4b264f5d9a0e89b5ab55a76d071fdc21e5d0911d3f43f255dca0efa8382ff39cd48bf7d703d56254fa6603e93e0f369fcf2d4061e6436d2c406da35fbc34d6fb991f9a8393c29ba1a06c4f9be5fcc9e5132a08ae138f4929e6a41eb385d028a37e602ed9c7058ee4448e746a43a69bbc2f6a28560e4b0228863386148cef2a221161836474eef5fbd7dfaa4ffbcfad030a89f0088b320e21810d665b017e0a4fee3c581daa33ce174d166a77223c0795570b085a9d62cecdb2fe4e2e66669c349aaa50f74c0de29848b10c1cad54b740aa9a1ed4fc23095e1945ddf549c732a2bbeafdaad89e05eb51b80b914a44fb165fcc952c27f04245e8ff4a0cacbd4bcdc9784d2d2ba82ecaa80b2f331c9dc331cb27053e0f7fceb00154fa7e360296075078d8004cdc84ee4876b3d0ceb75ca8c3980f3bc4d6fc66c004f24fec6f4f82e8d132dab6ec3efcd9b42141c6689052fae94b3d60bfd8d62297c4bfeff3f915886cca07c541845984134b0306ed6b3d82a382c9d42ee3a8b517a96a538f5ef477a22eebce12c80d76c1cc2ebb63de83162008922e252ff44ced989ac6ac74097e5c9d8e486e2ad003cfa6991ee036e9a7f556685ccdb872eae8a8e9f155b1b00507c34286efa4c6b950935e434826d1bb9f42d1525a8a8754e210f096f5024e067591a62a01dc59009580227d4c4106f6018d71a0b9e404edec523211ac0f969917b70c1deddd9acef4c5bc45d38684812782d4efdf2a1911883242da72e1caa3f7e95c7b923ae312c48b98d8e188fcd82151c39c0ec50479b5c23cda16dba4544801ec3d640ea43977f190572918f40f4a2aaba37a0f75a62bebbd6a424f33f9f25f363372e2555a730ffd8a7f72a2f086f004253fe0d74f8bf38885a7243605cfe9e9d4d3c744db54299713db9ab867c0be244d0e96e342e659cb03a71ae3e40405f0d23ef02cba180b03d30e97d0dcc40e74734ca6c15699f2de373b3545eb3e95463254c8bef5283096e7b172cc306e61a69e386daf25a3135455a45f3006662b4ba68c29f8214ad4c9f16d831fff1ec9bba1a887bca12c0f83868b71001ee7b9f030c2a56911713362849af997c6b70783c5dd9bc8e2b7b39dc1be34ebb40fd2ac9a885d751f30cb9c2ec604c390431cf1d4e6c5c425dda1ae88aca83aae063d34f039450d0bf9692243b664f93307457da093674e6a78deb825d77d4e31adcbb6f470d26a73c99c943b45eba11fcdc8024b812d1e0c7d93c9a46f94ffe6c61aa9834385c8d0fb23f5e011c95ada3048a4521d8ca8d28f0ae999e2adda49e81eee3eaf64b9c9f97bccfb196556b8917426380a6f011a340771cb3f6f52a43ab585a11fa51dfbef26848b612fd7022a01b989e3670feaa34bb62d4561ff5e73a0d1c1f22fde1962278d827031eaa3169716ff74cc690a51b8db6ef7e6bcdd17fbb99a46108a3065e11d1575ac020812d2c65e47d012f0c7b39e96fcec1093451f33fc40d250fa73c78967f4685fb3c20d8169b7989b96411e0944460eebe3897e5491efd921f2635c42d94c4d598141f415c8de73f15117a59c3623a9b7ba6d79393c70a8f6e1b4c147c6116a71488517b9c301d0304930aa0b63823e004ae6ca858de05a94ee085dddb40b3f25d43099dd68f68bfd16faf58c8eeee4cad3986b680fd0d1b6e4bbf89edafb990e6cc3a3d4f7a5411f929b23ea75833fc39c0b18ca5e24805d8ad90acc94d7fe2ac1db076215c1c447ebb55efd00b81e2fcf1c0802cab35b993cf117cace1500f9fa3a3821da088caff77ee10c9e13f44bdf693374dcfb26fc6649aa906b11556174ab18692aca0583d3c06106fdbf511e94dd8ae77229a675e693ba8a832b0d843e407cc2f91796b4aa2feab7aed41def78afff46bb046aa68e56278a53b20735658b475e061518789a8be5431b72346d0406ca2420080638bfbb7329d4f4055bf37066859c44d9f8a2580bd08a421d36df60d576bf9b2c59e06e0a2af7295821f750362ff6da00a76ffd346723219b1fccd2d4f2201138443a534c755e2b49ecb4ea044f627c81c9bb0e7871578cd864fa66e9b34102d48fbb96961581fcc4176ff7957517b561cd8615da2ac3aea06e6290f6abce150275090e4ae3f82de539b4155bc53a96b0152a2423ef953fb7ef5b280de695ad9793b1b307e65f186ba08dbc8eec02a7500d8dfeb886e20385d557c6bc7f2d0bbc37b63efa4f9320d64c02d448e7998cf3176f8411f403ea07ec66cf3a24c0bfcbef49a679696e0963018702c856b014b18a37bed55caaa775f8096fa280cf978d913804a26852e73dc1066df272d8bc58f663d3524cd75777914c348bc5a0e3e880ba69e9d5ba90c7ab457cf0b814de75571f3a33761618bf1bc26c3b0d8deb621325d1050faf2aa9eca691f6311cbd244226008f70aeb5a2e70a80c833405ceaa6dd5a080febe86d74eb2e7c7938c041df7715c31deb865f23bb6828bebc9c3b8d43a54d6b1549c87032ce63e7e7df8b7dd27e415027bbf8e6dac342a662ce0a49d187fd70d1d99ff3982baf7e8a9674e79d0e6d241061a107939076003c6b2f29b1b54f3faa21cb87230bf6e5e577f7b0aea3e4165629f7350769214c49bea490220baefba74ee70c1ef24011eca781720b70efbe3d575d4934e3979756f638ae26b4f2b2e84a366e321765695ee1fcbe9972be7de4c380236d34cd679a1fe9bb477d88c068e4ea59c416d505fac20c8f01142d1c8aabc84c9f86d99312a1aed88215aab80b730b198a4635ba9448aba618e9540b23e74a8daccf96b83e435725c6dcbddd8434d2de61e0b6cea579b584810fb38463ad65b0d10f6bfcb8d5261910273405fec8a61c1fed4b4b9f3eccc2aec19af8d8085f6f49d89ca9d14e90c70b2cd38836ec764ebb1cd1b55bd7bf3d88da0344d6523652640e1264a9348cd21b97b872c402283037be42b086e23c537804ab0bde7ff9843d1cecddf0752f37294c493944d8043dadb3a2460d74ddafa763be2d630de110093ec23f7f61b8faa1c14398eb977ee8b9be2309e4f954d788fd7aa1b85a9b4b18e7bca6a74b826cfa7262dc0951673c03d446fe628791bde25a152f74b52e9f4cbd8077292fdf28aa5a041e95c6f229617e0c21a497f36def294dbe56426c0c2debfa3ebf11892e18933e28511cef4d901a1125fb4bad05e5a804e5fcf2e47004cad4ba0a8f1520fa52b5d037eaf2b9386d0ab43280aac43571f3d3fc61e8e363efe23ea3d44afaa881de5c702e597bd7d4505c5ab51847726fc17d5df2ca8d86fe8655c028fd8b9067d93b72c65921be4e11d490c4e1624585af4836c49b2cc1a65bcae4236feded573bc09908a38c514763836645b3b5163a45251bea317aea1a1b96cda4c8b76117a29949e32eccb3cd067b5623778791348bdbb07e54d8d247614126cc1e54c222c35fc3c6c5ac35f32263744bf4b5e9f84cb0380d04d22c91fb855e994538ea4158d66133bc888993d0f685150503a71de02ca4174a2740b3ce1ef7cabffedd8ad0be828149efc279f32319dd995d0b80ee4c268d0faf66b29c29ee5cfffeff40cf2e456a3a874906a3650301b77acc64cb47655c2bf179521d1b10813362b33992f784364dc3081fb322be3c4eec7d413036bc1e392582cb195af9141cac79ce1cae63bad08766f18f4884a5e1f2ca6de819e232d02073939d616efe608da7f3e01e6fc26d84f46b5ffa049ba13d88689f25f90b5dcb77681dcc244b96dad8d76b21387b16dfd078775a0a639377b82182f161125164dc0419ec608db40f9e716b92c2b1a3c02c205424582963eb68771d48b824815b71c0f48813f6d03da77638e17b9afe498a29b3844595dd06a77842a625bd58508bc2158f178784675a196f02149c96bc7d45b2a0a1a139134554f44432847846305e1e010ac9351bae098f3b4372ed8e2a07ca2896562e089e35382f6f0d585c2f1fbbcad8e6593449ad5691c89af38eacf045bed8bbcc4a7a97a4eaa38844819876aac33840785b5a7b23e4d3edaaca2a68cd3c4aaba8729f80443de062a75cc86c610e778e8bb8d34e56cb6becff0baf9e0baea9840fd6bca68abdebd5316c5c770ab1edf4c5b0f5e372e08e33c4e9f96bb05336e5cf5237e65e61abb1ea8bb1fb9074f75a238ae8fce163f423f52e1edbb84c95768db3a644d55a93d4c23d0234f91e1f3e5614b33a685ac730603b9379b63a94be47684d74d11bbd5e625060aec3a9e3723ada9cca6d97f55480a28cd2308d14be73e70207fed43fa8c08b6e2b9ce0b184add870d2fcacfffbc0c35c9390dbe18f788d19ef97a74f72fd61c4c5e4c89872cb950dbae5f1897b7f754901595df86a02636bc42a100833c513fa0a08fd9a6a5f11de64b36a365f71ceb926026ecd51663036ed2790d60d13919d2152dbfde099c6e96d198795047b25ebd2602890ca893a35c301c9643aaf264c980716d0175b1de2e1129748cf28b5a9fb6dd5f0b018bc384f9601789f8d7afe86430aff6622e8667d0b687850b59d047132965ef9ae85f9bd3400efd1d24b80f2b4462ea3de22f8cf5e28d28a6f40597b4bb1eae28767de00b58b579ec5562920325237864060f5132aa019958e10e8b9cb0487f9c9ff2afa926ec8c47dbf1f578bca1209375788f1985dfcd5f15d1a8787e602b564d35e8686a72930247a4a4070667c822c3f4291cc0186ee08a1433ec5687a09005910a0a7b9637f20b95320e8b03103511f0c7a663852527dded1e2aea0b37a39849058881b587712034b7e11c0354da907b88da9987b3946342030da2f936704011820bfe50c61e9c5822974fef380be80f60b35da551d2003160c66b462af32acaa670ad4214994b031307f6d58bd0a544569dc914199ed53ee687650a5f3d0c41c8671a08ed3f657b6d743fc1129cb9b1f7498e147250c1375cf37c297eb080e0f63ef92bc395c7a55c43a96adadef8be61ee18008315b8b06c6998f47a43e113ca3e146625ff1764ece35c4ff419d06a95e41a7ca1f743e47a0e2266fac9e56b8ed216b4216f077cb7b01887db7ff574aaf16345329b07c50e09d5311c7221cce4fd256970bc27bb0f6bcd651216da0c697ad810e04bffd287fc69df6781e7d7fe48a3a14e4db2813e71d80d7879d7ebd7d5111d6edeb88b03f868fbfcae2b663c366ec8af2538e1a171e18af07e8368a2632df34a0f422514c3e26da6cd2df54ae77f5c380a2c350cda612647c3f04e816a85d3a1f26273098bd3af966c4c5b3eb73a1c42b23e62a48245ca35da3f2f542a90482ef18e79b9f4dfd844034cb213bbfbf26bd49e8186c94fdf31c9f2b923d5a5991b53633f3c53012b51ca9848f94abd637e65e6810faf47cab30026e4f08dc213d5e4c1bef9041a4f5ab2b10ca9779123b0c7d0fa00265e06d2ed825ac876280607d0d8d2589c0ec76e8061ed69b7415f2387baa46ea299adbca3c17b5574e61e581b06c5b32693c4cc7c64730d28783eb11c6c8d2c00664d2bdfc6c80635d63b248acbc3f26f84d7d10ae33a5368de6d844ced26acbc670608c84cd84771a819f8c7a3e12f8fdf7e82a99fa218f74b8112b458c30a534b4292f5123f2ea16f8f648a3910240cddeec1171068b97376acbc3785d27d7c55198d81d4841ccdf7934086eb03df51ffc1c0a96098eb6c0a7dec40cdc557aea9ba1b1bafb88a271193909976c7b1b9b1bf37346416eaf13498ab218d1d7f073506a63537e02e93e8901736f07b5e9ca31cfe9faf847866cb56d420766cf4f3594051c7cd4612ee75f48bdfcc4d1f5bb4f2bed1a8bfefaabc5d59554a92408436276cbeefc144d269ff19afcede169109455f923f8e7af10898903749019277d8b77125ae784fe342acf18675ea0c8bc1b0292074e3894a8c80d8ea6166c718dd26fad609f65e20b98150ee3c46b78dd675c2b74730e949847e57d926e3760fd107bf5d22fea39e088659dd2c1cd79fe3f361603f71a684475090193026d8e1a2874df01049b61c87b7fd5b6c669b4239622ae329ac67ec4078027ec6bd98e32795875e059f039c0d1b38853c7d614589fe57fd41c89f5c68cd60f9f958d5dc38de8fcf54bf7f2fe292775c3bc66dd117c599deec1f5f28c3e51d2e188a0be60614a60681f1e1e0bf2fcb8443073c9aaa1b0541ac90ad3af29b69376e038679bbfa83f56d9983ab5e7cc3be57f65d0fbe573975527c9868c9270a4a83cbcb9da5fbbc9e2fffbd41c5a21c859b4cabd2da52b831303bb8094b7327ac0e456cf7a24e8301ce1dad6c1c3589193b3ccc7ce9cf2571f7329b3620c217d0191f42a27f5c3d34ccbf3a71edf323f8f84b73b7a2fc9a9d17c54c19c6322cfc9a410afd8b2c7938cacd88f79d6bd70165cef8507f150d39ceed3bcf802d2ccb3cc9b6a70bf2075c0a83d8965987d94b2bdecc2e6c9be92c7fa503731555b354fb61808d39697aef558f4d52f8e3c4e499d8b632920fccf2735eaf524d8ef6e0b2e1a8773b57170a8594e961dc71739f4ebabe4c7f373d6c3a56f1b63d71105afb011631e178d877f091dedc02cc4478e762c08922c63bd259cdfa1718d2c9ba4b7cc3c7befba3c8b54b1be84f9c489c8418f6b3cc978a7cf7f0950732d1c26011bc75acbe95f40653930cccfcddb2c6b73775bde832259d0b50a03bd5cf190174f9abe8d4685adba2f96f2feba09bcd07e1995dbdc2aa897840039c377f2c86cbac2b982d062789a54c7109c240c47d49528e6706f5ed7b63168b58f4d52081b1584bda7838e62fb524ddca24dc0f9090c5fd84a8b0b047c27bc9b2b106aa8cc0a85585c7de25a762ab3a216277acc604733184433b1b677fd76c2ebc0a829b0f2dcd7c5b1144ab3d61e86b6fcf9a115bbb9e30cf0aa862da04b2ee8c70e5f26812f7fa498f2e80dcfc8c611a7ad46481dd140dde92278e20b42cde2636a15bcecc65c25da97f5662c46154e706bcd36695bbb7a1ec77659cc073877ed49fc1710bd75175e60f7beb8aef8b9ab924fd28898ea64f71319c06121fccfbbb92c821da1559faf3443e35be08f6ecf2c27c30fbbf2da58801069799b1bba67e97b0f3fb7c2e19e8a41aeccce1fa597f2ee413d05d34f3049dfb04ef0a2b1a334739a4e46d3061f8cef9de8ec56ebe2d925691a5bff6cb437f13686a766e7d4828123fccbf52c3fd278b6a026bf303d79d403416c1a890aa2affd466d18aa67c56442361107900cea36348d111f2e195f683ed904188900b3a622ef8595c9bf6ef6e4fc50832fae91d21006f5914d8873e7881e9f1834a56c0fd1d0aaa0d30af71cda56a897fda1713693db937a859ed472cb406bad6b876d0a3366500d68cfa12b08733adee670750d36ff70f16682b08484da981a9d0273fbb2ad528a98a964620b4ffe6a8ad0b85382a26b3f4b2799efe6539619d8eae65d6e23fceacc635f62e02e6b0897495e48bb7323a53d7b44fb1078d801f37890224c7666eb13e593ccf2a2847887f904b05c260667d68a9a02650401bb10d9f5bcc14facf77eb50ea6ff3a2e6e60eee44308d146344d13d4de9dffbc41905bb5468526dcb2a3bba2a0bf2ada4abaa2d4a33576a846dfef7823210f0233f7452ca4d8a5980d5871cf704f73f2d8cea02db6bac5e85ab17f9d9f00c8274a66b94c6b4dfc43c15aae08eeb9358d21eb3f70d03e652ff6c1a60489bcb045215535edcba8b9116027803c92cfc6b5dc171946af5735a3317f5a310717f9d8d94d4003b88c87591724d51e5754b73564c6ddbc511d03bf65f9ca792a8877f5548287c01e2cb482c2291c2e13da91dae63911d1f081547ab6d78b7771fa430ed4401f45489590ac20568de96148cb427762295da37d3042e8a18c5281b6f6e28a1fe8a61be475c878f9c17c185d43f25119c3cb2170c89f26c86aeaec066765a3fcde4cfd3fcd2ccc946190684b204fdf943a5b4b2e34f27f9c5bf25b0504e965e6c6ed96c9102bb72d124a9c1e2004e8267a9243ddc801eb04a56427b2642b755e52fb676976e209efecce456bd3a4b59da3b1dc4842e52b63d5c33616d94a187c007fff514139c0d2f41e431b9384476dec2dffc7ac4f7ffa718ecc6e60193eae410d5a8fa37ece7b863b151bb5bde6b0f345a5767e8cb4ffdfe294742b8189e8b156e0d4db13c3eaeecc11df6b1ddd38dfa85d45e68458fdac61710282ed733d02ea75d57bb915f7fcf1422b112712cf2b6d5e6e8c9c2b98c2fcb1329f9dd32177e24eb511dfb7582eb46f56b2755ea71d2be3ab7f8800f4ecde058aebcba24b886ad9624fb000e6739a6c838bd9bc6e988f7472ff4861039dcf0553fedb60eb246c4d938f2de14ef9f9296a7f6891dedab95d66a6bfc6705cbcf2f611a04c53acec6ec7df45e8722a8b936f25548f2a6cc3b7c51f185f5aa35aef0c742f370b0cad6e27de91bdef6dae0795186c3293c55fa7c4b863b0c6f82a1b471f437069f55b2374aa6973c4c2ef4ee09047b5676769dbe805c625debe0434156176a3a8039d1bd012d479d80e83e5f8ebba7fb43d4eb54f280f2365fafa10d3f82869a0496feabbd9cd8c66ac62ef5ae338ded85013b75312dc5b8e9dd3a6e51ac63b6f90a6c33b1b0446fb763a0dfce691830100660411e87e0efbbfe86b62cf4e16eb314e8f9c862646b39550285238e9292725f7907a6762cce157da8df51bad6df36a9ae2280d78562acddea160c1f08fca0a45fc4578e42e84c7028633e40b35794793d371455ecd00ed9664647830ad8a6be7fa78fb7efe7c1bb812192bf84745e4f9e5feb437190d19c7cd9b43e0c6a71ea8d8ce0ec876f492687a720e34e12bf726af83912acf8e93e0fa3c837c6ad0d020092cbd0d0cda09f8153e766e887ef1b33b7583531cdcc76c8a52b2fcb7c394e1e51aa8bc61197da4f2284e4c7bf1d34af6dc5b7bdbebb844faa545b56e10c7b41f7f24dd599bf818ce4bcf903e7ab9b2d40b100c9b3a0290585f8ce2e19d186cd6d82f1d7362fd238e180fdbbeb294af92e1a5c02c789676eb903200e92e74cf87d8b7a60ac148cedd2b1daeffedfcc4d314d6c3b689f7a1b17f63f67f7fd7d87749d796c5998f9f0ce2987fd355f44b1a62bc339049c98126f45c9030442655bb6af74c84d894fd82afb8d83765396e1b323e62c2630922f0db5b52a431077edae8be66900cc659abfdb3cf817420d02ef8cb6f6c5291ce35a9cb847b1e38f4be2a1cbc66ba5c55d8712a6dc8f3ce170a8fe9cdcaebb7a935fd75eb8830e3b6b885a18aecf6acda652f76f83e8542820db941ed884121d65c9d0deaeea0531d0f7808356bc845a6cc75e071758f0c99662e73e6ec70adf9356a11e26813ef87b6f87bc3c1f7f3b8859c06b31191e6f4fd24233ed8705a51e945a06e7d48aa8e13daf3911ca1216fa1383d92e782f23fc1204ada83bfcb528c5d90a6f4336a4d5ebdfcc25349499746193d5f46e850d13267651700f31b0ad6e1188bbde89bd68538bf4cec8b115cf573b8aaab3dd76be35aa57b92c96ee3004578c917223ca44f425a0c38f75ea11e01eb8cb14a44443caff1f451ade114ecd7686556633d2c3a9e6a77c6c9e85774e3637b3eea2c7ce4fffffe3f51f6ef9104cb1a5651b0c990f33b2f118e48f749f1cab97104245924c4f1d691c8552902b0eeab0bb9abd3c895116f4028d05f11902384a7e3aaf06e62ff0d1d08eb92b635a7fd2fadf91063e64bdbe74b4e91b046f465be34449ac868f457303da44a16c4050578608f2456c8264507bbe389533203c1c4d9c05ca6d10e37c9392a0c02b00125496e0f43f637269410ab2d9e62ae52c7f72638d8f3bfc52dbb9f8a58f758e539f9defc937c99c7f7c1c73bee821bd84a3925fe7e511ed7f05e60eb25e95a550bf39ab58efb131ee08c5136599d8189d07aaa58eccef6b8fa918ed47891b2b44f2a36dfc762d5b06ad80b657dfa582721316a30c882ef8d93f9c2f53c7a4c96d157f556f624304d795c63d761317e262372000e3b3c23d2bcb2d5bad22adeed92faeb037302398d87250d748bbe115e93fde833dd697e3e4c4d10c8d6204d207fd6db9dbd27c7907247fc305944ec58c2bcd0ad75bff8e3494cef7ecc0215eb0c1f1f5af88a21bc9186ad367e7e64245a9b38f285d16904d47a097b8f3479c2020c5572339cd2bd52a70f4ed46ccf41850188e55cdfcd46c1346b819675b9b5665445fe7825918df670d23f425f3d6a77047a5ea4bcc1d3f68086a00fa8907ed3163c75e166336fa555cc3c975a6c9e45602cfb348c50ca4a18f7f9ef90f2e0a80c92882883910ddd310fa1f329a2eee360d4a6e772a219a409b4ed94da525afcde79896a74ea666bb9c798c97dff280799c70e5f8af8478f8bdfc94e15df9a660ed2289bb0622b7716649532282a75e15d5faac0179e457062a52a00eccb1c32b74b0618cf12165c24c7758a7754e0910c3cc1322d55a2852dd5ecf1ba5f0006b33af20865b02664c3efe8bf403c57d7332e79b1a218d91f46c9eb19c678ae9772b9832173e7f2a1666b839aa5b8d0cc385535b597d224efad21c47976c7d6239e810f890fdba7d953d4ef0d2185a3608140783e057fc8a2797fa0abb606f54668f70e46779f20e671d24e855e1826e5d670bb212213e54bae13c584488d23d39f4cbec649488c350c35b01edc3f7814909218f86a5ee2a0b508e384592002b9884a5ef886e2a997d27d97a3604bdb2ed0c865be2afc7f977d74628444fabce3cbcf19afe3866bdec3d2a55c22b380b3f14a28422bc4fc088cf8d556ae6e55082da91c9bc1960e3b4772b9c92062f095ace11788eadb96ed7c7da80ab287b25063fa43fdfc63a3a5d50fde9b32c88e63850290bc2c07b4041bfbc902e6188fd37f5f92367da559e10c6b3428cf313b9211738bedfde040c732ee707be7457d0236e36f8687f809db6cb82dbe8763db7776fabe931e9a0ed7a0495c3565e2b5bb6b65ecc650ee8cb7118af17e333878dff47b4c5614cd686da3ac7b2a6b031a17b0c5f5e7f1b1e1edc57dce4dc3d519b820cc4b67680f1b9eb0177c12c2a21d76cfc3c1bb409afbbd230d60661c78c06278e2e3ac55c56b7f2a49f9c396d1ab3dd45adf071d2a5d253b0a90014ad833309e1e5bb71c90642f17f648c0e03736f7214e18c3c9b63a49965dd7a8674a9f6992167b8c62570702c2933d18c13af1a19ad8534784d44d1430ec138c946aa07defed86a39c39d5733745140467e618f0c5dec988d15ea0f1a1ae03fd27890dd66ba1c081e4d2465a337f0cc4f3562db70bf6d6c95bf3215a16e368387f18f7606031358e6e01856df37a2313fd7b494f2ef77f967c6d02776cdcc78a82bdc0e631c636ee68de564f1c067f22e9f1edd37ea38b09d633740c1305a9ab3354a03f3e31fe4f1d88ea706c8700a5a9a08fdfa9fd747ba6db816cb9569e217da6e989fea35e80ff1b65b3c77999407b993fb98d314b3cbdbbfe3dc7e891ac4350c0789d02601703f7a10a24a01b42a254e190829e53cb9057c303837751a79e04556b7828a729889a562769a34574d69aac390807b19e5c6abbae61cbe5a123d2708686514378b766f23a27157ef22f057d17fa86708f560318ff6fe6748cd7675e172e857346aa89db080bdb4a4801d401f593abc3bf9371d647715cb7d1829ff0c3c99e4800673e7b00dfed052f905bcd09d6533ccda4800d794f10ca9efc4db944dc88c0a9323b9bd5773a78b740b46311b6664671de71979d25affc7c2c2eb7df6de153946e596dc0a90d914c0f86fc16d38047cc2e5d4c1b7ae7755592f015c5e74f2c78ff3386d29947e6f99ea1f7b7f9681b3296461c0908d40dfa62db3035afe8e2cdf3c54f20c3685dce369e9c88331c68363c407755154d4335bce29395514d9323bfd8c34dd055b7062ab4e5d86d2bd8806293698d5b8bc289119a4536a48057deac5392159b3ca9ac54d4240c4af5929f5177d67fc49bd3467d5db21894b98aaf4b67b83bb92228be601d491af1b6eae562758823f292e5c0abca397f5f6b48ad0008d3d45e4ceb1893fa57b603581e6dcfea48617e2be48ae066582048b7b6227da31cb6e3c48358eb4ba5a2d686de2f23bd86e027ec40b7c5edd79c1114f103eb3700b01bf3e08e4770314fa4088171b9d3ce824c6ec6568ef987452fc817f8bb939bc7d9e57edf8f6ed05efbb95b7cede30890ee33298182e5752cf86783a93265b910668df1ec51f131d007c134510116560884aeae507998b74e64b208bd0a897ac6009ed9f4cfde46cb9f516b2366fc9767087f7718dfc88af7622caefcc7baa107e03ae6aea60b998e4c58c5f18a3b84b8d5166962e08d9d49d09933edc7aa287bf54c69ab0797d98c9349a8252209a8b2765fb9859d8aeb7bd7ff6dc08d81afe1f49e25d546c3634ce813663923d244b311846bbfa48318c9d17e973543be32bdae15342aaff64e3cf3d1878536b1cc12d93eaa90b088cf5c5f9af4a69bef8bcc95a4ff2e7bcb3f5b78d2d1c78be0f7d7eaa55d0d813decee130a41ab4b47486c708520972c00b47fdd5dbf61b9e70ffb9899e53be39adca8593decccd95e48dc25305751746e0e8ab8375d765875c45254dfec345e1e11965146328b0eb1ba0dad601ea288f2521d90818d3737e0706b88918cc6a77c092c250e1f2bbdbe365f725903a0fa41214512773791ade51f9d6db2ecb25ba5e67046e2ed681a99c4262cb085489ab0b02beaa9ea6bee699cbb258e8fc350c1621abf50a7e216b01dbc521f9174a212687b7aeef8a8077d0230f444f33db029f6cbf9f08a5157f4b764bf2059b369e278d58cf9a674e4b4fdd89e663de8efef9ad8cfebb6c2ddadff6fac6de49e00cac33f834b549bc051d3c7fb324f90b36d70f54f89b128d861fc32779c1e304fcd61d47d2cd53c46f7088c32df210e13f2922059adb483dafeda23b2412c3ec09e7d444de2d731892eff8e129be33a43f4891ab105f8fded5c8e43ea89942803f80a68e52a5a01102d3b0985177d7c9c31abb6068aa4e565367f63aa2bc3a9636b881fe357317d8b2f3c303750d136a7a21d7e7f990f4502d530f9e033ba2e8887d937bb17a8f8e6f5490bef9051aa15d42aee927df4f9d8b00c0980a5d4200cb778c1441014401320198b20883425fcecc5689b1e5d69305189cbd84cd90b7c25e8a65165f68a93db5b0e126d7e50d41165ef0c6eb586acd5974c15bd285cbbda1560cb3e00272ca5c11364eea25a72db0e75e6a9d8da147564e0b0a6943a794b95315535964e11fa97acf564bcdf368608ab8fcca020bee16caef55efadc5a61acde20acb9f6bf34fcb6fb1d9e5edc69fe78710ce18428470c678e194b1d2b2b0c2ba23f4b9ab9ba1d2f72caaf0ec5b7aab1e1d7bccfcb2a002ebf558b174eecab14c2c594c0157f2bb4f8ca57d674f2305f4564b2b7b695a6d75651105c55435533fe6560f910ab2804252bbb4397f287162b46a64f104d7edbc21cae42f7b59195938017d225fcadb3964960e862c9ae0988e6ca5aa5dc7f865c104d79b186ae9bd4de55e66b1847e9ed87bb5b9cf96425928417b13b1f3eba6fa5e65918445aa3139e4a554629801a931d5c8420fa93d6bad0a93116f6a59e4012dc5aaf4d33b424d7d1678786ead29d5aeb1950c311664718766abee53b2632cd7731676488fdcf555f2e2c46cc4a803bf57fcd8bda6996e7d1674f067baa8cc14cf21775d53dc9f8a8d3dd5b0b4fc07498118608071e43d0f8b912ce4f0d02226a62d9b3a4e2c0edb09f99dff2e2364a8c9020eab695d6bce99720aa9cae20d9fc9bd840abdd7cf96b27083a2b652ca58971753ac0d2dd14bd6ef61638d10b2a1edabcd4f8b301fa105248b35b85c2c2dfdc6dc6bf6aa21f17bccbd36eda4945acdf3b03ccf1840b830638c123c0f1759a4e1756b2879f1ebb60dd90459a021bdfad59a42aa70e966166750748ed06673c8983d9485197a19d5a5a6927209a5f5228b32b4e5905553cf592da65990c1e136d5905b6a2c95eb31f45aceb619395f7aaa0dc70459888135464831b45273ac58ab39fdb41ca62c22e10965a246ccf1a5d395451dc9c96a3d96dc73895ee9c0b490a5c5ffd8dba7698ec48d9b428f5c5a5eecc9e1d8fc92add5a7ca6a21d1fcd26bd4b41adf3395c523f811538e743145e8399b91852350357e0d33a94b1a593482a963f6c55d8911ee6f9b25dffcc790438b78fccfd2f32df6fa8b308a585f491d9f15b94c9a89506ef531b452797b32d63c0f221a2dec746fed228b43a4d66ffc8d315b6f6c4b9085217aada41a2b6f7687c90b81a873edebd2450f2d2584aaab4f69a54b0db1d606a12e1fcbf6460a933617076acea75ccb851c36a72018b7e5bae1ab168884df5cb963abed5a486501885d8caa29d27774cf290e6cb182b2f8c34be970e5e25ee6d89f1fde6ebbdf55758b5f22983ea8cac69d1adde3c342844dd5735e45ba5a167b58c46c155b4a59061cc8fc80a20f60a254d962f301e423291f9881139223ef0302c8c4c014416307890bd9224236eb925202d3c9428d4c6a8971a3a559f1f655a17c6545ec644d4b2cf23c44bcc3e2464bb33c0fcca625c6a5a5c863e98c91c52a524b4c4703e3c2c2924516aa7821c26f4716a988711854b81b1c22449c084a16a738f2c2449c088f2c4c915852b228456a89690e91222c2c5964418ad412e3a2815916962cb21885bf5c957edf53875036962c44d1b8de8da9f46da897c7c82214fa4ce54ab62bf339559b2c40e1a9127b2db9f68da9fe4f2cec56f5349b7ab6ffb2f0c4b76e4a9faeae9590b2902c3a919c94bd94ae7b75e767c1096feddf6288ded3cb2c36e15ed122e5dfc8e22f478290c4210b4dbcc4d4a3e56c4fb5ed6742b9b7be3fa5163344c404abd7bed743f9afd7d125bc1def52f66dbbdb9025d6a247b4e9a8993a869548951a7a4cc49c052578537b2a5bcd505bef653109460d79e2efa64dfecc4212be9a77038105a8a10d218610420821124880dab4067104c538c628850c63107b1248821c4f5210c2200cc240146308111042902184184614191aa3ce187ee1547a2ba39e5071fa5799fc8ba5c25cbf0303772884fae94b3407ef73bb1ae862d01b29aaa6a6bc584219fcf86b35d605f8cbc224350d7aaf869246bc8cc6f05880587b81e03d6dd30bd4b46f1df0f50805eae43b4fee3dbaf46926e86820076a4cdbf7a5c8aef64711da495e083565e739ee044e4d59de884f8bffa80c76ea02a11a968f31d554f600cad84be19260281f43e237625d9413a88fd1460d5b2c686aad0f0e87b41b5c67c26132de13b12d006c31c85906784de2353da66ef29a08ce993818dd4aaa059433928d8f032881b356c206a43cb3fafa55361dbc2d2b22f815037ed7f874767480f8824fddf36cfa27c3814ad838254e75c134646cfb783a902f0f3bfe497cea1f6234ff1fdb0bfaeaf27a714c9593f958fae1d31a4c6939711ea91d3f881f2a3c5fc15902162a5f11c389034631f95d55955d282e7958833750ee906b829f2d2fb16ac6ca9a7daebfeb3bb45817958e32a170c12c1c418786d4e62d4f4f1e2b649a25a203cc8c55f0914c6115613d822be67338747596dc6bdac3c365e7d0a98d0a0926c44f09cc82ac40ed1e65a2fa92080e839de9a7e55be4510dbac2de1d860ebfc0aae97c00a1ae904059d27ac72d2dbea16b1ba7c54211717bd94d82840d2fb91133e3356f1c9483f9bd92a22667846da5329f951850cbd8282158a7c98abc51b010d30ced35155a09ef3ae6878c1a32d6781286ca4537f03ecd0b47f07d2f91d90e8cd502da46f480311c1083798c594000c0da814ae18cd03032eca100f3f8a0369f0b256d844b9da059b669d83181978105e6af2b465a2ced5d17dd17379c1e7d3bc2ce0bb788fb7e196f07b820d8d830d96293cfc0297a69ec62a07b2583598f2ba78a86974e3068222ffa466821d2d1d19ef241f44fea346c7ec38245f65667ece46d5a3346a5bc322c685c88ca19981d8297488010d56c04a5e00f51b944809582805a1fc906780dd33991bf7e6fdc8b2b36d897f2b81e27064a1e92b1548fc3919cede59bbe476887227afa1bc1f21571a72f3a9f2262fb3240", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cf14c1bc1dc6b2a2e53636e043d57c724a62f7bb23af644482a6a8c5431def66561fbe9a7b257703e9c0b51dc1d09863": "0x0000000000000000010000000000000000fce7b4170900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9541ea28560da4be57a92e04d6cb23b974e0719d7faced97b2ceabd7a3f2fbc572a9e888695ef48e6b272f42b6bacae2f": "0x0000000000000000010000000000000040b486f4f40400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ef17e474755adf9cb4393d9846303686945c4a7fc973faa85d1e2b7621352af85e86748f7dedddfac2fe9cd4a9d6094b": "0x00000000000000000100000000000000f3ea8db5830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da941b998a403a2e5480a382c8bfccab65808a32288e6b13fcc23a6dfc837a1b850c1cbf36a72bd3502e737fb2f79942139": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ffdd7663dabd8fbe4e7163e5a944ee3058bb0575da6bba1af50693a7129cbccb075b6a4e0e8d2488dfb3914e47d67868": "0x0000000000000000010000000000000000c06e31d91001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9507c359ae940aae1093c7360d37f14b2c0b189604ebd3c6fd731cb5f3ff77d46655354769c61c6a85ddacc6e69e5ef0c": "0x000000000000000001000000000000004ec7501c358800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9215cf1685650be58f650cfb7ef8c404cc20b460e0e5fcd8b8aac6f4bd8bf91379abc23bb543572a5717d3cbd23fca730": "0x00000000000000000100000000000000022d34e9d30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9257fd4f163e4cab849a3cbef9448283160c3fa2fb0f91d2004aa9766fff474e164e7bfc7d42badaf032ca7b4292e657d": "0x00000000000000000100000000000000c41a01b25b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98607520ed5f5ea9477baec0b93d4e330c949ae71c66d3abd4c847a5272966fbe34b35b4987486f52549db99834a79843": "0x0000000000000000010000000000000000c067187a6503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da998106cc988fdfa3652f3d7b595f3ce9e95f6525e8e4ba61ec1ae4d5def540135b1ccb60721788b9ede958736f7c12612": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da979197c0b822410e51d78ea27c2d8ed527eab8b76fd4e22ddc6e88178e56dfeeffa5ffd5793419a2c241d58f49dd26778": "0x00000000000000000100000000000000a438a496410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95d6e39c05c485163cc56fc84c5b4d0a4c49a7bbdb46fa9573533f2baebbd5c13b6d28e0227dd9aced72344bc93bcef68": "0x00000000000000000100000000000000f22a77215e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97ca02af9a6e9bd2449368d7a32f90073c68abf79d924b46427dcd2571fdfa2ec5c13020446815cdbc54af7c6b3592823": "0x000000000000000001000000000000008e9f0ab1c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c54cc116fc2c3b96fd8cec7eb97b2aac9c322cfa42b80ffb1fa0a096ffbbe08ff44423ea7e6626183ba14bfb20c98c53": "0x00000000000000000100000000000000383822ec41ed15000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da954366bc3a2fb9290e765a8e573abd7d5de971d44cba2f76bba3a8244700669eab219519ea0f74725d99619188ff5375a": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99497f774e0b69d8d5bee44ccac9de936a618682d4ca75e3f94865e76ae16bdeab7c0a52dd1df5630b1251d572fccb567": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cd0df052280d676580eccdd297958ce90f60d3297dc7f856912471640b00ac7d7e53c422797fd79a786a90ddbf9a4da7": "0x000000000000000001000000000000007183a32dd10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92810e8abc4cda4d19bee9f8467bd0e51a4356e36b41ced8ad3525ab21a1a5c659a75c245aa2e2dec0b9b88e2dc82950c": "0x0000000000000000010000000000000000e02992d20900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ec35bda1638c1126a8d89ad3ca6100ca56859452730cf717696d205c940b4dca8a142d853c1e170cd296a2a8089ef05a": "0x0000000000000000010000000000000080dfe80a460200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a11834e97cad3a963d08a868947f6dc40c60ecee6a91e0023ae00e5b5364503f765af4d5042f16464b0d05a9f6b24846": "0x0000000000000000010000000000000040d3c6c3e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92e5230f9e9982b3082b127843c73147452b1167c9f03c752fb6d641493805651ffcad9a2b13b4bf75f878e36582ced74": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a975638a9cb099554ea74a6500972f754d938434a9d45e5e41160902e9cd43c67d671ff4ed650fa603fa03c8e5ba68ec": "0x00000000000000000100000000000000009024ccb53f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x344b0bd4dba92f85c9e4f2ac14ef72e9878d434d6125b40443fe11fd292d13a4": "0x00000101", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9964513710224baefdcca210716d8a7755e352b6a8c41637bb2428a8c6f05fa4e40e90256889395f30420d24287d84165": "0x0000000000000000010000000000000069ac7dba821a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ffb0870a3bd20e1a0b4593ffd9779135060edfb60e8fac6430f3bc97f1efea665d8703073619de96131bbd912565db7d": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da978fa74b520dbe79da74f9f58606152079018971e9e98a47d34f5bff19396bdc88d27a120b2d22aa80fade65791abb274": "0x000000000000000001000000000000004ae1bf5c678900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96915219819ce4a98db42aefcb09dcac645862037fb2107dbc9d1a56e17ffea52ef5903d98e6b6965809a3059e4ca28ae": "0x00000000000000000100000000000000005039278c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ec8ff27aee7d7d75d6d1a92a28a8fbed1c12b0d4a58e59124e863a171252a47939e4b7f3131534f9477c0020e04dfd1e": "0x000000000000000001000000000000000005f86327a126000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90ab77664074df629549456d2d4aa48aa6008e33bc9a4bdaab77646d558e761b89c230b18895abac7cbdfffab7d8c8c0b": "0x00000000000000000100000000000000f83c6053ce0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96976afe0a3bd7dc8cbf9f8d1b0736e42d9ec2b568b374698639ab5cc1d27185ba6072d7d9946d7687b66f455853e0cbf": "0x000000000000000001000000000000000020d57fb88a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9117383d021979ad280418d95a22c1948ce768bcccde89207f1faa091a64737f38ec7f5289c626f02ee0e08c6ffc82f31": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da935a3cf2bf9900156ea1b9dc674aebfd2ce8666dc129b94a35d229bbb7a0705fd3c45becba0c48ae613f62aacd989ac53": "0x00000000000000000100000000000000a3bf8616a50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fd124fcc0f8d4b66823dcb3094f1e527b888914128e67c37cf7903fee167729b047ebd90cc43644e2035bb5783fbeb0e": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da969c5808ec47014a42039dbc71e7fb334cec3fa975f14c3809843e6e957da270d9343a54faf102e76b8eb2557cb1dcb50": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a9c8a10930b3530468e15eef491c3c703045dae9fa332cee38b547781262ad43d2f15990fc6292987b310e45d52f9c26": "0x00000000000000000100000000000000e6f5d4bb815111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9db179a03073ce81839ebcc084ca304f8e6ce53e65b9f007c8d029f9f30a251796ceae2c75f5bbeac44cbafab368f3026": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b2e8c66ac2142aa0904126d091b45abdd2e9096aa5f5443d04328ff82645e1417fc059c3a42c33249c77bc90b90bc32d": "0x00000000000000000100000000000000fbc29601200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9963fad4a07f8ef582cefa64378ed40dd84f857efd82624575fdbe7324d7e5606f752fc309481dff3fd87a637fda4d52f": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da917b5742af7d8eb0fac4973c094a6df971c12ab611842f5353d6b1d8b6305c616da8b0771c2314a54a68d133ebb10db0e": "0x00000000000000000100000000000000d038665ef40900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c625a92e1efdcb13f831f866194e54eeaaea49d9f7fc6ded096e25f7edc7625a6da3099dff32f09c982cbd29d8e2c60d": "0x0000000000000000010000000000000094a6f02147a941000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90abdd46af59c8887317e380a47cbd1d4b6e00d7d8f2153fc9786fe9ca49f78dc98d841350fc9b4fb570f0cdee5b39b4b": "0x00000000000000000100000000000000d1f802eb848900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a41141d1a95b0034980cec95b03c010f2035b80029b0fcb36e379f950ea25db23c6982cbeaa2b85d4c10b607f3c80e16": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c68c26fdf661512be80ac86d733757035a31c356b4b44ca2b430ccff09579a49c53aa6417ce517ae1fd0f0e75c56c66d": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e3e68f6d1b46dec32f9f4156bccbdaeb48e32859bea5765c67ccaa91fc240e79f6518f011b40419dbf840a4425890e91": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94fc1a07a32234844136cf235d2f458b98c17017d6b3f092920f4bba2c93164e97ecc7ef6bd7222dd2dea09deab8e795c": "0x00000000000000000100000000000000009d9765ae0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e957854f15df5ed4f159039bb256ba4863b8dcb5da879d74110683b6664a27f1de8d2a7bf0eb5f786adb6e536a554ab7": "0x0000000000000000010000000000000000e05a6fc52f01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b9377c4ca130ad3a45d04abd172299a8e203e5a654af2e19d3cf14dc22b39a39ae9ce644f2f7501ba97893d3d8979a6f": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93c1c87caa5971a660732b59c48b8de0e16e1767e573a91debb5a434389eb148a6e92afca4f0357dcd2c3a03622392162": "0x000000000000000001000000000000002e6b64b5800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca6ddc7809c6da9bb6093ee22e0fda4ba8": "0x01000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9698b900fce34ff6fb82c3ff742f3ebe12215d54b5bb83d5a00a9024c6d890c315388baa07d5c467912d13e21883d5f0b": "0x0000000000000000010000000000000080d0a2498b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91af66332a63232a4f1d315a3f2e98a98e4c1578e463cc8b8279eb541afba76b25c70b5d00496e7b85c99d8084918476c": "0x000000000000000001000000000000000080384a1bf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d61c7ecb9116ab7a67f521128f83a09a8aa90965f097a007fb77e5ef73c789952a14dfa29408bc291e8738b6baea0a31": "0x0000000000000000010000000000000040b867154c2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9801f1c7f709d0f638501e1598e2e47be8af95d14c7a287e314165ea09b2a3160265af6589cd6091f6dabde5b00838712": "0x0000000000000000010000000000000090121b82467702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e76e2c805e5b15c5f2921f0512a4c6c8d0475ae07f26885750f484a135d1adbf4c1b9dae4462d3c1dfa8476395828134": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da935397881e4b71b5123ceed7aaf8479d8d8b60f0b7663f2e19aaaba2689f1026443c958adea07fff3d3b9289b5a9ad71f": "0x0000000000000000010000000000000033cf27b3021600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97992739ad4be550c954ba34551ef304c5a0bd4d0d5090efd798a645d93128bd521d7d334b27651e01d995517a0561d4f": "0x000000000000000001000000000000002785fccc0b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e23f33e54a06f9b170f61e30a604933b723c90938b396605278fd002d94e813745dab98feea0407f0d3db4411cc2063b": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9657a9a9302f7e6d7d963dcd0c017e06be803f351f82cd537d61f26176e73c5a90c5300f140e6ff9d6b9feb8639b1cc55": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99fac00021e23c1cdb49a8c8f5ad13791b841e0018ac8e4b232a8c72b94b460f2b02e6a89fd1745f44dbfde5120ee300c": "0x0000000000000000010000000000000000d37064f88623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c2f09f84cf83f5d65523e64833cbccc3bc1c9a973111261bb80380b018c5c8266b16cf3a2468231a007a02734a52c05e": "0x00000000000000000100000000000000df9bfc767b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9050f6acd63ce3a700c352a3cf2c1247ee423ae5e94bf4661b2837483a54f17e39d2c58d3f3ccd84308e31488eb47f903": "0x00000000000000000100000000000000c712e4ecca8a1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90eb1b679f5c88f0d36ce6d9b3d8566969c462176badf33a5d2ab4ac580ad85b6f0d67293bec9652672b18f76cd486c7f": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90251f8f74acf9c3a06f529c7416bcdad7259e9548313b894883751175c43f86aca93f08025b20cc759661070b9b0cc33": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9743989d4316589aa398f512ead509ee0a2e9637f390044b8c0276b148d23228fd12258ab5c80c29b21fbbfb1789f8f12": "0x00000000000000000100000000000000eb85f44e380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d5e6dd7a81f1359c6dba49a88ce32e6b4af38d0d310f497173337b6aa04b7d66d7b3c8e7242377ea310595eeae65705e": "0x00000000000000000100000000000000b3a69683778700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da909d87e482a8096b81129bcf4fe475b67c4e85759d2f2c494965f7c509a3450e1549dd45a76c0341f1c2541537b558155": "0x00000000000000000100000000000000bf9b30eb320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b9dd20982c9d66c9aee9b59b2241f5bd78323f726c9a4885463aa151199b48c0bb9dacb4c8c6a103158380d519e30d7b": "0x0000000000000000010000000000000000e4ede2155c2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x92972a1d208817aa0e44c51623d2d2f9878d434d6125b40443fe11fd292d13a4": "0x01000002", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91d2934d85b8a7aa744ce783d1b0d1d55e8efeb6fc336a893e510fe6d7bd68ecce030a3ebe0b9b1a007471c49a01b6448": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a344bbb6ec6fd137928090fd83d01852bc1e0f65c3de0fbc6304a1ae07fd343d6ebe131de3180cd95b451980c0a6a87d": "0x00000000000000000100000000000000c1b64887d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95109b5d4d207714aaee167f70b7a683554e47392d74f1484cfb98033929cb185f1178a775dbf22147c06d13e0fb3bb75": "0x00000000000000000100000000000000e94595bebaf700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92df1265c4c37f5d53421bc62e9dac46d04bdc8fa41dfdf1656299977a72be4dc77f7331eac4ad703275aa522504d335b": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94744cd00fa7a11df3fe339a26179f639e065f23e572eb645df808693a06fb8088503b04cf13937b7471b94ce79a92f0c": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ac516da6fac772b8783cc10b5737fd584bbbcfbfbe862a468285e180f9bb18b1cc99bb5faec5d1f6d83391662269518f": "0x0000000000000000010000000000000000700b23c87a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d30ccd9d071ab91f9d8b8e2a4a2925745f50679cb0e93320099b6d4b8980a45c34188436c82d494a65f6a0342598d4ff": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d27e9a4a13c0a782a3870bce6a5686d058a05e498706e545faf143bde305b75023ff0e6aa2b0c4b10a9703bfb8f1370b": "0x000000000000000001000000000000000074fc13fe8623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f5259bc3114edc1e529d4556e70bf958f4aea404632b4758bdea5733660c67e80efc4c4ef694041eee36221d81dfaa1b": "0x00000000000000000100000000000000c022fbfac91600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90b993d94d3fa677f527238c0e9cc51ab211e0b2973cfc520e89454a559ac7fc0ec0739347bdc5090b2e72c80ae99a56b": "0x0000000000000000010000000000000000508df5952701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9050458c07e675297f10bca68fb5a940c560c2d333cd535f9a1ab81f09e4a5adaaba9ed9740d61a0c3a980ec93ca7f526": "0x0000000000000000010000000000000000204aa9d10100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da972e5d591437b710da957ca3b66d0f458a23be2660b0e9c744e8835b3f1f6618c644fa88fa79ef17c1ebf8baf74ec23e4": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9be5b2de289ca83edde90d81bca48925ace8f2d6067c6743e451b924cf526454d10f47f738bd8421431b452b6b2235424": "0x0000000000000000010000000000000000001e3b061e08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e0c4e77df07edd96ef467d7df5b5061c50d0ec61cd03fbd533484c3e3cd7c869245918822c199146478fca74fea17313": "0x000000000000000001000000000000008cb26cd5b60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94787b9c1194982c65d3edede3a035a2b7863c453b4d7bcf8126c77126a4bc0f649e257a9fbd085fc26a1f596f50a911b": "0x000000000000000001000000000000005db45373008700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f1b962204da143ef48654c2aabe43acd44afefe7313f1a13bf530dcca1493f8e3d7a71324ba46a06be7cae226487ff13": "0x0000000000000000010000000000000080ea36924f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bd518fa8178c50a9b752b4621c49cdc07f5afc749783e2b4555a27cf0bc763fd8ac5bcfa045a915a299417e918285e01": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93d4f273de2503394f10908bfaa510edf1830c28267e4302bd613f4701905baa7f388e73c5f699a430499544a3b38f308": "0x000000000000000001000000000000007dc4fb8c350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ab787e23bec3e03ab97548b831347e1268da4966d21970c4e3ead70e270bb7f5037e706dd6b3270c44c8db7cb9129d53": "0x00000000000000000100000000000000c0e9a0d75d0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f9d9b8b0af1610dc7973a91d65713ebaa26db1dc2b9d995e1a28d57d985877088aae9734e37181ac1caca8e92b93d7b": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9436a5ce5e1a59dbf90f149db1b935f4012be664642a41a349d735c1bbc889e5d2f8663c770c09cde623a2600ed01e713": "0x0000000000000000010000000000000000406352bfc601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91fbad74a997415679602d986d162fd449c678e2a620b53cfde625ecdfe64c92eb57f514c8d5c9186b7e36183f760bb41": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da915acaa5c985b6a2a319534437dd3edb8f173d503bf9fcc2c0c95b81ccc1f3cd7ad637db082d5278fc20c89ba98394370": "0x0000000000000000010000000000000000b05b4c364400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da940e0a6d9f6bb6d5d551bc03c078dc761b2e39a6c4577b75dfe0c1cf3b41109db788d6b2c20174fe48baf397be3978831": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da920a5126081af324d5d9092a15fba830d3812568471e4fb58fa7e85896627665a7eaeffc73c142c416f51e1e8658b587b": "0x00000000000000000100000000000000b89cd195350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da922acc062f4af333cbc47af751047dd8392152b2d2c7d98e9c89ae2e76129819a4eb4876d51aafb0cf247d193ae32d555": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9986731e0ea8e7a93ff7f038ed6b59d295ceef3d503f809d9a72a5451db448f2816cf0fdb33e63d3851d978596d8d1859": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d0d1780ef11ffa2c0d852f38f5f1c8269acf1464429fb031e4454ba9522e86cc0178e0b20aabfef0a0ea1beb9ec0fb2b": "0x00000000000000000100000000000000ebbc43df559600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9264b138a144f1595618016132d0431ff82b7d98c181344e58cec76a166fc025ec724e4687912ae6169ede1e9fa0a3638": "0x000000000000000001000000000000004099ae6aba0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90db0548244fc7ca98a64f2fecc1d9f698c0ed1c8f07011db21e992c4db651f71798c478c056d18aa34e878db01f06ea7": "0x000000000000000001000000000000000060ae5d41d80b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c0b3fc4c2d7acb8e3d94777b7c9180e1e8ccf47f24323db6cb7e71672827e045cd6c5818efbd7caee980fba74d588451": "0x00000000000000000100000000000000008cc0fc011400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f2cdfb2b7c30c8d5cba64a0595de300b47b1adf408fe6fd6d68e0469eee89cead9f8cf9448c87298eb202e2644da52d9": "0x0000000000000000010000000000000000e006a1bb0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da954c413557ee6d73dc7175e1baf872fc680977e39f730089ad7ca24270863a8a08941484285f2ae9d1b2309c57c19a16c": "0x00000000000000000100000000000000c082f8e3530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96875957ed1fa111adb949f2da0b57d333653745128b57347a400820390bc68788ee8f802c8da002db2a313aeaac0734c": "0x00000000000000000100000000000000a8c84abb253423000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d992ba692109e2db99f3004c926cd975171494b8e7c9da402958e3c3e664d70c35338ec7e485b9b1e24284defeae23b1": "0x0000000000000000010000000000000000f4f76a8b0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d2ddddd28dd50218d723ef280f33b1f8aeccd897ec97d19386912dee3c481936b487e66675644e1b379909338da2242f": "0x00000000000000000100000000000000364a7f6ed88b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bd5364ee6fe574bb9e9d4e671c762f8b0c8220c20b57d955cd84344bcb97955704f70c88c037a2811b92ba8b81ceed18": "0x00000000000000000100000000000000493eb9a7b5aa13000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da996fb645ea479be1938308f26fb5a44cb0577f9c73bab6726db6051250bd1ad26c1665fbeb7aa41da34b978b20568635d": "0x000000000000000001000000000000006d1598699c2504000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9308aa5765665b767ada74bc5ba10aeb306f61466bf2172edbf21a3988a2c533c5c05b3fbd00827d97e18d7c41a453022": "0x000000000000000001000000000000004b413375d50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93e3cdbc7f6897b35e2b557d46a47142c74d0db9f870506ff7094e1561acd32beded25b3da24fac9d696f0f8284792702": "0x00000000000000000100000000000000b651c3b22a6801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94e6e562aa681253bc84813c4b75d70de6841cf85298dd314a52a1fc48d45c52f68e81741493dfb35ac392982ef9dbf1d": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x45323df7cc47150b3930e2666b0aa313878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0xcec5070d609dd3497f72bde07fc96ba0878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da924afe64d43ad204da1e19fe31b604064bb1d00a00311dcb04129f085c55e390705f1adcdc88a04fde3744185e13e9341": "0x0000000000000000010000000000000000b0100aa25e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c24f304e4a78d6680d4d065b31bd0812f24d8f0721ecc85399328ec7145d7ddfd0af5de1f8d4be978e8753dadf03c57d": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a9bfb5dd9ae1b2dae8bc7a4ce081b4278530e3382bd9c865764dc852df621a1c572a5fa45ca6615a6f23cd6a3e803e93": "0x00000000000000000100000000000000003033a7ef3c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97594cc156e22fc08e113040609a713cff0ec3f249468a8696ed5cc76f41d2c67f863b69c0f258b9e8a0465ebc0f60411": "0x0000000000000000010000000000000078014645ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98d571edf181a77f491c59eed4b07f4cc354cbc8d622dec47b084887533eb8a3059dd6afbe9ca400e29f95b1452b273fb": "0x0000000000000000010000000000000000a0c9a09e4002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da982bea1c5492ffa934e565e62fd38479aee78f2eb9a47ad917605ea1b9e2d905a2308d2c7dbb0ee6d81e61dad6227e96f": "0x00000000000000000100000000000000dbc66646e78a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ee2cbffd7f3fcd4ea4e673c553e31036ec83bfa378dedf21a308990f0a89e9f899967a428ef8b7354637e85af3fbc457": "0x000000000000000001000000000000000000e941cc6b01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b2ec4629856bea8e1a93b44b6741ab3d82614e7346152fd97aa1201330eb95fb998c4930257f3d7955e255fc8215db50": "0x000000000000000001000000000000000074fc13fe8623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da906f12c55d2e7bf58c4be78b27b9ae4b7e8d9af48c621b82fba7568933abc18c776d71809633514c5df7c0396f037dd0a": "0x000000000000000001000000000000002bd2fe9fbc0602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f40b6c97bba24a92e60852c1a5b59fd96ac96ce17dc19b2d36ff54fb716ffa8044909aa04f5da13d06c725dd6ffed76": "0x000000000000000001000000000000003027f137e86900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da978f99564831c81cba45d6d2c08d54f1ce2b2af5dc3e38882f200171743c9fceceabeec45769703947be22f3fec196d83": "0x00000000000000000100000000000000005039278c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94ac2cbdb144a2031397c308c119eb25c90439a6c801052a35f5b1fb132fcddcdf877cc953c6033e7d63f252574769b83": "0x000000000000000001000000000000000070388ec92002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9152ed6f9eb321e53e18f798c811d131e0ad790bfc0bb32b86488d151a3ffad8dcb0757a6c741db4f78112f4753d4cb00": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98b986ee2a622e5076d8ef03cd4c659a98a85bb3509bcfeb115644d6d337b35d6b1766f9ff088de5e84333ef9eb05884f": "0x0000000000000000010000000000000000fa80ec531700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da989698be2fb54b6a2338652f04cb028e76dbcb00ca2a94447f5c2320c165c2662a6a678232c4ebab4ba3f176e0207cc30": "0x0000000000000000010000000000000000c06e31d91001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99c5fa1368a6a16841790e8648e2a824cee6bf7d13cd690d5c3bfeea4c63fc5ab9ebde325b90c88b08a46cc3dc2d5747d": "0x00000000000000000100000000000000406242656b0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9300127f7d0c29c7f808861df8bf9f2517933e4300c94513e4e7561d367c8b23d342782405e2c863d3d2ea79a730dd133": "0x000000000000000001000000000000000060b7986c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a05d731603dd5628e9fbb9936c327afbbb53c21048b89dedd6ee9e8d5919bbf49be1dc71fb4e1f3ac02ec6c5a3fa0c38": "0x0000000000000000010000000000000000e0b6a4a4568a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97e72c426012f60b955fae9883193d6cf8ce2a3ca12d931c6c45affbbb6bfd7225c02d03736a74cd291b8cb936d38f602": "0x000000000000000001000000000000000060b7986c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c7542e73b39b60f034d91d61acdcc1b8f87250c38363e232cf6322028e069846c577c6b28e351ce6ae6ba87519f8d51f": "0x0000000000000000010000000000000061582a010f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c277a88d1f0ea81e1c2088a9347a065554a973e25cc0ff30db3430bd00cc4d2276fcb4b636c5ce89d6e3299688c424e7": "0x00000000000000000100000000000000004016ee5edc0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96bc69c2ea08438af3bafe008afab20295ad88d6b24b945d0a2caf843ebc8b44ee28eb6ae667817e7b734c080a656b544": "0x000000000000000001000000000000000010a5d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9cdcc121e45f1ffc58e356b6c60ef322a06e188c9d27fe0d32386fea816b28460591acbd60bda66f9d8817a25c2abcf2a": "0x00000000000000000100000000000000647ae8e7330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da987aec687803db3240cc11a9b23483fa64c078d009ee3ccfa86bd354cfcf7e4b36586347f4321f0c52e1534ff13a87302": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96ebed7e42a058d6a756ece7cfce2a43944b161455702030e39d7a8a0c9fc76980a987eed632fc5fb8a8f9c6d73eb2f01": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b74fc63174364bd9f1bf7d46070cc902786c7e7fda164df952d10001be5edd90963e5273c0dc871f03bc8d6467d41d4b": "0x0000000000000000010000000000000000a051e6e75c2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96d3e9580b7ea4f4a8d60a2f7d60dfc014aea2854a0478183cbc2256667ad346927faccc992f12783d025497216ea8610": "0x00000000000000000100000000000000407d6ddf230900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a0312f5fcb293c3b7997e759a2b16a6d3a881c39a92fd3be8716235a65038167be695f8ca2a0d2b4f9b104d937a32572": "0x00000000000000000100000000000000cbe94f03971e06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dd212eeb1306135bd8426360cab58c0408fb4dc5f92f65875841253a180755443d1883ca33a983aeb7b53113a1573e08": "0x00000000000000000100000000000000997a2d28440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94c9f9a4c2abdeab527b18ce5d0195380100830742709a2dcf96ecaadbff24c9417e4c20e16f7020c488167d7443fa23e": "0x000000000000000001000000000000007fbae41e970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9acfe5bb7e8967b92aa6b39bddffcef0346c7d281f67ebd91235d0eba00ed55e20f8da87daab5d729fc95e3a7baf99b34": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a8429bbcd5b55bf2c906d459ff2d98e6eacdf8b02787b4c74a5c92df7d1a1922f6469e73d33403e1dae9b1be8bf31949": "0x00000000000000000100000000000000008053ee7ba80a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92cfa58887a9757241667b603108241e524cc8492881b0065495fb9fa6a27d9094e13f7ac5eba1debfb3742b4a421127d": "0x0000000000000000010000000000000040f8cb6e000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a9572583afa25d7daeaebf4b3e5f2b25d079acfccee3dd5e078d8a05e5784deea5d785a72b18fcc1d27ea4be78206c00": "0x0000000000000000010000000000000000a05c94299f28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f79b2dc1fc8f3d19562a67845f91ba3c5e85a3c62df556db745880d405380a7f4d32ffcb1b99324ae056f6e04a1e2a52": "0x0000000000000000010000000000000000406def9a8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x04d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92982f9dbe3b322d02f7a7b6dcf025927541126eebdac5db5bdbabd371d6569c9d5a9f7a386e0ba064ca4bc322f8e50c4": "0x000000000000000001000000000000000010b579bde900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b5cf107384fa612114d2fa1c5425631cec69a59bfb782ba13fab71cabd0e0e50abacca44f3d806e95d76e3134ba7144f": "0x00000000000000000100000000000000180ccd1cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d3b7b9c65658e58b9a145269960746f542d6d5db669c0a3a3cd5db69a66150838bd66069760cbf9c09b342a0d0115a09": "0x00000000000000000100000000000000638ab920730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b496ca294f33a5a718afdf0232a044ab3e6dc37f62ac77a47b77979ecf386faed95939fc127b5275237e7ce9c9e0ee5f": "0x00000000000000000100000000000000406debfb510500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92475666762c346a6d66d98dc611d14326ece2234ae3b257f7fcae73e79097212c2ff0ca149fbc9a6c7f9396e2be2e871": "0x00000000000000000100000000000000155347e7924c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9396c6b6168a947da18aa52025f600b44d6a200e6a1ab5d060f7bf6010b81d1c18a96ea9422238a272df0e58abfbd7c03": "0x0000000000000000010000000000000000b078568c363b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da961b27ba85bdc1c17b07ac9c7da8372d4d643a98cac26afd4fea4b3c0499b57e8159ce01a33cb06f9c23a4966c6845a3f": "0x0000000000000000010000000000000000b0708a32ee24000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96d4521b84bdf5de705b786fe83c42d2ad6dc0558c46ad01b7d6bbcf3a337dbdca45f32dbb5e229706edc263be8fea628": "0x00000000000000000100000000000000c066a18f160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ed60b064bde51ddef2164e6889add2e7e01f6db35d6363ff0535d7e614daa6af26a46a7301e92520bcd52b3e4a02551a": "0x00000000000000000100000000000000bc49c71e620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3a2d6c9353500637d8f8e3e0fa0bb1c5878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c4eabcacb14579c96366f02d2ff0f9ca58cdc7ef880c80e8475170f206381d2cb13a87c209452fc6d8a1e14186d61b28": "0x00000000000000000100000000000000dddaa44a1f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9096ff14325972217275a343126ac3ec68a16f3443f7552faf25ebeedeca78dd7381143b379f170aec030afb37b1b4a1c": "0x00000000000000000100000000000000d9f4dcaba70300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94faba016dba25e6e264b8b89e56650b86ca2b0ea99ccde8a2ed02a766335ca44241692756b2a6b643ec5bcbf0232d771": "0x00000000000000000100000000000000aa35ee2fc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a4804852978f4ac937371e9c424ac1447edcf01eebd209e90f562bb494be2b402aad397e8bae7f0752a4435ac20eda38": "0x00000000000000000100000000000000808f6770d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da953010bae5d6d94880fd92af4ee4a0e4b521291263fc1e1b9e644c819458684329bf3a18877598d8857721c3f85972c07": "0x0000000000000000010000000000000040f36d7e180900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98203369dfec8c70a6578777d956be890aff89a835cb0058815e4970d0821371ab2f7c9aae82d5a8a9115c5351824a389": "0x0000000000000000010000000000000000901ec4bc1600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bd86e779a7515526be43bc812551610bea840179d49aa2bad3ae605cb23648502a06b3a2dc7e7af396e5d7b83be1125c": "0x00000000000000000100000000000000b37e81c12cc003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da906d34dd7cec01232e5b97d5baf0c6f289eb36bb8b33dba49cad979c9b1a0686231a3368908b383ff3d71874c453e3cdc": "0x00000000000000000100000000000000001092fce1900c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9936e63a60d6c357e5e4f717b0a6137af34016102bd97dd492b15d8c229005c3a6e9740d98092abc4d7ff306083e88f38": "0x00000000000000000100000000000000c4f84967b20200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c9b2f382f6e7537ea1c671f9baa6ff40d8a05ce79915350c3b9876bf917d50110e187ef383bd1a2b6f9b5985a6c82a69": "0x00000000000000000100000000000000604018afae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95df80c023308aefc8a662ce7bb695f7ae2765e6d3e5e4e118664099f194023b050d609fdd7bf2b9aef381e4189a92f6d": "0x000000000000000001000000000000002c911f71a64700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f67fa79e51a2a02a8d99e907503a99d5048225d9c37dede81c3768b0e79b34c88a9ad781047f3b6e091a86581d795d60": "0x000000000000000001000000000000000020886ca22d1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92917d57de57f0d1b8cb06c5575baf6fe721920bfb9c204b7f307cd6d5c17d7c13834edcc38cf93b5627821700f58da77": "0x00000000000000000100000000000000405e275d000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9686550b6976b1fa397073bf3598d41831c12b2904dd0c8f60555db51bb515641549ee074fdd37b987a7381adbad4aa5c": "0x0000000000000000010000000000000014a7c2fba20004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9544a79c052f796b4a0d8f98ff6d8ec64de85a8cf537f0ce61f0d05be62e775855b513c9a92b2d2d0e2acf4e4d622bc31": "0x0000000000000000010000000000000087600d21290200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da967142e09e9ab7ec230593c992053b67c48bfa93de807d60ea916c200516097a4100d57b60d25646b356e04c72e2a8109": "0x00000000000000000100000000000000c5d8e4e5eabf01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90ae1b0137a7e0d2b6cb1decf7ba43eec66b538d3ef6326981d88dd2928fd34f8f9d0a086b8cfa1bbe34e4af279c8205c": "0x0000000000000000010000000000000063e18c004e6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9429c3126e41064284abf7a29984314967279a8a94d51ff3f3dcc276ec7b0ae2ea8cfedc76f2be01a145bacf912342f34": "0x00000000000000000100000000000000009d9765ae0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9aa591815c8e38341020007f70d40efe5fa8153c3222bd8595ee3bab0d7d31d7412231db3e60dfaeafa9fcac29bd20e63": "0x0000000000000000010000000000000040b9f8138c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95c76985e785c7a3edf5507849330bbc3787dcae0fec7c8d2cb7a1392508ec057ee4e3820751bcc929d475a18909c200c": "0x000000000000000001000000000000005ab31c39690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9897ec3429354d468156811ff9da98541ba029fcdcef3ab7124425964b884692b22330b5c93ec0610e2f627153af06b4d": "0x000000000000000001000000000000005aebf2d18b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da934194f09b4b5ec8a165a1971c6ff360476c202f46721822567d5ee0c6e8de0fdc087967a4248446d504cc71db29d613f": "0x00000000000000000100000000000000804200a4890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da951d4518daceaeddcd11de0438ac14338a25bc97793ed591b6513d94eb8cf40740585556a510fc7aaec00796257386d43": "0x00000000000000000100000000000000665bb5b4e10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fa8ab46d5e04684b7848902f97b7ee1e94021b1cc63f95fd902f615e95f3753b1b164290a962a85baaeb66fcdde45f73": "0x0000000000000000010000000000000048f33ec42a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94e0097d3270e8e2ec9ad7964f291cbe4a802442eb0d4a2347f3fc9b902028968b3cd20fc4869e0f16b48ad8ef4f0940b": "0x00000000000000000100000000000000e4d30017611000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x04d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ea17dcbd32353acfe837be33ba8af3087e3fb405d6108539101cad00859c773e3ce7d37fcfd1d9a75c1f48689bc1371e": "0x00000000000000000100000000000000ff1c9b56a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91d5fe1715b68004a9582c1432c40b7271c12a63834fe8d80c90b27098bd5853e693dc34a5c9d8195aa495aacb4b0d171": "0x00000000000000000100000000000000f1f92470be7d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da939b60a225b1917c31834790a1fde7136e87b7f1d7819dc298615bab33307472d3b215a80ba89357de818a76a09a2af3c": "0x000000000000000001000000000000005808a1c3afb969000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e26789f7d4459059b4a52dc8f51d59e580392d0a35c3bb81ecae8fc62fc85eca72fc8baff3d5b9c1de0d0d0ba6f9cd6c": "0x00000000000000000100000000000000e6191339ef8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9911ad9c8c7e624972e8dd49aed5d6e5f7865cac8de493773cc2a8e196ecbe55efd597c3df89ecb36eadafc9e77d1c429": "0x00000000000000000100000000000000009d9765ae0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - }, - "childrenDefault": {} - } - } -} diff --git a/bin/node/service/src/chain_spec.rs b/bin/node/service/src/chain_spec.rs index 48a3b481c..a5d6f2a47 100644 --- a/bin/node/service/src/chain_spec.rs +++ b/bin/node/service/src/chain_spec.rs @@ -43,9 +43,6 @@ pub enum RobonomicsFamily { /// Robonomics Main Network #[cfg(feature = "kusama")] Main, - /// IPCI Network - #[cfg(feature = "ipci")] - Ipci, } /// Robonomics family chains idetify. @@ -67,11 +64,6 @@ impl RobonomicsChain for Box { return RobonomicsFamily::Development; } - #[cfg(feature = "ipci")] - if self.id() == "ipci" { - return RobonomicsFamily::Ipci; - } - #[cfg(feature = "kusama")] if self.id() == "robonomics" { return RobonomicsFamily::Main; diff --git a/bin/node/service/src/command.rs b/bin/node/service/src/command.rs index 66a116f16..797950c7e 100644 --- a/bin/node/service/src/command.rs +++ b/bin/node/service/src/command.rs @@ -79,8 +79,6 @@ impl SubstrateCli for Cli { RobonomicsFamily::Alpha => &alpha_runtime::VERSION, #[cfg(feature = "kusama")] RobonomicsFamily::Main => &main_runtime::VERSION, - #[cfg(feature = "ipci")] - RobonomicsFamily::Ipci => &ipci_runtime::VERSION, } } @@ -161,30 +159,6 @@ pub fn run() -> sc_cli::Result<()> { ) .await }), - - #[cfg(feature = "ipci")] - RobonomicsFamily::Ipci => runner.run_node_until_exit(|config| async move { - if matches!(config.role, sc_cli::Role::Light) { - return Err("Light client not supported!".into()); - } - - let params = parachain::command::parse_args( - config, - &cli.relaychain_args, - cli.parachain_id, - cli.lighthouse_account, - )?; - - parachain::ipci::start_node( - params.0, - params.1, - collator_options, - params.2, - params.3, - heartbeat_interval, - ) - .await - }), } .map_err(Into::into) } diff --git a/bin/node/service/src/parachain.rs b/bin/node/service/src/parachain.rs index beca21c61..50ea30e47 100644 --- a/bin/node/service/src/parachain.rs +++ b/bin/node/service/src/parachain.rs @@ -29,7 +29,6 @@ pub fn load_spec( ) -> Result, String> { Ok(match id { "" => Box::new(chain_spec::get_main_chain_spec()), - "ipci" => Box::new(chain_spec::get_ipci_chain_spec()), "alpha-local" => Box::new(chain_spec::get_alpha_chain_spec(para_id)), // Load Alpha chain spec by default path => Box::new(chain_spec::AlphaChainSpec::from_json_file(path.into())?), @@ -129,45 +128,3 @@ pub mod main { .await } } - -/// IPCI Network parachain. -#[cfg(feature = "ipci")] -pub mod ipci { - pub use ipci_runtime::RuntimeApi; - use robonomics_primitives::AccountId; - - pub struct IPCIExecutor; - impl sc_executor::NativeExecutionDispatch for IPCIExecutor { - type ExtendHostFunctions = (); - - fn dispatch(method: &str, data: &[u8]) -> Option> { - ipci_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - ipci_runtime::native_version() - } - } - - /// Start a normal parachain node. - pub async fn start_node( - parachain_config: sc_service::Configuration, - polkadot_config: sc_service::Configuration, - collator_options: cumulus_client_cli::CollatorOptions, - para_id: cumulus_primitives_core::ParaId, - lighthouse_account: Option, - heartbeat_interval: u64, - ) -> sc_service::error::Result { - super::service::start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - para_id, - lighthouse_account, - super::service::build_pos_import_queue, - super::service::build_pos_consensus, - heartbeat_interval, - ) - .await - } -} diff --git a/bin/node/service/src/parachain/chain_spec.rs b/bin/node/service/src/parachain/chain_spec.rs index 1c877a983..dcf0bca14 100644 --- a/bin/node/service/src/parachain/chain_spec.rs +++ b/bin/node/service/src/parachain/chain_spec.rs @@ -90,15 +90,6 @@ pub fn get_main_chain_spec() -> MainChainSpec { kusama_parachain_config() } -/// Specialized `IpciChainSpec`. -#[cfg(feature = "ipci")] -pub type IpciChainSpec = sc_service::GenericChainSpec; - -#[cfg(feature = "ipci")] -pub fn get_ipci_chain_spec() -> IpciChainSpec { - ipci_parachain_config() -} - fn test_chain_spec(id: ParaId) -> AlphaChainSpec { let balances = vec![ get_account_id_from_seed::("Alice"), @@ -214,61 +205,6 @@ fn mk_genesis_main( } } -fn ipci_session_keys( - aura: ipci_runtime::AuraId, - im_online: ipci_runtime::ImOnlineId, -) -> ipci_runtime::SessionKeys { - ipci_runtime::SessionKeys { aura, im_online } -} - -/// Helper function to create GenesisConfig for ipci parachain -fn mk_genesis_ipci( - balances: Vec<(AccountId, Balance)>, - sudo_key: AccountId, - parachain_id: ParaId, -) -> ipci_runtime::GenesisConfig { - use crate::chain_spec::get_from_seed; - - ipci_runtime::GenesisConfig { - system: ipci_runtime::SystemConfig { - code: ipci_runtime::wasm_binary_unwrap().to_vec(), - }, - balances: ipci_runtime::BalancesConfig { balances }, - parachain_info: ipci_runtime::ParachainInfoConfig { parachain_id }, - session: ipci_runtime::SessionConfig { - keys: vec![( - sudo_key.clone(), - sudo_key.clone(), - ipci_session_keys( - get_from_seed::("Alice"), - get_from_seed::("Alice"), - ), - )], - }, - aura: Default::default(), - aura_ext: Default::default(), - im_online: Default::default(), - staking: ipci_runtime::StakingConfig { - validator_count: 10, - minimum_validator_count: 1, - stakers: vec![( - sudo_key.clone(), - sudo_key.clone(), - 100 * ipci_runtime::constants::currency::MITO, - ipci_runtime::StakerStatus::Validator, - )], - invulnerables: vec![], - force_era: pallet_staking::Forcing::ForceNone, - slash_reward_fraction: sp_runtime::Perbill::from_percent(10), - ..Default::default() - }, - technical_committee: Default::default(), - technical_membership: Default::default(), - treasury: Default::default(), - sudo: ipci_runtime::SudoConfig { key: sudo_key }, - } -} - /// Mars parachain genesis. fn mars_parachain_genesis() -> alpha_runtime::GenesisConfig { use alpha_runtime::constants::currency; @@ -336,45 +272,6 @@ pub fn kusama_parachain_config() -> MainChainSpec { }, ) } - -/// Ipci parachain genesis. -fn ipci_parachain_genesis() -> ipci_runtime::GenesisConfig { - use ipci_runtime::constants::currency; - use sp_runtime::traits::AccountIdConversion; - use hex_literal::hex; - - // akru - let sudo_key: AccountId = - hex!["16eb796bee0c857db3d646ee7070252707aec0c7d82b2eda856632f6a2306a58"].into(); - - let mut balances = currency::STAKE_HOLDERS.clone(); - let total: Balance = balances.iter().map(|(_, x)| *x).sum(); - // Store in treasury align of 10M MITO - balances.extend(vec![( - frame_support::PalletId(*b"py/trsry").into_account(), - 10_000_000 * currency::MITO - total - )]); - mk_genesis_ipci(balances.to_vec(), sudo_key, IPCI_ID.into()) -} - -/// Kusama parachain config. -pub fn ipci_parachain_config() -> IpciChainSpec { - let boot_nodes = vec![]; - IpciChainSpec::from_genesis( - "IPCI", - "ipci", - ChainType::Live, - ipci_parachain_genesis, - boot_nodes, - None, - Some(IPCI_PROTOCOL_ID), - None, - Extensions { - relay_chain: "rococo_local_testnet".into(), - para_id: IPCI_ID.into(), - }, - ) -} */ /// Mercury parachain confing. @@ -397,9 +294,3 @@ pub fn uranus_parachain_config() -> AlphaChainSpec { pub fn kusama_parachain_config() -> MainChainSpec { MainChainSpec::from_json_bytes(&include_bytes!("../../res/robonomics.raw.json")[..]).unwrap() } - -/// IPCI parachain confing. -#[cfg(feature = "ipci")] -pub fn ipci_parachain_config() -> IpciChainSpec { - IpciChainSpec::from_json_bytes(&include_bytes!("../../res/ipci.raw.json")[..]).unwrap() -} diff --git a/bin/node/service/src/parachain/command.rs b/bin/node/service/src/parachain/command.rs index 5ae49965c..6c75063e7 100644 --- a/bin/node/service/src/parachain/command.rs +++ b/bin/node/service/src/parachain/command.rs @@ -19,7 +19,6 @@ use codec::Encode; use cumulus_primitives_core::ParaId; use log::info; -use polkadot_parachain::primitives::AccountIdConversion; use robonomics_primitives::AccountId; use sc_cli::{ ChainSpec, CliConfiguration, DefaultConfigurationValues, ImportParams, KeystoreParams, @@ -29,6 +28,7 @@ use sc_service::config::{BasePath, Configuration, PrometheusConfig}; use sp_api::BlockT; use sp_core::crypto::Ss58Codec; use sp_core::hexdisplay::HexDisplay; +use sp_runtime::traits::AccountIdConversion; use std::net::SocketAddr; /// Parse collator arguments and returns full node configuration. @@ -60,7 +60,9 @@ pub fn parse_args( .map_err(|e| format!("{:?}", e))?; let genesis_state = format!("0x{:?}", HexDisplay::from(&block.header().encode())); let parachain_account = - AccountIdConversion::::into_account(¶chain_id); + AccountIdConversion::::into_account_truncating( + ¶chain_id, + ); info!("[Parachain] ID: {}", parachain_id); info!("[Parachain] Account: {}", parachain_account); diff --git a/bin/node/service/src/parachain/service.rs b/bin/node/service/src/parachain/service.rs index 940ab9eb9..3bc2287d2 100644 --- a/bin/node/service/src/parachain/service.rs +++ b/bin/node/service/src/parachain/service.rs @@ -19,7 +19,6 @@ use codec::Encode; use cumulus_client_cli::CollatorOptions; -use cumulus_client_consensus_aura::{AuraConsensus, BuildAuraConsensusParams, SlotProportion}; use cumulus_client_consensus_common::ParachainConsensus; use cumulus_client_consensus_relay_chain::{ build_relay_chain_consensus, BuildRelayChainConsensusParams, @@ -35,13 +34,11 @@ use cumulus_relay_chain_rpc_interface::RelayChainRPCInterface; use hex_literal::hex; use polkadot_service::CollatorPair; use robonomics_primitives::{AccountId, Balance, Block, Hash, Index}; -use robonomics_protocol::pubsub::gossipsub::PubSub; -use sc_client_api::ExecutorProvider; +//use robonomics_protocol::pubsub::gossipsub::PubSub; pub use sc_executor::NativeElseWasmExecutor; use sc_network::NetworkService; use sc_service::{Configuration, Role, TFullBackend, TFullClient, TaskManager}; use sc_telemetry::{TelemetryHandle, TelemetryWorkerHandle}; -use sp_consensus_aura::{sr25519::AuthorityId as AuraId, AuraApi}; use sp_keystore::SyncCryptoStorePtr; use sp_runtime::traits::BlakeTwo256; use sp_trie::PrefixedMemoryDB; @@ -69,6 +66,7 @@ async fn build_relay_chain_interface( parachain_config, telemetry_worker_handle, task_manager, + None, ), } } @@ -194,11 +192,11 @@ pub async fn start_node_impl( parachain_config: Configuration, polkadot_config: Configuration, collator_options: CollatorOptions, - id: polkadot_primitives::v0::Id, + id: polkadot_primitives::v2::Id, lighthouse_account: Option, build_import_queue: BIQ, build_consensus: BIC, - heartbeat_interval: u64, + _heartbeat_interval: u64, ) -> sc_service::error::Result where Executor: sc_executor::NativeExecutionDispatch + 'static, @@ -233,7 +231,7 @@ where sc_service::Error, >, BIC: FnOnce( - polkadot_primitives::v0::Id, + polkadot_primitives::v2::Id, Option, Arc>>, Option<&Registry>, @@ -298,19 +296,22 @@ where let rpc_client = client.clone(); let rpc_pool = transaction_pool.clone(); + + /* let (pubsub, pubsub_worker) = PubSub::new(Duration::from_millis(heartbeat_interval)).expect("New PubSub"); task_manager .spawn_handle() .spawn("pubsub_parachain", None, pubsub_worker); + */ sc_service::spawn_tasks(sc_service::SpawnTasksParams { - rpc_extensions_builder: Box::new(move |deny_unsafe, _| { + rpc_builder: Box::new(move |deny_unsafe, _| { let deps = robonomics_rpc::FullDeps { client: rpc_client.clone(), pool: rpc_pool.clone(), deny_unsafe, - pubsub: pubsub.clone(), + //pubsub: pubsub.clone(), }; robonomics_rpc::create_full(deps).map_err(Into::into) @@ -384,71 +385,6 @@ where Ok(task_manager) } -/// Build the import queue for the PoS parachain runtime. -pub fn build_pos_import_queue( - client: Arc>>, - config: &Configuration, - telemetry: Option, - task_manager: &TaskManager, -) -> Result< - sc_consensus::DefaultImportQueue< - Block, - TFullClient>, - >, - sc_service::Error, -> -where - Executor: sc_executor::NativeExecutionDispatch + 'static, - RuntimeApi: sp_api::ConstructRuntimeApi< - Block, - TFullClient>, - > + 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 - + AuraApi, - sc_client_api::StateBackendFor, Block>: sp_api::StateBackend, -{ - 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(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *time, - slot_duration, - ); - - 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, - }) - .map_err(Into::into) -} - /// Build the import queue for the open consensus parachain runtime. pub fn build_open_import_queue( client: Arc>>, @@ -497,7 +433,7 @@ where /// Build the open set consensus. pub fn build_open_consensus( - para_id: polkadot_primitives::v0::Id, + para_id: polkadot_primitives::v2::Id, lighthouse_account: Option, client: Arc>>, prometheus_registry: Option<&Registry>, @@ -577,104 +513,3 @@ where Ok(consensus) } - -/// Build the PoS consensus. -pub fn build_pos_consensus( - para_id: polkadot_primitives::v0::Id, - _lighthouse_account: Option, - client: Arc>>, - prometheus_registry: Option<&Registry>, - telemetry: Option, - task_manager: &TaskManager, - relay_chain_interface: Arc, - transaction_pool: Arc< - sc_transaction_pool::FullPool< - Block, - TFullClient>, - >, - >, - sync_oracle: Arc>, - keystore: SyncCryptoStorePtr, - force_authoring: bool, -) -> Result>, sc_service::Error> -where - Executor: sc_executor::NativeExecutionDispatch + 'static, - RuntimeApi: sp_api::ConstructRuntimeApi< - Block, - TFullClient>, - > + 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 - + AuraApi, - sc_client_api::StateBackendFor, Block>: sp_api::StateBackend, -{ - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client).unwrap(); - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - - let consensus = AuraConsensus::build::< - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - _, - _, - >(BuildAuraConsensusParams { - proposer_factory, - create_inherent_data_providers: move |_, (relay_parent, validation_data)| { - let relay_chain_for_aura = relay_chain_interface.clone(); - async move { - let parachain_inherent = - cumulus_primitives_parachain_inherent::ParachainInherentData::create_at( - relay_parent, - &relay_chain_for_aura, - &validation_data, - para_id, - ) - .await; - let time = sp_timestamp::InherentDataProvider::from_system_time(); - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *time, - slot_duration, - ); - - let parachain_inherent = parachain_inherent.ok_or_else(|| { - Box::::from( - "Failed to create parachain inherent", - ) - })?; - Ok((time, slot, parachain_inherent)) - } - }, - block_import: client.clone(), - para_client: client.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), - max_block_proposal_slot_portion: None, - telemetry, - }); - - Ok(consensus) -} diff --git a/bin/node/service/src/service.rs b/bin/node/service/src/service.rs index b3a3381a0..27a171fbc 100644 --- a/bin/node/service/src/service.rs +++ b/bin/node/service/src/service.rs @@ -18,7 +18,6 @@ //! Service and ServiceFactory implementation. Specialized wrapper over Substrate service. use robonomics_primitives::{AccountId, Balance, Block, Index}; -use robonomics_protocol::pubsub::gossipsub::PubSub; use sc_client_api::{BlockBackend, ExecutorProvider}; use sc_consensus_aura::{ImportQueueParams, SlotProportion, StartAuraParams}; pub use sc_executor::NativeElseWasmExecutor; @@ -28,7 +27,7 @@ use sc_service::{config::Configuration, error::Error as ServiceError, TaskManage use sp_api::ConstructRuntimeApi; use sp_consensus_aura::sr25519::{AuthorityId as AuraId, AuthorityPair as AuraPair}; use sp_runtime::traits::{BlakeTwo256, Block as BlockT}; -use std::{sync::Arc, time::Duration}; +use std::sync::Arc; type FullClient = sc_service::TFullClient>; @@ -72,7 +71,7 @@ where pub fn new_partial( config: &Configuration, - heartbeat_interval: u64, + _heartbeat_interval: u64, ) -> Result< sc_service::PartialComponents< FullClient, @@ -84,7 +83,7 @@ pub fn new_partial( impl Fn( robonomics_rpc::DenyUnsafe, sc_rpc::SubscriptionTaskExecutor, - ) -> Result, + ) -> Result, sc_service::Error>, FullGrandpaBlockImport, grandpa::LinkHalf, FullSelectChain>, Option, @@ -175,11 +174,13 @@ where }, )?; + /* let (pubsub, pubsub_worker) = PubSub::new(Duration::from_millis(heartbeat_interval)).expect("New PubSub"); task_manager .spawn_handle() .spawn("pubsub_service", None, pubsub_worker); + */ let rpc_extensions_builder = { let client = client.clone(); @@ -190,7 +191,7 @@ where client: client.clone(), pool: pool.clone(), deny_unsafe, - pubsub: pubsub.clone(), + //pubsub: pubsub.clone(), }; robonomics_rpc::create_full(deps).map_err(Into::into) @@ -241,7 +242,7 @@ where keystore_container, select_chain, transaction_pool, - other: (rpc_extensions_builder, block_import, grandpa_link, mut telemetry), + other: (rpc_builder, block_import, grandpa_link, mut telemetry), } = new_partial(&config, heartbeat_interval)?; let warp_sync = Arc::new(grandpa::warp_proof::NetworkProvider::new( @@ -295,11 +296,11 @@ where sc_service::spawn_tasks(sc_service::SpawnTasksParams { config, + rpc_builder: Box::new(rpc_builder), backend: backend.clone(), client: client.clone(), keystore: keystore_container.sync_keystore(), network: network.clone(), - rpc_extensions_builder: Box::new(rpc_extensions_builder), transaction_pool: transaction_pool.clone(), task_manager: &mut task_manager, system_rpc_tx, diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 1410202cf..c7b231ad9 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -3,7 +3,7 @@ name = "robonomics-cli" description = "Robonomics Framework console line interfaces." version = "0.9.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" [dependencies] robonomics-protocol = { path = "../protocol" } @@ -14,7 +14,7 @@ futures = "0.3.8" serde_json = "1.0.68" async-std = "1.9" bincode = "1.3" -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } log = "0.4.11" hex = "0.4.2" csv = "1.1.5" diff --git a/frame/datalog/Cargo.toml b/frame/datalog/Cargo.toml index 980338a2c..5281f3ce2 100644 --- a/frame/datalog/Cargo.toml +++ b/frame/datalog/Cargo.toml @@ -3,23 +3,23 @@ name = "pallet-robonomics-datalog" description = "Robonomics Network data logging Substrate runtime module" version = "1.2.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" [dependencies] scale-info = { version = "2.0", default-features = false, features = ["derive"] } serde = { version = "1.0.130", optional = true } codec = { package = "parity-scale-codec", version = "3.0", default-features = false, features = ["derive"] } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false, optional = true } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false, optional = true } [dev-dependencies] base58 = "0.1.0" -sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } [features] default = ["std"] diff --git a/frame/digital-twin/Cargo.toml b/frame/digital-twin/Cargo.toml index 53107726d..2b27ceb0c 100644 --- a/frame/digital-twin/Cargo.toml +++ b/frame/digital-twin/Cargo.toml @@ -3,20 +3,20 @@ name = "pallet-robonomics-digital-twin" description = "Robonomics Network digital twin runtime module" version = "0.3.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" [dependencies] serde = { version = "1.0.130", optional = true } codec = { package = "parity-scale-codec", version = "3.0", default-features = false, features = ["derive"] } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } scale-info = { version = "2.0", default-features = false, features = ["derive"] } [dev-dependencies] -sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } [features] default = ["std"] diff --git a/frame/launch/Cargo.toml b/frame/launch/Cargo.toml index b2feceeb1..1c43c1177 100644 --- a/frame/launch/Cargo.toml +++ b/frame/launch/Cargo.toml @@ -3,21 +3,21 @@ name = "pallet-robonomics-launch" description = "Robonomics Network robot launch Substrate runtime module" version = "0.5.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" [dependencies] scale-info = { version = "2.0", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0", default-features = false, features = ["derive"] } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false, optional = true } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false, optional = true } bs58 = "0.4.0" [dev-dependencies] -sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } [features] default = ["std"] diff --git a/frame/liability/Cargo.toml b/frame/liability/Cargo.toml index a3b06c6d6..c42f92d6b 100644 --- a/frame/liability/Cargo.toml +++ b/frame/liability/Cargo.toml @@ -1,26 +1,26 @@ [package] name = "pallet-robonomics-liability" description = "Robonomics Network Robot Liability Substrate runtime module" -version = "0.8.0" +version = "0.9.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" [dependencies] serde = { version = "1.0.130", optional = true } scale-info = { version = "2.0", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0", default-features = false, features = ["derive"] } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } [dev-dependencies] hex-literal = "0.2" -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } [features] default = ["std"] diff --git a/frame/liability/src/lib.rs b/frame/liability/src/lib.rs index 978d28aea..8e23e825d 100644 --- a/frame/liability/src/lib.rs +++ b/frame/liability/src/lib.rs @@ -86,9 +86,15 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn latest_index)] - /// Latest liability index. + /// [DEPRECATED] Latest liability index. + /// TODO: remove after mainnet upgrade pub(super) type LatestIndex = StorageValue<_, T::Index>; + #[pallet::storage] + #[pallet::getter(fn next_index)] + /// Next liability index. + pub(super) type NextIndex = StorageValue<_, T::Index>; + #[pallet::storage] #[pallet::getter(fn agreement_of)] /// Technical and economical parameters of liability. @@ -100,7 +106,17 @@ pub mod pallet { pub(super) type ReportOf = StorageMap<_, Twox64Concat, T::Index, ReportFor>; #[pallet::hooks] - impl Hooks> for Pallet {} + impl Hooks> for Pallet { + // TODO: remove after mainnet upgrade + fn on_runtime_upgrade() -> Weight { + if >::get().is_none() { + if let Some(index) = >::take() { + >::put(index) + } + } + 1 + } + } #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] @@ -120,13 +136,13 @@ pub mod pallet { agreement.on_start()?; // Store agreement on storage - let latest_index = >::get().unwrap_or(Default::default()); - >::insert(latest_index, agreement.clone()); - >::put(latest_index + 1u32.into()); + let next_index = >::get().unwrap_or(Default::default()); + >::insert(next_index, agreement.clone()); + >::put(next_index + 1u32.into()); // Emit event Self::deposit_event(Event::NewLiability( - latest_index, + next_index, agreement.technical(), agreement.economical(), agreement.promisee(), @@ -309,7 +325,7 @@ mod tests { #[test] fn test_initial_setup() { new_test_ext().execute_with(|| { - assert_eq!(Liability::latest_index(), None); + assert_eq!(Liability::next_index(), None); }); } @@ -369,7 +385,7 @@ mod tests { #[test] fn test_liability_lifecycle() { new_test_ext().execute_with(|| { - assert_eq!(Liability::latest_index(), None); + assert_eq!(Liability::next_index(), None); let technics = IPFS { hash: IPFS_HASH.into(), @@ -398,7 +414,7 @@ mod tests { ), Error::::BadAgreementProof, ); - assert_eq!(Liability::latest_index(), None); + assert_eq!(Liability::next_index(), None); assert_eq!(System::account(&alice).data.free, 100 * XRT); assert_eq!(System::account(&bob).data.free, 100 * XRT); @@ -410,7 +426,7 @@ mod tests { Origin::signed(agreement.promisor.clone()), agreement.clone() ),); - assert_eq!(Liability::latest_index(), Some(1)); + assert_eq!(Liability::next_index(), Some(1)); assert_eq!(Liability::report_of(0), None); assert_eq!(Liability::agreement_of(0), Some(agreement)); assert_eq!(System::account(&alice).data.free, 90 * XRT); diff --git a/frame/lighthouse/Cargo.toml b/frame/lighthouse/Cargo.toml index 4bf88f09e..22757f84b 100644 --- a/frame/lighthouse/Cargo.toml +++ b/frame/lighthouse/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-robonomics-lighthouse" description = "Inject the block author via an inherent" version = "0.4.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" [dependencies] scale-info = { version = "2.0", default-features = false, features = ["derive"] } @@ -11,11 +11,11 @@ serde = { version = "1.0.130", optional = true } codec = { package = "parity-scale-codec", version = "3.0", default-features = false, features = ["derive"] } thiserror = { version = "1.0.30", optional = true } async-trait = { version = "0.1.30", optional = true } -sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } [features] default = ["std"] diff --git a/frame/rws/Cargo.toml b/frame/rws/Cargo.toml index 6c9b56276..b0a7fd928 100644 --- a/frame/rws/Cargo.toml +++ b/frame/rws/Cargo.toml @@ -1,25 +1,25 @@ [package] name = "pallet-robonomics-rws" description = "Robonomics Web Services subscription runtime module." -version = "1.2.0" +version = "1.3.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" [dependencies] scale-info = { version = "2.0", default-features = false, features = ["derive"] } serde = { version = "1.0.130", optional = true } codec = { package = "parity-scale-codec", version = "3.0", default-features = false, features = ["derive"] } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } pallet-robonomics-staking = { path = "../staking", default-features = false } [dev-dependencies] -sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } pallet-robonomics-datalog = { path = "../datalog" } [features] diff --git a/frame/rws/src/lib.rs b/frame/rws/src/lib.rs index 0c381beb8..a59371d62 100644 --- a/frame/rws/src/lib.rs +++ b/frame/rws/src/lib.rs @@ -477,11 +477,11 @@ pub mod pallet { Subscription::Lifetime { tps } => tps, Subscription::Daily { days } => { let duration_ms = ::Moment::from(days * DAYS_TO_MS); - // If subscription active then 1 TPS else 0 TPS - if now > subscription.issue_time.clone() + duration_ms { - 0u32 + // If subscription active then 0.01 TPS else 0 TPS + if now < subscription.issue_time.clone() + duration_ms { + 10_000 // uTPS } else { - 1_000_000u32 // uTPS + 0u32 } } }; diff --git a/frame/staking/Cargo.toml b/frame/staking/Cargo.toml index eac83cbfc..ba70d889a 100644 --- a/frame/staking/Cargo.toml +++ b/frame/staking/Cargo.toml @@ -1,23 +1,23 @@ [package] name = "pallet-robonomics-staking" description = "Stake your token to get some network bandwidth" -version = "0.4.0" +version = "0.5.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" [dependencies] serde = { version = "1.0.130", optional = true } codec = { package = "parity-scale-codec", version = "3.0", default-features = false, features = ["derive"] } scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } [dev-dependencies] -sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } [features] default = ["std"] diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 9bae63bf4..3ab543bc8 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -386,6 +386,9 @@ pub mod pallet { Error::::NoMoreChunks, ); + // claim rewards before unbond + Self::claim(&controller, &mut ledger)?; + let mut value = value.min(ledger.active); if !value.is_zero() { diff --git a/io/Cargo.toml b/io/Cargo.toml index 64e3d0853..6cfa47543 100644 --- a/io/Cargo.toml +++ b/io/Cargo.toml @@ -3,7 +3,7 @@ name = "robonomics-io" description = "Robonomics framework I/O operations." version = "0.11.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" [dependencies] robonomics-protocol = { path = "../protocol" } @@ -11,7 +11,7 @@ ipfs-api = { version = "0.10.0", features = ["with-hyper-rustls"], default-featu async-std = "1.9" futures-timer = "3.0.2" derive_more = "0.99.11" -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } futures = "0.3.15" sds011 = "0.2.1" serde = "1.0.130" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 8e21a9abf..40a2c9cc0 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "robonomics-primitives" -version = "1.9.9" +version = "2.0.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" license = "Apache-2.0" homepage = "https://robonomics.network" repository = "https://github.com/airalab/robonomics" @@ -13,11 +13,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.130", optional = true } codec = { package = "parity-scale-codec", version = "3.0", default-features = false, features = ["derive"] } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } [features] default = ["std"] diff --git a/protocol/Cargo.toml b/protocol/Cargo.toml index d2b8138a8..37309d08b 100644 --- a/protocol/Cargo.toml +++ b/protocol/Cargo.toml @@ -2,9 +2,9 @@ [package] name = "robonomics-protocol" description = "Robonomics Network protocol library." -version = "0.12.0" +version = "0.13.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" [dependencies] robonomics-primitives = { path = "../primitives" } @@ -15,11 +15,11 @@ async-trait = "0.1.30" derive_more = "0.99.11" futures-timer = "3.0.2" # subxt = "0.17.0" -substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18"} -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23"} +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } libp2p = "0.40.0" futures = "0.3.15" bincode = "1.3.1" @@ -28,7 +28,7 @@ jsonrpc-core = "18.0.0" jsonrpc-derive = "18.0.0" jsonrpc-pubsub = "18.0.0" jsonrpc-core-client = "18.0.0" -sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } rand = "0.8.4" rustc-hex = "2.1.0" rust-base58 = "0.0.4" diff --git a/protocol/examples/reqres/Cargo.toml b/protocol/examples/reqres/Cargo.toml index a4bf39952..7508fe47c 100644 --- a/protocol/examples/reqres/Cargo.toml +++ b/protocol/examples/reqres/Cargo.toml @@ -2,7 +2,7 @@ name = "robonomics-request-response-example" version = "0.1.0" authors = ["am "] -edition = "2018" +edition = "2021" [dependencies] bincode = "1.3.3" diff --git a/protocol/src/pubsub/pubsubapi.rs b/protocol/src/pubsub/pubsubapi.rs index 5588e6fb7..89d576c98 100644 --- a/protocol/src/pubsub/pubsubapi.rs +++ b/protocol/src/pubsub/pubsubapi.rs @@ -141,7 +141,7 @@ pub trait PubSubT { } impl PubSubT for PubSubApi { - type Metadata = sc_rpc_api::Metadata; + type Metadata = sp_api::Metadata; fn peer_id(&self) -> Result { Ok(self.pubsub.peer_id().to_string()) diff --git a/release.nix b/release.nix index b3b77c4d1..6e7d70182 100644 --- a/release.nix +++ b/release.nix @@ -9,7 +9,7 @@ let (import "${ros_overlay}/overlay.nix") ]; }; - rust-nightly = pkgs.rustChannelOfTargets "nightly" "2021-11-29" [ "wasm32-unknown-unknown" ]; + rust-nightly = pkgs.rustChannelOfTargets "nightly" "2022-04-05" [ "wasm32-unknown-unknown" ]; in with pkgs; with rosPackages.noetic; diff --git a/runtime/alpha/Cargo.toml b/runtime/alpha/Cargo.toml index a4568f5cb..89da85782 100644 --- a/runtime/alpha/Cargo.toml +++ b/runtime/alpha/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "alpha-runtime" -version = "1.9.9" +version = "2.0.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" build = "build.rs" [dependencies] @@ -16,38 +16,37 @@ scale-info = { version = "2.0", default-features = false, features = ["derive"] # primitives robonomics-primitives = { path = "../../primitives", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-staking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-version = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-staking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } # standard dependencies -pallet-assets = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-asset-tx-payment = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-bounties = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-elections-phragmen = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-executive = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-preimage = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +pallet-assets = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-bounties = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-elections-phragmen = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-executive = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-preimage = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } # robonomics dependencies pallet-robonomics-rws = { path = "../../frame/rws", default-features = false } @@ -59,24 +58,24 @@ pallet-robonomics-lighthouse = { path = "../../frame/lighthouse", default-featur pallet-robonomics-staking = { path = "../../frame/staking", default-features = false } # cumulus dependencies -cumulus-pallet-parachain-system = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-pallet-dmp-queue = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-pallet-xcmp-queue = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-pallet-xcm = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-primitives-utility = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -parachain-info = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } +cumulus-pallet-parachain-system = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +cumulus-pallet-dmp-queue = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +cumulus-pallet-xcmp-queue = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +cumulus-pallet-xcm = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +cumulus-primitives-utility = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +parachain-info = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } # polkadot dependencies -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.18" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.18" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.18" } -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.18" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.18" } -polkadot-primitives = { git = 'https://github.com/paritytech/polkadot', default-features = false , branch = "release-v0.9.18" } +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.23" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.23" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.23" } +pallet-xcm = { path = "../../vendor/pallet-xcm", default-features = false } +polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.23" } +polkadot-primitives = { git = 'https://github.com/paritytech/polkadot', default-features = false , branch = "release-v0.9.23" } [build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } [features] default = ["std"] diff --git a/runtime/alpha/src/constants.rs b/runtime/alpha/src/constants.rs index 6c0c53b52..e2092c7de 100644 --- a/runtime/alpha/src/constants.rs +++ b/runtime/alpha/src/constants.rs @@ -28,59 +28,6 @@ pub mod currency { pub const fn deposit(items: u32, bytes: u32) -> Balance { items as Balance * 150 * GLUSHKOV / 100 + (bytes as Balance) * 60 * GLUSHKOV } - - use frame_support::traits::{ - fungibles::{self, Balanced, CreditOf}, - Contains, Get, - }; - use pallet_asset_tx_payment::HandleCredit; - use sp_runtime::traits::Zero; - use sp_std::marker::PhantomData; - use xcm::latest::{AssetId, Fungibility::Fungible, MultiAsset, MultiLocation}; - use xcm_executor::traits::FilterAssetLocation; - - /// Type alias to conveniently refer to `frame_system`'s `Config::AccountId`. - pub type AccountIdOf = ::AccountId; - - /// A `HandleCredit` implementation that naively transfers the fees to the block author. - /// Will drop and burn the assets in case the transfer fails. - pub struct AssetsToBlockAuthor(PhantomData); - impl HandleCredit, pallet_assets::Pallet> for AssetsToBlockAuthor - where - R: pallet_robonomics_lighthouse::Config + pallet_assets::Config, - AccountIdOf: - From + Into, - { - fn handle_credit(credit: CreditOf, pallet_assets::Pallet>) { - if let Some(author) = pallet_robonomics_lighthouse::Pallet::::lighthouse() { - // In case of error: Will drop the result triggering the `OnDrop` of the imbalance. - let _ = pallet_assets::Pallet::::resolve(&author, credit); - } - } - } - - /// Allow checking in assets that have issuance > 0. - pub struct NonZeroIssuance(PhantomData<(AccountId, Assets)>); - impl Contains<>::AssetId> - for NonZeroIssuance - where - Assets: fungibles::Inspect, - { - fn contains(id: &>::AssetId) -> bool { - !Assets::total_issuance(*id).is_zero() - } - } - - /// Asset filter that allows all assets from a certain location. - pub struct AssetsFrom(PhantomData); - impl> FilterAssetLocation for AssetsFrom { - fn filter_asset_location(asset: &MultiAsset, origin: &MultiLocation) -> bool { - let loc = T::get(); - &loc == origin - && matches!(asset, MultiAsset { id: AssetId::Concrete(asset_loc), fun: Fungible(_a) } - if asset_loc.match_and_split(&loc).is_some()) - } - } } /// Time. diff --git a/runtime/alpha/src/lib.rs b/runtime/alpha/src/lib.rs index 44d44164e..b30cc660c 100644 --- a/runtime/alpha/src/lib.rs +++ b/runtime/alpha/src/lib.rs @@ -39,12 +39,12 @@ pub mod constants; use frame_support::{ construct_runtime, parameter_types, traits::{ - Currency, EnsureOneOf, EqualPrivilegeOnly, Everything, Imbalance, LockIdentifier, + Contains, Currency, EnsureOneOf, EqualPrivilegeOnly, Imbalance, LockIdentifier, OnUnbalanced, U128CurrencyToVote, }, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, - DispatchClass, IdentityFee, Weight, + ConstantMultiplier, DispatchClass, IdentityFee, Weight, }, PalletId, }; @@ -80,7 +80,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("robonomics-alpha"), impl_name: create_runtime_str!("robonomics-airalab"), authoring_version: 1, - spec_version: 1, + spec_version: 3, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, @@ -154,9 +154,26 @@ parameter_types! { pub SS58Prefix: u8 = 32; } +pub struct BaseFilter; +impl Contains for BaseFilter { + fn contains(call: &Call) -> bool { + match call { + // Filter permissionless assets creation + Call::Assets(method) => match method { + pallet_assets::Call::create { id, .. } => *id < AssetId::max_value() / 2, + pallet_assets::Call::destroy { id, .. } => *id < AssetId::max_value() / 2, + _ => true, + }, + // These modules are not allowed to be called by transactions: + // Other modules should works: + _ => true, + } + } +} + impl frame_system::Config for Runtime { type Call = Call; - type BaseCallFilter = Everything; + type BaseCallFilter = BaseFilter; type BlockWeights = RuntimeBlockWeights; type BlockLength = RuntimeBlockLength; type Version = Version; @@ -229,7 +246,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; - type TransactionByteFee = TransactionByteFee; + type LengthToFee = ConstantMultiplier; type WeightToFee = IdentityFee; type FeeMultiplierUpdate = TargetedFeeAdjustment; @@ -424,7 +441,6 @@ impl pallet_elections_phragmen::Config for Runtime { impl parachain_info::Config for Runtime {} parameter_types! { - // We do anything the parent chain tells us in this runtime. pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4; pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4; } diff --git a/runtime/alpha/src/xcm_config.rs b/runtime/alpha/src/xcm_config.rs index de3433f29..986e62fd8 100644 --- a/runtime/alpha/src/xcm_config.rs +++ b/runtime/alpha/src/xcm_config.rs @@ -3,7 +3,7 @@ use super::{ ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, XcmpQueue, MAXIMUM_BLOCK_WEIGHT, }; use frame_support::{ - match_type, parameter_types, + match_types, parameter_types, traits::{Everything, Nothing, PalletInfoAccess}, weights::{IdentityFee, Weight}, }; @@ -145,7 +145,7 @@ parameter_types! { pub KsmPerSecond: (xcm::v1::AssetId, u128) = (MultiLocation::parent().into(), 1_000_000_000); } -match_type! { +match_types! { pub type ParentOrParentsPlurality: impl Contains = { MultiLocation { parents: 1, interior: Here } | MultiLocation { parents: 1, interior: X1(Plurality { .. }) } diff --git a/runtime/ipci/Cargo.toml b/runtime/ipci/Cargo.toml deleted file mode 100644 index dc7c3d117..000000000 --- a/runtime/ipci/Cargo.toml +++ /dev/null @@ -1,138 +0,0 @@ -[package] -name = "ipci-runtime" -version = "1.9.9" -authors = ["Airalab "] -edition = "2018" -build = "build.rs" - -[dependencies] -# third-party dependencies -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } -codec = { package = "parity-scale-codec", version = "3.0", default-features = false, features = ["derive"] } -lazy_static = { version = "1.4.0", optional = true } -smallvec = "1.8.0" -scale-info = { version = "2.0", default-features = false, features = ["derive"] } - -# primitives -robonomics-primitives = { path = "../../primitives", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-npos-elections = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-staking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-version = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } - -# standard dependencies -pallet-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-assets = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-bounties = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-executive = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false, features = ["historical"] } -pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-election-provider-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-election-provider-multi-phase = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-preimage = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-bags-list = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } - -# robonomics dependencies -pallet-robonomics-datalog = { path = "../../frame/datalog", default-features = false } - -# evercity dependencies -#pallet-evercity = { path = "../../vendor/evercity", default-features = false } -#pallet-evercity-transfer = { path = "../../vendor/evercity/transfer", default-features = false } - -# cumulus dependencies -cumulus-pallet-aura-ext = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-pallet-parachain-system = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-primitives-utility = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-primitives-timestamp = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -parachain-info = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } - -[features] -default = ["std"] -with-tracing = [ "frame-executive/with-tracing" ] -std = [ - "serde", - "serde_derive", - "lazy_static", - "codec/std", - "robonomics-primitives/std", - "sp-api/std", - "sp-block-builder/std", - "sp-core/std", - "sp-consensus-aura/std", - "sp-inherents/std", - "sp-npos-elections/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-std/std", - "sp-session/std", - "sp-staking/std", - "sp-transaction-pool/std", - "sp-version/std", - "pallet-assets/std", - "pallet-balances/std", - "pallet-bounties/std", - "pallet-collective/std", - "frame-executive/std", - "pallet-identity/std", - "pallet-membership/std", - "pallet-scheduler/std", - "pallet-session/std", - "pallet-staking/std", - "pallet-sudo/std", - "pallet-im-online/std", - "pallet-offences/std", - "pallet-treasury/std", - "frame-support/std", - "frame-system/std", - "frame-system-rpc-runtime-api/std", - "pallet-utility/std", - "pallet-preimage/std", - "pallet-timestamp/std", - "pallet-transaction-payment/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-robonomics-datalog/std", -# "pallet-evercity/std", -# "pallet-evercity-transfer/std", - "frame-election-provider-support/std", - "pallet-election-provider-multi-phase/std", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-parachain-system/std", - "cumulus-primitives-core/std", - "cumulus-primitives-utility/std", - "cumulus-primitives-timestamp/std", - "parachain-info/std", - "scale-info/std", -] diff --git a/runtime/ipci/build.rs b/runtime/ipci/build.rs deleted file mode 100644 index 630838db1..000000000 --- a/runtime/ipci/build.rs +++ /dev/null @@ -1,27 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2018-2021 Robonomics Network -// -// 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 substrate_wasm_builder::WasmBuilder; - -fn main() { - WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} diff --git a/runtime/ipci/src/constants.rs b/runtime/ipci/src/constants.rs deleted file mode 100644 index e89c5d38d..000000000 --- a/runtime/ipci/src/constants.rs +++ /dev/null @@ -1,895 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2018-2021 Robonomics Network -// -// 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. -// -/////////////////////////////////////////////////////////////////////////////// -//! A set of constant values used in substrate runtime. - -/// Money matters. -pub mod currency { - #[cfg(feature = "std")] - use robonomics_primitives::AccountId; - use robonomics_primitives::Balance; - #[cfg(feature = "std")] - use sp_core::crypto::Ss58Codec; - - pub const U_MITO: Balance = 1_000_000; - pub const MITO: Balance = 1_000_000 * U_MITO; - pub const fn deposit(items: u32, bytes: u32) -> Balance { - items as Balance * 15 * MITO / 100 + (bytes as Balance) * 6 * MITO / 100 - } - - #[cfg(feature = "std")] - lazy_static::lazy_static! { - pub static ref STAKE_HOLDERS: Vec<(AccountId, Balance)> = sp_std::vec![ - // IPCI token holders until 2021/06/24 - (AccountId::from_ss58check("4FjoHf1RDrEHJg6ZSBFz3etgZTSWwu26JqjjGFgbojnRDF9e").unwrap(), 19967000000000000), - (AccountId::from_ss58check("4GEFWDi938ZPdWP4ZRrFuQ6qbSwbAL2tQVn4GKsthQ8xxYQ3").unwrap(), 652776204169), - (AccountId::from_ss58check("4ChuZwaQxArtVYRKEHqtDcdpzFE8bZm57C6PmNseCvMQY3wo").unwrap(), 736000000000000), - (AccountId::from_ss58check("4F2n5UqTd33xFEeKrndg3mfw7M2uNEiSHfcYtK88feKKpX9b").unwrap(), 675000000000000), - (AccountId::from_ss58check("4E3qJghSxEt2ZhTHMPL5moA6kZQEjoZrZwqoXMrUKY3D8ViR").unwrap(), 978873271394), - (AccountId::from_ss58check("4FNkrP1eEHrMxpamgiCuQ21DkznvLBkFHZNEPZJvtn7tYy4n").unwrap(), 5849677000000), - (AccountId::from_ss58check("4GKqXwvrcT4o2VVoq52AiPg5vxHynWWhpWr5vFCJAa2LTArG").unwrap(), 154836346320846), - (AccountId::from_ss58check("4HqFfN56cMfCPs412Zqi6r4cviHN3faqSZNi2tmp8zr1crgQ").unwrap(), 167000000000000), - (AccountId::from_ss58check("4DZ1MS9CUif95QHF6sico6M1RjFEDZk1bd8ZdNcxHmKr34to").unwrap(), 4954481351700), - (AccountId::from_ss58check("4En3SVvzvtrEb7vuVuYRHpYheH4p7eGuRJgKHsM6AUiGzpfD").unwrap(), 10049677000000), - (AccountId::from_ss58check("4DXRzVCWBDic8EZNgNvjwTmHV2XhXGAcQohZ41MiTjDAcCVz").unwrap(), 911675717473), - (AccountId::from_ss58check("4HfZmZMoNwxzvWmHt8DYs49uT2BmxpLMEbiQ4qhps34H2epM").unwrap(), 5849677000000), - (AccountId::from_ss58check("4HTM4Zo5hcD38BfyQiT3wVe6HHA4tkTPrJutgDDgz9bDBCeY").unwrap(), 672355194957), - (AccountId::from_ss58check("4HTUaoH3Dmgrf1G2nXdUsrJsD7cci5cUvC5Fw5CNbbXXejTF").unwrap(), 996343000000), - (AccountId::from_ss58check("4DnvTKyo7qoc1AU9RtJLXvLzNjiM8uDJJEVnmN2tkywfExrp").unwrap(), 9495680200000), - (AccountId::from_ss58check("4E8w1PojSqPyDuLMyt2LdYQ61mVx5wvgLoqZke2c7LpbcHdn").unwrap(), 2000000000000), - (AccountId::from_ss58check("4HMEnkGDDpmY2VqHSZv7Vg8LGHMkE4vXAmGoux2cijQYM1Cg").unwrap(), 7752428533584583), - (AccountId::from_ss58check("4HogvjmJkZ3TdAW4pEPq7z33MfjYhrmrWPXQFamVaqjCB33i").unwrap(), 4999677000000), - (AccountId::from_ss58check("4E1sBvJA41vGZqccp397y4XrkvyimHQeG16Snx8iWfofRV4w").unwrap(), 1324930919268408), - (AccountId::from_ss58check("4CXRzXWg3KHnAxUfzZfbWSa4wLEN4Lk6hANbvsaBMyUK5Jzi").unwrap(), 2999677000000), - (AccountId::from_ss58check("4Es2m4PSQshagfz64cipi7wB2hfcY7b7TDWTHRdxCywEv4Go").unwrap(), 1480393000000), - (AccountId::from_ss58check("4FrjHzv6b5QNEd4WgC5AjzkZPnnmHJnFgSE5Uo3FSa4CHY9R").unwrap(), 11853858000000), - (AccountId::from_ss58check("4FnC8upLLPubKjR4b5TnUTDovGZ6Px9MbasjjhXUi9YAgioF").unwrap(), 3537000000000000), - (AccountId::from_ss58check("4HTR3hpJsX3XvtsE4sJxAW1aFFHpodYsVDrJvd5EdaHwyUwW").unwrap(), 570357161316907), - (AccountId::from_ss58check("4EunrzkTzWcPVgy8umjWDcfFgypRknjrftZMg5zjED1jFqjQ").unwrap(), 4999677000000), - (AccountId::from_ss58check("4E6bqXmiAisXRT9Pf5Am55LLo1BACGW4TyPqMfpYL1HDaqJG").unwrap(), 1000000000000), - (AccountId::from_ss58check("4DnDP43TPopCr8KtD6kbEDPpTqwufjKqazeKG3W3XTDwBqDY").unwrap(), 400000000000000), - (AccountId::from_ss58check("4FYoRfBTFcyVty8N9PMSKVWqNHQ6gKqNZWhKpY4mT2C2Cki7").unwrap(), 18281347010750), - (AccountId::from_ss58check("4F6HQkj1hhgfFVQ7PKLFoDXK4PRxLNL14yVnzQ5nfPGH7iRP").unwrap(), 2999677000000), - (AccountId::from_ss58check("4FBFDE2zhVs3we1QbfasqmZU1uH3UX1uYoYd8QE9FJapeM38").unwrap(), 21334000000000000), - (AccountId::from_ss58check("4G968GSjchoTmbeaw18YLcexUdgSYWTbbkXsYiDxHgb8ELYr").unwrap(), 4739802000000), - (AccountId::from_ss58check("4FKAhSWzVTuwfxAZxRS5wFFUJqvVuTJLjvppoCkpZgSBZvLa").unwrap(), 4018677806297), - (AccountId::from_ss58check("4FKwBmKqo4LmwiezLrbXXDSG7FqKeJpnUErwvDTCyT63jMXQ").unwrap(), 500000000000), - (AccountId::from_ss58check("4Cpv9uSF8ajzbUtNg7Ko5fdXs6Rqkr2UcXbzYw9Sei8S4d44").unwrap(), 4955732458509), - (AccountId::from_ss58check("4GeHgFHNaHPuRsKUxy4oDdsV6JUzEoJtniWaTC6fUkKkPDJB").unwrap(), 218694196159), - (AccountId::from_ss58check("4CoQwiEWfUwDP2PFGj7Q26puH9KGcjFrTx7ixA48tvi17hGm").unwrap(), 388487589508), - (AccountId::from_ss58check("4Et3FUqc4dXWnqdEu3ywDyUYB9qfaCZrrWM9VH7DNuWsuXcE").unwrap(), 91718000000), - (AccountId::from_ss58check("4EN2WVxpNmJZAaR1HR8PcdByYr8M4RxpYuCumbxmZK4MGjA5").unwrap(), 886162078968), - (AccountId::from_ss58check("4GKtYZFWs1tT14Svm5HJNfgnmhKKFViSUUnb32hixR8WyY1V").unwrap(), 151203971528913), - (AccountId::from_ss58check("4GiyDwBjTb5wKLpvadT5vcVZEM1bA9AFtTrqL2faAXx5st3z").unwrap(), 949510647415), - (AccountId::from_ss58check("4EWmzR54atfyDfV9mDMHwdGBZqCDs3kgkSVFJRSC3tbb7Lp7").unwrap(), 121281295737187), - (AccountId::from_ss58check("4E9krV6RcduUM3Tew6nXjc84DDPj7EQwFJxBoiU56jXEj26t").unwrap(), 788610216508), - (AccountId::from_ss58check("4G44NNUq2kQtGkfjj3bjRX2FmCGCwxBQdnXGPfVhx6WEP9h3").unwrap(), 32515230645003608), - (AccountId::from_ss58check("4CwXn3BDs1AJTAr39z86qdUz7X4PQYR6CxRjrqf1qpSv283x").unwrap(), 325000000000000), - (AccountId::from_ss58check("4FrrbCpzvHtewiz8Nfhb8J6VmdaWSqfKFUxZsg5NhjbX1eHy").unwrap(), 2999677000000), - (AccountId::from_ss58check("4GsQUPskaFpHpHurstC1wCmHmRkzYHQGrMPTNHUk6EbkS6hB").unwrap(), 282000000000000), - (AccountId::from_ss58check("4CsjaVpqoWekmuaYLv8ro6Ziutzi7mP6s67DAb6YtCAiAdyy").unwrap(), 15698000000000000), - (AccountId::from_ss58check("4FMkNuTH9HWrm9GGwnLbA8S7nhNDrFaUZZj3VcsHZb8xPykZ").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4GKHh19UGDMx6qiqk1GB167ozj8dWjp4G17ZNAGYb1e73avF").unwrap(), 10000837000000), - (AccountId::from_ss58check("4ChoY4BURYimgZGP1r4nA5XJG97KdwAno568mpVTTCgA1S7G").unwrap(), 10000837000000), - (AccountId::from_ss58check("4Fj1aLFfHRBJWkghm3NbDJw3Xw2M4wb7LAmynipq2oqLk2AN").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4DjSKifFYvG36S23wfbfwUVPNv7xEDoVPA6poYWuCNKcyKsw").unwrap(), 374745976630265), - (AccountId::from_ss58check("4FhKSN366q16DhYcYERmoAnWmTK1hvsGo9VKNqW4nNutcshm").unwrap(), 5849677000000), - (AccountId::from_ss58check("4DZKwNACTfsCzFgXT8Qbj1WSRyu2P2BaEH4yyeSeXs9qjvKb").unwrap(), 774666561972), - (AccountId::from_ss58check("4EvhtANRvN5cNY2KDAJoZDhobpJ8Hmzg2nZhJYHWic8GjSjT").unwrap(), 238062359685), - (AccountId::from_ss58check("4FUeYGz5jNkcMeHEYbjGXC98joDN9E8KYSrAssEPBF2nUHBk").unwrap(), 196793000000000000), - (AccountId::from_ss58check("4GrDBgQNUeTWFxNoJV8GcJMMqAQfeJLgdRT2eDE8957AHc3Y").unwrap(), 6238518000000), - (AccountId::from_ss58check("4G8M8RbkMxPS6Lx7X9VreyKCXqVYXU2BTuDaoi4zziXjydxD").unwrap(), 834000000000000), - (AccountId::from_ss58check("4CuV8zWrjm8nM8J4xj9bARch7EeBQnDExhp6Xf9PojzdycmT").unwrap(), 84000000000000), - (AccountId::from_ss58check("4FDqzHsBk9riXXKBKnGvjFwErJ9o7AmWrGw48gQcnocrewCE").unwrap(), 512000000000000), - (AccountId::from_ss58check("4GrpMNkpFsXsS3aVTHChfMB3YcaaXCX8r8Ly8LAqc94GuDoD").unwrap(), 1000000000000), - (AccountId::from_ss58check("4FeLu58j3JuRKMtRemSPvTzZZVRtAJXZXJouRfUJ5bSXA8yj").unwrap(), 598348583778), - (AccountId::from_ss58check("4CeaaGHhqReBaiTxEmaAyUxCwD2hh8FUDoqZm7wYUTLfHnvX").unwrap(), 1049622107634), - (AccountId::from_ss58check("4HY6tUUTLE7twzYo4MVMJwsFH3nLVEahKFD1fzxUQNRaqs7K").unwrap(), 4917611212350), - (AccountId::from_ss58check("4CcKsPtWAYL4BXGfmgU5TSWeJXirXsrxU6azgPMYq2E4raBn").unwrap(), 652516100131), - (AccountId::from_ss58check("4FWcxxHe4cWtG97CVxUbpzbqmeuCQUMPuXPKMUkj2QZJNsng").unwrap(), 149624113167110), - (AccountId::from_ss58check("4Hubr4WzZmdiCfhcunmRubnevH3NjHGyqmmPg5neqa7RtBxh").unwrap(), 143811052661), - (AccountId::from_ss58check("4GudQZZ3NEqwqzoRoGvQBxVcBZzqVznGRtnT8PD3gKtX79Es").unwrap(), 6186294000000), - (AccountId::from_ss58check("4GYJ76Pju9GRUKN5aEAH5c1mgQcBrrsPQBVUtfVR4eX8P8ve").unwrap(), 181596954218), - (AccountId::from_ss58check("4HHjahAHgHpuu6CEuV8qCub7TsRPaBF9tnwrmqfQtQGfHuxk").unwrap(), 10000000000000000), - (AccountId::from_ss58check("4H8wqZa4M82At1DLzEHPoGroMcEveBMv4Tweke9D2Fg4q38s").unwrap(), 7432054158147), - (AccountId::from_ss58check("4CSKndJgqww92pnkxpjMnJW3QPHFRFHQKmrzUhrGN7PmXQq8").unwrap(), 5849677000000), - (AccountId::from_ss58check("4DncsQzLMn1HPSBJgqfcZdyLLwkVNcu8TY2i6GxDjHp6NTxK").unwrap(), 4999677000000), - (AccountId::from_ss58check("4GTSggriU18KGoJZouZPoKzbhGRy5Jpvn3pUWoJX9iiM6pcj").unwrap(), 935527811509), - (AccountId::from_ss58check("4HehDpYsj8brHT6nhpUcEExFc8MjJsTno431Efm4Ur9x3eGh").unwrap(), 75000000000000), - (AccountId::from_ss58check("4Gmbe71VsyhuWDJDR3DQeeotjiPW6pQQNj1jxC44pF4BVBhX").unwrap(), 150000000000000), - (AccountId::from_ss58check("4EBrpbW3hR8H9ej8MfRc9iqaMQnKcxJyEqgNFUuGoeN9fN5H").unwrap(), 78981958573309), - (AccountId::from_ss58check("4H8BrWPExhaBNw223Le61dowXvv4615kU3EPtGSxFLP9VM8L").unwrap(), 2996003000000), - (AccountId::from_ss58check("4EjZbKB5bgn1oetUrZZD6oL2KFkkgiKyr8jPHfJijiYDgKe1").unwrap(), 10097192000000), - (AccountId::from_ss58check("4CkuSiwZCEaDJBAhbaSiiUnH6meNAArJkpqzceisHApJ3KVE").unwrap(), 6660000000000000), - (AccountId::from_ss58check("4G1PMXgPz72YNQ7H6o69L42SHpvActmWKutZr714YKahBady").unwrap(), 4999677000000), - (AccountId::from_ss58check("4FLLk7gE7sD6ZoAFcgq4MhJ391Qxe9qWbrXtuMPZoCUpoAW9").unwrap(), 715485791138), - (AccountId::from_ss58check("4CpvABNpCtd6tZieu9ZsZXDZnbEwczLnFbC2ym5wqkr8RHke").unwrap(), 10945160427728), - (AccountId::from_ss58check("4G8a7Mk1ZUGjkETVMzyHD3QLT4zeybJrhomxayp9VDtU2J9e").unwrap(), 151639607669046), - (AccountId::from_ss58check("4DhsoZujQhEF6uPLFeNXfWDEfCL4rPjVUaM4QPQRSFzzRJeW").unwrap(), 4917611212350), - (AccountId::from_ss58check("4FF4bmx4dkN1bi8HpHjaX5o58Qh831ePyVDAmCz8Uc6cxtdP").unwrap(), 150000000000000), - (AccountId::from_ss58check("4DSpAzxVMW8pxpkBoybNPvfhjRWs7AUqC6nvWmY8rv9uVWuP").unwrap(), 60000000000000000), - (AccountId::from_ss58check("4HN3dBRUrcZVF4821xAhyE2YT6iJbUk8LbjCreCfMpWasAzy").unwrap(), 264000000000000), - (AccountId::from_ss58check("4GboJsop8sJdMS474frVFkAGWSAPoPFTUVYvxEaeprVJQxK4").unwrap(), 5000000000000000), - (AccountId::from_ss58check("4HRzURQwTBWj5P32pS4X1adygKab3TSa7b9A7CqgMpxXrFj6").unwrap(), 300000000000000), - (AccountId::from_ss58check("4HBgJhABnroKhB2ecjfQiwDqmht1ZcMMWrB8ER4s62fHdAdP").unwrap(), 3000000000000), - (AccountId::from_ss58check("4DZaicBBmLuhdtxp4qzYy2umRmyrZc5iRqeDnqRGcfRAQgyv").unwrap(), 387375929079), - (AccountId::from_ss58check("4GiJmgjoDgEMX9hKMkBWkAmyKE25fGHNqc9egqxvvyjD2Sqp").unwrap(), 580000000000000), - (AccountId::from_ss58check("4FnQ1QXzaBmmsw4vRRCEGHS7ZEgSpnF5oSrxekFY8ZMWhM5a").unwrap(), 191143788555), - (AccountId::from_ss58check("4D23PkZdAEixtcJeArNCETgZbmFhsG3ZkcDdwtEXBWs6g9UU").unwrap(), 316862922567), - (AccountId::from_ss58check("4HTXeobQX5ijeVWkvgkAqeiLC1zmUVLeivUyvi98zrcGGwzS").unwrap(), 2999677000000), - (AccountId::from_ss58check("4Cpv9qEccekncUfx6SZjqbt1dunCaJBVjZcjNRiH71q2etfv").unwrap(), 138256878729713), - (AccountId::from_ss58check("4CK3A7qaCQsxP9K2xhMAPuTNhvAjNCKPZ2nM1mmVgFM2FhNd").unwrap(), 34000000000000), - (AccountId::from_ss58check("4EyYW95qWymdoPeX7anLqbY1CLdmGzFvjTSwi3uYyYLfPRZB").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4EuZAzuVxEqB6XrHVXGoFHMUQcAyMQU5bTvkSz5eo6UJ7acK").unwrap(), 9000000000000), - (AccountId::from_ss58check("4CHxGsPkBqsnfPXmYan7dQPnTHagxXWHPMuRXcFoWjXirmVn").unwrap(), 2991064831499789), - (AccountId::from_ss58check("4CpvAEryxh92CftQax1aWLfAv7ceJwBhEzAHMNErVWigoEJS").unwrap(), 1104173904364142), - (AccountId::from_ss58check("4EuJibu19kH7CfK6evQvTTYdE5sLeUSopfwFpvoXaVVRURg5").unwrap(), 334000000000000), - (AccountId::from_ss58check("4CS3TGoebz2MLfVHzWPvL4CL5dZCZd61NsPhDLq2r1QustaD").unwrap(), 477086649319415), - (AccountId::from_ss58check("4CiAGyb9yceT6QbZy1dKv3A47urg3grmfbW1BMXuD5WwsZER").unwrap(), 195864893426287921), - (AccountId::from_ss58check("4FjBWE2osaC9MbGaxDmFt4X9UqHQZBEUH2yJCtLQ8HXSg9v4").unwrap(), 2999677000000), - (AccountId::from_ss58check("4CFpghjtnTQpiYM7x9KkupH1aYCYvatJjh8yACPprRxdDSip").unwrap(), 2250000000000000), - (AccountId::from_ss58check("4D2FuKPoYuEoswVB8LbCmNHFDJBQXe2CQeFNqXJqr4ZK5Tiz").unwrap(), 4739802000000), - (AccountId::from_ss58check("4HfdxsfjQvT75JJxLoRYpizgWPqq7V5iRQH4CE9y5jS4ZaLC").unwrap(), 5849677000000), - (AccountId::from_ss58check("4FgsAh4LsTQEGE9DsddoGGFpcmGBSZ1oEW9xsyYnxttbea5X").unwrap(), 2999886000000), - (AccountId::from_ss58check("4DTdQEU5TcFkdXAanhQf4pVdWYsJ7D2ybwE9CdWu3BHFAqKk").unwrap(), 230146809016), - (AccountId::from_ss58check("4GaXunbmCkC7K8gLFKYHET9fv26JJhfzzjbagajMApBjBFvZ").unwrap(), 910150610178), - (AccountId::from_ss58check("4DkEcQJbSGYza7PqXWQPm63jgP1FA8WEGcWcDJzqZ981MTtW").unwrap(), 867000000000000), - (AccountId::from_ss58check("4EBpbNAcxuMiJ68gRJakDaT6Yg1aow6RqYEcnADhGWVyvyxF").unwrap(), 5499417000000), - (AccountId::from_ss58check("4GgjX6rF3UJp2V3DD1ZwPxrgdsuBkhU7QAXmwK4qChukrm3Q").unwrap(), 164158918243), - (AccountId::from_ss58check("4Dk3PW9RGJw1aVXm1h2JdP6VyFkXuoY62Yhhb1t5gamtYy4S").unwrap(), 725485541765), - (AccountId::from_ss58check("4GyStPcyTwCecpSopP2K4MfspjcdzeuC5T2jSR5vnocd5MMV").unwrap(), 150000000000000), - (AccountId::from_ss58check("4FVeYxoieWMAEdfDk3Ag53X3wdVca46no9aUXjyEcFgDvFZm").unwrap(), 2999677000000), - (AccountId::from_ss58check("4FBx8XCsY6Do7NDTYRFyr5RHekAiikWYgjiuzrrEQ8ufWvan").unwrap(), 137929279488), - (AccountId::from_ss58check("4EtFHCbVswtVcYpokneEo9N9jRy97DjhjzrLt6aNxgZ8BLoS").unwrap(), 948857093426), - (AccountId::from_ss58check("4ExF5qLj9mHHxefkRqQQc1t3WGz4stzZS1fiEdPge59o35Vw").unwrap(), 5499417000000), - (AccountId::from_ss58check("4D5n2exKLwu9vJjSqhXvN5EQ5ufULhueibkkTtZy1Ngyyqnb").unwrap(), 448000000000000), - (AccountId::from_ss58check("4EhPmrMZGxUFy5Fj11zhoY3drMbwvdhU5dAFVsuxt71YPSkw").unwrap(), 84193829147413), - (AccountId::from_ss58check("4GRSqogpHa8zpA9PwnTtLhM6yj4p8Vkvo186pB8e5ou2oY8d").unwrap(), 667000000000000), - (AccountId::from_ss58check("4E24amBe4JBmHnF7FKL22zBvgNmEps3yfQKQ3Amqh9pGUBzG").unwrap(), 1667000000000000), - (AccountId::from_ss58check("4EHNf5jZ4ormn6SCQ3xq8yw7MHPBqDXcm2oWLBaVXWp6hoSa").unwrap(), 5499417000000), - (AccountId::from_ss58check("4Enky45bzN6S4pWpzCvhz9PZ5LYa4gjSx5AKdZgLZXE9hogp").unwrap(), 739830356397), - (AccountId::from_ss58check("4FnNvrJrM2fNnre8qrnLVdaSwWPZQxhxP9s48i8nxHtAa62U").unwrap(), 10049530000000), - (AccountId::from_ss58check("4Cixkky3cfyZQ8AyStnQWvChjb42t5oBys2dCq9KEQEgaR3C").unwrap(), 33333000000000000), - (AccountId::from_ss58check("4ENz5ynoaHr2u1tCP1Nqij993CaKo885WQw8CQQD4rto5vMp").unwrap(), 393828440772), - (AccountId::from_ss58check("4F9W7TSZSNF7KvsiSnNqn6aTDY1Vqoae8i2qXfarYWcDtfV8").unwrap(), 2999677000000), - (AccountId::from_ss58check("4Dguuvp6GxzPTPRw8Act1c18ATHVsRCiDzWDpGvA9LGc83Kd").unwrap(), 9697251000000), - (AccountId::from_ss58check("4H9TDs4SQthT3FMGC54cP3Ag3gxJkAGSawbyU9ooFsZgYQuj").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4F45kQAV7qM19soFKekLazs2GL3pwDg4Mes49UrRppkUGVMR").unwrap(), 10049677000000), - (AccountId::from_ss58check("4FuQzp9AuEFwRQr466AhaFuBkzwzYoLf3C6ujpCGhv4UpqQm").unwrap(), 10800000000000), - (AccountId::from_ss58check("4Fp7grV1yvFdmdanm4vuoArnophQ5qo12qcrT87mWrtk83qj").unwrap(), 150000000000000), - (AccountId::from_ss58check("4EmiCJg9oBGcaVwfkvNQMS57szkX8hvBqwFNAynzELzZX4yB").unwrap(), 5499121000000), - (AccountId::from_ss58check("4FV62C8E5qz3GCfnSu1J3nWbai1YJPt9b3VAAU2Jww5LtbcB").unwrap(), 300000000000000), - (AccountId::from_ss58check("4E6LPZkoLhZQdcj2GdSsxpBt2pFvchzCkfDw9xiUwrwb7aVZ").unwrap(), 257000000000000), - (AccountId::from_ss58check("4HYhiSHs44u2XWc93mfsPH3tKCWHq3Hivo7Uh1AxA9pFQqbG").unwrap(), 15776958553201), - (AccountId::from_ss58check("4DZKtksXvUCrCKK1aNJdq9vZVUzxErmYaKtGtQfySxiyeJPU").unwrap(), 386173099588), - (AccountId::from_ss58check("4CXmnbHpFqWsQ4ybu3VXsaVYtfVS8k6UmRGJbTufZSBdsDNB").unwrap(), 5499417000000), - (AccountId::from_ss58check("4DXMnEpPs8JJpiayQm2aEPLBzZPkKf1e9diECyDQRoMXR1y8").unwrap(), 11000000000000), - (AccountId::from_ss58check("4D2MkVUckQfQvZ5AyT3kmRXxBsNnq9YQKMtLhTS7oX4o9JFV").unwrap(), 5499417000000), - (AccountId::from_ss58check("4Ew1UUosURgrRj6fqBQ2E97bgHGU8xzAa8wBtwRSS34aQLim").unwrap(), 167000000000000), - (AccountId::from_ss58check("4FTpFns4KGiYWo9D6XT2hS6sRpiphXmnJ7LKAxgHE6qes6me").unwrap(), 68347626388911), - (AccountId::from_ss58check("4DNfuXjAMKjADwqnvwd5S8YXhCjTQRTW3m4SMLoSTNQNjAKK").unwrap(), 334000000000000), - (AccountId::from_ss58check("4CJKqn4LkSSkTGeWq1gyquWZ4xztzNKyYoWLA5YAvyV2QHTm").unwrap(), 2999677000000), - (AccountId::from_ss58check("4DGv737ZVx4Tx9ZTszv7nf3f4EDTDrGVA42EQEnJT6R3P2Ga").unwrap(), 1000000000000), - (AccountId::from_ss58check("4E4Xoe4tT12WPbx3srcSuQQ4R5xUBYeoPoNKtSodQKGh8oEt").unwrap(), 5499417000000), - (AccountId::from_ss58check("4GQesumFr6x3NKF2PzW8s5oMQwQ8ks314KJmVMc64oexYoem").unwrap(), 99400000000000000), - (AccountId::from_ss58check("4GubzEf6N5CDUCEW9hH7Gc6L24LQMrFJnKTKExLmGnK6Wjxb").unwrap(), 10030407000000), - (AccountId::from_ss58check("4EcD1pGXjP5ffh2roz9cFL2BxBx53kVZG4UdRgJ8XkXS9DVd").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4Ds93XwippeFa6qbnzhn2yoTkr79RJtYz42qRkTvEM3cEchJ").unwrap(), 57364851870943), - (AccountId::from_ss58check("4Ew2UsQnvtJdKrwsVEZHinaYmaLQM6ABwoUPtGx7pPbERE6N").unwrap(), 150000000000000), - (AccountId::from_ss58check("4FiucCrJdi9Lz4BvubwbaFTDFyVvJUeSFVpxqDYumEMTFn2T").unwrap(), 3001000000000000), - (AccountId::from_ss58check("4DqRBT9JoEFAEJnJnYo13Xii9cHP1vksSVKrHwfyKdbza5uY").unwrap(), 2965260335300), - (AccountId::from_ss58check("4CUh4qZwYXbgJHVKfctrJKXUe56mMF3K2Hs9vWMonAqmFNDr").unwrap(), 765389601463), - (AccountId::from_ss58check("4EH4LvqcucLyPNAspz9LxSc1vK8UyRmmqZkm1KUoGZ4KFoZW").unwrap(), 1208000000000000), - (AccountId::from_ss58check("4CMEfGPPBHtdrfWDcvDLdRApiH4dVfJJ3GepjTFqUMezQdsc").unwrap(), 916794327371), - (AccountId::from_ss58check("4GsUQGHm3qjiMvMXak5cZdPMhWFfWntyNcG86321JzBoiGTN").unwrap(), 687851455678), - (AccountId::from_ss58check("4HG5hKq4Xf2jy3aAhNTNXWt6mEqjcjGgUz9uaiw1N8h3dv1C").unwrap(), 622002535858), - (AccountId::from_ss58check("4CevQCBdEWjRoGUMXJPrMHBf77Fh7ufFXnnnavm9MmNDA46H").unwrap(), 4739802000000), - (AccountId::from_ss58check("4FbPYHBhJfoWd1Rb8Ak1gHrpPohFBafkrW5frSx5TJ2XG75U").unwrap(), 226830976341), - (AccountId::from_ss58check("4FRCqEX5gV81kiVsMmDzUjgmJmWZ6e3ZBk5d45JhdF1i31UL").unwrap(), 2999677000000), - (AccountId::from_ss58check("4DLQCMdHvdxe1A5ZmhTmnS84WZo8pCgyGurzAirDcqmzpLpb").unwrap(), 2999677000000), - (AccountId::from_ss58check("4GSqM2Vqs75RnXybPoJgn2YganDhy8cCWPhVv4Scgas9Y5RZ").unwrap(), 88724504022), - (AccountId::from_ss58check("4CvHHbbYW7uMt16J54Bwxo9XewLPnKVBB8jkxC8JGtv5opzn").unwrap(), 9598254130049290), - (AccountId::from_ss58check("4CaHAmqpJCHxJzcFB2Lv5gWrwo34s8M1J41sM96mgFACVRpT").unwrap(), 5849677000000), - (AccountId::from_ss58check("4FU1jC8sLYxhdoFd9pvVKATaqSpE3GLhnZ9q3e93mryxPCsv").unwrap(), 2999677000000), - (AccountId::from_ss58check("4DEoYHSbTd9J6pJPJovxpFnmRiDBNDjBi3z7adfjjkdHY2Zc").unwrap(), 150269520384227), - (AccountId::from_ss58check("4CKHS63EWzNGYKgH3NHLU35y9hhoC62sPPF7frdMS1cJbSDu").unwrap(), 496530188903), - (AccountId::from_ss58check("4FYZbaotrUbh4BPXNBy6QVvWMC6fgsJqMAGpftyBN4fwEUfa").unwrap(), 151469932377307), - (AccountId::from_ss58check("4EspZDEffUQJ7qnR1TVTD2vnaVjhZc9V2NQCWcjUYdFusRxk").unwrap(), 591162000000), - (AccountId::from_ss58check("4GENyszwsnMWfwTPeqYLv44dZvCW4webbUhqkBWHpJiBWxfb").unwrap(), 2584657510342), - (AccountId::from_ss58check("4EnFQDxqs2FJHRDmB81tFF1nnTFhNSEgABVknyj9sYjnXU6y").unwrap(), 521252218142), - (AccountId::from_ss58check("4CwErgeG2pr6mGsKHnFMAC9e4ZV27kg7Uv6ApbLgU6hBym3x").unwrap(), 246633317448710), - (AccountId::from_ss58check("4DHqb7YNCGkQ3vDLHzfJuyLEyd1Q5fdoPSF33P3UGDnhaWwe").unwrap(), 2999677000000), - (AccountId::from_ss58check("4H6FhSsnyU2NGcBgGZnRyqbFPyLYxWyUW19JpLvi6RZR8X3r").unwrap(), 24200851476275), - (AccountId::from_ss58check("4Hu1yJLnskGNXF4gMfL9iuU59ANYLBeotQRTGquwfe1zRmz1").unwrap(), 481479136916), - (AccountId::from_ss58check("4Gru4ZdAUeQmZay8czJ9hMVU9xdtYdBYif2zBw8j2rwK1wMZ").unwrap(), 709047533475), - (AccountId::from_ss58check("4EBVy44HjzFb3wTp8fxfFPKHtgMmM86pNQtvmQBdkx7b7p39").unwrap(), 2999677000000), - (AccountId::from_ss58check("4EsAmqhYBDbmwYJjWafjBjjN4BZALU8fc257HxYZ7ScysqwM").unwrap(), 474495185906064), - (AccountId::from_ss58check("4DNweGNwVgs7wXgZmUJXpmsohKaUQbxkV3DvUjQsqceBorJr").unwrap(), 863147508813), - (AccountId::from_ss58check("4DidCbAWaPssGfkyxuxnADp8RCjq48hba2Fozh3iA2kaYhm6").unwrap(), 150000000000000), - (AccountId::from_ss58check("4DABJ1MfoFPmSA2boK6FbU8iBUYk6P8ZdrShSR16FRqbGeqd").unwrap(), 9665674000000), - (AccountId::from_ss58check("4CS9NSHGakZK6pQMTimNzWzUudzCbSEBwXHnrw8Yjzpqke2K").unwrap(), 5849677000000), - (AccountId::from_ss58check("4H6CwuXnhrwxgtxqutN4P4ijMZsp9zTXfJf9bvyyFptPefsH").unwrap(), 337080875993), - (AccountId::from_ss58check("4DA28jB81Vf5UZxgoAdGv6dNtxshNxrjwWCgxi4PE8t1icwx").unwrap(), 11063665431474), - (AccountId::from_ss58check("4CxPDWrKXrqGXevR5vBcPENkorZvcVALtEnVmT8wmgCCNF3i").unwrap(), 460000000000000), - (AccountId::from_ss58check("4DoauNbPxbATJiS8ZTcs9jrJnDv61HH5hrc5vVQ3J97TKDwg").unwrap(), 1334000000000000), - (AccountId::from_ss58check("4EGw4SmbaVPfoWqwEGoCePMEPtZqJuQNeaiqjCsEtdx2GZqu").unwrap(), 5849677000000), - (AccountId::from_ss58check("4H3XeMALbio439FxAp4pdHnr4raP4FHMCUuy19FmYRvWZxE1").unwrap(), 16667000000000000), - (AccountId::from_ss58check("4HSw4t1bqnnCAbfMCNjkHj3HdrFHgD1qLRgT7wUWW68gt9D9").unwrap(), 29759037107144792), - (AccountId::from_ss58check("4DuMdK2mjEuDd6GBUEouRDmAKhiU3MJUZwQfu2oQeU8A9FF3").unwrap(), 45000000000000), - (AccountId::from_ss58check("4EjWPbkRnvRWVQtMytve4gUaxJXEkqQxkcqenVeT5K6J34Mo").unwrap(), 4999677000000), - (AccountId::from_ss58check("4G3sA4saTXqNfSTyoxjMqjsVCUUtpLrYpBu4A6PBJGTmQngY").unwrap(), 657515316781), - (AccountId::from_ss58check("4CpERaewvWxXE1mwadTJSPmgPR2Zf2qXnge5h64tNyrs68gM").unwrap(), 7500000000000000), - (AccountId::from_ss58check("4Ci7JUzWU6iHLiigR3yPuoCJw3VSm5GScfYzUkX8WXgrueuh").unwrap(), 552799071022), - (AccountId::from_ss58check("4Hdzvft8MKEeaw5ENspAGKeS6KVDqJGfEu7ypV3BbJcEhkhN").unwrap(), 305884524186), - (AccountId::from_ss58check("4DkyTrGTzzEFP7Z4XqwLnZJt7o8wG3ztdMZNKsiXHvGrsxpE").unwrap(), 1000000000000), - (AccountId::from_ss58check("4H45HxJZE8bbKLAmkRPe1YHhH4y1CEcAaMDHPXR84e2CsZ3Z").unwrap(), 334000000000000), - (AccountId::from_ss58check("4Fn5fAtr5aQ2aVPmEiGZ265aXa59EFuw4MREGt3Vb2wG95Li").unwrap(), 5499417000000), - (AccountId::from_ss58check("4DPBhBcBb69Sn7hDqX5qb9QnNZCDiVFXeC5uWfUBK7CmZ3Gt").unwrap(), 3683000000000000), - (AccountId::from_ss58check("4Fh3eL4bDAMkZWABugZ23J7HCLKhtY4XNeGjcny4WHroLc8h").unwrap(), 281840098981), - (AccountId::from_ss58check("4ENiKh5gw5xhR942you3PSspb6KfUgZf1iDQT6FDi1tNAmTF").unwrap(), 8499542000000), - (AccountId::from_ss58check("4Hb5Vc31DAP8uoYFzwJhPjmu4sg3fRfNcjvjBnNg5NjCcK4y").unwrap(), 2943358818450), - (AccountId::from_ss58check("4FK6SRW8w2nEJHGS7ysfu7w7Pp92B4qxjgunQK5TRMCq6HK9").unwrap(), 151555258747088), - (AccountId::from_ss58check("4CgBikEKqqCQ7tfdwhcuXfobywGrxoC4dmN9kgyvRsny7deT").unwrap(), 52329000000000000), - (AccountId::from_ss58check("4CjpuWqFQCLeJVZ8aLXbh7buV7j7mdkqD1HaTeGeWaoSJymE").unwrap(), 229998576765), - (AccountId::from_ss58check("4EsXkySKfSUkcBDQdobfxiiqYxXasMAAmKswKhjiJXcBmmfY").unwrap(), 4917611212350), - (AccountId::from_ss58check("4HouLkvYLsnoqSR8nTeLj226SvSSSYmE4TSY2xwaMgFRNCUb").unwrap(), 1321094492295352), - (AccountId::from_ss58check("4Cp4mMzne2NArUKn8Xg1GbgMnZXuVPrGtPDSjUncbvUrNuaH").unwrap(), 2700000000000000), - (AccountId::from_ss58check("4HK6FrPkULhTeHvzKuJ3gkzjMkknnD8Jx9jEXX7MwzxmChGa").unwrap(), 150574982419356), - (AccountId::from_ss58check("4EqGsTHW2vhcNwC6qKtCHQYQHTEkwdTM7nwPcgraYfos9VYU").unwrap(), 396007573770678), - (AccountId::from_ss58check("4CN8JtKS2nysJzssqR8w8sc3XLBRbidp5Lqqv77AmSLNoEKk").unwrap(), 75000000000000), - (AccountId::from_ss58check("4Hed9LqfoeiMGGczs7AEBWzUMJgLgUknTSGonGJEiS3qtNtr").unwrap(), 10744762500656471), - (AccountId::from_ss58check("4HofbTqC7DCGw6pESe6xraYq2PbYsz3q4EquSZBnfZcqx3k8").unwrap(), 5849537000000), - (AccountId::from_ss58check("4GmmBosbvGUoSjdCKRLhEw4H5h1T58Y6tAjYfjCePbvLeaDd").unwrap(), 10879000000000000), - (AccountId::from_ss58check("4HY8n3GHFgphhDpjfeNBgqahCRVmDYC7sbWUYZXdE9MdPb4z").unwrap(), 12998668000000), - (AccountId::from_ss58check("4HgfcudaBA8y6BizE7bSCd9tTNs5WQXsf3jATv3AX1ibbUiQ").unwrap(), 4739802000000), - (AccountId::from_ss58check("4FoyG2B57BEDeBY2LA7csA8gYkejs8qVUvWaJ9He17zm9fhp").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4GEfQd1JT2NwhkVNBBWpWi9Jx1yJnqVVp6scCyL8arvi6qLG").unwrap(), 4999677000000), - (AccountId::from_ss58check("4GENfEsY97wNcCz8H1yemze3FLXNnv6qsA5XbinmDRJMcM6L").unwrap(), 4498251437830512), - (AccountId::from_ss58check("4CPS7iSJ97jQNjj4CVCDjeZgWjM5Hv3m88aeENaBykcmkd97").unwrap(), 1000000000000), - (AccountId::from_ss58check("4DA63hMSzN9YmypGn8gzfzgrYrSvemwec4pMVRo5jDQN1Aar").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4HKFSyeMuQmfcoiFEAM6oYH8dCCg3wnTsTp9j266rsE9xerg").unwrap(), 10049677000000), - (AccountId::from_ss58check("4EnCsVdM8zKE1r1XMVTaayTY4xDPtBu57Wi9qQhEWH9FKdLU").unwrap(), 2948052000000), - (AccountId::from_ss58check("4Fxuh9QeA3D8H73DWVshvuqKE6BGM68zB23L1HTBdrC8kA1W").unwrap(), 548183171033663), - (AccountId::from_ss58check("4CXHKZnJT5JrHT4zd5TqSGW2sFuyfXNGQFBfo6erEyNLdnYZ").unwrap(), 150115536291186), - (AccountId::from_ss58check("4FeanoNCAKAWsddMgBJ2hVZ8ArhfefikoTiPLibt6m3H7e6D").unwrap(), 171689064625822), - (AccountId::from_ss58check("4Diu9xVkPufJCVgfrstsePWNmJru2c4U6SvTA9SHTAVTgBLV").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4CkGYoTNPMmpj9fSKstEJk82mzQjxyiofigA6D7ddJL61EQ6").unwrap(), 380618616342), - (AccountId::from_ss58check("4CcghFFtonQDYtHPtQV1vxrPPFcZvSrEMtEoe9eVQAy1T81J").unwrap(), 500000000000000), - (AccountId::from_ss58check("4DASo9VG9rGfL1R2u5fCnVx9Xks9Z8Gba8LGP4dZ2gqw5jcr").unwrap(), 2999677000000), - (AccountId::from_ss58check("4GYMRzEdotVfrqwY2nSUbsJYLBAWiUv7GmBJrNQnXLViX7Gg").unwrap(), 2681000000000000), - (AccountId::from_ss58check("4CEH2FxG27FSQ9o6HeB56xT4HMGcr49YbshFwbBtKYUs8U8F").unwrap(), 1000000000000), - (AccountId::from_ss58check("4F3YapKvGm2cBCo6Rrx7hMBnm3QmfvvetFxka1nQAgko5xNA").unwrap(), 2104005878098516), - (AccountId::from_ss58check("4HKag8hmHTn3PHuhZnYYM6uCCH28zeAZtrpfv8XBWhtSXiMp").unwrap(), 257018353524), - (AccountId::from_ss58check("4CPUD8hHZDczCzViyzRLBtt4RJA3Bpy3FtyT8QaBLhY5CC3R").unwrap(), 5790429000000), - (AccountId::from_ss58check("4EBiYwx8BdMYR3faNVcrtHF2cZyY4UDUzcNd57FMqi2ZoUR9").unwrap(), 8000000000000), - (AccountId::from_ss58check("4E1dkBy774v9fCBKmtQr83kp1fN2prAM8XzNvXkTBsPRZPXy").unwrap(), 4917611212350), - (AccountId::from_ss58check("4CqBNhJiZxbDoAAQf9Yqd5vGERGwCsF8558bGa9MQ5o1DQ2x").unwrap(), 166845845398617), - (AccountId::from_ss58check("4HGLHMnMstdk3KDqq1bWjLJmHSxF249f1923uBxo4wAv1ghs").unwrap(), 4999677000000), - (AccountId::from_ss58check("4EuxeyAC4JvsftNpo3eWQb3TM86J5cy671ViP9qQBdc2gXjN").unwrap(), 148436004615261), - (AccountId::from_ss58check("4Dgm1vXY9y8QrTLJuAPfz1dECHg2hkN4AovMfr81WbTgcBXZ").unwrap(), 10049677000000), - (AccountId::from_ss58check("4GfXNRPK6Ru4RBKnsQwy11UaKjLJQepL7JqsRjYWSCALKVos").unwrap(), 675000000000000), - (AccountId::from_ss58check("4DkEQqTQQifLR16SxFUU97zN2zNzDXweBFW6i6hDbZ1oz5w5").unwrap(), 10049677000000), - (AccountId::from_ss58check("4CZdq8hsn46MqQWt4reKFDJvRM5jkhfgdNJ2v7hG9cevTAje").unwrap(), 1083072489381), - (AccountId::from_ss58check("4EibiTtHRMTHcEWajMk7jYHreUkQXSoCHbB2EncA5MGu3TKN").unwrap(), 788000000000000), - (AccountId::from_ss58check("4CDDTVEesMSTCjKQeMXJdKWSgjWE1vyobmZtTjqubFJirv2w").unwrap(), 332325785522232), - (AccountId::from_ss58check("4FTGFTUGTt7PAeC1sEZFij3fYHmivjgcP7LB6HnxHpDdB7C7").unwrap(), 599000000000000), - (AccountId::from_ss58check("4EEqDjz2jt6nnxtBrmX2JCFEPkMqb7XBN9D4BCoDeqYiQbYe").unwrap(), 314000000000000), - (AccountId::from_ss58check("4EeJUJ3ibBRNTrqNPKKhASachAnUjRjoqbbdpdLdykwKPPxe").unwrap(), 16088000000000000), - (AccountId::from_ss58check("4GC27jMQMM4RLXNz8PUzUztLrw1bEnJg1vm9fAz6ydUETBFa").unwrap(), 2999677000000), - (AccountId::from_ss58check("4Dn8y5qGLFxEE5GP9TRiypKPynh1eDhSmptYm2dJ5UkSAAC7").unwrap(), 63797821179), - (AccountId::from_ss58check("4CZ8UHMFVBFq4dRr2CZketMoWVUMYgbFe9ekA1McjJSkwWer").unwrap(), 649058368127), - (AccountId::from_ss58check("4DCd8rRMry4hq7sSqUkjNLRM1xZiDrDUytRzouRamx5T62Ht").unwrap(), 5849677000000), - (AccountId::from_ss58check("4FzPzPFaghMeVhuFuWgbQ8E8WrenqVZc4A1YejrWZzraJp5z").unwrap(), 18009183802340), - (AccountId::from_ss58check("4FnLFUFjzg15J4ZpK7KYnzpVwW5gskMtFY8hVYbdmFToK4Ma").unwrap(), 2001000000000000), - (AccountId::from_ss58check("4EYooUjj569mPpnUjcMGYn592j8itpgmB4ABpWCbCCwaZCZT").unwrap(), 5849677000000), - (AccountId::from_ss58check("4GR9q3aJHWAwLDBiQGPGAq8co2HYf9go7fGZQU2qrpKNHmjC").unwrap(), 1000000000000), - (AccountId::from_ss58check("4Fc4pJzPRsNF2Xr2eLPuBaCKYMd9gjFW63Ebw4j6oQFfqCXu").unwrap(), 209359168577599), - (AccountId::from_ss58check("4DjTWUZrNHFsneLxpm9D9a1fTwKB3DjGkEcNRWWccmCRHB8k").unwrap(), 11403948724412), - (AccountId::from_ss58check("4FskUMqv9H1FgUp72C1BNnamdjpDk44dhvCSDvRsVSH7qqiT").unwrap(), 1000000000000), - (AccountId::from_ss58check("4EeYmoLGnViHyrm7boPtppw2Bzk2jrit6o3B8GoSZav8NDqw").unwrap(), 834027795882), - (AccountId::from_ss58check("4DZFwhL9PwME4Nff4pJFttu3hqjiypa3RP4im3DTspUyxqaY").unwrap(), 161294317128), - (AccountId::from_ss58check("4FMnoxD2J4p5v6vWs5ai94zHMhG4h1CU6Qx4YgazMfNLnphk").unwrap(), 2948052000000), - (AccountId::from_ss58check("4DsvsVdAxRMhNzoShMNieQ1HUSTe5Aa1PWyMDsYPPAh5utLn").unwrap(), 10049677000000), - (AccountId::from_ss58check("4GYmCsoauPfmPx8iYiQpMbG7dCbYupfCwdJuEqZmV8uvibgK").unwrap(), 149761689700174), - (AccountId::from_ss58check("4E7RAAm7oSzRpeqiND4D6F2x75wJu76WwM3BSZ5q7NRtZL9Y").unwrap(), 272381433431529), - (AccountId::from_ss58check("4Ge5ZA5W7SihDnw2rKWyidu3Y2wgkjHSU1oXa436KpFJdmJM").unwrap(), 768887501535), - (AccountId::from_ss58check("4FrzJ8DyDMfEahJATnL1QVZCVaCVAH9JdgfoaLSGX5vnqTWq").unwrap(), 969399425894), - (AccountId::from_ss58check("4Dbr1f8sxNmdya6XZqbvVPyYQPaMGMucv8pEWKWhnigRNWiT").unwrap(), 2999677000000), - (AccountId::from_ss58check("4F6tXJNmEdnkLzPApPb7LbRgYkGYUEf3vLToeK3EZcTRdsrD").unwrap(), 82201303536179), - (AccountId::from_ss58check("4ECheJTxAY3WupypZKfbaK7RKQ5dQDww7epfzeN4Zk7ZHJTM").unwrap(), 4999677000000), - (AccountId::from_ss58check("4E3iiPXiYXRpC9ywrrUEuoKoKrGjT5NzXHq7X2kQfV16tLH1").unwrap(), 10000805000000), - (AccountId::from_ss58check("4Ctgd1XQp2duhAwsErggtmWcVAeaF9a78PaYs88pj8zULn17").unwrap(), 152308362478354), - (AccountId::from_ss58check("4DxR7izP239DA8z8R2kgJHMYVzAfGTfcgUqa1SE8Z1vWmTst").unwrap(), 5450121000000), - (AccountId::from_ss58check("4HDxnx5zyBW76gUiDDT7N1v9DwoKxiSLptyPNexvmJHxQTLV").unwrap(), 4999677000000), - (AccountId::from_ss58check("4HDscD6WtsW6aXjbjHPDyNuj3SZGT43k6WwhzhWNQjZs5jfL").unwrap(), 2375671439495), - (AccountId::from_ss58check("4DRnnWYvyEdLbprACWLMhjtKjNep4JGjrt48PavNAFogC3t7").unwrap(), 2499531000000), - (AccountId::from_ss58check("4F6iQQfCmbmdHz7LVR4VkbP46BVUeiD5s9bUiNeLzC5fRxFX").unwrap(), 360307000000), - (AccountId::from_ss58check("4CaCRZa7vQontdM9uFLfFaou3jG6Wf963YTQszPLaasu93FV").unwrap(), 138047626455), - (AccountId::from_ss58check("4Ee1beaRL37ra3Ccn9fLEcHikjVNEo69Rxdn1Bg4YNd6PfWM").unwrap(), 445575082668), - (AccountId::from_ss58check("4DX45hfXh5MN8bHAF9dnSSsjFxjZgdyh7GANYaYPX5zn3hBc").unwrap(), 615857301588), - (AccountId::from_ss58check("4CecKqRhMArCpXNw4pWGyWfw5hhoGthkGpoLzZQYfrNscxrg").unwrap(), 4999677000000), - (AccountId::from_ss58check("4HVBroTZDr6tivLKeBAK8CdxF7DKj5sGJv8iyG9zog7mHD5k").unwrap(), 152557922187161), - (AccountId::from_ss58check("4EekbS8C5kcSSQvH3iYkrQw934eKkMSFNVxdCWnAqXtWXXxW").unwrap(), 1999341000000), - (AccountId::from_ss58check("4F3kRpcwWxzwZmM3G542mvBThApdhiPm8dMAoYGy3zjhSXBb").unwrap(), 1184152877116136), - (AccountId::from_ss58check("4DWjj2TQA4px7qDGdMw6tKWisME882ZT4WitzAuZpZzHT6iq").unwrap(), 588302549503), - (AccountId::from_ss58check("4Gm4dDKjnWBUSsofztAd21v2LXmKunzwaToE3XZHQZHwXa1v").unwrap(), 243653032340380), - (AccountId::from_ss58check("4Ey9pJtxtEwCyAmggX1LC6emYFp4WTgHPW8HH5hHKSV7ZBak").unwrap(), 9997424000000), - (AccountId::from_ss58check("4HSBf85PqEwTHtKNociSHtpHJx3uCfyPjxVXMBP84A5h3LWV").unwrap(), 440000000000000), - (AccountId::from_ss58check("4HiBAgHHDVNyFcc2QegSwt2ZTsBWmFtKHmtEARD77WYcnjb8").unwrap(), 5499417000000), - (AccountId::from_ss58check("4D7gnAc5Ab8KaxELyyU3urnwB57Jp2BatM51zCFgyYSfHE94").unwrap(), 1000000000000), - (AccountId::from_ss58check("4ESZACHZ7aKQu2eSYDJmv5q4TVsSr3u5VGHj7Ww2f95gF45g").unwrap(), 900000000000), - (AccountId::from_ss58check("4FuEvoGsoARj73AffAxereQTeD1LjGeAru21fHGkxKvFAAto").unwrap(), 5849677000000), - (AccountId::from_ss58check("4HQk933sAspxah4pP9kHmxLZNHjxrFLa1vM1VC4ESsSLyos4").unwrap(), 999692000000), - (AccountId::from_ss58check("4HG3DBf4rMiWCSmpUPzC4pdLaQU6mSUU76D8929xYMEm12SX").unwrap(), 11000000000000), - (AccountId::from_ss58check("4CfakuRVDjvXaknzmbCiqEhAnKNXgWZ2wZmT6mFu9agErdwm").unwrap(), 5000000000000000), - (AccountId::from_ss58check("4Ev6PNyEKcneudZhSgs6of2HcMUiqU3wNG539z3Et2WZWyHM").unwrap(), 451929748314), - (AccountId::from_ss58check("4HftSNjaEQk2S6Qct2z4WmaRDEZL8VTR3EDxYx8SoJXuQMb5").unwrap(), 154752963725766), - (AccountId::from_ss58check("4ET6erffN6gfWm8Nc7C9DV7XT7fWmKULwZmTT1xHkDF6jYtm").unwrap(), 6000000000000000), - (AccountId::from_ss58check("4HTNYQYZ54DdRFER1K5uaejiUUfdP7DKhSfWoWeogEmMLw9b").unwrap(), 2999677000000), - (AccountId::from_ss58check("4EeNGCeLh4cV2sqGxCzD37Po5kvkz8fHmn5LX2Fq5wCsR492").unwrap(), 322045448768), - (AccountId::from_ss58check("4GdtYndUZrDiwtMkrSGYEUqcnbawkbcfVFkzKPg1UjP9xveb").unwrap(), 404288383730), - (AccountId::from_ss58check("4HK3FsKZh1pTf6HXz7deGACrY58qHuZJwA9akzYokTDwJfqQ").unwrap(), 78780188037420), - (AccountId::from_ss58check("4DqmESLeN1fFpQCCq3atexQDKXP2iM3YkW2o3ihfgPKioe2W").unwrap(), 343536203672), - (AccountId::from_ss58check("4G2ecTzysJdtcFWUtYzDBcePdgg9fEWfX1p9phYnNpZ4Em9A").unwrap(), 4632000000000000), - (AccountId::from_ss58check("4FxcHjWdJs5wzRfic3nMFpZ2FkF5by48CWBpZ7iDVMFUctJb").unwrap(), 58657586509699), - (AccountId::from_ss58check("4Ed2CJwWCi7Ee25tg1UKDWS8BRbewR6amRH2M98itC5sQKvn").unwrap(), 8312667677024), - (AccountId::from_ss58check("4GJr4u4bKNMPTdDSCPhnHhEiktBpnDSyu6NW9fatboqmPXZs").unwrap(), 636780714034102), - (AccountId::from_ss58check("4H33ctQUCpVr3b6BC6DBxA2Gg94hfo6gJ3RhB8s8YrQ83C7s").unwrap(), 10395000000000000), - (AccountId::from_ss58check("4GK5E21trpNQzphmu529mKkTU8x2H4znrkLpj1oc8u97JLDG").unwrap(), 122353344793203), - (AccountId::from_ss58check("4HJvUY38DcFAnvpGSrcGfLNbhvKFvks4Bz8d4bRy5pm3gVyP").unwrap(), 5499417000000), - (AccountId::from_ss58check("4GdM2ZgDA4DH2w983xJQ7wwtzMFPWyMcU8MNgg7DyVYeVYRd").unwrap(), 1666948852481827), - (AccountId::from_ss58check("4D3yHipNkkTgBZU5GnDucbs6w49qFyBuWDP6vRhaCa8inAWc").unwrap(), 1000000000000), - (AccountId::from_ss58check("4Hibrtt3sJ6q43kzX3tmPMgZxwPLwKgGRrRMWhUtKbM5toY1").unwrap(), 999558000000), - (AccountId::from_ss58check("4HpUqReRtXTy3MRkDEsvmVtA1sNiwGfNS1M2kxQK9uKPzvLR").unwrap(), 10049677000000), - (AccountId::from_ss58check("4EqKbUige6XdK7D2EosAgh55CQB5KEsi7jydJE7xxtJbCTH1").unwrap(), 5499417000000), - (AccountId::from_ss58check("4EMBvcJGQHSbU8DnoFxC6ekQLJ1UMnKPbmWZtTNuUKnwzMKC").unwrap(), 269000000000000), - (AccountId::from_ss58check("4FbNi6cr5PBaaM1BjfAbtBFaKGWE5RuDTGrdHNTmfDFmmVb3").unwrap(), 151728352340255), - (AccountId::from_ss58check("4GNdBENK9Gns4mNcPPNGeQR4NjtovVwXkUtTrBR3YaTNfGrf").unwrap(), 10049677000000), - (AccountId::from_ss58check("4HSKZ9crJDu2FEJjVJKcjqppU36NnF6Ljc4WZiUxpa9fkXJ2").unwrap(), 2999677000000), - (AccountId::from_ss58check("4EYyB4CqLAc2cr4xCwewPeYsjVxRxw3MBFso3pa1NX7AtV3o").unwrap(), 38648244775587), - (AccountId::from_ss58check("4DiXqUweQ5CBhr86XMviFjx9DmQXvB2EVhrvRhTFEenWWy8W").unwrap(), 524000000000000), - (AccountId::from_ss58check("4Ek3eHhocjKJjpWagt15Pw7eUAT9ktQXrEMbhcyGMpn1LHQB").unwrap(), 655816680813), - (AccountId::from_ss58check("4DqVexXjmHrNrFm3NrqHvNb36crje4ujSyR8up9AgNoVjS3z").unwrap(), 492490576943301), - (AccountId::from_ss58check("4FFkxVNboaaBVUKiixYCQe3RdKxkDwYbAXG6NVwijcHZExpe").unwrap(), 5000000000000), - (AccountId::from_ss58check("4DcW11iHsggRYvNeyS45r9DHCX91f3fXARGnhv3McGGrN7BQ").unwrap(), 169498537458707), - (AccountId::from_ss58check("4CpvAfRRMG1jFoQ8ke7PvnkzEZuGfK8XhfVaYw6MWeBZv5tt").unwrap(), 1126599915382548), - (AccountId::from_ss58check("4DRLecDHFFiAB7bwcYaaAT72ui2oAXfKodPZfohX6nwjCAVf").unwrap(), 9908960845547688), - (AccountId::from_ss58check("4DmGRKLsknQNJcvKFkJu2KGhApr8eKaC1jNmoRAWRMxe3ymW").unwrap(), 5000000000000), - (AccountId::from_ss58check("4HBbZDwHcGN8KCgpoFXvU3n13itpyWUpHppPQZk5UwLrgZbV").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4H7qpXWWHJ3VmaYSnApCf4iJMZvNpJBJvxfw358Tu11uAj1Y").unwrap(), 434000000000000), - (AccountId::from_ss58check("4CxoPMT7GcZLEZgJ3CQLbUgpjg9gBfmU9BVBXt8iBLYSrJBd").unwrap(), 6095794000000), - (AccountId::from_ss58check("4F9oUUygXSSLQay1mJvUBpWhd2DibXT9QtdE6weTEst9rfvD").unwrap(), 134556492723), - (AccountId::from_ss58check("4HYXa2zAEP9GmtdEFcKrqTWqppJVAgBLNwiLfG2i2DqJLGck").unwrap(), 232808848117), - (AccountId::from_ss58check("4GsDMWdMNF1W2gWnTmEgVzfgU5dBoC21zirNVHvhHWtgXgxt").unwrap(), 5849677000000), - (AccountId::from_ss58check("4DHxbgxNHVoA9DyU47skwMc5MveGucdYusQiwc2UC7FkW1pw").unwrap(), 4999677000000), - (AccountId::from_ss58check("4Ccm8RNa8AGP9dHxCfS7auqcHHxmwTTBsixd7aHGj3osYWsb").unwrap(), 188949140777245), - (AccountId::from_ss58check("4GQjQQLj8HUHUvhAJoBHQ6RyemeUeJkHueEfCN6ty3SnbjoW").unwrap(), 930324655936), - (AccountId::from_ss58check("4G6w1MiMqQgbN4ntFDwCZmgCBSHNYzWiFLs1Re4FjXaR9wRk").unwrap(), 75384071506), - (AccountId::from_ss58check("4HMkkNnjrSGdZgmaQXj4cCJjf2APsGJ7DfAZAwtWhDa8gzJm").unwrap(), 2999677000000), - (AccountId::from_ss58check("4EFDupMSkddtBPRHEboAj3rDcMxgEGAr9353XYPRNGakMqfi").unwrap(), 1000000000000), - (AccountId::from_ss58check("4GMq4yFW2p6RmRpYEWiRAC4FY3yjfBaHBP6jWUPjY3Q8r9y5").unwrap(), 9461649401001039), - (AccountId::from_ss58check("4Hfpmu2jhvXyTyDkaThM7o3ZctADmGaXhfBcZzXG1Xw5R8Uz").unwrap(), 5499677000000), - (AccountId::from_ss58check("4Cw1a5ZVdoaBvbRzcGrL3uDrzxiAtHBcaF41joQc5s6GHgqf").unwrap(), 153651098285182), - (AccountId::from_ss58check("4GHoAoXXb9tei6aRf1BP6r1o8a6STixGRAND9aafixEcky5P").unwrap(), 37000000000000), - (AccountId::from_ss58check("4GrZkVPSEhMr7rpHrShx13BQYpBpoJHKWS5ajAHwCSfNRS66").unwrap(), 150175286090784), - (AccountId::from_ss58check("4DtLNi6wGX7dRujusa1cNhsB3qVx14NnwKVBWbaGmb8A2Yg6").unwrap(), 10049677000000), - (AccountId::from_ss58check("4H3psxtQd62hL2KbQmZqb3YaZ7BfywS9LyGLu1P2icVugd4T").unwrap(), 96899000000), - (AccountId::from_ss58check("4Ej6RAX9pUpd74GQ12MSoL3hhypFKeb2db6EL36M14mYv3PU").unwrap(), 41000000000000), - (AccountId::from_ss58check("4GdB4ZZGZ3fZRRnMv3MxDdSAsppgDTv9VuVs9CA5CXx2m1WQ").unwrap(), 2999677000000), - (AccountId::from_ss58check("4D7fYQe4tHkedrdqwgkz7eFQgs9tUdHZA2oH8Akips39uB7b").unwrap(), 454419646626), - (AccountId::from_ss58check("4G8tf3S6amdfG6m9tmeAEmiedcf4NkR1HF35Fo1DyNrRNczK").unwrap(), 6456123000000), - (AccountId::from_ss58check("4D24EsxascPGvKrwcWa1TmHWiVDNna3ofmZ6jF51hRHvUTAz").unwrap(), 10247691328803754), - (AccountId::from_ss58check("4FYQpCAMFS2ZWfra3GUYNiFXWx13YUijrdrvsebKws62gGNy").unwrap(), 310000000000000), - (AccountId::from_ss58check("4DkBDnpFJYNJZFgwtJNZUudYFRe3oJkvEjxKN1yZxixf7D3t").unwrap(), 5849677000000), - (AccountId::from_ss58check("4Fbfiz79UvgaRc1kS45wqmaV2TVsCtpm7Er1Ano3cAJFwfdL").unwrap(), 116446091880240), - (AccountId::from_ss58check("4G3CxN1GsNcoT9oXp8FQEYLLKK8UG4YoUbS94sgNPSGB2oqj").unwrap(), 10049677000000), - (AccountId::from_ss58check("4CFpnmQTqAb4c5CEGWMUeH8ce1CRYJzMsTWYLTxWX9QpBgLK").unwrap(), 3167000000000000), - (AccountId::from_ss58check("4H6dCZRwhSJxcxH6KGEx9cDmvdmJyAP1E3k4iB8f1cX1RKVQ").unwrap(), 448073469325), - (AccountId::from_ss58check("4GBiWMyJAt3G83tNJJzGkAYzfDZ3vWh3FkH95wW5Z96auZEX").unwrap(), 15476995000000), - (AccountId::from_ss58check("4Ecks3ugLS1g4f4193tWzhRFwFyBatJweueFAA4ChZhQq6K6").unwrap(), 2000000000000000), - (AccountId::from_ss58check("4FuLY9TTHifF48JyW4fuvFPWKXYWC8dneRC5ycfFLexmH65D").unwrap(), 4696979123236), - (AccountId::from_ss58check("4HaUTA93PA1ub9QoYSM4acMnxDbvbber8EgpjEpCVEcaDzd6").unwrap(), 111641592636155), - (AccountId::from_ss58check("4FEP6LeUKnY2MysSvqjyBQyiYmzUN9pcwBxPDHE4JHUuZP8E").unwrap(), 1934000000000000), - (AccountId::from_ss58check("4DEmgz5XuEe5yn8eypYSgQ1o4uRTYpyLTW1umtG2gz2jmzMK").unwrap(), 560836285341), - (AccountId::from_ss58check("4DhoRNJ5RwqYne1BzEXD85Tka3YQtTbjHWRYZ5rE7dozkxWJ").unwrap(), 2965260335300), - (AccountId::from_ss58check("4EyHSPd8qkjnf2JYYDPb3HB6BsaTF81H7pCVTEsPh5xndxnr").unwrap(), 2999677000000), - (AccountId::from_ss58check("4DuKjxjpgoV4Y6n1sC26DbPe9airFRxcKcHGZUuaiF9mFkT5").unwrap(), 1000000000000), - (AccountId::from_ss58check("4FrppTQo3V6n8t4nYYP7xFaKkgGSpppoa3niML1SzzuYug6z").unwrap(), 1000000000000), - (AccountId::from_ss58check("4ER4sTKV54D7f6hocGPqspqPVUvmp5sSZLKdRvBCQ9LYSdkX").unwrap(), 450000000000000), - (AccountId::from_ss58check("4Hwj8VYkpYzugtW5Ha3yKjsW4oAzTaNCRKu15ENmqs8Q1A6x").unwrap(), 852182247148092), - (AccountId::from_ss58check("4FbaHuM7XcMeHHX2Xpxr6TEx7cvwasTFH91asbbsePM2uh5D").unwrap(), 39027458836903), - (AccountId::from_ss58check("4FyV5qrEjkMzxBnmUVLH9tEbTdcdbLwon2mfGPTcuFVDVuvK").unwrap(), 199000000000000), - (AccountId::from_ss58check("4FsiMs9muFZBeGoCShAxiCpd2Sja8SeUUdW52NqTihtjQNgb").unwrap(), 241842816491), - (AccountId::from_ss58check("4CDCk3o9bC7c3mPaEu9wBt2VwZeq9qEJPzcAMuNTztmrwtvy").unwrap(), 444305892512235), - (AccountId::from_ss58check("4CWqwp8wfkRMFPXkjMR8LdC3xAQ547y9c9VV8pGw8cCPYVAh").unwrap(), 36065530421027), - (AccountId::from_ss58check("4Hdzwjkiqh7usJ8Q8177N4hzFdRqdnveYkc7pobnZUrRF7VR").unwrap(), 1006184563064), - (AccountId::from_ss58check("4HdfddR5LZzKgxHxiTZ7SbgPGhVRMKaL7DXiWoJXCJL7asdu").unwrap(), 744287788201), - (AccountId::from_ss58check("4GYxrxHB7y7FfjBdUimkT2uJBTo9xFzp4kxv78zZ7sSB7sD8").unwrap(), 99847241223565), - (AccountId::from_ss58check("4F9XMDGgbFCAsMTnKJGESiy1VYFTre38ExzPCZQa1UCUjZMC").unwrap(), 22848787554822), - (AccountId::from_ss58check("4GgE6dy9zwgLLQi4vQvD9o6phkcBR8xbYiYHcG9to9EK7hqM").unwrap(), 46696690914019), - (AccountId::from_ss58check("4HMoPt4sJfsuqMh5S4vP4Dks2refH8QE4bYwchrSR2xFyY5J").unwrap(), 2999677000000), - (AccountId::from_ss58check("4FxKoEvrSqTRvaK8TMv25tbzpHHCa9Y8MKe8TwwgDoXrMdyF").unwrap(), 641098944340), - (AccountId::from_ss58check("4GYeAghrXH6gE7zLmSPWsomrDHqo79dcHJcNNCrhfYNRh9kt").unwrap(), 189849204764808), - (AccountId::from_ss58check("4HKMB6H8ry7Za9zD4Jump1rzsgSdGnwR9FTUxMRYikcURXaF").unwrap(), 5000000000000), - (AccountId::from_ss58check("4FT3UMxEFVvNpFBDvw32ToyMgBA8UAhkR6zWtgGSkUewktft").unwrap(), 151077030715722), - (AccountId::from_ss58check("4F4CGLW8DVW2X2PAUMpfULFmYy13MKH6EjeJwjC7n69edQTa").unwrap(), 281700219044), - (AccountId::from_ss58check("4Ger1UjsjmRYVE2gF7A9pJLRfUUemQAFsNhygBdRVRdCf6cU").unwrap(), 1000000000000), - (AccountId::from_ss58check("4EEB6Z8M581nZYmmcSQQQpTpSVPzZRbAbpQi5gda4s6pRY96").unwrap(), 50683741479), - (AccountId::from_ss58check("4FmdLSsxhNEFPkW4yw5EBaZJY5C4GZvy2H7rpJ1HS26KAqvF").unwrap(), 896130690449), - (AccountId::from_ss58check("4Gpdzh4j3Ez7DvFQRrVZQEkNu1gJrzBkSrrdsHeomLUgN7rs").unwrap(), 2667000000000000), - (AccountId::from_ss58check("4HVLVL5WWCS4dKDWnG2DxuV1FU7nuM1SqWqqLpToo3xhMHYs").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4HT5Q5ot8mNfCnKE2jhRrhjag2XJRZynobEgZ1yfbvUwvGYz").unwrap(), 100000000000000), - (AccountId::from_ss58check("4HoxdUkmeK6JnnERntwDqXTpG6ZLhn21V5vFXvV4waywJSdH").unwrap(), 554791330673), - (AccountId::from_ss58check("4DM8JearTvSqpWx1KuyHG9eBDSH5aceUQ3bYBrwrqsEbycd2").unwrap(), 187000000000000), - (AccountId::from_ss58check("4HEEiBG3pEYXTkZ5UdiCGRC1nTWbA74dKjCLgCMybitKCnDZ").unwrap(), 5499417000000), - (AccountId::from_ss58check("4HbB31BnuNCv8TV8a62n2QxBaa4YFSPs9u6VS9Lte1owTaYz").unwrap(), 81083058134448), - (AccountId::from_ss58check("4CLWVMuBWVAjdUuWwA6snM2Sz9wZsPeEGZRHJzCwXpgdeo3R").unwrap(), 152366949078), - (AccountId::from_ss58check("4FyZxkcz1DyBrE5Nb3Y6J2kS5ymtwfiscXwe8Nnmzh2AKAbg").unwrap(), 14000000000000), - (AccountId::from_ss58check("4DbksmVSDBY5fKwq839rK93m65WNPFKpBXL7f7dit9Y5aXFA").unwrap(), 5849677000000), - (AccountId::from_ss58check("4GgRyE91yxEQRXq8xBnMV5LcJs3et4KRSjsz3L7EjkLMvWKB").unwrap(), 831898951566), - (AccountId::from_ss58check("4CtMrSR3m7By3L4v4pzQxRhz7uYo99buxeoJJaQit2W5t7Zs").unwrap(), 1190458000000), - (AccountId::from_ss58check("4GGwHNHNptMDEv6awimiv78SArdWZeaDFP7mifmQYrzpmeTa").unwrap(), 30000000000000), - (AccountId::from_ss58check("4Gig9SMP4cMJjtQke5uNPsoky8bSYcvCc3NDDCabmj5Qn9G2").unwrap(), 4739802000000), - (AccountId::from_ss58check("4HKU3EjTuWn2KY4T4xyUXv5iC3WjbAMS7Y923XxuBY5A4Fsc").unwrap(), 5499677000000), - (AccountId::from_ss58check("4FNqJV46pnCvhvbhRSxmvUXLxsTFjGrWDfRAy1UWS9uK5xBg").unwrap(), 150000000000000), - (AccountId::from_ss58check("4HfiSuh7HpYt2rxyZtDQeag91e8parbmyBy6zrph8QTUqSH9").unwrap(), 52137345278), - (AccountId::from_ss58check("4CyRCbksHkTRJz6WGASot2w8QLoQjCXBhroGgDtnNsYRfYds").unwrap(), 3330000000000000), - (AccountId::from_ss58check("4Hott4XcQT3EKRfCqmq1bbZNf59c4Q9LLCc3YYjzfGs9QTUZ").unwrap(), 1085881000000), - (AccountId::from_ss58check("4FLKxT9zJBCFSBpHvJP1d8nwGqttXXpFGesojrLr1WH7HQTW").unwrap(), 694094667649680), - (AccountId::from_ss58check("4DnKwd3o7Uv8zTUi2jtdXryqEyrn1urkacwg7CMhiHR5Uw2V").unwrap(), 999497000000), - (AccountId::from_ss58check("4DvZzm49HJyHr8D9jJrbCCXfmoTf2T6Pirf9xxyZn5mMh3sB").unwrap(), 1000000000000), - (AccountId::from_ss58check("4F24usCW53WVjqqh5nCrmor4KsW8U66FX9UWerV9p1QMU95S").unwrap(), 43510000000000000), - (AccountId::from_ss58check("4DZSBqCtQKVyAps1aLgyr7fEAhy9RSgD5HMsPQqER5Gyj336").unwrap(), 152521762079735), - (AccountId::from_ss58check("4DyA6LbaUAZetML3SWBD3BnuAweSWH1XrT86Ni9CdRxgKo3T").unwrap(), 10049677000000), - (AccountId::from_ss58check("4GAqW7ks7pKaokP6hZffdQPkcs4w7bmfMgdnUXkWNPBt8Xpq").unwrap(), 25000000000000), - (AccountId::from_ss58check("4HdzeNpPrZx2SKAisMKdfuRLPWg3nvEtmXPPuNykUeS9WGQk").unwrap(), 10000837000000), - (AccountId::from_ss58check("4HanbecxpnkQUk8EzQmEfPgVRegrzvcFyNACbFKLh6qEXQWR").unwrap(), 152725923219163), - (AccountId::from_ss58check("4HrTix8KbdVwUsRkfGFhqFrSkneDhm1xqk7Rfm61uAEmnpyk").unwrap(), 2965260335300), - (AccountId::from_ss58check("4EsFADhct69GDc6SY6GVXrzGLgRaSMMG69SMsZuGDbJBfk8a").unwrap(), 2999677000000), - (AccountId::from_ss58check("4FZUTrZHxW71id8eZDKinguSPPc22vX1vf2Bca7vUN8QoBjG").unwrap(), 8334000000000000), - (AccountId::from_ss58check("4FgdidzPxrzm5QS6McdQFW6yUBp8EcSGDeVL87YxPgToXrSb").unwrap(), 150300824514711), - (AccountId::from_ss58check("4GXhf6j9UbhtjGFfiG5b2U8NaKZFZ4WhtGQSpWHXbKuN6xBr").unwrap(), 129447000000000000), - (AccountId::from_ss58check("4F3eE64L3vGHvVZ2JW2U3U49Bgmp6qrxVdP5qaezcPT7Zfav").unwrap(), 1000000000000), - (AccountId::from_ss58check("4ErsDStB1XwXch3tHe6zrW44rWEHocjW5UxDrVL6dCoKQuWR").unwrap(), 1501182327184), - (AccountId::from_ss58check("4Edxn2eRmfEefcLvxLMdExTNHn5qtW8D2BajniNGPUduG1TD").unwrap(), 2999677000000), - (AccountId::from_ss58check("4GuCm9zWiznfhHX4Foi9LH1A6bkH6k9ihqoYWnguYRZ7b6SZ").unwrap(), 5849677000000), - (AccountId::from_ss58check("4FmkaoYdwdmFaXAHPurTGW8LMJBEKaeN14Ve9tvH8vemeKEb").unwrap(), 4739802000000), - (AccountId::from_ss58check("4Gk2nVKVpSwUW6XEUkdkrZwEwWzqMtx29ywdMkJ9gU12aRJV").unwrap(), 956000000000000), - (AccountId::from_ss58check("4GQaDRTKUNmVrXonEPt68pdvicS8HFQ3jTKHWNs5122qvkEh").unwrap(), 1667000000000000), - (AccountId::from_ss58check("4ETWpQNtTUmyuTEp35Wg1viRV2BQZe9uFGT2yLuzmH2Jw7ck").unwrap(), 132784492435235), - (AccountId::from_ss58check("4GXyKvvEeUAK9tu6mFenvQoSydXM1LK6FT761Y8k9C1LM3ug").unwrap(), 442718587334), - (AccountId::from_ss58check("4DdMBxysKMyabbNm3tCtqiUtWYyqvzrx57cyafvd6uZRLxrw").unwrap(), 500000000000000), - (AccountId::from_ss58check("4CzBA888SHE7DeWbDEVDb2jiy7VT3ExVMRPSU2CnyCtuuqPr").unwrap(), 897720594357), - (AccountId::from_ss58check("4CnszL9LjQtrMeZoo5DMUCAKastcNXqHuwp3Z51nDgi1onra").unwrap(), 106388353847), - (AccountId::from_ss58check("4Got4yewinqnavoCjKHbcSEHcRTDVQqsSLxBHj9S3anJ9FYp").unwrap(), 1000000000000), - (AccountId::from_ss58check("4CPkTULMVesJJfmDUebMiNPMQccmTM24msCGPJv4pE4Nfa5S").unwrap(), 10049677000000), - (AccountId::from_ss58check("4Duo9vMSvZYHDUYdvmDRZga39G3Za2Lb8hhanTz2JUKWZGGR").unwrap(), 5849677000000), - (AccountId::from_ss58check("4Fj5NMn7RjkeR4EzBcauqakfvwH1G6TpfvkQaqQ3E35xuuyw").unwrap(), 4696979123236), - (AccountId::from_ss58check("4Fxj3XZjSNb2SC4feyDXtukyPnijVHnKur1XBQFTMc175RNS").unwrap(), 1004585743825), - (AccountId::from_ss58check("4DpCXii5M3snKdZxEkMkqAtxDCpUbxfaj8NC7rh8PSnMt4DP").unwrap(), 1499000000000000), - (AccountId::from_ss58check("4GVF3jm4ZXzYyBAKCR3KDXpB3y25MXuHVWQ8NXzXkMW8hnUH").unwrap(), 712951227041), - (AccountId::from_ss58check("4EfzYVGUw99Zn2FbwJCayAtSL7ufX7D9i8ikqSek5eAyz88R").unwrap(), 300000000000000), - (AccountId::from_ss58check("4GPzxYRFkmM9YiUsz67cftn9bs1SFirgxiSMaZFsnbxwe1ww").unwrap(), 600522812250), - (AccountId::from_ss58check("4HiLrZEgbgQNcVRvMicVx8qx9sDZKna7JwgHfndF8w2Q9W6y").unwrap(), 163801927937), - (AccountId::from_ss58check("4Eq27wsjUqhqKvtbKMkzrCKUDf6CxnSVe8CXV2J2Vvv7f7yW").unwrap(), 100000000000000), - (AccountId::from_ss58check("4Cpv9s4eNhCNuGDyfYkm6ZSrrsxCvevhism4SY2V57p3z16c").unwrap(), 206208671398528), - (AccountId::from_ss58check("4H6XPpFHqifJfnaTeDJHntgKjgagFrP94pXrCofsEcLT8M4u").unwrap(), 148426182504335), - (AccountId::from_ss58check("4EgQTfiyqCcdtNPt3AxrNDmYBfQuPzhwTa5zmVBALbnJNijz").unwrap(), 373893390120), - (AccountId::from_ss58check("4ExedpBWJ2i5vggtf62QGwjrM5QaiCC1nL8yzaL9fNfLim33").unwrap(), 238901294069), - (AccountId::from_ss58check("4FghiywwgNsASrpjzBrtrpRw18VeCxGqL8XDgk9YXW8qsren").unwrap(), 61045198646), - (AccountId::from_ss58check("4EmyDwm16ye1sniChcmJmLRvLfcYyz9BdRigfNCqLaKwWQjL").unwrap(), 298000000000000), - (AccountId::from_ss58check("4GxYT61PUmLbJp7vD8wfkkVZESjmr8w8z7QCazH5VgwpDav2").unwrap(), 763000000000000), - (AccountId::from_ss58check("4FKjc9qrBtqoPNxtLYfgYkhBGstxu8VRtktPNdHDtDN1Jpm9").unwrap(), 25649217600000), - (AccountId::from_ss58check("4EPWvtbKwWB32rKJWB5WX3LsRcm9aEFCCadxZ4cQugbTozHp").unwrap(), 31207000000000000), - (AccountId::from_ss58check("4ENsZQoNHFWij6GDkfsZn9aLS6rQXWwhaMbkmaZdG8ovVin3").unwrap(), 239579030606835), - (AccountId::from_ss58check("4HdCssMtWQepqvmm62CB8d69UwEySsfRDEKWBWSvsz9Drxkv").unwrap(), 3200000000000000), - (AccountId::from_ss58check("4DhCP7aLNz2jypC7uTbAEbtervLHnasjUN55UK2vhmVdDf5D").unwrap(), 496859719152), - (AccountId::from_ss58check("4DPzc5tRVg6eayZouwN5GbmeApYMhbSd2X5Gsz1YU4WPyJWv").unwrap(), 634000000000000), - (AccountId::from_ss58check("4D4tDXGhXACYCpX6wAsqHkWA46T1raRh3aKcadR3GzJ5EHkc").unwrap(), 203592784350101), - (AccountId::from_ss58check("4Ci8QUtRUf4ZjszCtn3qhB7x9KQM3qkaLNZheuj9CUirFKzE").unwrap(), 38369004696232), - (AccountId::from_ss58check("4E9bYZpvKis1EmvqUxJp8r17F9Tnpa9DLQGNap7GmwMqLtvt").unwrap(), 10993144000000), - (AccountId::from_ss58check("4FrmGbuYb1YHp5tB9fhFxDYzxd5GsMZjNsaN18Q8nvqxyaqM").unwrap(), 5499677000000), - (AccountId::from_ss58check("4EJetAYfvfLdZ2wq129zjTNeSW68MH7irHSPvRXR3xjtCLpJ").unwrap(), 3340000000000000), - (AccountId::from_ss58check("4GdJud1tEod3sFffrDrfAYiJQjfnehqpRUHbpEGzTdoKGyTa").unwrap(), 997087610605), - (AccountId::from_ss58check("4FKtExuu8FARv143o4qCX7qVi7z7KRGdwBpQmjmwBx4pSGpx").unwrap(), 5849677000000), - (AccountId::from_ss58check("4EWer7wKmrs96sxiSxskhodoy8dEs1YWqRMi6RQ3yXFCe3vW").unwrap(), 4739802000000), - (AccountId::from_ss58check("4DcLhVAJkcw2wnC2LqJ1kq6PUxupYM2SMGQtHL5LTgEpjDN1").unwrap(), 4999677000000), - (AccountId::from_ss58check("4EuyFrzzoijFcXeVdhnGToWs5DG2gU2nHpz28uuX4wXdBT6y").unwrap(), 2948052000000), - (AccountId::from_ss58check("4CkbaJGq8yUFeAL9VuzMT4oKUecxqDcKorV7RY8ViYCjt7dk").unwrap(), 2999677000000), - (AccountId::from_ss58check("4HW6tXGmGgkN3krLUWkkH8UQeKAFrNAnwXr31bVHXitULy17").unwrap(), 4739802000000), - (AccountId::from_ss58check("4GEQwLshyps1NqFtxmSAxvj3sAoVNqa1LBkZRbGAFfKbvjKs").unwrap(), 4739802000000), - (AccountId::from_ss58check("4EpjZ6f5bFNxCyDEp5AFTpKkRxskYsAGeAiERx8wNp8rrabJ").unwrap(), 644339613553), - (AccountId::from_ss58check("4GNXE7BHz8gxFxhzSTXLU7jM99XeWsv4a6autrJsftFGTF2y").unwrap(), 8499088000000), - (AccountId::from_ss58check("4GDxcVVLRgdNsqvaYn1JbhhZ3gb2TwBCFF6VG1751WR3rjpt").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4GMjSMX1gaFTMXSrpGHYfBAFmUJ22ShTNzpmef1P7mSCR1F5").unwrap(), 907122510037804), - (AccountId::from_ss58check("4Ex9e6mfqjuF7Gu7j619BhzXpVSSnaCMe2RUZStzv3pxzETA").unwrap(), 1906821000000), - (AccountId::from_ss58check("4GiMwJnrJbdx5ajJ8phrP9G1QXXc3MSCBtdKPzfdTs5d4A7R").unwrap(), 4873164860308), - (AccountId::from_ss58check("4GVhRajurXUGzDmE8xk5JbDmTQDrdYDdzZkxDQBZjmaLYB1r").unwrap(), 5849677000000), - (AccountId::from_ss58check("4DNJAvi2ccN3MGAq7MBjgnfxCx2jj4dGtKkeaerJFZNauDzf").unwrap(), 2965260335300), - (AccountId::from_ss58check("4G6SeR7iFfxauRtp4UZVLzL969kCMho5t8VWnHii47iwYDDs").unwrap(), 151182109254588), - (AccountId::from_ss58check("4Fc35Evu2DpUFC8dwhBb7b2sMzbEwMEFWhHG5j5jUNPhucRc").unwrap(), 1030710484105), - (AccountId::from_ss58check("4GKhszAu8AU8SPqUZ3Lty4LGDnZjMKUWZxSBiBEeKnZYDgtW").unwrap(), 899641147659), - (AccountId::from_ss58check("4E4DxHiDfP7px1k4pbHfS2tv1PL1q6zqnyZwE2yQGcxV1i2v").unwrap(), 10049677000000), - (AccountId::from_ss58check("4FwtUJZRNeRRurTYEHJ5ffAT3XNS7VzNcSgQwrzehKdEajEw").unwrap(), 5849677000000), - (AccountId::from_ss58check("4FNmApgqQimYk9ghyBwRWZrrVVZBBUBVZabd5Bf9ZXJtW2Jf").unwrap(), 4999677000000), - (AccountId::from_ss58check("4GPcW33sLXKWahYkq5XEMb7S52QKNneWAV9dxZwPfrvCzM6Z").unwrap(), 3511717218580709), - (AccountId::from_ss58check("4EDRKGX8CcgzDgzX3aRMRESFz7eGGRPunUQjrtfSkGyaQeac").unwrap(), 130000000000000), - (AccountId::from_ss58check("4GVnPy2fDpskjQSypea9J9W5ZK89Hv4NbEWuXvLZcRPkmDM8").unwrap(), 6667000000000000), - (AccountId::from_ss58check("4FCTNDFdY52rEQEogUnXLKPdr1WCEgmrw8GA7gx7mTjjxKCD").unwrap(), 5849677000000), - (AccountId::from_ss58check("4EKdZuW5DLmPVJc5NTYgpynBLEr2ZpVi6p6vcGAosVjN5wus").unwrap(), 29148776868969), - (AccountId::from_ss58check("4CKH9mU8SFCgyu6awzd9DFfmwFa2wPwTVzyy8mGFL1sPdYWg").unwrap(), 1167253623543149), - (AccountId::from_ss58check("4ENmQvD6Q3rBGzkB96hhqMQuhmQ2g85D1cdaK4vvyLpVT5Tt").unwrap(), 2999677000000), - (AccountId::from_ss58check("4GmGZM5f9q15JjLHFvEUJPEJFhFRqEe934uDkQiw5LGjj5ZK").unwrap(), 8097703000000), - (AccountId::from_ss58check("4FajabKKpa26JbJSpo3jCEPJdVkQLGm2XTfs4j87nZSBCY63").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4EHxfKGaWQxjmaJkaG3QMs6VYRerTWHLaHcsywnpE1BRXcuh").unwrap(), 2999677000000), - (AccountId::from_ss58check("4E7E9R4vpfiZLrSQJv3YBv3A5jxZBbHqkxhxwh2CKG1Vwg1o").unwrap(), 999717000000), - (AccountId::from_ss58check("4GNTrp6Wj85MyP5Sr8xCfovJ86FdYU9oiCfC5ZnzTgPJMF1Z").unwrap(), 854310265225), - (AccountId::from_ss58check("4CUdrkbz9Pcubnb7D7y4Psa7B95TNxZ79Xev8hjGtieAYf7c").unwrap(), 856180277642477), - (AccountId::from_ss58check("4EZVPvsiA4W5gbyTSFCdixsmtZiBCzxWstN1eLj3JLLVJ9pg").unwrap(), 4500000000000000), - (AccountId::from_ss58check("4CeNuPAP5Gh57Wnxqn93SjAWANVrJVMwAUUCvhFJH6oDmtD4").unwrap(), 6667000000000000), - (AccountId::from_ss58check("4H39BPYAaCxb1yh3NcK9uGrFUv3wb7XuT23f1midHFKGk6kR").unwrap(), 1667000000000000), - (AccountId::from_ss58check("4FgwZ1pmq6bfejitArPtgALay4sYq2WHbFWgDEiNqGHaP1FF").unwrap(), 58474651830464), - (AccountId::from_ss58check("4CfXmVj4Enx4e5Ucoj6Y9K2Fr4bh3bn6nVZHrAggorH6TSPb").unwrap(), 28470557624644), - (AccountId::from_ss58check("4G34M7f8bjL5DsYivZ3twRJUuX8QG1G3cbfhSrG9GxjSooY9").unwrap(), 2999677000000), - (AccountId::from_ss58check("4ENfujPvsmMBeg6RTcXBwo9rVhkTSTtk1oX4zhxYpQDdTuZt").unwrap(), 127000000000000), - (AccountId::from_ss58check("4EvNzuC7w2bUXPnLKNhSDNVJmvLSTJQPCQDPdtdxKjWD5k7Y").unwrap(), 2999677000000), - (AccountId::from_ss58check("4FT3vrTv5A7DQt5rLhevE5bZCj4xphnvru4u6JGnyNSZTzsc").unwrap(), 235175598587), - (AccountId::from_ss58check("4HQ7DqtU3UX9TApGgKaaWoULnTpARMSXsbToQEvcMcwzvmmF").unwrap(), 10000050000000000), - (AccountId::from_ss58check("4HGaXVNnELLE1GLDGsPxpYswm7dmma1fWUkr2myrxraM3Te8").unwrap(), 19500758064901), - (AccountId::from_ss58check("4H5jdR7G1wRsyZxFC3jcUCKLvrKQEoLsHBQK3uVMMPHmNQJN").unwrap(), 24390264373071), - (AccountId::from_ss58check("4GfuExn7DxvTASKHp4X1CDE3PdjTdxwJyFcn6XmYZizLYXWQ").unwrap(), 58462420000000), - (AccountId::from_ss58check("4DWnjB1WK8PE1sk26NgbVkF64BgeZmFU8V9hnQvt7fsokbva").unwrap(), 3300000000000000), - (AccountId::from_ss58check("4HaijzcsCTayymV5zZPJdPYzwjTfVYe98QRx6R6Zj1NegNE2").unwrap(), 10356865000000), - (AccountId::from_ss58check("4CqdVJc9momYh4sNtnr6nniKudv5MQqpvmY6KW3vKh5uH98a").unwrap(), 4999677000000), - (AccountId::from_ss58check("4GHCXTuCawmLHiJpmSgp7MuD1CAhatuQMDY7uwaS8Ru4kLFV").unwrap(), 10049677000000), - (AccountId::from_ss58check("4ERDG2u9L4YwEtYVZSkRGwuHFSwkoucKphcWd4wQFwhReoMH").unwrap(), 449182999718), - (AccountId::from_ss58check("4EK5VcBU6Th9pnKT3Nc8MgkD9qCMhGsQ9Cj5zZqzppUA8ZSA").unwrap(), 51000000000000), - (AccountId::from_ss58check("4EWQoWoeQWJ5X589ZBvZDomsTvREdsN4VQTZ6J4eM9RSqPB4").unwrap(), 260387844025506), - (AccountId::from_ss58check("4CnQGt7ZEGqJ8ApvgCGC2K7Vc7Uc8W6wRHf9dash54J6WcZa").unwrap(), 375000000000000), - (AccountId::from_ss58check("4GMhempgyH5cHCC38zn2qy2gkASvsk6Jda3Fw3aafDAQuLW8").unwrap(), 10000025580000000), - (AccountId::from_ss58check("4DMVcEnzZga9ECMx9UgSz9bLLbSneaPMmQLnfxEZDgGNvgKT").unwrap(), 1134000000000000), - (AccountId::from_ss58check("4FGmfJRyoLuaE2ZpcfCTKJSn9fgUiN9GmL3RdzLYMHQkzT3W").unwrap(), 76300307759), - (AccountId::from_ss58check("4DWrUxTnb2hZLmgDxGVo9zY4DFa5FU8umYgV1rXxcGZcdN5t").unwrap(), 1722483804727755), - (AccountId::from_ss58check("4GRj7DtoukKQnQf6xnuLX8V3G8uDECXFDZ61nsPUpoWUayLD").unwrap(), 183054000000000000), - (AccountId::from_ss58check("4ENfPrDhcw791cWw4ViGJkXBZjLsQkavwdR5L7x6jABFbUF6").unwrap(), 1000000000000), - (AccountId::from_ss58check("4DrETQgkavE9tZMTqu2mzvpKh9Rcho3AE1owfo4HFJ2hzboN").unwrap(), 1999000000000000), - (AccountId::from_ss58check("4CULe4d81hZbTbLees4iKiHK9HoT6VgDK7Be2CwFaVXgn52U").unwrap(), 999717000000), - (AccountId::from_ss58check("4DNhE5xCrmjyHnZd8VtFt4Eqqf9zNZgwBFb1dDBEJjS4dE6x").unwrap(), 91808000000), - (AccountId::from_ss58check("4HrHk7ricyAc6fetXywckk3Mgbnz3oo4SLNuN2UzPnt33id3").unwrap(), 73947392000000), - (AccountId::from_ss58check("4FvR2S4UBwLvKEheazHEn12KhcLtMZQdkGvdPd3R1LJyM6AU").unwrap(), 16667000000000000), - (AccountId::from_ss58check("4FjPbaEeptXUubzNRNXqqnFA85Xd36xhRUh9Hv4sYHwRFVMh").unwrap(), 5849677000000), - (AccountId::from_ss58check("4FvCxjETd2WQgNdSwwfhR2HouZvWRf93hxEzSqg1cJSs7JX9").unwrap(), 149906790507040), - (AccountId::from_ss58check("4Fbm3sEE2SSsfZDm8G5fNNwJFvy5tdvuhRWUEgkv2Y3WRwP1").unwrap(), 1000000000000), - (AccountId::from_ss58check("4GqsE2zGCtvrSuaRZsb6nTk6AzGriWuaS9vEoEJn94sgJA9f").unwrap(), 1001000000000000), - (AccountId::from_ss58check("4GSmCokfkAwK5TveSyiXa5nS8r7K8Z9GEfdyjwoYsuo3nVt3").unwrap(), 934277592769), - (AccountId::from_ss58check("4FKR1UqJEYxgVHfaTiKqkWeArZKVCfzWeH4gJQEgrqt1HcC8").unwrap(), 4739802000000), - (AccountId::from_ss58check("4FWJ9XP5xzQLgCjrrHDRsLKYEGi6uYkYXsaie4rcWE17BrA2").unwrap(), 13126428715528), - (AccountId::from_ss58check("4GTAVtPnKRXSykgsRuH4XzGa2U5nr1DBLujFgyUc6ymLifac").unwrap(), 2999677000000), - (AccountId::from_ss58check("4CyhLMfWgUh1hBV5xQMRpNt27bfZ2j8g2cKz1LAiDszzdLTA").unwrap(), 100000000000000), - (AccountId::from_ss58check("4CvLmB4t5oi3J2DK6HpSqs1Qt4TNSLhgB3acBqrKDHr2m9KR").unwrap(), 4739802000000), - (AccountId::from_ss58check("4F4SwMwaKmFQLMBSAF1qduh6pKmxcHL2dFK5P9rQYKNucXVa").unwrap(), 899534000000), - (AccountId::from_ss58check("4GuizRRAagXoXUvzz1HgZPGyEtG9NpgHVvaQHPRTEYMtCUPc").unwrap(), 2188053145602289), - (AccountId::from_ss58check("4DvZM4Csqh2ABeKQWS7ezZQBg2Sh6jzDNtXoTKLSZp4ftsFu").unwrap(), 4739802000000), - (AccountId::from_ss58check("4EhPbbDLJepfEdXV2yA1VFcZxX6FhQZEGALFDBRMB2L226VW").unwrap(), 99115000000), - (AccountId::from_ss58check("4DUkK8zJX9GeQnc39TQ94JTSoEWdwz8oQ3WNWuGpgE1ZKLQA").unwrap(), 499779000000), - (AccountId::from_ss58check("4ERZznygvZPi2W67BuDLRfiRQsy356j6QGcn533VmYEaXA1B").unwrap(), 2999677000000), - (AccountId::from_ss58check("4DjohM8jb4frM15ogKtAsyK1XfH6xgSYEpr7qPLcGna8oRrT").unwrap(), 20565997510000000), - (AccountId::from_ss58check("4CyT9JoJ5JuDWYzUtDNfcohyo3GqoWtcWpyn8YAUrC139dfS").unwrap(), 7995712000000), - (AccountId::from_ss58check("4HVyfSipCJ3UiaVrMZs8TbAp7aa5MBf6GNPiU397PSxTvf97").unwrap(), 3000000000000000), - (AccountId::from_ss58check("4H94Q9GsBjL2cgdc63C4DDWzoYka6Euc8RK65ngzMHxYWmDq").unwrap(), 13267000000000000), - (AccountId::from_ss58check("4EZBXhNs5vBNVLZg42sT51XtWkbaanSDXtSoG1HALDk6w2PE").unwrap(), 149656398840485), - (AccountId::from_ss58check("4HVR83RSkhPLLX3daWSffVEoYGHgD2BNJybX4qcm1F5L4yWD").unwrap(), 10096958000000), - (AccountId::from_ss58check("4GuTNrRbbXHnaLmSizobKHqgpkfEnPjMxX8niAndoTW6xM8v").unwrap(), 11434000000000000), - (AccountId::from_ss58check("4FEUSWaPguD8hPesgJ494ekHQJfXP28iZ2iNXCGJJjqb16hQ").unwrap(), 12000000000000000), - (AccountId::from_ss58check("4DwpnFSaDpqibeVXyiebF6rAnuaVfpgm4QVaJuigZiY98Amq").unwrap(), 633000000000000), - (AccountId::from_ss58check("4FCkASh2EpZ8soz41KMNj8KKmNXmV6R6u8TPkgTyLNv9L2aW").unwrap(), 67000000000000), - (AccountId::from_ss58check("4DHQKdmYioRPXQjWizJ38gSJTU3ZhqbrKgqUF1QXQHeiYXPM").unwrap(), 4874692248008166), - (AccountId::from_ss58check("4HopCVvULdA76NxMxC2qSzL8ZJNS9s5uf51xDr5UxefPBe9G").unwrap(), 538622585743), - (AccountId::from_ss58check("4HrZfLCFRztndEuFwyVUTUm3Wv2uJSqFpbPY5qNC7hi1NoXX").unwrap(), 4999677000000), - (AccountId::from_ss58check("4CUJJwspD2NSBrpdSLTmtAwRdCjf1Hx33y2vph2TakszjRFL").unwrap(), 1051436581678761), - (AccountId::from_ss58check("4EZb6aexztTuvDitviMc8Yt8ecuKxjiHC6SRRD6ZrJtaM4dx").unwrap(), 8099631000000), - (AccountId::from_ss58check("4HbPh9KtUoZDQ1j4NwmD6LYeqrYAFUUAaN3wYLq5RKzmtwpS").unwrap(), 2948227000000), - (AccountId::from_ss58check("4DS6LNrnV3J9TVYjrVYbirbGtQxwEktDR8Yndvd3mVpB8NLi").unwrap(), 687284938610), - (AccountId::from_ss58check("4G6fSZRmF8GgdX8rduVL9p492bYxDu9uWs1Rb4T5RcZYuqRQ").unwrap(), 119090937544), - (AccountId::from_ss58check("4Gqp1oAnWVxfiC3hLQK2NAZ184gg1Y1pghHXQGdUKM8Vx6fF").unwrap(), 1000000000000), - (AccountId::from_ss58check("4DfHXdBZ4HYteqzmi7WV4jXp3jMh32LKAsyNsif515jmgGJg").unwrap(), 597228508975), - (AccountId::from_ss58check("4D7eyXTexbuDhKUrTCYZwrjBnpYtx4cLBRXbgJmBp57PPvZg").unwrap(), 994361858936), - (AccountId::from_ss58check("4EKVFPdMERjwSbjff4VVuH2ERotHpZvCBmixSaovAwYPGcNg").unwrap(), 97060000000), - (AccountId::from_ss58check("4DuQexqDeRWb46yuCAL8CvymtbG2LZTF25hsTSmgt6LPPJTR").unwrap(), 135000000000000), - (AccountId::from_ss58check("4CLgstq2jkLkzhmycgGnR1kmt9zkYjkTg6NADhPta7ZNxX8F").unwrap(), 62465435958101), - (AccountId::from_ss58check("4Dnuz1yr6ZRp14GxhRaMjMVEWAhiAWuEnsGyRMJupncEJM8d").unwrap(), 5849677000000), - (AccountId::from_ss58check("4HSACCGhyUn6b5yt31ftBqyKtGTXQ6S2qVUKhfdeVSD1hn8u").unwrap(), 1000000000000), - (AccountId::from_ss58check("4Epk3jW1aQJL1o99wEaNPWohfxUWLG6e88Wp9mtu5wp9ZrNk").unwrap(), 2113705000000), - (AccountId::from_ss58check("4EyF5USuQb7XchWVFfLyTFyUvWsHuqn79j1yTMQEerpYxbU1").unwrap(), 4999677000000), - (AccountId::from_ss58check("4FNESC5TPQHrG3ij7f4e2nnJsen6gL81dCoXCkupVW7TCire").unwrap(), 339390343019), - (AccountId::from_ss58check("4CuzUf6xCHBBKibgL3ocPwEupTikePifd8k5jazSH6sG1kKA").unwrap(), 15000000000000000), - (AccountId::from_ss58check("4FnZqeRbyii7oxesPi1sNfkkrkfdSk8XKpL94nPZES5yxN3V").unwrap(), 4999677000000), - (AccountId::from_ss58check("4DvyXZmMKzKx1wq6euycNjUUCkv9LEZmb8FHRjx4iq3q2GwB").unwrap(), 40000000000000), - (AccountId::from_ss58check("4HY3XQpHy66j6dq8NXDVANQ4kKXScLvvXC7ViB9jit28Et8r").unwrap(), 98688504303), - (AccountId::from_ss58check("4Cf59CrQ2FLjScbGfoKg1rNvWe2BUZqUK5d5N6ZxzV9rfqL1").unwrap(), 334000000000000), - (AccountId::from_ss58check("4EKxp8wqhA1yR43yCcT2dxZAg7W6NsKYPDdz1wJ6WcKB8Xkn").unwrap(), 3435342179951612), - (AccountId::from_ss58check("4CetrD6gVtvuqmaiWQ5SrruWrhPvqikoTD8owEp9f9MF3kmg").unwrap(), 1000000000000), - (AccountId::from_ss58check("4DZ4mdgwLAxYR9TphNnQPEnHYhJPi1xG6vscsCmbzCGYVZzN").unwrap(), 195000000000000), - (AccountId::from_ss58check("4EEUUVwxBYa4eNTdU3E8rr5WxipXXMFk2F8jWdKzXdjncypa").unwrap(), 2426000000000000), - (AccountId::from_ss58check("4GED1HvjZ6wobCBm8MEbixtaTkBnoziqN3Wk4fW8M2eY93Xs").unwrap(), 2948052000000), - (AccountId::from_ss58check("4GxeZ7Z9c5YgTcsHoCk4S1AG2gVssgfsj47snW3ExotVeUAt").unwrap(), 137465611003), - (AccountId::from_ss58check("4F94QME4iuGFxyqEYqHpP3Qq54p3aZXctVzfGkCZMU6upqVx").unwrap(), 10000050000000000), - (AccountId::from_ss58check("4E7J4V4Y1nCA3djqC9jeKWREWW3Z5K74AcJHsEYyF3A89P6X").unwrap(), 989065523205), - (AccountId::from_ss58check("4GTJj4iLyTY9mogGpfBHQJfziMCWsQZij2gHGMTtDeEpEtcj").unwrap(), 161668611749), - (AccountId::from_ss58check("4FZJBJUkRLmUcosZdvYmMxzsuV21fjExAcTvP7wHpks86k2X").unwrap(), 900000000000000), - (AccountId::from_ss58check("4DKxp3FwZUX7jvX2P4Niza82ABRtBAZFubpVMJm1eTopDUKx").unwrap(), 5000000000000000), - (AccountId::from_ss58check("4FN6zWwMXfK2Djo8JA39MCqn29C9pf9hudRwcXoxVhYkQRHU").unwrap(), 5849677000000), - (AccountId::from_ss58check("4CCscpsqB5QwMwgiuCP7nTN6E3mXL5fW5J4n77mEenqfzcw9").unwrap(), 2999677000000), - (AccountId::from_ss58check("4Dbxr8D3yRZUCP55rzyXN7PrN6tWH9gJ7DN4tn6XPt1BmxZk").unwrap(), 5849677000000), - (AccountId::from_ss58check("4DUeBxnBv6sgT7FCZ4kAjngK3XC3kk1Fo4gFAs1TwQ564n4c").unwrap(), 862414625562), - (AccountId::from_ss58check("4HmZECfFWWzayL4LXBjXktBx2pbQKMjqFm89XLAL2QGAAR4K").unwrap(), 10049677000000), - (AccountId::from_ss58check("4EAqtYWFvT8gPv7h98jNU4JQymvucM4hjgMcLieqJVZCywmy").unwrap(), 150000000000000), - (AccountId::from_ss58check("4HY5xSuqJMNW9Hdgs18ib3GgNiFn9RuZw6YVFjnRWAscyg3N").unwrap(), 833706855448), - (AccountId::from_ss58check("4EH7FibXwt1FaNcQL9gsiHVxrt5MhG2LVYcut9QxygffKAok").unwrap(), 35432636000000), - (AccountId::from_ss58check("4F8zVavKJXUAzHEPsRM9w8pfsgFue6nVKWP94XGF2jxsTwyG").unwrap(), 84380260366), - (AccountId::from_ss58check("4DHk8U1FF5G5yPMx597WjvGgbuKGwqD5zxQd48UDQtPKTEk6").unwrap(), 5499417000000), - (AccountId::from_ss58check("4GpTsJP4Z6k48Psd2onSzDCLMu1aSKbVHf95okszreAtHUgj").unwrap(), 5849677000000), - (AccountId::from_ss58check("4EL2v5s31LWHDn5tG5HvtPrLtDu1gvSjRBYhoQ9nYd8rxaaT").unwrap(), 4917611212350), - (AccountId::from_ss58check("4Ev1FLS2jgWs7VrmHzvW5ye8Qa5GyTfHs332HaX8mv8qCaFV").unwrap(), 13050000000000000), - (AccountId::from_ss58check("4Dhry5zpjMYmxoZ3YuD55veP4JRUenmboF4kVRXiLBv9KHhX").unwrap(), 2163965691701914), - (AccountId::from_ss58check("4HQixsZpAdhZufVXZKXL9fBfGz4FWXUbiLvNo1atYZfxyiCx").unwrap(), 10537852915210), - (AccountId::from_ss58check("4HJTFZkUCQsFfop2vg7ByRZpsgydnbRqmMRabxXnshQu91sU").unwrap(), 2999677000000), - (AccountId::from_ss58check("4EuhwmvySY8QzNe9eJLdQhoQH2fHDAbSEm1Mc5j8AvzVHB7m").unwrap(), 13049098000000000), - (AccountId::from_ss58check("4HBKp5foaXwUwQdhFcNzaJeBaf53csqA4qaxfa87BpmZeT8W").unwrap(), 4999677000000), - (AccountId::from_ss58check("4E9CHhpRZsmTMnQ4Q2X5U9NYQ3BUEujD73fFtoPpbMnBENcx").unwrap(), 3000000000000), - (AccountId::from_ss58check("4DpeZThK7NXbC8YFxcLPn9fB5YRcFZWKtYFoWqXFvXvYWpEh").unwrap(), 117000000000000), - (AccountId::from_ss58check("4DKpgwDjZGA8pRgxqpWYynFftfDCR7wyaQYWnnHcieZFqtpY").unwrap(), 98967000000), - (AccountId::from_ss58check("4HrSwti8kJBHrvzZ5cYmXdP5o4RwrLhNhpQhQPFV4LDkQMmW").unwrap(), 743756079647), - (AccountId::from_ss58check("4DD3acGzpUQmVpdc32vk2xJwREQwbKnmTkibXZWaHw8uWonJ").unwrap(), 97811000000), - (AccountId::from_ss58check("4DCKUd7kiETmy2PBu7VUGbcMHM4jZqKbPwjkWRBife97nmVv").unwrap(), 333771347965), - (AccountId::from_ss58check("4CPsYPMStkvRFe6NNL59bKFRRCqPmBEtsac4BcouGSsNheGB").unwrap(), 10000000000000), - (AccountId::from_ss58check("4HaJSrydJyjY7MUWkHAiwxrYVGeYVySZKSokCSJ4n3Ssm54Z").unwrap(), 4999779000000), - (AccountId::from_ss58check("4Gud9k4avXBqAvqmdgLxE3rkhsn6jPWqTta3GY1kFm8tFsuL").unwrap(), 1000000000000), - (AccountId::from_ss58check("4G2JrRbU5QrootjnYiDw5UU4GC4HAEQa1AXTLYZVXqnSkjz9").unwrap(), 100000000000000), - (AccountId::from_ss58check("4DvGhgjzUZAvkBVEQ3UKY3qnqiyjP3wRjoPKBVFzDoyCd5KE").unwrap(), 147189144468), - (AccountId::from_ss58check("4F56P7zw9FtYj8H5pLWKDM2MHVZoqpxhhMFaqHF7avzMr2X3").unwrap(), 1000000000000), - (AccountId::from_ss58check("4CUWW8PJvhG9NjEVQpXKkdZDsvee3JpLJfzMGkGMoQSarb3p").unwrap(), 5535721737240137), - (AccountId::from_ss58check("4DHxKwXLYUVxXWD9qtDySY3vQYCQy5iXoU7eDnejckUZxEjH").unwrap(), 217666027971), - (AccountId::from_ss58check("4HVbh3b1i9yQA3dKGvDEcEi4jutAxFP1ACWUAa2Lz8cVg7MV").unwrap(), 1055723387715251), - (AccountId::from_ss58check("4EZWPJYHyBnzxp3NZDgvtgYu1fucP487977MvcN5HfaSXYeR").unwrap(), 151819552833417), - (AccountId::from_ss58check("4DBpFMapPk44oi8FSXpCKpeVcEXsqH59q2jGpMLmwgVw6gZ3").unwrap(), 817161652112), - (AccountId::from_ss58check("4Grwfm5tX7AtxbQMUEv45GHT76y2UCs6PKSH2KbxKNiX3VP6").unwrap(), 146400000000000000), - (AccountId::from_ss58check("4GKvAFrxSteK7pwUeXqF5gxgrX8u9gYasPHdcsqXd3odgcjQ").unwrap(), 487750474325), - (AccountId::from_ss58check("4CZijNfo4sfSJR2fJcgAwLXNLfK9rEqNbGDhvyp7jfZfsVps").unwrap(), 560182190074), - (AccountId::from_ss58check("4DZTJkiEEqgKcVNHECKxePtoDa11ur1t1ApJ4c2qWy5MwWf2").unwrap(), 10049677000000), - (AccountId::from_ss58check("4DhMjdrK95CqLZLkHSRjpN5yHmrjNBWZcG6G4Mmxpdj9M4gj").unwrap(), 631648575956594), - (AccountId::from_ss58check("4HTMGNshq7FvwVvPEWAYfMyHDQKZ9G3uivXHHp2gQNGz7374").unwrap(), 21998768000000), - (AccountId::from_ss58check("4HYmUEB5u3J6XyTu1BgVJXNouKmyzGKC1VZt2P7qzKU1a2XC").unwrap(), 657616856379), - (AccountId::from_ss58check("4FZJnxY9k4t6SdQYgKANfXSCw5BdXUJ6SPc2cusdUSsdQNgj").unwrap(), 10985265103592616), - (AccountId::from_ss58check("4DxLskd7w3ZpdSgf8RhtamYCdPbWAaAuDjZbhHJe3p5kuEEd").unwrap(), 1334000000000000), - (AccountId::from_ss58check("4DXMpKuTfYKWGiYkMAFrao182J3h464krTCXSjxZdooXswoP").unwrap(), 5499417000000), - (AccountId::from_ss58check("4FxNrTo8HUiVtBGMj5Bjr99pdqWZZU8GgD6Rxz7HXBNVJBGk").unwrap(), 2999852000000), - (AccountId::from_ss58check("4HfouAQ8GFtb7d5eQjcrk8cZcss7Lkayy6T6Cbr8YHmg7hn8").unwrap(), 5499417000000), - (AccountId::from_ss58check("4E77deHabiBygLDaPzfu39ebNKKszod1XWHaSDAC1bSQAJio").unwrap(), 3620000000000000), - (AccountId::from_ss58check("4HB8DSsLfZz9SCwMCXYEc9JpP3hXS721ngp2P9TfLvLrmDa6").unwrap(), 149606838757707), - (AccountId::from_ss58check("4Fsbr8DmyN5e6p3Be8C9sASPqma3H8vjqx8RsXHD6LWaNxMB").unwrap(), 2965260335300), - (AccountId::from_ss58check("4GSkmiUJyJqX7Kohk5AnehrHHZeC3meA98doMKMYz16WqB9a").unwrap(), 530277243871), - (AccountId::from_ss58check("4DX6tStgPGv26VxwySq2Wm45v1FSG8oUPSjww2EUKp2nd6AL").unwrap(), 4999677000000), - (AccountId::from_ss58check("4HjKYADRSkbAHcZrS2DHhYv38h8S83Mdj1vbZSMnHjmd5ua1").unwrap(), 735504138543), - (AccountId::from_ss58check("4Fy4w8u8DemrP9i9YVTAzmaPMiwheSEaedK8EAze9SLjigwo").unwrap(), 490666000000), - (AccountId::from_ss58check("4DZTpcowJJKwgW4iN2bM6snC3PbPwvchd6JfBc2GxPPKriiz").unwrap(), 112000000000000), - (AccountId::from_ss58check("4Dy2NPL9eMc245uE87ev4LTG9EuP9fjrEeLpVZ4Cjg6pdzRJ").unwrap(), 71240413870485), - (AccountId::from_ss58check("4EFPiTi1eV87uv5DYBaariF9kf7k1sUxQZaouRAbK7AKvq7w").unwrap(), 835600474447), - (AccountId::from_ss58check("4ECYcg8LZRgPfEyFUWyoGe5bE63ZVd8MvoZwwCg2HMrYAnF6").unwrap(), 4532442815197), - (AccountId::from_ss58check("4DsyJhLAuSm8VW1LWLwhdXWuuJdK8T2eRrhLGYEW4aFwmP5p").unwrap(), 957434340184788), - (AccountId::from_ss58check("4EC5bQgqmBkjJ99Jygpt37btnqTJnGDmCcc1CKQfde9YuCNy").unwrap(), 59374943243015), - (AccountId::from_ss58check("4FiueWs4Q223iyvcYmEUQAJexNXZRQnvkML1sqWxZ8QXuCW1").unwrap(), 6171841901246520), - (AccountId::from_ss58check("4CZrjUyrGFZotk5CF45ZMmCbnh3AuLytGDcVGbNb8BbTjePL").unwrap(), 974162184728), - (AccountId::from_ss58check("4G4D1b2qzi7EfKJmm7X2d9mJEctQrG22j3h4W391uU3BUmZd").unwrap(), 18481996463384212), - (AccountId::from_ss58check("4FJxmSx8JUp8JeHYi66BkVQpxnKnudX2g4NWd1WQ6Y8rxs6P").unwrap(), 1000000000000), - (AccountId::from_ss58check("4HrAU2FtNceBVFez34f7svTsJ8jhiu9AiDSE3393UbsEGvxn").unwrap(), 151489258678644), - (AccountId::from_ss58check("4EENN6wVR2CqMXQLVK7HzdsT96gwCzvCsC7M1osMVmkRedpm").unwrap(), 2999677000000), - (AccountId::from_ss58check("4ExLPmZK7jnAXp1Lj1spghQtgb18TNbB7MJUT5myQzXigJZi").unwrap(), 5499417000000), - (AccountId::from_ss58check("4Hos78a3PeRvpY6uNbER55Fu1xDxNKAsSJyezZamtQSSMnhj").unwrap(), 64444061793), - (AccountId::from_ss58check("4H5vZwwwHSnyMRTtY6ZDXaUydizd2AhJZ2HRj6zWVmmL6ezf").unwrap(), 122215610512752), - (AccountId::from_ss58check("4ESHejS6NFmoYHpiopEBPLg28YX1AsKMwqQEKPZcKAvHvv12").unwrap(), 1000000000000), - (AccountId::from_ss58check("4DFLHdQiXztv1JpNM9Vf1RFgx6z8RwBihF3G3ZRe5Gyec3Sm").unwrap(), 131197756453), - (AccountId::from_ss58check("4G92CcySEqkGHaLa1VtqDDSdn6UcxaBVAczAfR2Hb57Si1xa").unwrap(), 10000837000000), - (AccountId::from_ss58check("4ETXRHCNW3xCf8bcDdEgRdbXjhPXgHbuDxsS3NGsfYnthE6P").unwrap(), 4739802000000), - (AccountId::from_ss58check("4FnMCpYFZzLeVXTiXBjmZyGqcXn97wEzmSRpy39m7YkHgUhb").unwrap(), 1049492556006), - (AccountId::from_ss58check("4Egwk8saQyE2n8haScLDsvYaDGw8sBBSqb3HycsTiodS56Z7").unwrap(), 2000000000000), - (AccountId::from_ss58check("4FZJk4SvHLCgwFKm2zCZnszPpMnjMXdUuW219xcXU1zukdeT").unwrap(), 1050000000000000), - (AccountId::from_ss58check("4H69FdqinwAZVPA3Avac8stokzXyXSKCUfNBSEW3ii3o8hUL").unwrap(), 750261911648), - (AccountId::from_ss58check("4FrvTk624hzDueNRqUhfw3ugavyrqMLKyCrRrByvk7S5PrsU").unwrap(), 25054714974736), - (AccountId::from_ss58check("4E6kGg3hFcUP6sddnZEVDiEDNEaMJRcTKsJB68RCEQeWhjHh").unwrap(), 5499417000000), - (AccountId::from_ss58check("4DCUY5FqNSeGSnZtXgLkEWN7rTB7kZQ9fuS5ZDHVz93nfRKG").unwrap(), 1000000000000000), - (AccountId::from_ss58check("4D8N6Cry4XQhxxqLLPpcjFSA4ZZpKepz9Uzif6pppGzy6RKC").unwrap(), 637000000000000), - (AccountId::from_ss58check("4EbbBSDgrjHW3hc1Pa3kZxHFMhJEjZUfPpSzTuTSs3GxMNVZ").unwrap(), 281446444834), - (AccountId::from_ss58check("4GXvP88JCyJbGJeoUHHqCHrPxVuwfSpqVbKz4ENzuoh2NRRn").unwrap(), 231779730240923), - (AccountId::from_ss58check("4FTwe8W3NTcquX2feJyWFXXqxzkiETcxWMe5fdbJFJ4mTKpg").unwrap(), 212893822297), - (AccountId::from_ss58check("4ELa6ZP6WCksx5vuGW48jYj8DsKmH3y6qmxQzmGoEQ1c9q2U").unwrap(), 147632136397204), - (AccountId::from_ss58check("4CSKToWKGN548z6n3pmDKhtcH5ZdSQ3drDbzrUd31okWMyZW").unwrap(), 573366976634), - (AccountId::from_ss58check("4Et5ZZqPMun6dQKspiko1ErVZRunoQh6pZv1dBQuufQetpK9").unwrap(), 495482399530), - (AccountId::from_ss58check("4DpkrZMh9itePXWuovRmvUUPdUEVbdnD3Dz4JEoNhyxgPT7C").unwrap(), 3330000000000000), - (AccountId::from_ss58check("4CYGkfHQh5y6EaTVxo1X76yfFM1ydzxHaQLditbE7STAJysf").unwrap(), 898413855601), - (AccountId::from_ss58check("4CM8ZH4Wt16fS9J83rmYT5UyiXmS6iTGP2V9i7Z9gMfegCbU").unwrap(), 222934104676), - (AccountId::from_ss58check("4HSi9BJ7PdEQrYif1LfqVHUAkH7g6DvVxrbZ5sAr2XPkH73Q").unwrap(), 434488267867), - (AccountId::from_ss58check("4G6cqQKps6aovmX8bFE7Jc3wu7VWi5YZoccacBkwovybsKaK").unwrap(), 4999677000000), - (AccountId::from_ss58check("4FSXhVsBE6k69wfPKPFm2iucRoqEU4BQmfhQrSyLhHCrPdrC").unwrap(), 324000000000000), - (AccountId::from_ss58check("4DseDSdb4456jhqE15cnS6ftGSCRxkkpRhZrFn81aMkZUhSa").unwrap(), 9997424000000), - (AccountId::from_ss58check("4Gu7h4svSE5h98DFgcLe1r4ygbXX7HreAaeDyFokPFwDXqo3").unwrap(), 2965260335300), - (AccountId::from_ss58check("4D4aA46nJxzRPNzuEY8XZ68t1MtUhuMKd3jGKzYjog3edQiY").unwrap(), 5849677000000), - (AccountId::from_ss58check("4DWau26ewrPUZZXhiZ8gbUckwC9ndTcfxLT8x3JDaeUUjsVr").unwrap(), 5849677000000), - (AccountId::from_ss58check("4GwviEKm7RFvE4vP3S6JaDkaVKXdPmjFiWzjBvkJ6uZyVAuQ").unwrap(), 2999677000000), - (AccountId::from_ss58check("4E7UT1JR7mGWKv9QFmf2RugSyz16WpDnKVDf24cooZE2Eos3").unwrap(), 572342077609), - (AccountId::from_ss58check("4H7VF1LZR5zrUSanxNq3ctWw2NM5gGgno18D8JnumxZN4A6X").unwrap(), 225000000000000), - (AccountId::from_ss58check("4FLuN5s3r2GYMUbGpwq1AMTHBpNNSfyS5U6D2T5YihJX1eLP").unwrap(), 1000000000000), - (AccountId::from_ss58check("4CRtbCvrANVFAPF4DR3VtbGj8jHFEaQwYwVTNAC3BMJ3gb69").unwrap(), 10230686903801), - (AccountId::from_ss58check("4HmHAbGmLf8tnUDUBtZRo9vkxUAo1ggqffdLy54DykkT7ja1").unwrap(), 1017622063156000), - (AccountId::from_ss58check("4Fh6AMT3LCHF5NUzwemkBPX6kYsFYja5bRSk6QP3kL8gG2Rj").unwrap(), 165295562145003), - (AccountId::from_ss58check("4H6ZbkRigNTta1spN8AGfvsc5KmgZN9Fb7kAaufGpQwmHWLf").unwrap(), 2999677000000), - (AccountId::from_ss58check("4Gz2oTBjR8QV9wffDSvLrvUYjS75cHKFd2Gu2hKMUe6J8jY1").unwrap(), 300000000000000), - (AccountId::from_ss58check("4HaoaTo4gi9Q4iegk8J9QSDNW16YzaRn1gkTEL9KrZH9h29F").unwrap(), 5499417000000), - (AccountId::from_ss58check("4HwTXaxzLMjiqHSWdwhYfr3vCWAvkEX58LDjmpY3XFRtwXKr").unwrap(), 853510657974820), - (AccountId::from_ss58check("4ECK8EU362tYywczcmUGDGGAqHQxDtbET1KP2hrBP3SpoiG4").unwrap(), 10000050000000000), - (AccountId::from_ss58check("4E6UEqJGdvuweLvu6y57wCXL8NhH9P2eaXuh2Ppv9Xmuz5Y2").unwrap(), 631591369870), - (AccountId::from_ss58check("4G9JTR5934oPxb5ft1ibJoikTja4AJ2oZWuvLSzX35kiSFHo").unwrap(), 153761683032630), - (AccountId::from_ss58check("4E3e12yHH62Q2pi3Dh7wU6ZxuEFP8p82GYgKyRwBdotCZSZi").unwrap(), 97072000000), - (AccountId::from_ss58check("4EM5hw7mbDxchvTz9QadpZfLx3Mc4ZAYzYQZH4sGErp8g7J3").unwrap(), 1000000000000), - (AccountId::from_ss58check("4CxbXMacCzPDoBSKmYZ7xMqP57tSKTrKMfVVQp94uSck57cg").unwrap(), 1801000000000000), - (AccountId::from_ss58check("4HiEYyuUTvak2FVBGQQnJrwhQXJGnL1Ae9Z3kGMKTXFq77L9").unwrap(), 909765731724), - (AccountId::from_ss58check("4DhkFaUCyR8qWowy8yFWXCNi14zuuQAALDm7TqAXAUiKcf6G").unwrap(), 494470269539), - (AccountId::from_ss58check("4Dvnmoh12b1H2xAZbHw5XiqSDkZf9Z5h2jjiZaJpiHv1QLbu").unwrap(), 100000000000000), - (AccountId::from_ss58check("4D7157to9nV8BaMzzKstwV74c3kMNHbQyrhVPSwtALjzr5Q5").unwrap(), 779631365335), - (AccountId::from_ss58check("4DHq5TADhQFYQTdPBrvG6UP2YFuh3kDSyapv9Mrer3edWNCa").unwrap(), 1898213000000), - (AccountId::from_ss58check("4DEpTCUER3ovziwDtQenMQHmYNFaeuxvTq3gY7mmoGoGq9vm").unwrap(), 3334000000000000), - (AccountId::from_ss58check("4G1fZxz2J3yQiqEi3eJqrqTr9tFVr5gVNPJ25iavnHu7v56o").unwrap(), 30000000000000000), - (AccountId::from_ss58check("4FnCpcH7deQjesbpZ284BT14oUeRTSoB6npavvvdvxZUK8nG").unwrap(), 256966828735), - (AccountId::from_ss58check("4E75WqauqsvdYpt9P6QEoTAzqUpuQuANX5hXN9zi74vQKXKz").unwrap(), 983028529618625), - (AccountId::from_ss58check("4DtPAZ8GmF5NDZhptqZqoAVouEB7JQikLXMtohZpFW8isaqv").unwrap(), 148947378546355), - (AccountId::from_ss58check("4FKv6T9sRh2yDWf3JGdZaEL58EdHzvz4MJeW1CNTUEpkN5ZY").unwrap(), 46506265000000), - (AccountId::from_ss58check("4D22dpz31tuNmZT3F8ZXTwGGGAHgMLUvfsK5SrYGnB4pWdvD").unwrap(), 150000000000000), - (AccountId::from_ss58check("4Hcuuvss3DuQSdgZCisHLoeSyvqqnqjLNbqXBuf9J7LY2PtB").unwrap(), 376847757697), - (AccountId::from_ss58check("4DNXExqYwjEX8dQpE37Ews6dczGb4UqGn59CRy2XG2ujieHc").unwrap(), 139497512568), - (AccountId::from_ss58check("4H9MiUqQfQ2Ppq3zkhBahrWSEAuNMmkjKNmH7SBbQ8G5CeZy").unwrap(), 10000000000000000), - (AccountId::from_ss58check("4HmbxoHPZeyfDHHW4eyuKnCXuEmEja1ESi2VP2WzwPot5s4m").unwrap(), 9999062000000), - (AccountId::from_ss58check("4CiNVE9SHFQy8Undj2c2Q2sekJgFR8QdBj98Ts6xvU5pmdL1").unwrap(), 4996841600000), - (AccountId::from_ss58check("4G9fTfgYAEHMYgsXTtviCeB6JcEwL3MmRxm7S4Jtws7AFvof").unwrap(), 24000000000000), - (AccountId::from_ss58check("4DHqZWwpSKcTqyKUToD7ax5GBhL6yzNDCJvWBFSNWPHV5VAk").unwrap(), 750356378472), - (AccountId::from_ss58check("4HQjaUSL9Um8ufikTj2dW4VVQbAmhPLx8YvJWuJbhtPTGELB").unwrap(), 10049677000000), - (AccountId::from_ss58check("4HpQsLQEm52FSCmsgyGFS95cBNc9ZGyVsK5zJ28bUvpfEUd8").unwrap(), 43320000000000000), - (AccountId::from_ss58check("4EmgkNe8W3xhypsJ3xHnzmV2mqYXSwHhkZtxzqf1cYR39qt9").unwrap(), 869855524182), - (AccountId::from_ss58check("4H2e6FGBjAZzv6uZECSx99XmpzBZeLiEU8AXVit42FLtYTpG").unwrap(), 10000000000000000), - (AccountId::from_ss58check("4E9pofTpvdfbLbGHUyVXUR123yUzxWRxm9wjgdWpWM2KU19o").unwrap(), 4999677000000), - (AccountId::from_ss58check("4HY3yBh5USGeNZmKKz3L2Vxb3MXgmrdzTjhgySvX7ikVP21A").unwrap(), 1970163480325050), - (AccountId::from_ss58check("4DyTidDPHVRW4sF4aECXA3Yy386bS2TXwGomcFquL6anmFrn").unwrap(), 1500000000000000), - (AccountId::from_ss58check("4CvPQdi8FmoJDGaZTgKRkP6AwYsLqBoL86myHhWzQr5aL4Vb").unwrap(), 5849677000000), - (AccountId::from_ss58check("4CPtJq6TMCmzAKgSAnyto1nPdjbovTazQ3MW25ihUz6tWx5n").unwrap(), 292731845273), - (AccountId::from_ss58check("4EwVxJ78jHNkHiGfPAARsDhEqUMR2JF5VWXx7cG1GK1YKKED").unwrap(), 695604449878), - (AccountId::from_ss58check("4HBvHwreGZP73hhhfj5Ynj4GXk1CunAvtTsSFq7qWBJHTgiL").unwrap(), 29380000000000000), - (AccountId::from_ss58check("4GKhsQtAWC5YyyEdMchBfrM32zfGo65Wc9ty1c4pikqQL1qQ").unwrap(), 3133136574893896), - (AccountId::from_ss58check("4Eb6n818d8Exj4aJ6vYTjDqjYuygYqJk4GiXVQBLpi82xPb9").unwrap(), 10000837000000), - (AccountId::from_ss58check("4DtFsRppFJEMs2ELSbU4Bo1quoAAUJZZrmAhJqSHiAR4WhG5").unwrap(), 5155285000000), - (AccountId::from_ss58check("4EQVq3uugAH89Xy2px2wB9WLh8Ex2jYVChBa5cQbUo8eBamp").unwrap(), 1000000000000), - (AccountId::from_ss58check("4FgFmY7N4aPQ1DXCawgbWxZNff2a2y6FpAzRrqLsFaTuKzTm").unwrap(), 5849677000000), - (AccountId::from_ss58check("4FspoSMsNZt9GaD3Yj5hs9zpCNtq2pckjxMkRu7kDBeXVhh3").unwrap(), 489576755650), - (AccountId::from_ss58check("4FTadUW6vBJxaQK8HV5sk7Qgfk6e5UaffRETP9xiaiN6hFZU").unwrap(), 2999677000000), - (AccountId::from_ss58check("4HHX52cvudSycwYouU5Ya6dhvGnqAooLk3ij6VanQK2q1Lku").unwrap(), 50000000000000), - (AccountId::from_ss58check("4HaxytuzCRPQ9kdoUwLpkVHRNTw8wjJ1muym3CcRt8MUo2E9").unwrap(), 2999677000000), - (AccountId::from_ss58check("4Gj2AWCH3fAa82ocd218sJSMbxqvLfbWqNv2qU2vYn6CT3g7").unwrap(), 7999778000000), - (AccountId::from_ss58check("4E25Abg9HRf52xUbyK1GjprAVa9BxRWGMt2Eo81XRQxoVgUu").unwrap(), 785264718476), - (AccountId::from_ss58check("4CCW6yRr2Q9Kxk7muzstrfsoomdPLGAMz7SMYp3CBhbL57Gd").unwrap(), 214852579972), - (AccountId::from_ss58check("4Fpc6RVnQCrZJbBqrYJWXxTcLpSGYxPEqk4smM8H9ffSfNHd").unwrap(), 1454974126927130), - (AccountId::from_ss58check("4EA8UTuRDwZs8S8EeK6xpDGHJXkedTs3q2guvnY4vR9aob2p").unwrap(), 667000000000000), - (AccountId::from_ss58check("4HKSCV4MEFGBLyK53wZ9rNAA9HVYeh196yYZYHboZ7FPnXDF").unwrap(), 1999677000000), - (AccountId::from_ss58check("4EmtisHiFMkozRzGRtzJjcYUCzsBw3nBLiEBMiTfLhoDQ9eN").unwrap(), 2999677000000), - (AccountId::from_ss58check("4CLJLEcn15mSyN9C9EN5fdTjtiREKSyTg4LhBcpmD2gZTYNe").unwrap(), 8631643000000), - (AccountId::from_ss58check("4Hw7RDQHx4uF6ZabQntVyjccYX23JnNLXyqFyj8ABAB3NTcP").unwrap(), 33667000000000000), - (AccountId::from_ss58check("4F6EPMy76vcv4hMk9YAb7bmGDfNTZfvHp6cuuFV5zzopktLr").unwrap(), 152760059369958), - (AccountId::from_ss58check("4DqgCYo7DjDUwcFva6zJp9wyuwGUJPV17iWzm4eLqZqg35aC").unwrap(), 1000000000000), - (AccountId::from_ss58check("4GewpTSbK2mzMyWvHb1kH9tUEJhq4Pc4CBrZucRzKQbDiHJ7").unwrap(), 74000000000000), - (AccountId::from_ss58check("4EALjkK9ezAenttLbpEgYp1dYBmaZqSKCitcsHxJyNpZp14S").unwrap(), 5347778609981106), - (AccountId::from_ss58check("4HaXmCAFn5GDa45RZrLn8UwrKZfwdsebJJAyBU86TJ9PaRJg").unwrap(), 4739802000000), - (AccountId::from_ss58check("4CRDwouv3AmUkraeifKfur69vJpMLTYrxnqmZM3wQprRhwqA").unwrap(), 2999677000000), - (AccountId::from_ss58check("4FWFojU1F19u5wpWtT8hR5CMY81taNbenrjBYKPrj1TdcDj4").unwrap(), 2999677000000), - (AccountId::from_ss58check("4GT4Tum5kDfxGjvXFBXRsFrvdLm4qGZfAtHe9WQEafy6pRtb").unwrap(), 2700000000000000), - (AccountId::from_ss58check("4HrSbCwxshwJeyKH7SxcPuJNkFn94JUi6wZT4AS2tZ9kRpxT").unwrap(), 48094628992913946), - (AccountId::from_ss58check("4FsCCbmZTF3WeJ4531qvHT6zLV5wTNpNzkCSZYxP1DouCNmo").unwrap(), 548853387953), - (AccountId::from_ss58check("4GuCRr4bWtBYTqd51N2M7AuaD7v5yE21W7yMnRY3CpJFr8Sq").unwrap(), 5499417000000), - (AccountId::from_ss58check("4EkdGJifJaur1Fcmxrp5c1YSCsngegdfX6FVij8fAnjWnRkw").unwrap(), 9000000000000000), - (AccountId::from_ss58check("4G998fCTb9gYT9JfsvCfVGmX9Wy84cWe5fsHXNC9i7nDHa3U").unwrap(), 2999677000000), - (AccountId::from_ss58check("4GUfq3YkwQqrRzDRwwvEfYVN9iSFxKFCt8E43h9rD9bmgiCN").unwrap(), 650000000000000), - (AccountId::from_ss58check("4G5pDFf7V35JKL2GnEV1yDvhAZYHDEhMRDkeLpx9j2fXswyN").unwrap(), 2247370264834), - (AccountId::from_ss58check("4ESrvoVnr7Cqs4LGCBfLfb4pdQPCHQwPNN9rZisGRRhL1CXo").unwrap(), 334000000000000), - (AccountId::from_ss58check("4DWxjMVg4RpLq3rcfcdTWdmdRM3LhKSSBCWUR4avVSYfMrRb").unwrap(), 9000000000000), - (AccountId::from_ss58check("4CRYaQ2SdjQGNK9nAw2gWdQfNCJR5B7cDD6kCdknt3Sah4W3").unwrap(), 4999677000000), - (AccountId::from_ss58check("4F3eEGcjrtxLop6sYsA2YWT6pmGPKpwW2LVAgQqJ2dWerzo1").unwrap(), 718712544511), - (AccountId::from_ss58check("4D9LPRaPCfixPcXJ1NBem1UYoUqj553C7Ap3HLdN98Qw6nd7").unwrap(), 180000000000000), - (AccountId::from_ss58check("4HiAvfUPnFgrr6f56uustBv8WScwRz5dRD1Y3khzKAPwT7wo").unwrap(), 708877841254), - (AccountId::from_ss58check("4Fj3hjw9j5qejtGJtpL5UeQMaehUMDbHTjZpYowrTxk4EV2R").unwrap(), 153468459825450), - (AccountId::from_ss58check("4ELNXo3omy1PrGiiQMEJPDrKjpLEN4BJsxM9JaXECQatA3zW").unwrap(), 763055511774), - (AccountId::from_ss58check("4CqB2NzmhYshdPPtoYsmLQvXCdYCVaLVgGRbRhu3gNXEESvu").unwrap(), 450271839549), - (AccountId::from_ss58check("4FeU52PE9yfpgxiaALS8yacVfJRbkHvZebz6y2m6ks8VXqtA").unwrap(), 1000000000000), - (AccountId::from_ss58check("4E9Z57gB7h9vv7wTmbFB1VJAozri1rnP7EGwpiGhZveDg27S").unwrap(), 2499854000000), - (AccountId::from_ss58check("4CpvAYf3jPJngm94BTengtAjUZMapThmFsFx4G97Wv62TM5z").unwrap(), 10873239668000000), - (AccountId::from_ss58check("4D29z1uqLEbdEEWzSxsdvd8PCxcgkSeY3psMs84ddgvUMzZf").unwrap(), 2948052000000), - (AccountId::from_ss58check("4FBUyudrkMuZAByZD1oRfYAyac1JLmAayATPRRzv2FYqHnG1").unwrap(), 546197006533), - (AccountId::from_ss58check("4FshirJg4RuaPPVVxcHA5pCX7f1oAob5nnEmQboNVaZmoFcY").unwrap(), 5849677000000), - (AccountId::from_ss58check("4G7uwaZuhDYweW1h1Ef2zrY7D48y4qu3Az8JPepFLSkR4mYG").unwrap(), 6667000000000000), - (AccountId::from_ss58check("4HFyLNDgy9Smg8eHtq5zgCHEkzxQxyQDqFZ1fhwr9q62nTk5").unwrap(), 421423172028), - (AccountId::from_ss58check("4HYDiAkhD5M3QtKkLJrX77hpz3B1VRXp9iKEPszPENvoBfLH").unwrap(), 400000000000000), - (AccountId::from_ss58check("4CCPbrMFbNC6HwSdcZF7jwvpsSGtLUR9BsXNMNDUU4dEFdVS").unwrap(), 4858262000000), - (AccountId::from_ss58check("4FYdmvjVkGpQPQ2eHJ9NwjxfEn2zwqSgJZWqPe88Hnz4fima").unwrap(), 565686692595), - (AccountId::from_ss58check("4Hs93CuK3LUNEEhXCn2tcR97NxRt2AKD4cgWUT9aaraNp7vp").unwrap(), 2762238056961793), - (AccountId::from_ss58check("4D6izGbu1m5zMTkASekXnKSW9RRTqAKABZCKh3sCLf2yZaVi").unwrap(), 262419811769), - (AccountId::from_ss58check("4E7SBK2wsra83X92to9Yk78d39ac1Cqbbmh5USPD5btwzvH7").unwrap(), 647743658008), - (AccountId::from_ss58check("4CVAZrLcXKx3TEHwezkUgEiuubwDrBWmh9iuMYNx934Yp9xx").unwrap(), 41250000000000000), - (AccountId::from_ss58check("4DUGMq5pVGkzREieNLWHyQePxxzsKAFQFDfmQ4N6S1TpEZc7").unwrap(), 9999893000000), - (AccountId::from_ss58check("4HmW2eu2PyLx89NZTyLX1PCnWjf2tgTJA9YERFPpaUFrWJmB").unwrap(), 999434000000), - (AccountId::from_ss58check("4E1ZSfbjrgWJaN8iVqbG3BJBp8htXXHRYyWmV7dLjww5BJ2X").unwrap(), 23346000000000000), - (AccountId::from_ss58check("4DkAnvxYQuTEkFXbG8kBvEzGdWC8eUYJQdgcmyH8aPBf8pqB").unwrap(), 4739802000000), - (AccountId::from_ss58check("4HDfpwhxB8sTKiLC5dtoGfaRE4KNh17LZU9Cs9zXWf1yiekp").unwrap(), 4917611212350), - (AccountId::from_ss58check("4CkcajUxpsvvbjKUCdjjkgJPM6UqQKMyyfyEJKvMrhA9mcSg").unwrap(), 592559399240), - (AccountId::from_ss58check("4FN8phhjdcpctBpsPphyz4GCM7sNkBxnXz8a59p6Mc1gLLBa").unwrap(), 606160865075), - (AccountId::from_ss58check("4Dp7THQNicUaEv3aaj7AL8SsyYv3hCdrexi4a3FgmUkDUmHJ").unwrap(), 14000000000000), - (AccountId::from_ss58check("4G3eGBnnVked2T1bmRUqAxm73m8HohQu4HUnERumHqeogd5U").unwrap(), 4999677000000), - (AccountId::from_ss58check("4F3pk9VecUBUjCX3zFhAt5FjfLzonwKQEErpSiLhREBUtH66").unwrap(), 2999677000000), - (AccountId::from_ss58check("4DzbkBraL2n65udojULMmTY1uib7oK4jexMHB7q9dNvM9XfN").unwrap(), 4500000000000000), - (AccountId::from_ss58check("4FC7atiFxqpcyiEKRftwi9JS6GwBUM89kyY39qoBwdNGFH4Y").unwrap(), 866940779060), - (AccountId::from_ss58check("4CoMGzzugK9KD4LRQYH4o34XYsQ4voyhr4XzqcJAwikUvxTq").unwrap(), 6667000000000000), - (AccountId::from_ss58check("4E1nVuh6DqbfEP29oHnqi6CLKUGktmpwVNPUTUwvzMwvnxXf").unwrap(), 6667000000000000), - (AccountId::from_ss58check("4HY6kNeiPnpGCtaqWUPyMswS4TbLAj7oQhSTNo27X7cPuo1R").unwrap(), 100000000000000), - (AccountId::from_ss58check("4GBTdvaWx6zT8L2CQa4CvJkwgcfJ4Gkcx2kBJFyus9zEekF5").unwrap(), 39988397000000), - (AccountId::from_ss58check("4HivqQDyJsvLHMGD9FwdRjEqg6zjRhw6JvyJfR6tXTfhruBX").unwrap(), 25056755000000), - (AccountId::from_ss58check("4GNXeCUMtXMDBYt7SS1MdXXhhjSMCdA2VtsKaSM4A3ZfVBuV").unwrap(), 1000000000000), - (AccountId::from_ss58check("4EpdVYrUfM5wXWqfXcHDj7EVJK3wNLxgLCgqyUUVn5m2oi9V").unwrap(), 194115371368232), - (AccountId::from_ss58check("4EM8atNGFePHRAmeRVPRJKM46TtmZkRwTvLP89b1vGkqQLSS").unwrap(), 33333000000000000), - (AccountId::from_ss58check("4CZxzJEv448HXXfRag2E3ycctMTFfT82xAM2jYn6uijfAq17").unwrap(), 485000000000000), - (AccountId::from_ss58check("4CJ28FbHJxghwSPGFq23YENVoZ7HmLuhtuxcr4bkCUDbwQGR").unwrap(), 7650000000000000), - (AccountId::from_ss58check("4E7VduvZuxs5wEkuuJPgkY6C8aaF189p8m6U2UZCpCHwhc9G").unwrap(), 23000000000000000), - (AccountId::from_ss58check("4EL3UNfgnkS6zudeDyb4KLJutG3eedqsza2xUnhT6z1stf2J").unwrap(), 148000000000000), - (AccountId::from_ss58check("4CRuCQZ83ApsDh5va5KFq5TPNbDBunaBwHKjMtEYJJw4HaUL").unwrap(), 79540288215), - (AccountId::from_ss58check("4GGdbdFwhufs8RU19E1JnkYC6Jksn8gyjJ2HEqTvzq1zxXo7").unwrap(), 16667000000000000), - (AccountId::from_ss58check("4Ghr5X1NgBfE6uDqfz6KwcH7zF4EHCxyT9iWzCGuJWtzf3QU").unwrap(), 6000000000000), - (AccountId::from_ss58check("4GDqu5qTAuSSxqJSbgGt3Zat81my79Q7jCfuKSbSFGAcm66m").unwrap(), 336011406861), - (AccountId::from_ss58check("4HN8SariJEzheeLj4njVaBYQmkwMQyX7Xqhcpck3s23up3yf").unwrap(), 2943358818450), - (AccountId::from_ss58check("4D78DgdCHX2W2vx7Nn4eCwfqApxtefjbRPVGmFxeZUbwvPQu").unwrap(), 414524141157), - (AccountId::from_ss58check("4DsHtSMssgpPiepYyEDvPK3e3e3pdJtjRwRTNvTSHHkKN4ZA").unwrap(), 10000000000000000), - (AccountId::from_ss58check("4H5xuNVt67cu5eJUmfMHviqc8Gt4nTrELVruiQiFMBt7dSKn").unwrap(), 1027484472139), - (AccountId::from_ss58check("4CqSY1wSZFHEUr2h3yTaZ9w9z3bLJy3SL6jLU4oVuTrG3Loq").unwrap(), 500000000000000), - (AccountId::from_ss58check("4Fj5RqH64fiFHNvhAn5XhRcJta27vxei8o9uJcePRTprdd3n").unwrap(), 300000000000000), - (AccountId::from_ss58check("4FYAz5FQo2o54XKpZtdLtnZbWn7EyTcGNZk6Rz9JJwP1N7Zv").unwrap(), 183681086280), - (AccountId::from_ss58check("4FvKNvxdVuk58dQr3C7S4gsajyA7egSQJ7EvhWjsrswGCWVD").unwrap(), 660388517564), - (AccountId::from_ss58check("4FYWF88E1SLVDro11MWUnM1oajqx7mymfD9vZhzich57QDjr").unwrap(), 478945039815), - (AccountId::from_ss58check("4CaH1iXgy2DCNQ6qL2qtUUfMsDpt1ARGU6nJ9pu7eyHKP1ee").unwrap(), 73637491340), - (AccountId::from_ss58check("4HaNu8Y58NxN7uhq9FGd7Urra3L4mgYvtV1rToi4CsVzS3MH").unwrap(), 15667000000000000), - (AccountId::from_ss58check("4GN4emu4STMRXzQFtEaGarATpuAWKuDvzVwQeKmJuNzV8zCB").unwrap(), 10049677000000), - (AccountId::from_ss58check("4GQLBvBJof9AbByxW7LdGBYaiNqiE2ENNtwA5ozaiW6F9b5W").unwrap(), 97058000000), - (AccountId::from_ss58check("4EC54PqGRUMd3VYdPttSyjwh5Ehvdc6eRmfXyovgLK1QdxpW").unwrap(), 14978000000000000), - (AccountId::from_ss58check("4CpvAWeJmhUQvPJ3kxDxvHhhXJq72n2pEiNUyVZTsNa8Nfse").unwrap(), 1151518946472240), - (AccountId::from_ss58check("4F94wFeD91TuLGHGVPFf32pGKvSvDjKYtGtESbYQh3aGqDwy").unwrap(), 5849677000000), - (AccountId::from_ss58check("4CL3ygYJWtessGQLEmiB1AtbZe56kzTDWXva6173xmhmyvR5").unwrap(), 2999677000000), - (AccountId::from_ss58check("4ECT3TGxfXVjVJg1RdjnsXN3dQ9ygTLjta5pxsSeTvccnjXZ").unwrap(), 300000000000000), - ]; - } -} - -/// Time constants. -pub mod time { - use robonomics_primitives::{BlockNumber, Moment}; - pub const MILLISECS_PER_BLOCK: Moment = 12000; - pub const SECS_PER_BLOCK: Moment = MILLISECS_PER_BLOCK / 1000; - pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 7 * DAYS; - pub const MINUTES: BlockNumber = 60 / (SECS_PER_BLOCK as BlockNumber); - pub const HOURS: BlockNumber = MINUTES * 60; - pub const DAYS: BlockNumber = HOURS * 24; -} diff --git a/runtime/ipci/src/lib.rs b/runtime/ipci/src/lib.rs deleted file mode 100644 index dec7cbb63..000000000 --- a/runtime/ipci/src/lib.rs +++ /dev/null @@ -1,976 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2018-2021 Robonomics Network -// -// 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. -// -/////////////////////////////////////////////////////////////////////////////// -//! The Robonomics runtime. This can be compiled with `#[no_std]`, ready for Wasm. -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -#[cfg(feature = "std")] -/// Wasm binary unwrapped. If built with `BUILD_DUMMY_WASM_BINARY`, the function panics. -pub fn wasm_binary_unwrap() -> &'static [u8] { - WASM_BINARY.expect( - "Development wasm binary is not available. This means the client is \ - built with `BUILD_DUMMY_WASM_BINARY` flag and it is only usable for \ - production chains. Please rebuild with the flag disabled.", - ) -} - -pub mod constants; - -/// Generated voter bag information. -mod voter_bags; - -use codec::Decode; -use frame_support::{ - construct_runtime, parameter_types, - traits::{ConstU32, Currency, EnsureOneOf, EqualPrivilegeOnly, Imbalance, OnUnbalanced}, - weights::{ - constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, - DispatchClass, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, - WeightToFeePolynomial, - }, - PalletId, -}; -use frame_system::limits::{BlockLength, BlockWeights}; -use pallet_session::historical as pallet_session_historical; -use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment}; -use pallet_transaction_payment_rpc_runtime_api::{FeeDetails, RuntimeDispatchInfo}; -use robonomics_primitives::{AccountId, Balance, BlockNumber, Hash, Index, Moment, Signature}; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, - curve::PiecewiseLinear, - generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, OpaqueKeys}, - transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, - FixedPointNumber, Perbill, Permill, Perquintill, -}; -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use constants::{currency::*, time::*}; - -pub use pallet_im_online::sr25519::AuthorityId as ImOnlineId; -pub use pallet_staking::StakerStatus; -pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; - -/// Standalone runtime version. -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("ipci"), - impl_name: create_runtime_str!("ipci-airalab"), - authoring_version: 1, - spec_version: 10, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 2, - state_version: 1, -}; - -/// The version infromation 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(), - } -} - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - pub im_online: ImOnline, - } -} - -type NegativeImbalance = >::NegativeImbalance; - -pub struct Author; -impl OnUnbalanced for Author { - fn on_nonzero_unbalanced(amount: NegativeImbalance) { - if let Some(author) = Authorship::author() { - Balances::resolve_creating(&author, amount) - } - } -} - -pub struct DealWithFees; -impl OnUnbalanced for DealWithFees { - fn on_unbalanceds(mut fees_then_tips: impl Iterator) { - if let Some(fees) = fees_then_tips.next() { - // for fees, 50% to treasury, 50% to block author - let mut split = fees.ration(50, 50); - if let Some(tips) = fees_then_tips.next() { - // for tips, if any, 50% to treasury, 50% to lighthouse - tips.ration_merge_into(50, 50, &mut split); - } - Treasury::on_unbalanced(split.0); - Author::on_unbalanced(split.1); - } - } -} - -/// We assume that ~10% of the block weight is consumed by `on_initalize` handlers. -/// This is used to limit the maximal weight of a single extrinsic. -const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); -/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used -/// by Operational extrinsics. -const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for 0.5 seconds of compute with a 12 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = WEIGHT_PER_SECOND / 2; - -parameter_types! { - pub const BlockHashCount: BlockNumber = 2400; - 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 SS58Prefix: u8 = 32; -} - -impl frame_system::Config for Runtime { - type Call = Call; - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type Version = Version; - type AccountId = AccountId; - type Lookup = AccountIdLookup; - type Index = Index; - type BlockNumber = BlockNumber; - type Hash = Hash; - type Hashing = BlakeTwo256; - type Header = generic::Header; - type Event = Event; - type Origin = Origin; - type DbWeight = RocksDbWeight; - type BlockHashCount = BlockHashCount; - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_utility::Config for Runtime { - type Call = Call; - type Event = Event; - type PalletsOrigin = OriginCaller; - type WeightInfo = (); -} - -parameter_types! { - pub const MinimumPeriod: Moment = MILLISECS_PER_BLOCK / 2; -} - -impl pallet_timestamp::Config for Runtime { - type Moment = Moment; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = 1 * U_MITO; - // For weight estimation, we assume that the most locks on an individual account will be 50. - // This number may need to be adjusted in the future if this assumption no longer holds true. - pub const MaxLocks: u32 = 50; - pub const MaxReserves: u32 = 50; -} - -impl pallet_balances::Config for Runtime { - type Balance = Balance; - type DustRemoval = (); - type Event = Event; - type MaxLocks = MaxLocks; - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = frame_system::Pallet; - type WeightInfo = (); -} - -parameter_types! { - pub const AssetDeposit: Balance = 1_000 * MITO; // 1000 MITO deposit to create asset - pub const ApprovalDeposit: Balance = 1 * U_MITO; - 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 = MoreThanHalfTechnicals; - type AssetDeposit = AssetDeposit; - type AssetAccountDeposit = frame_support::traits::ConstU128; - type MetadataDepositBase = MetadataDepositBase; - type MetadataDepositPerByte = MetadataDepositPerByte; - type ApprovalDeposit = ApprovalDeposit; - type StringLimit = StringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = (); -} - -parameter_types! { - pub const TransactionByteFee: Balance = 1 * U_MITO; - pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); - pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(3, 100_000); - pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000_000u128); - pub OperationalFeeMultiplier: u8 = 5; -} - -pub struct WeightToFee; -impl WeightToFeePolynomial for WeightToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - let p = U_MITO; - let q = MITO * Balance::from(ExtrinsicBaseWeight::get()); - smallvec::smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } -} - -impl pallet_transaction_payment::Config for Runtime { - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; - type TransactionByteFee = TransactionByteFee; - type WeightToFee = WeightToFee; - type FeeMultiplierUpdate = - TargetedFeeAdjustment; - type OperationalFeeMultiplier = OperationalFeeMultiplier; -} - -parameter_types! { - pub const BasicDeposit: Balance = 10 * MITO; // 258 bytes on-chain - pub const FieldDeposit: Balance = 250 * U_MITO; // 66 bytes on-chain - pub const SubAccountDeposit: Balance = 2 * MITO; // 53 bytes on-chain - pub const MaxSubAccounts: u32 = 100; - pub const MaxAdditionalFields: u32 = 100; - pub const MaxRegistrars: u32 = 20; -} - -impl pallet_identity::Config for Runtime { - type Event = Event; - type Currency = Balances; - type BasicDeposit = BasicDeposit; - type FieldDeposit = FieldDeposit; - type SubAccountDeposit = SubAccountDeposit; - type MaxSubAccounts = MaxSubAccounts; - type MaxAdditionalFields = MaxAdditionalFields; - type MaxRegistrars = MaxRegistrars; - type Slashed = (); - type ForceOrigin = MoreThanHalfTechnicals; - type RegistrarOrigin = MoreThanHalfTechnicals; - type WeightInfo = (); -} - -impl pallet_sudo::Config for Runtime { - type Event = Event; - type Call = Call; -} - -parameter_types! { - // We do anything the parent chain tells us in this runtime. - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 2; - pub const MaxAuthorities: u32 = 32; -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type Event = Event; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = (); - type DmpMessageHandler = (); - type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = (); - type ReservedXcmpWeight = (); -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -impl pallet_aura::Config for Runtime { - type MaxAuthorities = MaxAuthorities; - type AuthorityId = AuraId; - type DisabledValidators = (); -} - -parameter_types! { - pub const UncleGenerations: BlockNumber = 5; - pub const MaxKeys: u32 = 10_000; - pub const MaxPeerInHeartbeats: u32 = 10_000; - pub const MaxPeerDataEncodingSize: u32 = 1_000; - -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type UncleGenerations = UncleGenerations; - type FilterUncle = (); - type EventHandler = (Staking, ImOnline); -} - -impl pallet_im_online::Config for Runtime { - type AuthorityId = ImOnlineId; - type Event = Event; - type NextSessionRotation = pallet_session::PeriodicSessions; - type ValidatorSet = Historical; - type ReportUnresponsiveness = Offences; - type UnsignedPriority = ImOnlineUnsignedPriority; - type WeightInfo = pallet_im_online::weights::SubstrateWeight; - type MaxKeys = MaxKeys; - type MaxPeerInHeartbeats = MaxPeerInHeartbeats; - type MaxPeerDataEncodingSize = MaxPeerDataEncodingSize; -} - -impl pallet_offences::Config for Runtime { - type Event = Event; - type IdentificationTuple = pallet_session::historical::IdentificationTuple; - type OnOffenceHandler = Staking; -} - -parameter_types! { - pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); - pub const SessionPeriod: BlockNumber = 1 * HOURS; - pub const SessionOffset: BlockNumber = 1 * HOURS; -} - -impl pallet_session::Config for Runtime { - type Event = Event; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_staking::StashOf; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = pallet_session::historical::NoteHistoricalRoot; - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = pallet_session::weights::SubstrateWeight; -} - -impl pallet_session::historical::Config for Runtime { - type FullIdentification = pallet_staking::Exposure; - type FullIdentificationOf = pallet_staking::ExposureOf; -} - -pallet_staking_reward_curve::build! { - const REWARD_CURVE: PiecewiseLinear<'static> = curve!( - min_inflation: 0_050_000, - max_inflation: 0_150_000, - ideal_stake: 0_666_666, - falloff: 0_050_000, - max_piece_count: 100, - test_precision: 0_005_000, - ); -} - -parameter_types! { - pub const SessionsPerEra: sp_staking::SessionIndex = 24 * 7; // session is one hour - pub const BondingDuration: sp_staking::EraIndex = 4; // 1 month - pub const SlashDeferDuration: sp_staking::EraIndex = 1; // 1/4 the bonding duration. - pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const MaxNominatorRewardedPerValidator: u32 = 256; - pub OffchainRepeat: BlockNumber = 5; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); -} - -use frame_election_provider_support::onchain; -impl onchain::Config for Runtime { - type Accuracy = Perbill; - type DataProvider = Staking; -} - -pub struct StakingBenchmarkingConfig; -impl pallet_staking::BenchmarkingConfig for StakingBenchmarkingConfig { - type MaxNominators = ConstU32<1000>; - type MaxValidators = ConstU32<1000>; -} - -impl pallet_staking::Config for Runtime { - type Currency = Balances; - type UnixTime = Timestamp; - type CurrencyToVote = frame_support::traits::U128CurrencyToVote; - type RewardRemainder = (); - type Event = Event; - type Slash = Treasury; // send the slashed funds to the treasury. - type Reward = (); // rewards are minted from the void - type SessionsPerEra = SessionsPerEra; - type BondingDuration = BondingDuration; - type SlashDeferDuration = SlashDeferDuration; - /// A super-majority of the council can cancel the slash. - type SlashCancelOrigin = MoreThanHalfTechnicals; - type SessionInterface = Self; - type EraPayout = pallet_staking::ConvertCurve; - type NextNewSession = Session; - type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; - type MaxNominations = MaxNominations; - type MaxUnlockingChunks = frame_support::traits::ConstU32<32>; - type ElectionProvider = ElectionProviderMultiPhase; - type GenesisElectionProvider = onchain::OnChainSequentialPhragmen; - type WeightInfo = pallet_staking::weights::SubstrateWeight; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; - // Alternatively, use pallet_staking::UseNominatorsMap to just use the nominators map - // Note that the aforementioned does not scale to a very large number of nominators. - type SortedListProvider = BagsList; - type BenchmarkingConfig = StakingBenchmarkingConfig; -} - -parameter_types! { - // phase durations. 1/4 of the last session for each. - pub const SignedPhase: u32 = EPOCH_DURATION_IN_BLOCKS / 4; - pub const UnsignedPhase: u32 = EPOCH_DURATION_IN_BLOCKS / 4; - - // signed config - pub const SignedMaxSubmissions: u32 = 10; - pub const SignedRewardBase: Balance = 1 * MITO; - pub const SignedDepositBase: Balance = 1 * MITO; - pub const SignedDepositByte: Balance = 1 * U_MITO; - - pub SolutionImprovementThreshold: Perbill = Perbill::from_rational(1u32, 10_000); - - // miner configs - pub const MultiPhaseUnsignedPriority: TransactionPriority = StakingUnsignedPriority::get() - 1u64; - pub const MinerMaxIterations: u32 = 10; - pub MinerMaxWeight: Weight = RuntimeBlockWeights::get() - .get(DispatchClass::Normal) - .max_extrinsic.expect("Normal extrinsics have a weight limit configured; qed") - .saturating_sub(BlockExecutionWeight::get()); - // Solution can occupy 90% of normal block size - pub MinerMaxLength: u32 = Perbill::from_rational(9u32, 10) * - * RuntimeBlockLength::get().max.get(DispatchClass::Normal); - - // BagsList allows a practically unbounded count of nominators to participate in NPoS election - // To ensure we respect memory limits when using the BagsList this must be set to a number of - // voters we know can fit into a single vec allocation. - pub const VoterSnapshotPerBlock: u32 = 10_000; -} - -parameter_types! { - pub const BagThresholds: &'static [u64] = &voter_bags::THRESHOLDS; -} - -impl pallet_bags_list::Config for Runtime { - type Event = Event; - type VoteWeightProvider = Staking; - type WeightInfo = pallet_bags_list::weights::SubstrateWeight; - type BagThresholds = BagThresholds; -} - -sp_npos_elections::generate_solution_type!( - #[compact] - pub struct NposSolution16::< - VoterIndex = u32, - TargetIndex = u16, - Accuracy = sp_runtime::PerU16, - >(16) -); - -parameter_types! { - pub MaxNominations: u32 = ::LIMIT as u32; -} - -/// Maximum number of iterations for balancing that will be executed in the embedded OCW -/// miner of election provider multi phase. -pub const MINER_MAX_ITERATIONS: u32 = 10; - -/// A source of random balance for NposSolver, which is meant to be run by the OCW election miner. -pub struct OffchainRandomBalancing; -impl frame_support::pallet_prelude::Get> - for OffchainRandomBalancing -{ - fn get() -> Option<(usize, sp_npos_elections::ExtendedBalance)> { - use sp_runtime::traits::TrailingZeroInput; - let iters = match MINER_MAX_ITERATIONS { - 0 => 0, - max @ _ => { - let seed = sp_io::offchain::random_seed(); - let random = ::decode(&mut TrailingZeroInput::new(&seed)) - .expect("input is padded with zeroes; qed") - % max.saturating_add(1); - random as usize - } - }; - - Some((iters, 0)) - } -} - -pub struct ElectionProviderBenchmarkConfig; -impl pallet_election_provider_multi_phase::BenchmarkingConfig for ElectionProviderBenchmarkConfig { - const VOTERS: [u32; 2] = [1000, 2000]; - const TARGETS: [u32; 2] = [500, 1000]; - const ACTIVE_VOTERS: [u32; 2] = [500, 800]; - const DESIRED_TARGETS: [u32; 2] = [200, 400]; - const SNAPSHOT_MAXIMUM_VOTERS: u32 = 1000; - const MINER_MAXIMUM_VOTERS: u32 = 1000; - const MAXIMUM_TARGETS: u32 = 300; -} - -impl pallet_election_provider_multi_phase::Config for Runtime { - type Event = Event; - type Currency = Balances; - type EstimateCallFee = TransactionPayment; - type SignedPhase = SignedPhase; - type UnsignedPhase = UnsignedPhase; - type SolutionImprovementThreshold = SolutionImprovementThreshold; - type OffchainRepeat = OffchainRepeat; - type MinerMaxWeight = MinerMaxWeight; - type MinerMaxLength = MinerMaxLength; - type MinerTxPriority = MultiPhaseUnsignedPriority; - type SignedMaxSubmissions = SignedMaxSubmissions; - type SignedRewardBase = SignedRewardBase; - type SignedDepositBase = SignedDepositBase; - type SignedDepositByte = SignedDepositByte; - type SignedDepositWeight = (); - type SignedMaxWeight = MinerMaxWeight; - type SlashHandler = (); // burn slashes - type RewardHandler = (); // nothing to do upon rewards - type DataProvider = Staking; - type Solution = NposSolution16; - type Fallback = pallet_election_provider_multi_phase::NoFallback; - type Solver = frame_election_provider_support::SequentialPhragmen< - AccountId, - pallet_election_provider_multi_phase::SolutionAccuracyOf, - OffchainRandomBalancing, - >; - type GovernanceFallback = - frame_election_provider_support::onchain::OnChainSequentialPhragmen; - type WeightInfo = pallet_election_provider_multi_phase::weights::SubstrateWeight; - type ForceOrigin = MoreThanHalfTechnicals; - type BenchmarkingConfig = ElectionProviderBenchmarkConfig; - type VoterSnapshotPerBlock = VoterSnapshotPerBlock; -} - -parameter_types! { - pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) - * RuntimeBlockWeights::get().max_block; - pub const MaxScheduledPerBlock: u32 = 50; - pub const NoPreimagePostponement: Option = Some(10); -} - -impl pallet_scheduler::Config for Runtime { - type Event = Event; - type Origin = Origin; - type Call = Call; - type PalletsOrigin = OriginCaller; - type MaximumWeight = MaximumSchedulerWeight; - type ScheduleOrigin = MoreThanHalfTechnicals; - type MaxScheduledPerBlock = MaxScheduledPerBlock; - type OriginPrivilegeCmp = EqualPrivilegeOnly; - type PreimageProvider = Preimage; - type NoPreimagePostponement = NoPreimagePostponement; - type WeightInfo = (); -} - -parameter_types! { - pub const PreimageMaxSize: u32 = 4096 * 1024; - pub const PreimageBaseDeposit: Balance = 1 * MITO; - pub const PreimageByteDeposit: Balance = 10 * U_MITO; -} - -impl pallet_preimage::Config for Runtime { - type WeightInfo = pallet_preimage::weights::SubstrateWeight; - type Event = Event; - type Currency = Balances; - type ManagerOrigin = frame_system::EnsureRoot; - type MaxSize = PreimageMaxSize; - type BaseDeposit = PreimageBaseDeposit; - type ByteDeposit = PreimageByteDeposit; -} - -parameter_types! { - pub const ProposalBond: Permill = Permill::from_percent(5); - pub const ProposalBondMinimum: Balance = 1_000 * MITO; - pub const SpendPeriod: BlockNumber = 36 * DAYS; - pub const Burn: Permill = Permill::from_percent(1); - pub const DataDepositPerByte: Balance = 1 * U_MITO; - pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); - pub const MaxApprovals: u32 = 100; -} - -impl pallet_treasury::Config for Runtime { - type PalletId = TreasuryPalletId; - type Currency = Balances; - type ApproveOrigin = MoreThanHalfTechnicals; - type RejectOrigin = MoreThanHalfTechnicals; - type Event = Event; - type ProposalBond = ProposalBond; - type ProposalBondMinimum = ProposalBondMinimum; - type ProposalBondMaximum = (); - type SpendPeriod = SpendPeriod; - type OnSlash = (); - type Burn = Burn; - type BurnDestination = (); - type SpendFunds = (); - type WeightInfo = (); - type MaxApprovals = MaxApprovals; -} - -parameter_types! { - pub const TechnicalMotionDuration: BlockNumber = 3 * DAYS; - pub const TechnicalMaxProposals: u32 = 100; - pub const TechnicalMaxMembers: u32 = 100; -} - -type TechnicalCollective = pallet_collective::Instance2; -impl pallet_collective::Config for Runtime { - type Origin = Origin; - type Proposal = Call; - type Event = Event; - type MotionDuration = TechnicalMotionDuration; - type MaxProposals = TechnicalMaxProposals; - type MaxMembers = TechnicalMaxMembers; - type DefaultVote = pallet_collective::PrimeDefaultVote; - type WeightInfo = (); -} - -type MoreThanHalfTechnicals = EnsureOneOf< - frame_system::EnsureRoot, - pallet_collective::EnsureProportionMoreThan, ->; - -impl pallet_membership::Config for Runtime { - type Event = Event; - type AddOrigin = MoreThanHalfTechnicals; - type RemoveOrigin = MoreThanHalfTechnicals; - type SwapOrigin = MoreThanHalfTechnicals; - type ResetOrigin = MoreThanHalfTechnicals; - type PrimeOrigin = MoreThanHalfTechnicals; - type MembershipInitialized = TechnicalCommittee; - type MembershipChanged = TechnicalCommittee; - type MaxMembers = TechnicalMaxMembers; - type WeightInfo = (); -} - -parameter_types! { - pub const WindowSize: u64 = 128; - pub const MaximumMessageSize: usize = 512; -} - -impl pallet_robonomics_datalog::Config for Runtime { - type Time = Timestamp; - type Record = Vec; - type Event = Event; - type WindowSize = WindowSize; - type MaximumMessageSize = MaximumMessageSize; - type WeightInfo = (); -} - -/* -mod evercity { - pub const DEFAULT_DAY_DURATION: u32 = 60; //86400; -} - -parameter_types! { - pub const BurnRequestTtl: u32 = evercity::DEFAULT_DAY_DURATION as u32 * 7 * 1000; - pub const MintRequestTtl: u32 = evercity::DEFAULT_DAY_DURATION as u32 * 7 * 1000; - pub const MaxMintAmount: pallet_evercity::EverUSDBalance = 60_000_000_000_000_000; - // timestep is a bond granularity - pub const TimeStep: pallet_evercity::BondPeriod = evercity::DEFAULT_DAY_DURATION; -} - -impl pallet_evercity::Config for Runtime { - type Event = Event; - type BurnRequestTtl = BurnRequestTtl; - type MintRequestTtl = MintRequestTtl; - type MaxMintAmount = MaxMintAmount; - type TimeStep = TimeStep; - type WeightInfo = (); - type OnAddAccount = (); - type OnAddBond = (); -} - -parameter_types! { - pub const MaximumTransferValue: Balance = 10 * MITO; -} - -impl pallet_evercity_transfer::Config for Runtime { - type Event = Event; - type MaximumTransferValue = MaximumTransferValue; - type Currency = Balances; - type WeightInfo = (); -} -*/ - -parameter_types! { - pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); - pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; -} - -impl frame_system::offchain::SendTransactionTypes for Runtime -where - Call: From, -{ - type Extrinsic = UncheckedExtrinsic; - type OverarchingCall = Call; -} - -construct_runtime! { - pub enum Runtime where - Block = Block, - NodeBlock = robonomics_primitives::Block, - UncheckedExtrinsic = UncheckedExtrinsic - { - // Basic stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 10, - Utility: pallet_utility::{Pallet, Call, Storage, Event} = 11, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 12, - Identity: pallet_identity::{Pallet, Call, Storage, Event} = 13, - - // Parachain systems. - ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Storage, Inherent, Event} = 20, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21, - - // Native currency and accounts. - Assets: pallet_assets::{Pallet, Call, Storage, Event} = 30, - Balances: pallet_balances::{Pallet, Call, Storage, Event, Config} = 31, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage} = 32, - - // PoS consensus. - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 40, - Staking: pallet_staking::{Pallet, Call, Config, Storage, Event} = 41, - ElectionProviderMultiPhase: pallet_election_provider_multi_phase::{Pallet, Call, Storage, Event, ValidateUnsigned} = 42, - Aura: pallet_aura::{Pallet, Config} = 43, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Config} = 44, - Authorship: pallet_authorship::{Pallet, Call, Storage, Inherent} = 45, - ImOnline: pallet_im_online::{Pallet, Call, Storage, Event, ValidateUnsigned, Config} = 46, - Offences: pallet_offences::{Pallet, Storage, Event} = 47, - Historical: pallet_session_historical::{Pallet} = 48, - BagsList: pallet_bags_list::{Pallet, Call, Storage, Event} = 49, - - // Governance staff - Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event} = 50, - Scheduler: pallet_scheduler::{Pallet, Call, Storage, Event} = 51, - TechnicalCommittee: pallet_collective::::{Pallet, Call, Storage, Origin, Event, Config} = 52, - TechnicalMembership: pallet_membership::::{Pallet, Call, Storage, Event, Config} = 53, - Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 54, - Sudo: pallet_sudo::{Pallet, Call, Storage, Event, Config} = 59, - - // Robonomics pallets. - Datalog: pallet_robonomics_datalog::{Pallet, Call, Storage, Event} = 60, - - // Evercity pallets. - //Evercity: pallet_evercity::{Pallet, Call, Storage, Event} = 70, - //EvercityTransfer: pallet_evercity_transfer::{Pallet, Call, Storage, Event} = 71, - } -} - -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; - -/// Block header type as expected by this runtime. -pub type Header = generic::Header; - -/// Block type as expected by this runtime. -pub type Block = generic::Block; - -/// 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, - AllPalletsWithSystem, ->; - -// Implement our runtime API endpoints. This is just a bunch of proxying. -impl_runtime_apis! { - 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 { - OpaqueMetadata::new(Runtime::metadata().into()) - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> sp_runtime::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 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< - Block, - Balance, - > for Runtime { - fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - - fn query_fee_details(uxt: ::Extrinsic, len: u32) -> FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - 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 { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - 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().into_inner() - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - inherent_data.check_extrinsics(&block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} diff --git a/runtime/ipci/src/voter_bags.rs b/runtime/ipci/src/voter_bags.rs deleted file mode 100644 index ff6989009..000000000 --- a/runtime/ipci/src/voter_bags.rs +++ /dev/null @@ -1,235 +0,0 @@ -// 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. - -//! Autogenerated voter bag thresholds. -//! -//! Generated on 2021-07-05T09:17:40.469754927+00:00 -//! for the node runtime. - -/// Existential weight for this runtime. -#[cfg(any(test, feature = "std"))] -#[allow(unused)] -pub const EXISTENTIAL_WEIGHT: u64 = 100_000_000_000_000; - -/// Constant ratio between bags for this runtime. -#[cfg(any(test, feature = "std"))] -#[allow(unused)] -pub const CONSTANT_RATIO: f64 = 1.0628253590743408; - -/// Upper thresholds delimiting the bag list. -pub const THRESHOLDS: [u64; 200] = [ - 100_000_000_000_000, - 106_282_535_907_434, - 112_959_774_389_150, - 120_056_512_776_105, - 127_599_106_300_477, - 135_615_565_971_369, - 144_135_662_599_590, - 153_191_037_357_827, - 162_815_319_286_803, - 173_044_250_183_800, - 183_915_817_337_347, - 195_470_394_601_017, - 207_750_892_330_229, - 220_802_916_738_890, - 234_674_939_267_673, - 249_418_476_592_914, - 265_088_281_944_639, - 281_742_548_444_211, - 299_443_125_216_738, - 318_255_747_080_822, - 338_250_278_668_647, - 359_500_973_883_001, - 382_086_751_654_776, - 406_091_489_025_036, - 431_604_332_640_068, - 458_720_029_816_222, - 487_539_280_404_019, - 518_169_110_758_247, - 550_723_271_202_866, - 585_322_658_466_782, - 622_095_764_659_305, - 661_179_154_452_653, - 702_717_972_243_610, - 746_866_481_177_808, - 793_788_636_038_393, - 843_658_692_126_636, - 896_661_852_395_681, - 952_994_955_240_703, - 1_012_867_205_499_736, - 1_076_500_951_379_881, - 1_144_132_510_194_192, - 1_216_013_045_975_769, - 1_292_409_502_228_280, - 1_373_605_593_276_862, - 1_459_902_857_901_004, - 1_551_621_779_162_291, - 1_649_102_974_585_730, - 1_752_708_461_114_642, - 1_862_822_999_536_805, - 1_979_855_523_374_646, - 2_104_240_657_545_975, - 2_236_440_332_435_128, - 2_376_945_499_368_703, - 2_526_277_953_866_680, - 2_684_992_273_439_945, - 2_853_677_877_130_641, - 3_032_961_214_443_876, - 3_223_508_091_799_862, - 3_426_026_145_146_232, - 3_641_267_467_913_124, - 3_870_031_404_070_482, - 4_113_167_516_660_186, - 4_371_578_742_827_277, - 4_646_224_747_067_156, - 4_938_125_485_141_739, - 5_248_364_991_899_922, - 5_578_095_407_069_235, - 5_928_541_253_969_291, - 6_301_003_987_036_955, - 6_696_866_825_051_405, - 7_117_599_888_008_300, - 7_564_765_656_719_910, - 8_040_024_775_416_580, - 8_545_142_218_898_723, - 9_081_993_847_142_344, - 9_652_573_371_700_016, - 10_258_999_759_768_490, - 10_903_525_103_419_522, - 11_588_542_983_217_942, - 12_316_597_357_287_042, - 13_090_392_008_832_678, - 13_912_800_587_211_472, - 14_786_877_279_832_732, - 15_715_868_154_526_436, - 16_703_223_214_499_558, - 17_752_609_210_649_358, - 18_867_923_258_814_856, - 20_053_307_312_537_008, - 21_313_163_545_075_252, - 22_652_170_697_804_756, - 24_075_301_455_707_600, - 25_587_840_914_485_432, - 27_195_406_207_875_088, - 28_903_967_368_057_400, - 30_719_869_496_628_636, - 32_649_856_328_471_220, - 34_701_095_276_033_064, - 36_881_204_047_022_752, - 39_198_278_934_370_992, - 41_660_924_883_519_016, - 44_278_287_448_695_240, - 47_060_086_756_856_400, - 50_016_653_605_425_536, - 53_158_967_827_883_320, - 56_498_699_069_691_424, - 60_048_250_125_977_912, - 63_820_803_001_928_304, - 67_830_367_866_937_216, - 72_091_835_084_322_176, - 76_621_030_509_822_880, - 81_434_774_264_248_528, - 86_550_943_198_537_824, - 91_988_537_283_208_848, - 97_767_750_168_749_840, - 103_910_044_178_992_000, - 110_438_230_015_967_792, - 117_376_551_472_255_616, - 124_750_775_465_407_920, - 132_588_287_728_824_640, - 140_918_194_514_440_064, - 149_771_430_684_917_568, - 159_180_874_596_775_264, - 169_181_470_201_085_280, - 179_810_356_815_193_344, - 191_107_007_047_393_216, - 203_113_373_386_768_288, - 215_874_044_002_592_672, - 229_436_408_331_885_600, - 243_850_833_070_063_392, - 259_170_849_218_267_264, - 275_453_350_882_006_752, - 292_758_806_559_399_232, - 311_151_483_703_668_992, - 330_699_687_393_865_920, - 351_476_014_000_157_824, - 373_557_620_785_735_808, - 397_026_512_446_556_096, - 421_969_845_653_044_224, - 448_480_252_724_740_928, - 476_656_185_639_923_904, - 506_602_281_657_757_760, - 538_429_751_910_786_752, - 572_256_794_410_890_176, - 608_209_033_002_485_632, - 646_419_983_893_124_352, - 687_031_551_494_039_552, - 730_194_555_412_054_016, - 776_069_290_549_944_960, - 824_826_122_395_314_176, - 876_646_119_708_695_936, - 931_721_726_960_522_368, - 990_257_479_014_182_144, - 1_052_470_760_709_299_712, - 1_118_592_614_166_106_112, - 1_188_868_596_808_997_376, - 1_263_559_693_295_730_432, - 1_342_943_284_738_898_688, - 1_427_314_178_819_094_784, - 1_516_985_704_615_302_400, - 1_612_290_876_218_400_768, - 1_713_583_629_449_105_408, - 1_821_240_136_273_157_632, - 1_935_660_201_795_120_128, - 2_057_268_749_018_809_600, - 2_186_517_396_888_336_384, - 2_323_886_137_470_138_880, - 2_469_885_118_504_583_168, - 2_625_056_537_947_004_416, - 2_789_976_657_533_970_944, - 2_965_257_942_852_572_160, - 3_151_551_337_860_326_400, - 3_349_548_682_302_620_672, - 3_559_985_281_005_267_968, - 3_783_642_634_583_792_128, - 4_021_351_341_710_503_936, - 4_273_994_183_717_548_544, - 4_542_509_402_991_247_872, - 4_827_894_187_332_742_144, - 5_131_208_373_224_844_288, - 5_453_578_381_757_959_168, - 5_796_201_401_831_965_696, - 6_160_349_836_169_256_960, - 6_547_376_026_650_146_816, - 6_958_717_276_519_173_120, - 7_395_901_188_113_309_696, - 7_860_551_335_934_872_576, - 8_354_393_296_137_270_272, - 8_879_261_054_815_360_000, - 9_437_103_818_898_946_048, - 10_029_993_254_943_105_024, - 10_660_131_182_698_121_216, - 11_329_857_752_030_707_712, - 12_041_660_133_563_240_448, - 12_798_181_755_305_525_248, - 13_602_232_119_581_272_064, - 14_456_797_236_706_498_560, - 15_365_050_714_167_523_328, - 16_330_365_542_480_556_032, - 17_356_326_621_502_140_416, - 18_446_744_073_709_551_615, -]; diff --git a/runtime/local/Cargo.toml b/runtime/local/Cargo.toml index f5119995e..8b30e4d7f 100644 --- a/runtime/local/Cargo.toml +++ b/runtime/local/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "local-runtime" -version = "1.9.0" +version = "2.0.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" build = "build.rs" [dependencies] @@ -14,42 +14,42 @@ scale-info = { version = "2.0", default-features = false, features = ["derive"] # primitives robonomics-primitives = { path = "../../primitives", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-version = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } # frame dependencies -pallet-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-executive = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-preimage = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false, optional = true } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false, optional = true } -pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-multisig = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +pallet-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-executive = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-preimage = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false, optional = true } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false, optional = true } +pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-multisig = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } pallet-robonomics-rws = { path = "../../frame/rws", default-features = false } pallet-robonomics-launch = { path = "../../frame/launch", default-features = false } pallet-robonomics-datalog = { path = "../../frame/datalog", default-features = false } @@ -58,7 +58,7 @@ pallet-robonomics-digital-twin = { path = "../../frame/digital-twin", default-fe pallet-robonomics-staking = { path = "../../frame/staking", default-features = false } [build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } [features] default = ["std"] diff --git a/runtime/local/src/lib.rs b/runtime/local/src/lib.rs index 7e407975d..da0a0571b 100644 --- a/runtime/local/src/lib.rs +++ b/runtime/local/src/lib.rs @@ -41,7 +41,7 @@ use frame_support::{ traits::{EnsureOneOf, EqualPrivilegeOnly, KeyOwnerProofSystem}, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, - DispatchClass, IdentityFee, Weight, + ConstantMultiplier, DispatchClass, IdentityFee, Weight, }, PalletId, }; @@ -239,7 +239,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = CurrencyAdapter; - type TransactionByteFee = TransactionByteFee; + type LengthToFee = ConstantMultiplier; type WeightToFee = IdentityFee; type FeeMultiplierUpdate = TargetedFeeAdjustment; diff --git a/runtime/main/Cargo.toml b/runtime/main/Cargo.toml index aaa82b505..f712037ed 100644 --- a/runtime/main/Cargo.toml +++ b/runtime/main/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "main-runtime" -version = "1.9.9" +version = "2.0.0" authors = ["Airalab "] -edition = "2018" +edition = "2021" build = "build.rs" [dependencies] @@ -10,43 +10,43 @@ build = "build.rs" serde = { version = "1.0", optional = true } serde_derive = { version = "1.0", optional = true } codec = { package = "parity-scale-codec", version = "3.0", default-features = false, features = ["derive"] } -lazy_static = { version = "1.4.0", optional = true } smallvec = "1.8.0" scale-info = { version = "2.0", default-features = false, features = ["derive"] } # primitives robonomics-primitives = { path = "../../primitives", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-staking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -sp-version = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-staking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } # standard dependencies -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-executive = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-multisig = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-preimage= { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18", default-features = false } +pallet-assets = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-executive = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-multisig = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-preimage= { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23", default-features = false } # robonomics dependencies pallet-robonomics-datalog = { path = "../../frame/datalog", default-features = false } @@ -58,13 +58,24 @@ pallet-robonomics-rws = { path = "../../frame/rws", default-features = false } pallet-robonomics-staking = { path = "../../frame/staking", default-features = false } # cumulus dependencies -cumulus-pallet-parachain-system = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -cumulus-primitives-utility = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } -parachain-info = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.18", default-features = false } +cumulus-pallet-parachain-system = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +cumulus-pallet-dmp-queue = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +cumulus-pallet-xcmp-queue = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +cumulus-pallet-xcm = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +cumulus-primitives-utility = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } +parachain-info = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.23", default-features = false } + +# polkadot dependencies +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.23" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.23" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.23" } +pallet-xcm = { path = "../../vendor/pallet-xcm", default-features = false } +polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.23" } +polkadot-primitives = { git = 'https://github.com/paritytech/polkadot', default-features = false , branch = "release-v0.9.23" } [build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } [features] default = ["std"] @@ -72,7 +83,6 @@ with-tracing = [ "frame-executive/with-tracing" ] std = [ "serde", "serde_derive", - "lazy_static", "codec/std", "robonomics-primitives/std", "sp-api/std", @@ -86,6 +96,7 @@ std = [ "sp-staking/std", "sp-transaction-pool/std", "sp-version/std", + "pallet-assets/std", "pallet-balances/std", "pallet-collective/std", "pallet-democracy/std", @@ -114,6 +125,15 @@ std = [ "cumulus-pallet-parachain-system/std", "cumulus-primitives-core/std", "cumulus-primitives-utility/std", + "cumulus-pallet-dmp-queue/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-pallet-xcm/std", + "xcm/std", + "xcm-builder/std", + "xcm-executor/std", + "pallet-xcm/std", + "polkadot-parachain/std", + "polkadot-primitives/std", "parachain-info/std", "scale-info/std", ] diff --git a/runtime/main/src/constants.rs b/runtime/main/src/constants.rs index ad50812e8..64b9e7a99 100644 --- a/runtime/main/src/constants.rs +++ b/runtime/main/src/constants.rs @@ -19,13 +19,7 @@ /// Money matters. pub mod currency { - #[cfg(feature = "std")] - use robonomics_primitives::AccountId; use robonomics_primitives::Balance; - #[cfg(feature = "std")] - use sp_core::crypto::Ss58Codec; - #[cfg(feature = "std")] - use sp_runtime::traits::AccountIdConversion; pub const COASE: Balance = 1_000; pub const GLUSHKOV: Balance = 1_000 * COASE; @@ -34,1020 +28,6 @@ pub mod currency { pub const fn deposit(items: u32, bytes: u32) -> Balance { items as Balance * 150 * GLUSHKOV / 100 + (bytes as Balance) * 60 * GLUSHKOV } - - #[cfg(feature = "std")] - lazy_static::lazy_static! { - pub static ref STAKE_HOLDERS: Vec<(AccountId, Balance)> = sp_std::vec![ - // DAO (https://etherscan.io/tx/0x6b9a9cbe7d21badf565ebce0fb50b865da8f5f784899db5fb455d1b276d14acf) - // 692500000000001 - 83847389697584 (spend for rewards) - (frame_support::PalletId(*b"py/trsry").into_account(), 608652610302417), - - // exodus + collators - (AccountId::from_ss58check("4CPcy7DnaaJGNxXdegaTLneTc6SqUrii2wsXxmq3FTdbJ8jk").unwrap(), 170000000000 + 697873680), - (AccountId::from_ss58check("4CUWW8PJvhG9NjEVQpXKkdZDsvee3JpLJfzMGkGMoQSarb3p").unwrap(), 1620000000000 + 3398794817), - - // exodus + crowdloan - (AccountId::from_ss58check("4CsxiMCHZVC8zszqE1YQeAioovP8fKpZxSr4jV6uwAdHTTRD").unwrap(), 60083703970 + 385000000), // DGAxaxC2kxLK7rv439hK8k4RN6K1pvxJEE8Gyot3Wnf1kaR - (AccountId::from_ss58check("4DEzmduSKtFLU7Tj3HjnGsYtGQRoqHYWABHVNufLRaNmKXoK").unwrap(), 25745228238 + 3500000000), // DdD1sfLoA1XnMKosKM4wqa8sr8zBnetVxfYvQNJXvY8svnu - (AccountId::from_ss58check("4DvaLRSgDzaNdCp98q4j3rogStZUn7ULyMhHmfyouJc5ndx6").unwrap(), 1000000000 + 220377500000), // EJnafCahGLZwSgDxrg1ippw4LGf8cajK95MKAgn1emTLieV - (AccountId::from_ss58check("4E21jqn4GEB1JxZ2zYaD48fgJytVt5JKKi3mx1Yy4FSLsNWx").unwrap(), 69346839915 + 38500000000), // EQDz5XxjVwCdCR7paBVj6gvvRbgEaQhfVRqVWFwAbbiRZ7e - (AccountId::from_ss58check("4EGqnaWduiaxdf29LpJS44yMvzZc2GZFdHNpnY4EjDbkhdNN").unwrap(), 4209542511224 + 220500000000), // Ef42pGYNzM9wttEAquij2zcYSGnNmfdy4ktL2mCqZm8Ftdu - (AccountId::from_ss58check("4EyDkBo9fMn2KAFduFh38qNtGEH8WcTggQLwF3CocEqbKUon").unwrap(), 5000000000000 + 227500000000), // FMRzRZ48dYDdQ7ijHJKooQ8sfzJs7a52BiznXumiazxsuQ4 - (AccountId::from_ss58check("4FiueWs4Q223iyvcYmEUQAJexNXZRQnvkML1sqWxZ8QXuCW1").unwrap(), 5305599999 + 70350000000), // G77tkcxsHnF3DnhNnqm58KuZpEjmuuK68i5RLDvfUZuTf55 - (AccountId::from_ss58check("4FurzPevzmj164Y3Sw9UaxFe2zuCTTZtbGoDoJRTyt87Cjnr").unwrap(), 85000000000 + 28000000000), // GJ5EdQqU3VCQJQ8GxkmFvGteScNoxgGw4BHLo8S6EHUm85C - (AccountId::from_ss58check("4GDXU2rutM1wULcBsd9vskN7zxqrZG5VdAmQBcHF2K9FD893").unwrap(), 1000000000000 + 66500000000), // GbjiGcpMcn8naUGhemDYiPNcQZ2umBsxx9Tj6zD8fJcmTtB - (AccountId::from_ss58check("4GGk8mutwDkhZHCGhmuzaCuNnVrcUZnp6CRauN5VW5duxRPS").unwrap(), 50275262760 + 15750000000), // GexP1foQVWtsX4MXoXHFAvdPwZnq4uCRyoeSrnTcRoHWxwy - (AccountId::from_ss58check("4GXsRhbd3q2cccm18c6YWyPCRaJMpPrkjUq2rBBrVf3UApTt").unwrap(), 25601546632 + 38605000000), // Gv5fwMXX6novrd5xdhqBwQT321YAty95GD6Pftpc1CqjCvf - (AccountId::from_ss58check("4GzKWYmCjcDjbVpPGvKSpQFcaLdxh6g9QYxPGHbuRATcaNZo").unwrap(), 14690866329 + 11200000000), // HNXknX7CsyvujgU6wvjVNGsBnM93bnXkLLSonJsXWcz8buc - (AccountId::from_ss58check("4H3FENY4Kh4Vo8NDLhfTTUaCEwfE2KyC8hREBQSxQW1YYSo7").unwrap(), 54983128556 + 35000000000), // HRTUcHxnxph7NEJAjGk8SbSrPNQNq5aUUoHiu9vWrAv6omQ - (AccountId::from_ss58check("4HicVzc9rEEfWTUuXCTmgiW3uibVs9RzM8t1C8BEsR3xUHFF").unwrap(), 151587358100 + 166950000000), // J6pkEN4KVzrphLzME54MgXJXAJgDeYNgvG4jctCymDL2iVL - (AccountId::from_ss58check("4HqwxLHE6hU2m2yjh6Ypas4qU6xkoLzwxP2UwESyshVGvh15").unwrap(), 60000000000 + 24500000000), // JEACa38ZyEE5GqpX8A7Fq665Yfw9r7LJAQYUj9wz3eeV8yT - - // exodus - (AccountId::from_ss58check("4EHFDwpKvrAo4AD6mL27JHHvRdKaY8L36Xt6JiosxF1ygYp4").unwrap(), 1000000000000), - (AccountId::from_ss58check("4Gms8f8zThogeZCrSvfWdLR6y5BSskSnZV6HhnnY6mWK6HiV").unwrap(), 5000000000000), - (AccountId::from_ss58check("4CnszL9LjQtrMeZoo5DMUCAKastcNXqHuwp3Z51nDgi1onra").unwrap(), 1000000000), - (AccountId::from_ss58check("4FQmexPzi3HZoyhY4pvMWzyv3LYDCFr4pDCHeZiyEVKjpFeh").unwrap(), 10000000000000), - (AccountId::from_ss58check("4DjohM8jb4frM15ogKtAsyK1XfH6xgSYEpr7qPLcGna8oRrT").unwrap(), 10000000000), - (AccountId::from_ss58check("4GjKEy25y4Q2Qhu6jkosyJb3SkT1zhjt9HPdG6EW4rP9ecuY").unwrap(), 150000000), - (AccountId::from_ss58check("4F12hJyLXF1y5Pj4SvB7FAPGy87LQpp69f5LDtCNjTbzWjDw").unwrap(), 13541598278), - (AccountId::from_ss58check("4CePkBBvyiDkNmjmGMWn4wdVsezNAZT1rxrzCs4AnKJ1Rt5y").unwrap(), 287277004669), - (AccountId::from_ss58check("4CvtoSt3yC9Gu5tyvhsWoHbXoJgdrcCc9D5T8dsN5ktCT9hU").unwrap(), 1483287492836), - (AccountId::from_ss58check("4CUDVvsr8SjnNRSPEtMgKZ4B5QJ3hnJgS2L52TMuRWMTA2bf").unwrap(), 100564091622), - (AccountId::from_ss58check("4CJbaUmZZNAuDdCfZr6HfkPaoq4516Cw4TCtfBZhFj3whtyJ").unwrap(), 205356000000), - (AccountId::from_ss58check("4DnTySmUBZkK8gBpt79EuwmRjTxu38HXPPxuX4pCCfs23L2n").unwrap(), 76032697041), - (AccountId::from_ss58check("4CZFgvmefUcjmSqVT2EQY7PpKzCyCzMMRtKShTYhnuVrtb7e").unwrap(), 2638200000), - (AccountId::from_ss58check("4G8i8EVg8ukR6Hs3VLwwSJGxA7wwKNiVoqkAsQSTAVax1y96").unwrap(), 2000000000000), - (AccountId::from_ss58check("4CpvAYf3jPJngm94BTengtAjUZMapThmFsFx4G97Wv62TM5z").unwrap(), 42326009570), - (AccountId::from_ss58check("4GQ7hXqYQ9gqUp3eByTvr5du8ru7ZjiS3jJafSPPFgMhTDv1").unwrap(), 3000000000000), - (AccountId::from_ss58check("4HYXe9WmBZjiPEShFWnynR98H3DtnVDe4baQu2cxT7ZVRTHa").unwrap(), 356285522627), - (AccountId::from_ss58check("4DjQYJ8WBkoHbpmaTo4yR1E61NamT7w1g583fKHPBBNTuDyP").unwrap(), 10132996319), - (AccountId::from_ss58check("4EZgG7nwc2aSunxCiTnZ4iQwWGdGeKAcjtcYVFoYuiCKqmUx").unwrap(), 18103206092), - (AccountId::from_ss58check("4HDT99R4MeR7HEKyumkt81dbRqMBTWEjuZk1HbezwiR1iNae").unwrap(), 220000000000), - (AccountId::from_ss58check("4HuhG8tCTQdMRSpW991c82UwKWKod2hVRVJyGcorjS6K7msT").unwrap(), 20000000000), - (AccountId::from_ss58check("4CUP4fVf3TmrfS1yC2d4na8T29od7czjsUV3XRLc2SCr6EJn").unwrap(), 34420000000), - (AccountId::from_ss58check("4GxQRUotbWYak62DA3aw6tpfMy8F6eYNWcWDpCdLgLtU1KaS").unwrap(), 370398186986), - (AccountId::from_ss58check("4DhksGVMtvtCmtMPhP34rLr5oh9yCA9km6w7nvbib86V9H7d").unwrap(), 160025098091), - (AccountId::from_ss58check("4DCggGkd4ebpEZhtMJksC28n8MK8KPJsBcUU2VCneecTmnyD").unwrap(), 68226276101), - (AccountId::from_ss58check("4HifezFz7f3DvuxU7dYLdaubcj1ksEoh9emwBYiZmsGjUQ17").unwrap(), 119299000000), - (AccountId::from_ss58check("4E1CWXUEvgyMzoQq3Lug6tPcdZ4L9qWKG5jp8b82dvbjH4tw").unwrap(), 300000000000), - (AccountId::from_ss58check("4CPibnptLD8SeGYmYU2eXnaqBv63JLe3aiqMqw1nBudGSmGm").unwrap(), 54000000000), - (AccountId::from_ss58check("4FNcowEpPujdFtpXPRxbczgS7cAd5yCYmwSt1Dk9fGsFuRKA").unwrap(), 42749959708), - (AccountId::from_ss58check("4FW5BaCdb5kX8xdRpM83r5ZjvrooFxaMCEAbiDCUdRS1gYNN").unwrap(), 523986718684), - (AccountId::from_ss58check("4FpAipxkqZDjADeHmrhYagk5nUE17SJ5dtiPk6hPck63KFje").unwrap(), 1000000000), - (AccountId::from_ss58check("4EnGdxDR96WagnZMZspbwQuDg1na3YsDagFrU2ERWVb8EKCZ").unwrap(), 35515729133), - - // collators - (AccountId::from_ss58check("4EGknSwZrXmH5XcfyDEUDT86CGX5vhhud5FpYgzdQJ6Nkv9s").unwrap(), 20683545120), - (AccountId::from_ss58check("4D7Bpa9ED5fRs6Uv7QgWiHS5z2omK1mVh28pQK4JTMW347Yo").unwrap(), 17323173000), - (AccountId::from_ss58check("4GGkTLRBhZkrG2NqrGmxsEN1ybxDj93oWqpPFEiLg3f3maKs").unwrap(), 11290718201), - (AccountId::from_ss58check("4CHseDyyjopCq2beiD7S7wtmQNpSeoeKFbx6zCWT1wkXeSa7").unwrap(), 9744356160), - (AccountId::from_ss58check("4CySo2NoHBFvWJJ9yRuJiDYkUBaY1VmC6fA9hY26UjnsfAAb").unwrap(), 7804496918), - (AccountId::from_ss58check("4ENjSnAo9ixbZYaGTeLfD6Yjz1YWfNirVfY6rLM7zVTpPjsF").unwrap(), 4979484720), - (AccountId::from_ss58check("4FYeo8dZFdt6c66t9NLKqPCejaPnRANuRN1FfEi4vNdZiGba").unwrap(), 4812816960), - (AccountId::from_ss58check("4CHjgm8nxkBDpXBvUcHqQ42Jmi3tdKNLMo6HY4QMSzZzXSb7").unwrap(), 3726051840), - (AccountId::from_ss58check("4HTc7hBPHfMWhYXAYrtuZG4qQfYGMj47iPAqFxix69sCxsRQ").unwrap(), 3269427840), - (AccountId::from_ss58check("4DEj1ZoCRgAVtowNYwMNBm5ju3pfuoCxWrJHTTkL8JvM2P1e").unwrap(), 2163636720), - (AccountId::from_ss58check("4HMc5NFN1v6KzmHc3LcExNQwYZprqXMXg81xtUB2QXbfbaGA").unwrap(), 1818124560), - (AccountId::from_ss58check("4CqfhJvKzShBmxiLuZoestzYrL39WXdtSVsA44Y11ZAEJTy6").unwrap(), 1775125800), - (AccountId::from_ss58check("4F4E8qgLQosEfZ48fSrD4sef1FDrXerjQu3Bm3L7AgWru9r2").unwrap(), 1114923600), - (AccountId::from_ss58check("4HY4niA5u2LY2LfeEubjNmR2GxfDRmyevkHtaAWj8srZetcj").unwrap(), 856550520), - (AccountId::from_ss58check("4GQjwA43yT8tHfBpSq2KfLHN3hei6DVD4TQaUMwJg9FJ9ZjK").unwrap(), 624052800), - (AccountId::from_ss58check("4EEQ9cJqY7hD783eEBbfgUhhJAMxNaTXs7bPPxAvEB2ermB4").unwrap(), 136606680), - (AccountId::from_ss58check("4G8U2CVAher4qvzpFGm97Fyoy6ofZW9aQobmD2dYjHm3pAdW").unwrap(), 109589760), - (AccountId::from_ss58check("4CLsdWThVzv7FX1YmwrZkfpjmW7YF1keduhXUgucGksR8rAo").unwrap(), 99696240), - (AccountId::from_ss58check("4ERFfW7o4QiV5mN2M1iAZMLAD2SuU9KMg9knG4U26zZCaXcg").unwrap(), 71918280), - (AccountId::from_ss58check("4EH6GfPq6RsU3t7rKvy6ukj9rskjgU1pxmawH2ZGivNvULqj").unwrap(), 55936440), - (AccountId::from_ss58check("4ETxML8hL53L5cqBKD8AxXLGp9zpPF9sznKukg8RwfCcA5xm").unwrap(), 49848120), - (AccountId::from_ss58check("4GVK4TsaHeGVidFsd1EtsrKEUHKw3b7ESBAZM51JR3uG5bS4").unwrap(), 45281880), - (AccountId::from_ss58check("4DCY7zc7z44CdsNR16GvxYYFnNUrcF5fJ616rCKqeJcLfKzC").unwrap(), 38813040), - (AccountId::from_ss58check("4HDzvMnGcuuT4uf9tyex4qmf7nz13U5kJBnUfweVpwbny1Aq").unwrap(), 37290960), - (AccountId::from_ss58check("4CJS33wRcAek5uphaH8RrXCU6nnQGfFCzessAoGEdQsa1no2").unwrap(), 26255880), - (AccountId::from_ss58check("4HW9YK6wNCuq44J4XS8AA3zsMUPtWUDPDknAXb8BXW7qnGur").unwrap(), 25494840), - (AccountId::from_ss58check("4DZL4uYRiAAnFAycXKTgxkLxkAvKQZkp2FjgyFhJpLxK9ARc").unwrap(), 11035080), - (AccountId::from_ss58check("4HQ2TALfSimtqDxT221mE2qmsCHVFJp4kH3rtx6fyH2pJwYY").unwrap(), 11035080), - (AccountId::from_ss58check("4F652pWB2EMppFAHZHt25ZASoN8DChNHvrx9gc8sP534u21u").unwrap(), 4185720), - (AccountId::from_ss58check("4CvtTFCtHsYpZyocGLcc2WBVJVDqKgj3pjyJXNmjanYuakpc").unwrap(), 2283120), - (AccountId::from_ss58check("4HYYLz2qZsXwMZFEeo876VqkvnZ5aAK4TL9qoviKTKUP2jzk").unwrap(), 761040), - (AccountId::from_ss58check("4FLCNicXiKWWvmxvQYYNDoPgowAduWMH8CwPDAtFfoydDn5P").unwrap(), 380520), - - // crowdloan - (AccountId::from_ss58check("EkmdfH2Fc6XgPgDwMjye3Nsdj27CCSi9np8Kc7zYoCL2S3G").unwrap(), 20026080785025), - (AccountId::from_ss58check("E5uPBKpRaZ38jXfXiTDTHHJN2qNnco7cnqBkKXEEsuZ5p4A").unwrap(), 4406500000000), - (AccountId::from_ss58check("HqXgaWa2rK6Wfzos8toTHdfcxfb5F5rVCf94SuKrKURGQWu").unwrap(), 3500000000000), - (AccountId::from_ss58check("EhxV5kSAT7GCx69G5CfdPb156wWcHfkqn7f7HmMUBDGzQyw").unwrap(), 3500000000000), - (AccountId::from_ss58check("HH5CgPv1RAgQMgpJh6p3NdT9juW5RkTgNTZyY14x3YEEY9W").unwrap(), 3500000000000), - (AccountId::from_ss58check("DimpaDpfG36MxnhQfD9jV7BJUSRxLdDaT393Hng3pRSD6gs").unwrap(), 3500000000000), - (AccountId::from_ss58check("GyBq4WEkCVM9wmL449jn92jCw3obgRxihFrUccsZxzMHzv1").unwrap(), 1820000000000), - (AccountId::from_ss58check("Eo2YWNA49Uhqu3rVawFUjhm19H72XeuNinmAHBGbKpHasNH").unwrap(), 1470000000000), - (AccountId::from_ss58check("GbkhM5AC6aKq9KVGZK2LB3buty3AtGFreDpFVGBumes2ASR").unwrap(), 1232000000000), - (AccountId::from_ss58check("HHj7D5oNKUKrgPwb5CYusqXaEN5cbVqbcfqRhQyKZdmMejj").unwrap(), 1214500000000), - (AccountId::from_ss58check("GAYEw55zxi8n27sTareYi1nGWhqo9DXAm4pr8FTsiN1ifsj").unwrap(), 1197000000000), - (AccountId::from_ss58check("DBHWqVBJZghss4FE2y5PB7aa4cf6jiLhPsTym3JLUDtGXC2").unwrap(), 945000000000), - (AccountId::from_ss58check("GqPDeJBexSsvEq6gBzrnMCn7KNYbzn9bX9ePCjEDN3EikoV").unwrap(), 892500000000), - (AccountId::from_ss58check("FiPrHCL2jt1pxN52BdFaSUPmYoDfZYnHWGhVQabnYA2WAZp").unwrap(), 770000000000), - (AccountId::from_ss58check("Er1AXR5LRA5oqzQS8DRqZvReFYuC7SvwzDijSSQ5LaV3Cb8").unwrap(), 751375100000), - (AccountId::from_ss58check("Cyy3Y8brP9ZSeKKwFZpxjrU4o9TVKxj9iVvGGB2i5sQYXKy").unwrap(), 735000000000), - (AccountId::from_ss58check("DGFkBQeYS7YBcm8ffQfRewhpMiLDJtegH6pLWhDAnHhMFhg").unwrap(), 700000000000), - (AccountId::from_ss58check("FFyDcD61Z4XFGLsmcZEnoinshkmmYJWX6nvgwFbMmkpTEBK").unwrap(), 700000000000), - (AccountId::from_ss58check("H7JWsnc6xDoj28n5B5iB1mcH3m5Lmjrb7Rq17cY88tvYUCu").unwrap(), 700000000000), - (AccountId::from_ss58check("E5W2s8NRAL5yQsBF6CLQiLKFG7qeFf8eojYY4gWUFGLKoAC").unwrap(), 696500000000), - (AccountId::from_ss58check("FSHa5hnHQLN1kX4oHeAZbHikxSFiiS3RAYnwpFtD88EH1ev").unwrap(), 584500000000), - (AccountId::from_ss58check("FDXZQjZ2JiUfUy8f8HVbozxvZsy83KnstfBRfdK9CGxXPhL").unwrap(), 580227900000), - (AccountId::from_ss58check("E3FfH6nbxCwQ9bg3oHAmBFpS3qEtWLbQ4QV8XUqn6qQaaab").unwrap(), 525000000000), - (AccountId::from_ss58check("GCQcmCVwALrshaz6cHJjMzUHX5WWP54LEzk97WHJTZyqTCX").unwrap(), 513100000000), - (AccountId::from_ss58check("DyngpQuRHqk7Huuobtn41g2Wvcafa8RaQ83JeFezLeUtVMi").unwrap(), 490000000000), - (AccountId::from_ss58check("DkWmumq1MNGWNs9mukEFJBYDsuMSHuAE42ZaJZ6SxjvhSbA").unwrap(), 472500000000), - (AccountId::from_ss58check("EJy1ruZeSstDUU7pU5XarCmLW5mcd3asCrzynpV2WMYfXNR").unwrap(), 444185000000), - (AccountId::from_ss58check("DkjeXjaeX2L5hw6jpYG6pX6ZT46buRYL7SnANdthqsfQ6Q5").unwrap(), 420000000000), - (AccountId::from_ss58check("J1aRKEqVUTAzMhp4XE5q9noUo4PXwZ3W7q4RQ7sEjCLbC8y").unwrap(), 413026545505), - (AccountId::from_ss58check("GFzwmGypvtcrAH4o85cFiRH92PFThWHpqSb2BozuapUH515").unwrap(), 385000000000), - (AccountId::from_ss58check("Hec6PvCo6Pz8gvGRgZi7Anwo37nVMDkqVbNo69qDKtzvxHa").unwrap(), 367500000000), - (AccountId::from_ss58check("DwCNHpUys3KmSEFDd54B3BwF7twCPwGxbqTjp1H1xyXdFth").unwrap(), 350000000000), - (AccountId::from_ss58check("Dow1Gu32fa8E6AG4YmFBqjvMNXDh8GyT5NRN2hJbMcTbjvL").unwrap(), 350000000000), - (AccountId::from_ss58check("DVC2Yi5fdZP4dDbLuKvX1JDF5nZSUFGs1yz22NvT4V1Gf99").unwrap(), 350000000000), - (AccountId::from_ss58check("J1VNkL7Sq8CqmdZFq8khNbPmbeRBUFLg2ArnuUSycCpg77L").unwrap(), 350000000000), - (AccountId::from_ss58check("FdGxpdR1GADdxhFP91XNQwosGLAVFSqPaapYXqg1TaMSo2k").unwrap(), 350000000000), - (AccountId::from_ss58check("GJ7JBaqx4ys5LrkECQKmEWdjGgAoXChsLepjEqdHuKggymK").unwrap(), 350000000000), - (AccountId::from_ss58check("EPrBGuinK6Lw2t45HULYk7VYjKPCgY77wmR3ToqbdvZhHjJ").unwrap(), 350000000000), - (AccountId::from_ss58check("HR2hCVxDmU2KSjCkgXXv6Gb5vJJDFtPrEmQmXJTc436mE9S").unwrap(), 350000000000), - (AccountId::from_ss58check("F7WJZgtd2R9iDk4TMRSLUzU3A8sX6j2NVSRtBk2TKGSNAzJ").unwrap(), 350000000000), - (AccountId::from_ss58check("FSeEmJztseXWkYQCgBp5U2R7yvzBxMvY3Y77GpWiFWkXp13").unwrap(), 322700000000), - (AccountId::from_ss58check("DXeWaSvf7GXPnf7pUoFf1wxM62setDg1id7v4G54yKr6oQW").unwrap(), 317800000000), - (AccountId::from_ss58check("GNyXjtwoT4UF2yDEXn4tPaBR6YnNZNFDFGKBcDAumw2VrpV").unwrap(), 315000000000), - (AccountId::from_ss58check("GpyQahFRepy1LnWYCfyYvLN2REqKwhbjAyTh1R5oLpohwvg").unwrap(), 315000000000), - (AccountId::from_ss58check("DECFCz44gE7fSy9L3rtY7a5zzMvtV2bqMApKRLLkZfoHfe8").unwrap(), 247835000000), - (AccountId::from_ss58check("DPsjacRLGvN915fvNzK4yXRa7vPmrP3z2LBpSXVZeEke3jV").unwrap(), 245000000000), - (AccountId::from_ss58check("DidVHoYvzHSm8ZQ7mi7f95E1a4CzdfCRDKnMuYF2FLyk5vj").unwrap(), 241500000000), - (AccountId::from_ss58check("Codv6eWwWnTkZXSgniRxaCiRVNUVgjs4jGR2RN8aD9cJtwj").unwrap(), 239806000000), - (AccountId::from_ss58check("FvsPfJwLqVS4x5MUiXQ7B7X2NL4tdb25yMJAJKnPeGcu3nG").unwrap(), 238000000000), - (AccountId::from_ss58check("EaaVqGgpdRhgadzSxyCbiu1vNvPTcVWo6x8y69A9WZ1mf2d").unwrap(), 234605700000), - (AccountId::from_ss58check("EFtNrSxTv3mtfZBRabYEaJTepWKrpXJDsVXaogsZMAM8BBF").unwrap(), 231000000000), - (AccountId::from_ss58check("HqnhuZCEMMgdrF54HAFqppWWRq98STiW1gVcZVvDgx6XPRv").unwrap(), 231000000000), - (AccountId::from_ss58check("H4tXtWuLgzgXZHZsjmMEZ9ZxzHCYESdeTs2Sf4d1ApE2L9y").unwrap(), 210000000000), - (AccountId::from_ss58check("DiWBmXFsX9ngnfVtWLoA28UCt9y711r9ShZCRye5ToeBZq7").unwrap(), 210000000000), - (AccountId::from_ss58check("HPBSh8iuNyTMEQ84NpjoYB6riUGY9YZDyfLhcFV2Up4MmFr").unwrap(), 210000000000), - (AccountId::from_ss58check("FRmHzqZ4LgaPV4nup954m9MccbwDCKQFzwUFNkir6aXfULX").unwrap(), 185115000000), - (AccountId::from_ss58check("J1sf2ZFTrYrxKUif2zSzstqQizBRXyK1a9hpLvCgC8ZrJy6").unwrap(), 184170000000), - (AccountId::from_ss58check("G2e4YrQ8CQ4yw7iy5yu9yB5vHxJjfS3q4T46ojazqsYkKjV").unwrap(), 183470000000), - (AccountId::from_ss58check("DwLQDzAU16s5sdyBAaFEAXwAQNW6zdpCsg9Nrz1ZKDNv2q7").unwrap(), 175350000000), - (AccountId::from_ss58check("GfdkZS3mNTpLdEF3qrRfK73E5akBShDUo9F7YH5dy8cniHM").unwrap(), 175000000000), - (AccountId::from_ss58check("Gw7TJzuc2VnZrMcJiouHFNx8d62u1uBZGPSM1qdHWqBkbNb").unwrap(), 175000000000), - (AccountId::from_ss58check("Cob9grBs5iKNxu22nuFChVzLzfMHcuiK3RZvvYiENpAUVvj").unwrap(), 175000000000), - (AccountId::from_ss58check("FQ9DuEJ5aSQYyPcK8b1N4XhhTHGZT7zsSsLto5rkEQPkYqu").unwrap(), 175000000000), - (AccountId::from_ss58check("GCPc751A5SaMGUWL298fgw23PVCfAwRSDSG8RnRkWLmhGiG").unwrap(), 175000000000), - (AccountId::from_ss58check("EAJWqTcNdgFb74fi6b3EzigGhDTjUUrBv5dD9wtRJkuHdxN").unwrap(), 175000000000), - (AccountId::from_ss58check("CzXuyrWXVDeduZVbnjdZoGtz25SJaeAjA6pJE5TZrt7neNY").unwrap(), 175000000000), - (AccountId::from_ss58check("E5G4noTKyse8mMhMHKX9xy8iJK9NbaSeAeVukvBVNhxXPUW").unwrap(), 164500000000), - (AccountId::from_ss58check("J17KNggbXFYg6ETH5f1w4z9WdLhUcKDBCiMvCWgsEMYZkXG").unwrap(), 164150000000), - (AccountId::from_ss58check("GHicQKW78t1mWF4iTTcX1pFGHt6m9G8RoQVERnWLZSEx5Hi").unwrap(), 159250000000), - (AccountId::from_ss58check("HNcZc5fvP3Jqyo9EYENfoT7sbRke3UnYfFQ2H29k8ENRu6T").unwrap(), 157850000000), - (AccountId::from_ss58check("EXg8ndn1ySbjxQRSFTiP7x2wDRcPzL2uRMYUbuRgp2dVd6B").unwrap(), 157500000000), - (AccountId::from_ss58check("JHLYk175ekQa9hmcm4tLT6BWEuEHqKTPrEqns256qXkVQ5p").unwrap(), 157500000000), - (AccountId::from_ss58check("FS8SdezgSMzxVEyghV6GBAL2gMJhkenoPs8qxMmfoDn2sue").unwrap(), 143500000000), - (AccountId::from_ss58check("J4k33KyZBJ9q2vbQQgT64tj3nwyrX62h7jhNRZ2RYap6y36").unwrap(), 140000000000), - (AccountId::from_ss58check("FyocgjyV7j3PSzWYYbZAwjhhJFFWvcnZbLh3mYWjSJWkTGX").unwrap(), 140000000000), - (AccountId::from_ss58check("HZgcGWS3zCf5GgHZZkDmwEv2TXEz1RkkBXp2zmynmCsAPyX").unwrap(), 140000000000), - (AccountId::from_ss58check("J6bazUrns4tfsJ5yJ9vTPjYBj9vvbLXUbjkDAFCGedxCDy7").unwrap(), 140000000000), - (AccountId::from_ss58check("Hjp6SmUqYWCjUdgi13SJAAx6efLouYasgndj19NdhH9iGJt").unwrap(), 140000000000), - (AccountId::from_ss58check("HgnxQPFL48s8rNJ7moA25YMBjb442f6bFKGN6ckDrCwyjba").unwrap(), 139930000000), - (AccountId::from_ss58check("DbJB6rKZUko1Ayh348Zw8wb5FcjtdjyYf6nR5dGEwtnKSW9").unwrap(), 130200000000), - (AccountId::from_ss58check("CgoiFabcT7xdzRcvzwf3js6sByEr9xXvd5Uo7rKxGt3FUg2").unwrap(), 122500000000), - (AccountId::from_ss58check("HWCp3SxjSSyowbodVxfgbgZc59VBnm22a7YXYNuAXfUbt24").unwrap(), 122500000000), - (AccountId::from_ss58check("EzHq6GM5tMc1Y1GZcVQRBuihWND6eCkSs6GjzK6GP9tqL1n").unwrap(), 122500000000), - (AccountId::from_ss58check("H7qW64422b4A2Gjt9EuhSYxTnvBQwagpTU7eZuzPN5zQMRf").unwrap(), 119000000000), - (AccountId::from_ss58check("E4woiQdETcjKQ8Cqnba4JL7eVxK8KwKPCMtisbTNKiSUk6T").unwrap(), 119000000000), - (AccountId::from_ss58check("H7dcKjiUcsQg2uAJpPbQiMCZNvFQgQiNTpKkyz4CXfghmCF").unwrap(), 116550000000), - (AccountId::from_ss58check("DDE1VHDscpgMnevsLH6d15M6ouBY4ZooNSFvjE93tF6Pimy").unwrap(), 115500000000), - (AccountId::from_ss58check("J6R1Ds3WfbZ3nm1Jn8N4jssz2Cj9QPyUpECssnKAPMfycFh").unwrap(), 115500000000), - (AccountId::from_ss58check("Hk39ZdgFK3ANNDmF2P1nF3SisBhcg2VXYWQef469wp3EHG2").unwrap(), 114800000000), - (AccountId::from_ss58check("G1pTc6DB665QByXRNojGdKPrPsSSDuLMn4CnpBb6UrJAhcz").unwrap(), 113400000000), - (AccountId::from_ss58check("EoW5pFMTNZDV5uU7auAtu2xK9EAtoNLcvWyXgVYErMy6Sk4").unwrap(), 108850000000), - (AccountId::from_ss58check("HyGEA6yGqav3rTBT35EgAzPf9RoJ78px4zGDdmVKDyU3wL9").unwrap(), 107100000000), - (AccountId::from_ss58check("H9T9y1zCmwChAfmFyR37PN9yi91PVzCyjxfTSrkSfY2LGHs").unwrap(), 106750000000), - (AccountId::from_ss58check("HFfPhmHzYKFkN5fhuT7Bp14NUUJ3GaNnFNJBJXtp27aB542").unwrap(), 105000000000), - (AccountId::from_ss58check("CrniPMf4Dz1AeiQKfkNuTFCzwFRo33G31Ltuy7BSXUiypK9").unwrap(), 105000000000), - (AccountId::from_ss58check("Cx5cnMDtHoivaaxLiGa4zGkFo7SZozQP7vjaExmUah183MK").unwrap(), 104650000000), - (AccountId::from_ss58check("HhStEpAFttb7yqyjiQg1GCtuY6MC7pRpvuLGFDr2etDW2Cb").unwrap(), 103250000000), - (AccountId::from_ss58check("GpuXKo8qC8oR8ZK8AMiZVt5B7PG8mTgcwECk56ReFk3H5Lk").unwrap(), 96250000000), - (AccountId::from_ss58check("GXT6ncUohWj8osqdTxRwpSEHUsuqa6TMDr4rRYJ8WQHURsS").unwrap(), 92400000000), - (AccountId::from_ss58check("HnVGajGCaJGzBUtDbm41QUsR2T8aB9h18BGRDnmrPFiHofn").unwrap(), 90300000000), - (AccountId::from_ss58check("CgiioKma6Ln4GXRSjV5iLNoEKHPowebRSGM1Mpfy1WkGwNL").unwrap(), 87556350000), - (AccountId::from_ss58check("ErNKuPVtGAWNLDT8QNQnLFypwqK899kG13ti4MzhhiFJCrb").unwrap(), 87500000000), - (AccountId::from_ss58check("EaFQxLXESDEYjuw2CoyENscbwPp8KxV5eoNhXWLo7qMpQ13").unwrap(), 87500000000), - (AccountId::from_ss58check("EfLhz8xZWKhn9BHVEPGpUCPECkyUzaBqVuQbyLTJyQERygn").unwrap(), 87500000000), - (AccountId::from_ss58check("HjTSXEGYziW5CyJsamUykjaBQtLKTFQZXwkPfzNq8k4LEaG").unwrap(), 87500000000), - (AccountId::from_ss58check("EwPvB5SfqjfJrgxeK5MKWh87WU12nhLp7RVSnjRqztPQQnh").unwrap(), 87500000000), - (AccountId::from_ss58check("DrCUyqwBLzzQpkJk2Yd7BTRFQNa5wDLS4nzapJx8pojoim6").unwrap(), 87500000000), - (AccountId::from_ss58check("Dx6k8uhZRGpuStXgZQfZMVidEZzWSZCnz3MYeeCz1wvjHBD").unwrap(), 87465000000), - (AccountId::from_ss58check("HtRw7rjRjW4XBWcuLFRjemGbfEhJq8P2XHwNVP6vkuMzEv6").unwrap(), 83650000000), - (AccountId::from_ss58check("F5hGnoJXcYcd1nHShm731aPK9Cw4eJbSChLgSFs2cuFJtQa").unwrap(), 82740000000), - (AccountId::from_ss58check("F5MZMXrTtrzVwKszjHAn44HZHsa67noNe1AQTmxAfDdpkTX").unwrap(), 80150000000), - (AccountId::from_ss58check("Dr2KfF8sK5LbSoyJ3yJKsZZ38rrQRsyoNc9e5Cm81zijkMD").unwrap(), 77000000000), - (AccountId::from_ss58check("J4LnYcBCTvawiTB3QrU36UMbU9QVxBvJNxAZhjpPbpWLVad").unwrap(), 75250000000), - (AccountId::from_ss58check("GFrQQ9cMz6mHdZig9bBJdNmP4CySJvefywouoBa6hdCUyjQ").unwrap(), 74200000000), - (AccountId::from_ss58check("GJPooFt8kgQbMiuEXbSoFnMS1Vam7MShUAqU6YK7Js1nmJe").unwrap(), 73500000000), - (AccountId::from_ss58check("EaPrkxNSSqfR8XvwkPhBmAwpuGM82u5jd9eJfu82Yuqs3nZ").unwrap(), 73500000000), - (AccountId::from_ss58check("HcBinYAi1YALAZGwNwC7Ak7qF8PbY74vcoP93FWPPhsQfiU").unwrap(), 73150000000), - (AccountId::from_ss58check("EMUt3xQ2BaDhxvNnmgEXVuR8eQNz8Fi5DioMGCYX5y1GYGR").unwrap(), 72100000000), - (AccountId::from_ss58check("EkbBXRUAQrRNX5xSqKCGSuUj9aE4RqjHvoKTwmy9EoZ3tqV").unwrap(), 71960000000), - (AccountId::from_ss58check("CsBRKFBv2JzRBCKqtTpgwpsWpNCA71L5p2e3M7w2BcJD4Xh").unwrap(), 70000000000), - (AccountId::from_ss58check("HS6ARFNehhZoWGqakTNKnd4XgLcohQxU9nJdt5BrPv2igzk").unwrap(), 70000000000), - (AccountId::from_ss58check("ELxRJLrqfNJ6SsFcoEqQWaQXM5F1YdhfHQLkyysJWwZDVo6").unwrap(), 70000000000), - (AccountId::from_ss58check("FHy6DDD2G3xmyDDUk7pnH8LTo28nnukSGbfXc5pjTFK3zY1").unwrap(), 70000000000), - (AccountId::from_ss58check("EuCfnnYAraheBSxJsabTzPwotgPU4DVHiXNhgRh11J5xfGP").unwrap(), 70000000000), - (AccountId::from_ss58check("FvjQD5d54YVtiHbVNsDkPhxhXjfTEfyAB6ZJ1QiDAfjFEcw").unwrap(), 70000000000), - (AccountId::from_ss58check("GHjovLTp39DEV5XGgZEf9z5iCygNMbBwuPEBCpr1NUQK98k").unwrap(), 70000000000), - (AccountId::from_ss58check("GhvCRBbbsxLAaxYQhfoX1bKYY3oZeu7q6FPxBtGMtvXbpUm").unwrap(), 70000000000), - (AccountId::from_ss58check("GPSFFaS2PE34GtyWD2eirWDt8SvnzzsMEif4jqDt4YxYeKW").unwrap(), 70000000000), - (AccountId::from_ss58check("GjuvSUGd7JeDjZThSZDCtYUc1R3Aj2jevf2iCNe4tthGtk1").unwrap(), 70000000000), - (AccountId::from_ss58check("JBr3RyLhTGVBGtcUvD9hbadAEragDoo8B1KuH5Gvanrx6CG").unwrap(), 70000000000), - (AccountId::from_ss58check("GnxAENseaJAAqaqFbAxVDYAfqyN3B2NsKiUdxFrjCL52Ww6").unwrap(), 70000000000), - (AccountId::from_ss58check("DrdfnT4WLEiB773X3pq3jKqe1aEfJsr3B4mDaJgNb8o1ECv").unwrap(), 70000000000), - (AccountId::from_ss58check("Dht2RG1cZqLSMACJ6D1XzQNaR667nWgAMcxnEr2LruLoaHa").unwrap(), 70000000000), - (AccountId::from_ss58check("E4wvXf5tuvkNLk47eQMLCwyZB3rTDBjvHyyHdJK3DZquyy6").unwrap(), 70000000000), - (AccountId::from_ss58check("Ed6dHRQLF58vToKHPHmvqjKR6QqYupGjU2EYZxSRauxc79C").unwrap(), 70000000000), - (AccountId::from_ss58check("DMzHsypVWep17bvvnsfvrMpvuCakj9qcARrpzjkSe1UfpLp").unwrap(), 70000000000), - (AccountId::from_ss58check("H7W7tX3NRc5JdyagNkmxynA6vajKvxS3Nwg27imM4XBL8Mk").unwrap(), 70000000000), - (AccountId::from_ss58check("GXdHYsUXqb2iHkXopmwCEKe6GwPicf9M6a19pbNFDzLZQ47").unwrap(), 70000000000), - (AccountId::from_ss58check("EM2VpJqb481ZjPQJ9sHeiBi4tszWFnifNYiXSDc288WeNvg").unwrap(), 69300000000), - (AccountId::from_ss58check("Eocb6wcAWdCtWiAYroWKPkQL9n1adah3CtJRfZkFvyvwYSx").unwrap(), 68250000000), - (AccountId::from_ss58check("J4hH3CrJDg5joc9hbCGfwrfQ9o1oA7va2KM6DioE25iHCDh").unwrap(), 68250000000), - (AccountId::from_ss58check("GPtJ233fZyimC25WqTMNQcL7HeGrP4oME4hKWEP4N2uUb85").unwrap(), 66500000000), - (AccountId::from_ss58check("DK7qbxoXWr29QoHSrG5QvwCpQBzocG2cUR7dkWbmfWEyyqQ").unwrap(), 66500000000), - (AccountId::from_ss58check("E88zdYVoyP9T5nkuXrpNHYRaixFhMJtQAt6KfkE1aZE47LP").unwrap(), 63000000000), - (AccountId::from_ss58check("HUm9etWFq6yf236GWmNuyT2pykgP98N8wUdu6YJxzRdcwfw").unwrap(), 63000000000), - (AccountId::from_ss58check("EJQcvZBfXzn4GR42U8rPN9WnWmdrCYAgVbMLkkjQ4FuVkDm").unwrap(), 57373760468), - (AccountId::from_ss58check("DMNbb5sUggLusSgnvrhcsTsqJkHoVsbbPzdRWgjRoAy8VNA").unwrap(), 56315000000), - (AccountId::from_ss58check("CoejTWWNeGTbZkBwj2aShzPKfYYj99gBVV7ypG8EegCpaRP").unwrap(), 56000000000), - (AccountId::from_ss58check("D8gafq2iRQ3n8pKorCwLQhFjUsstWmbTykaozbgnbv4Hsgq").unwrap(), 56000000000), - (AccountId::from_ss58check("CmkR4RVPgnbRpVK8rXJ9HsM9EBgHWz1rjzV9nAxm166BSGf").unwrap(), 56000000000), - (AccountId::from_ss58check("DGV5xU2i1bxVoFwGY8ikvgCCnApitr9JJeAacqFQWt5Haqg").unwrap(), 52500000000), - (AccountId::from_ss58check("DgMmE74W5EFXhSNRL3ztqQVL7Bt37jfxjE41iGNJd5eFjM3").unwrap(), 52500000000), - (AccountId::from_ss58check("EqZExubhDLvZPTeqGAkeKxWVbZvVgEEYfgn3HwvfMBWDv95").unwrap(), 52500000000), - (AccountId::from_ss58check("HL3Xuc7RtbMUCz7MxVfJy63CncJ4KEBV3PMZyGdGLqQe6QL").unwrap(), 52500000000), - (AccountId::from_ss58check("EcpP2aT5nLhdSKqVBj1uz2YCniSQUBKLQcCb2AbF1v29Kfo").unwrap(), 52500000000), - (AccountId::from_ss58check("FceEvzaNJHrwN5Ls95XYex9Knn5nz5uwcRyxfsTP9GuGt94").unwrap(), 52500000000), - (AccountId::from_ss58check("DK6VbHp69Xt1uyzjAvT75wdi7R6jC8eLzxVZPL352CrWYy1").unwrap(), 52500000000), - (AccountId::from_ss58check("FFdL1sEh4eh3ck4jWRPL6oufD2fZ6W7JYS5AUpihVGvqfW2").unwrap(), 52500000000), - (AccountId::from_ss58check("DoTMcbSeDv53puWqQGN8FLZTvCZKZAV4NEFmtRLVRu9zNDh").unwrap(), 52500000000), - (AccountId::from_ss58check("CjNkGwxyUcyLpjsZ1z86GjPqj4nVUUNYmxppfgukqeK4Ngf").unwrap(), 52500000000), - (AccountId::from_ss58check("E5qFqe5g5iS4Byu4hyKLAavayXtCiuuuK4xzuLcnQWvtqrg").unwrap(), 52500000000), - (AccountId::from_ss58check("HqnKDzYBnFpGH5jXYZmUFXFnz76ynKN6nTh3De3oRxA9gYu").unwrap(), 52500000000), - (AccountId::from_ss58check("CiZ5ssQUQTQDhPovZhCViQqougPntong3MFVMXWYMVC2S1a").unwrap(), 52500000000), - (AccountId::from_ss58check("CcxH2T1PFcQ8xXsBL1kTMszNynewcmvVHEZwdMMe5UyGLsQ").unwrap(), 52500000000), - (AccountId::from_ss58check("DXy9SMsHzYfvTmHjvePdr8y6tZauXdZYbEye6yXebPmS4mg").unwrap(), 52500000000), - (AccountId::from_ss58check("FhhmGz4TeU28wegza3nawhyVpVuRPvakh814gwEdwZpEEur").unwrap(), 52115000000), - (AccountId::from_ss58check("FwA7MCjU16XqeWJdsdkKxGzH9LAneH6FV7iNQbSGy9oqEdd").unwrap(), 49000000000), - (AccountId::from_ss58check("DKQFnC3i2zd8o1YUZaGLcypt2WrscXuS3ZWGc3gqWr8YCs2").unwrap(), 48650000000), - (AccountId::from_ss58check("E7ZbuJGqB3nKEhJrjj4mojnxmzF8tTD6ZqWVLwxX1d1Zz2J").unwrap(), 47320000000), - (AccountId::from_ss58check("FLVYNFMzcW97pjYkrggChkoY1fZ66wbAC6K5E1zhPhhWme4").unwrap(), 45500000000), - (AccountId::from_ss58check("DirbvYfwo6epBGoZTSBSDDMhTfX3RURSDmKDSCkrC9KjcCB").unwrap(), 44516500000), - (AccountId::from_ss58check("ELxEXYwinRMcHJLEsNANVV6QxqZGCHSLfgpj9ZyPf3WzdRV").unwrap(), 44100000000), - (AccountId::from_ss58check("GnYqpJ6i8Vbpob6dz9CcyoqJzKPtw8aGrieZwKriqC2JL4C").unwrap(), 43295000000), - (AccountId::from_ss58check("E5FLJc3vHt2CKqUgda5KqNuCA93wbyyhH3PFkUneXA3dPVn").unwrap(), 42000000000), - (AccountId::from_ss58check("HBuXBgW93PB19uwdasZSmyqfXEYYUnnwr7jLZ5MFvPmgTG9").unwrap(), 41685000000), - (AccountId::from_ss58check("JFNDkZQC4jTXWJPi7yNPwh2JjQmhcNnSNGwM5g8KUvEjC9n").unwrap(), 40250000000), - (AccountId::from_ss58check("DMqCThv2yNzhw3pDkjBWpP51cximFkc1GrQYGaJHBxqevJG").unwrap(), 39900000000), - (AccountId::from_ss58check("GSVeNTf1brgXYFUHeGpxUJoDSBWN8LjgsfpUYiWZcWJur3s").unwrap(), 39616500000), - (AccountId::from_ss58check("H22NRtsyfB2Xmq5HBsZMEKmywBbvJfp918NBvzcPtWgdrT6").unwrap(), 38552850000), - (AccountId::from_ss58check("HWo42EnWLQKGzNtn89aEuQ7k3VfskyGhwk3nJpv5pjXKRLG").unwrap(), 38500000000), - (AccountId::from_ss58check("FJh1cXRXLSgwuXyyBg9AEAHENE5JQttvvSYrab9fnFCvoWS").unwrap(), 38500000000), - (AccountId::from_ss58check("GfVdPSmMjW8Yoj6cWdooXMzeHV4qUZbfiMGEtV67cytn4ax").unwrap(), 38496500000), - (AccountId::from_ss58check("D34yzTfivs1cMKzK2HLcvcZ2FdLWe9cSxG53uz5f5TF7FZ2").unwrap(), 38150000000), - (AccountId::from_ss58check("DbJsDvgnG9qYx1qnL8s4fXoJj4qVJEgqiCUnGsi4PFHq3De").unwrap(), 38150000000), - (AccountId::from_ss58check("CgXrZGmmwF7E8UV7vVrzqPcDEF29DHmJW4Gg1wr7Ntcdp2v").unwrap(), 38150000000), - (AccountId::from_ss58check("EUx41nCTSL8NZpe3UZHwVU5yZ2YNcEDLgMipSL1cjUAsTgH").unwrap(), 38150000000), - (AccountId::from_ss58check("J18gGkW54ieFskXPmLUzM1ZtBanbSZD49HHUWmj8rDGrVaD").unwrap(), 38150000000), - (AccountId::from_ss58check("GP3NFPAjiv5vD6iMoW3TjCRSgFrhtJzZm3ek7MSGqo7ceHh").unwrap(), 38150000000), - (AccountId::from_ss58check("GhuizGB1Sk3zLHBG9cpaaRbx5a3HuDkAium5dUjuN2kjLH6").unwrap(), 38150000000), - (AccountId::from_ss58check("HF4CXgRjQXMNPGCLsnvqhX8mAmN2L6MStLknxYbuYTtKWG8").unwrap(), 38150000000), - (AccountId::from_ss58check("Ez3eGmk4GgJ69h95VaYmJeGY2xpSRFu4oPKABA4Fzj9Dvb1").unwrap(), 38150000000), - (AccountId::from_ss58check("DUn6Y87SwccheQR9ks3UoZj6AcXJznka6MenHxwfSS1dusU").unwrap(), 35700000000), - (AccountId::from_ss58check("GLCFUTmN6c6yS9Kn8PsoBAy56fzCeY9vWd3ti75UkDwrcoM").unwrap(), 35360500000), - (AccountId::from_ss58check("Eyk85j1gRDcnTeAJujTHoyAyLc1cgW5U2GPg5pUedfRphch").unwrap(), 35350000000), - (AccountId::from_ss58check("HuwhVyjKU7VGTF6fScSdbMJmLk2ubu34DqtoYhkAGVAVZnB").unwrap(), 35350000000), - (AccountId::from_ss58check("F7r2dyPXeCkEBKYyU9gh7Hxv6AErKvNk4ELqeqZETmu8fuC").unwrap(), 35168000000), - (AccountId::from_ss58check("ErGvN7QiqhuWzR7jfZQQkucRHzqzjPS5XHDVCDSuiR97jYg").unwrap(), 35000000000), - (AccountId::from_ss58check("Gv6dFDomBYgLrPXmFA1hgKqCBHZwhwwb868tqgrrnVwpXkz").unwrap(), 35000000000), - (AccountId::from_ss58check("CbAWVENyYiNQAxQKoa1KSWq4rLKMTpW4tceNQ9m481cWf6s").unwrap(), 35000000000), - (AccountId::from_ss58check("FccDkAhrajNhQvjbfd9R9zuqJPk6zxAsFkwgCcUGTa5N32U").unwrap(), 35000000000), - (AccountId::from_ss58check("EiSeCHvuP3cyp2RtvqDwCLXVGJcmCTc2eVYTYvcYeEHTQkP").unwrap(), 35000000000), - (AccountId::from_ss58check("D7rqeKivvzxbRNsKZVbACNa2nQ7TL2kAwHUDdCpnr52RUWY").unwrap(), 35000000000), - (AccountId::from_ss58check("CfxAWxH82JX7DEhPGyZ5X4QX7rUPaiYSfaRNYx7HrJsU9qA").unwrap(), 35000000000), - (AccountId::from_ss58check("Fhs2cnMQnWSrMCdwSer3ZsoEtiZ1QDJ9bZBrJpF6hdGd5iY").unwrap(), 35000000000), - (AccountId::from_ss58check("J6FE7qH3iGkGr9cnQC3W7P9X2KRb9RFQgmFJXvPsYNVdQRk").unwrap(), 35000000000), - (AccountId::from_ss58check("F4vYPBJwsaNBvuScPpK5F2Fn84sNnVTEns34dFqg5g8TgUg").unwrap(), 35000000000), - (AccountId::from_ss58check("Go7Z9bhjYo6Xkc6dqpXpBwbTxx91sR38yqDkcoheYgV4PAy").unwrap(), 35000000000), - (AccountId::from_ss58check("DmBshsfSWGjC11jP1LCGJGvcineVpKKK1Cb8BmRwg51Z3sq").unwrap(), 35000000000), - (AccountId::from_ss58check("FXficy6r69i2s29vr5snTj33p5x7iw2o4VUdSpjBzVnzdEy").unwrap(), 35000000000), - (AccountId::from_ss58check("Dwt5xZEiozU5nWcbpi3SZ7i7rREFPSWywaRXac6CKphEyqt").unwrap(), 35000000000), - (AccountId::from_ss58check("DVG7oKLytmx8QJfj4evzYmtCb3hj9MZQodPuDdYafECd9cm").unwrap(), 35000000000), - (AccountId::from_ss58check("Dwq1UWrG5f1d6RkfRt1RtrEVsBnsNeB33gMUs2K1FtuvZGa").unwrap(), 35000000000), - (AccountId::from_ss58check("JE7vegpy7WP6AFULf1j3twXnQBeipSTQis6f5YGTQEZiPid").unwrap(), 35000000000), - (AccountId::from_ss58check("Gc8SxiYSm4kb8WYbh8XZ74BJSejwvEZfdnuXjMQd7KM1YLm").unwrap(), 35000000000), - (AccountId::from_ss58check("DfsrvwTZ3g7nTh5mJNtSL3eiCqETUptTJow1L7RCo4ECXZ2").unwrap(), 35000000000), - (AccountId::from_ss58check("CbRn3PCXq3HRzE5uAr4m8q1nHruiyNFwHafW65Dya7AFFKg").unwrap(), 35000000000), - (AccountId::from_ss58check("EqjwmRHoob8QJph2oCSdHsdfrJj6uAuTGadov7vdSceV986").unwrap(), 35000000000), - (AccountId::from_ss58check("DtiNbXV2JbvthdxH7TQCETrxhkBffzM48sjd8cKEnorev6N").unwrap(), 35000000000), - (AccountId::from_ss58check("FjyswBMnAyuRB3PjZi2ptT7gWLyh9Wqs8mTvdnSeHR7CFgD").unwrap(), 35000000000), - (AccountId::from_ss58check("FFGWrU7w5EgMf5WHHbnBSiz5vstGrQXynZLuhGSYTaxabwH").unwrap(), 35000000000), - (AccountId::from_ss58check("HFUencvDpcJ6XzT6fvKXuqBoQaeaKrjwD4o8HAGpVHRhViJ").unwrap(), 35000000000), - (AccountId::from_ss58check("DiP11m73mNpjPXj72KfAEkMJC5Z7XHagx5g2rfAXehPzmRX").unwrap(), 35000000000), - (AccountId::from_ss58check("EJJMF3oudVuCKVd8p6gqKvrhprqPewqxGyPQc4spdTVRKeD").unwrap(), 35000000000), - (AccountId::from_ss58check("H9XLTunD8MM7Z282d9h5hxVmCqybc9umEjKm1eL13LS8PcD").unwrap(), 35000000000), - (AccountId::from_ss58check("FvgWzGVrQwA27a6DgQVC2j8aFDLVhXDPNxRAmyyayGEtMx6").unwrap(), 35000000000), - (AccountId::from_ss58check("FAtrqJDEZLDxvB18RD11qJ19vQpF49GRxNeEMkdysr2QHCb").unwrap(), 35000000000), - (AccountId::from_ss58check("EXvk92X4EYvPfWJy9t8f8pqK6Gg3m2UM2ig9aECyN5eqGh6").unwrap(), 35000000000), - (AccountId::from_ss58check("CpCNXtrsgKZJk7cm1tWttzd4sJuahknbZAbdmVhvhURqVJx").unwrap(), 35000000000), - (AccountId::from_ss58check("Ftd3y3TNMiB7AJshhPJFQBjaaXhhcqqMRxMs1FU2X5j44tw").unwrap(), 35000000000), - (AccountId::from_ss58check("DiithcUjDpbmJqLk3pgujqkASk93CrE5T5ddmhKtKXKMDNm").unwrap(), 35000000000), - (AccountId::from_ss58check("HZ7Pa28vCUmX3tEAQnFqVsBr6we37oxM8wkCLZticjJh7fh").unwrap(), 35000000000), - (AccountId::from_ss58check("HhW71my9XNstMXTJ8y3WnpgcA8s9DPh4dLG3EypwNkiEj4Y").unwrap(), 35000000000), - (AccountId::from_ss58check("HCJpBF9yFnvUgwsPdfWwsENySWyMNX1hcTLmF8dQPP2dufU").unwrap(), 35000000000), - (AccountId::from_ss58check("FvwP9L9vkehpWUEPRYKwTeATnsNPqmZZE6bhBwN9cRGxDXa").unwrap(), 35000000000), - (AccountId::from_ss58check("FSJPrS3W8puDqAg7ufDwrUUNKipYJg9PwbLyS8FGZ3CrJLm").unwrap(), 35000000000), - (AccountId::from_ss58check("Fz7FzEnUh5D32L8z9fTENuJQjfvMRMi4nhzPWTKPVjZRVJh").unwrap(), 35000000000), - (AccountId::from_ss58check("GDPXpRGkqfdzJLkf3sfu4gAAPDZC2yFggJAPE5TGisYhwkN").unwrap(), 35000000000), - (AccountId::from_ss58check("FkvB2NrtsdxhF3bhyELippnwhY7NuYyYGhu1teqcxtzuGpC").unwrap(), 35000000000), - (AccountId::from_ss58check("HNxfNjJNLwfteBEEbXeGb1ao4ENL6itk6pLqmst32VyX36y").unwrap(), 35000000000), - (AccountId::from_ss58check("CmkHUWRBZWp8vh3t9ZMyddx3DHjqfv2jErXrECtcizxoGc2").unwrap(), 35000000000), - (AccountId::from_ss58check("CsKhKndQEDQJ85dJDdHZN3Gs9paA74iEvv3vKDLaNZndvzC").unwrap(), 35000000000), - (AccountId::from_ss58check("G1zi9oarnXFXfCAG5pW7bCSAXfFjer14vwj1teMXv6HaAa4").unwrap(), 35000000000), - (AccountId::from_ss58check("HJ9zTG56An45FHKf9dZreaF5kEEx7GdPYkRv1WEcpWqBULs").unwrap(), 35000000000), - (AccountId::from_ss58check("HnPXXjtM497co1AaFokkY256gb3fBgAkxx6cJiM6MfH7ofo").unwrap(), 35000000000), - (AccountId::from_ss58check("HRJxMH2m7zWLXSGuuEN6bY7jkFeg3oRBdcAeFJSSybcQobX").unwrap(), 35000000000), - (AccountId::from_ss58check("ET6uFHgD95XdSW3nno29qbnVpBdLAqFfNywx9xEZLTtYXCP").unwrap(), 34999650000), - (AccountId::from_ss58check("GAECLgx3HbErBD3Awj12DE5qkkoHAPdVPrYZTVUtx7djDkh").unwrap(), 34999650000), - (AccountId::from_ss58check("ES2UzgYDkBKTSqkmUPruqA2dDU8tvApvUdPFhyofzMDjUGA").unwrap(), 34965000000), - (AccountId::from_ss58check("F4rrWeHghFsyVhzFuRFgSqLBN5hXe65xqF99L3fXwihqw71").unwrap(), 34930000000), - (AccountId::from_ss58check("HqfVpvt2tTKt2ykh4R7rgHCNZDfasvEz2aWAz1M6GWukKtX").unwrap(), 34055000000), - (AccountId::from_ss58check("D3cPG9ieLRNY4tCofX3vnDXWj4ap68zzrE25i47qcjPTTrk").unwrap(), 33250000000), - (AccountId::from_ss58check("JCfoj15yUeFSRXpqieFgL5E7o2iocJBAndGBH42nqnHWHQ2").unwrap(), 32900000000), - (AccountId::from_ss58check("F22qF6UTii2nvvycZpUTYZeypZQqHVfqZvHJuC4x33eApdq").unwrap(), 32550000000), - (AccountId::from_ss58check("GfNnK1Xs13LF6Rh4ruPHCKcpuZwMPhHpCUCS5Qqa9fVvAVc").unwrap(), 31500000000), - (AccountId::from_ss58check("Fd8WhiobpdFRPCXCmQ48S4VFtFpw5cDe5ksYnuSUgmbj9Mr").unwrap(), 31500000000), - (AccountId::from_ss58check("DMgQ38pAmCJR8w3z2Bvju6wodNmLbZHho8ggmdXGosMyrz4").unwrap(), 31500000000), - (AccountId::from_ss58check("GeMPTadSaK9Ht3Wx423twPgmthkjb6KntYrhVuh9pPEiTVx").unwrap(), 31080000000), - (AccountId::from_ss58check("DmQFs3M1tCrRq5frLan1ZsYj6DixBuijG5Uz81Kyu9iqpLW").unwrap(), 29050000000), - (AccountId::from_ss58check("Dtud5p8WmpS5APMxdUngUqoH3KkQbQFkKfSPECj6s1x1z59").unwrap(), 28000000000), - (AccountId::from_ss58check("FLQv1YKitnBJ8BpXassBgA88jVjekdffT9PPr7RVa9u2CWe").unwrap(), 28000000000), - (AccountId::from_ss58check("FiBengSoyskyBRKkYmTCrMRGoSvdUJupZQCqQkLeNQQyuvA").unwrap(), 28000000000), - (AccountId::from_ss58check("GPTdbwb6nrCaENSWmQmEfMFSsEQD71CZS5wEJ9hJf5vehpY").unwrap(), 28000000000), - (AccountId::from_ss58check("FqyN194QzfEhtBz8Ne115jiFFjSvTEMDL8VEfhCbGzCSdKy").unwrap(), 28000000000), - (AccountId::from_ss58check("E4vVDQMz2Y95uGyNrQSn1UEge555A8aLEgoPdgJnYNnSyTr").unwrap(), 27328000000), - (AccountId::from_ss58check("FZpjhYdt6fqRSzW1nR4fRejavcrSo7UXYP4TDhE3mgimgeC").unwrap(), 26600000000), - (AccountId::from_ss58check("DkcXuobcJR1axxmW5MWKKTFgJJ6W57PPvHUGYi76oWatc9y").unwrap(), 26328151501), - (AccountId::from_ss58check("GRL4V9z3vByMp8rxqMprmf8P19WtJfgfdUqbR8238iKiHrM").unwrap(), 26323500000), - (AccountId::from_ss58check("DB2iN5Bhch7BSNAWBpXUWfPKqL4FLy9uZ96FakiB6s9TA6d").unwrap(), 24500000000), - (AccountId::from_ss58check("HnJTcTqUDgRaXgbYfYwa7QCxZQpwjZj8sqxPUHYGKECpzHf").unwrap(), 24500000000), - (AccountId::from_ss58check("HnvfKc7V8W4DXCHCDSuPcahvi1arUhVN3XJGRA55ZR9tbJe").unwrap(), 24500000000), - (AccountId::from_ss58check("DmiGarVVScjzRmMpZZrZeqQPeVGxKB9DNnbiDvQ1QZKHaCh").unwrap(), 24500000000), - (AccountId::from_ss58check("Cx6r77Sp7apBDuNh5N11zmo8ZRMYmtPfPfyG7jqMxpbaHFY").unwrap(), 24500000000), - (AccountId::from_ss58check("GemHu1u1WQowRtA1sgm6zPVQzi1QL34fLEhK7JkPMFp7rBX").unwrap(), 24500000000), - (AccountId::from_ss58check("Fev4rqqJqxcKPsArwkKQTqP7S23Jp2q3hQHgo7EEU9py9XM").unwrap(), 24500000000), - (AccountId::from_ss58check("ErEdMZrxyLw7zkZ71EuYuNUPfmnWWcZRYpX12fTETTmuyWa").unwrap(), 24150000000), - (AccountId::from_ss58check("DuTDfEAsXu1CaDvXxvD3oJR5KVwQguT4WT115t4BkBNVn41").unwrap(), 23450000000), - (AccountId::from_ss58check("G7Pg8TMoQpHDQNq27bb6CTB4uzyk2ccq7poJwQsojNbsipV").unwrap(), 22750000000), - (AccountId::from_ss58check("DpJmEbFMgWphPiUcwwJtNWkgQqYTgTnHVWeacfnziLad5Yk").unwrap(), 22050000000), - (AccountId::from_ss58check("GboWCXT44UkD88ymrp42eN8Sp6LCjoUFowNSHm1kuCrUgnJ").unwrap(), 21700000000), - (AccountId::from_ss58check("F5Tbyp2AE3H9XZramxu3M9MDoqVcPUHH1pNBhwBXPNGtnBq").unwrap(), 21700000000), - (AccountId::from_ss58check("HtHnj3tSAeUyyCt42QdwdZaY4UzV3q8UpxTadwsDpti6n5C").unwrap(), 21350000000), - (AccountId::from_ss58check("DVtT819vxS4A53ZZ9qLNq2B6jYGDpqvWqCAAE6WnHotfv2b").unwrap(), 21000000000), - (AccountId::from_ss58check("FD28Tqj14QssGvt8nBg9rGTjJ84VKNaCxnQzHt8LRMGzc8t").unwrap(), 21000000000), - (AccountId::from_ss58check("GA9b4Z86es13jA9tZwakX6fjjo4ZxXVjPPKBsg8iTNYaqcM").unwrap(), 21000000000), - (AccountId::from_ss58check("DFpwexSjn7mYGaX9qYQbH94FF9oLNXigizN4ajCKVKFT96t").unwrap(), 21000000000), - (AccountId::from_ss58check("GymSEjRMs9qQMBVXqHoY65btuLmVNfbPhZsZg2zGhmy18ku").unwrap(), 21000000000), - (AccountId::from_ss58check("Dj4gymZwSDNfR27jawDYMdcUaqtcuixBtBfGpmU8XfGUgkm").unwrap(), 21000000000), - (AccountId::from_ss58check("EPjjRrp2JZGFdkquHHxnDNnNbn4WXmXE9NGRcTAY8DMqhzU").unwrap(), 21000000000), - (AccountId::from_ss58check("HvYiENE1GisK7tg76sJmz8xKSiT9PFN58FUBMDDRFbftjuB").unwrap(), 21000000000), - (AccountId::from_ss58check("DuJMKVyaR56Uyrxo6hWPJg4XEfE8YffYecqu4NBzjQFwYxZ").unwrap(), 21000000000), - (AccountId::from_ss58check("Gh8pRpLu2nbf6J1FBpWe6664cWhrY6kVpz5YGzs6LtPV7n7").unwrap(), 21000000000), - (AccountId::from_ss58check("F2jRjgxGFDAM24zQia81wBZjz1pFeffSjhrFinhRB6V6ZSD").unwrap(), 20904100000), - (AccountId::from_ss58check("HZ5k1DnNnnWEFMjH8Srnf7sTqgGoYQ97mjwLBDCkbtfpaSn").unwrap(), 20300000000), - (AccountId::from_ss58check("EPz5DAHakKkjwyX5Wq1yAEcykvyhyxkJS6Crcqw89N17CZG").unwrap(), 19600000000), - (AccountId::from_ss58check("GHXpgVeyLvDsGVNebRJ3h3zjvQ3x7h57Q6cwCacPnJ4HJiH").unwrap(), 19250000000), - (AccountId::from_ss58check("EaQyqxZ9p7sNV1ZxyoT4dsfVTk6yoLPXWBSsigwuUWnH4iv").unwrap(), 19250000000), - (AccountId::from_ss58check("Gc6efXZVMMzuWBz5HQbet5oVEkGBH5uSBLwHLDW9v2zqFHL").unwrap(), 19250000000), - (AccountId::from_ss58check("GZaiAsECV8MdT1FtNemLtAhNYxMyXWj2dctYHcC6E4Vfta5").unwrap(), 19110000000), - (AccountId::from_ss58check("DEJEZeQFWwNiXF69hg2WHXXDR8qtJKDgN4DcCdvMXZTywCB").unwrap(), 18641700000), - (AccountId::from_ss58check("JH1LehPcXgjikBDC236wPmfGwCM55w8Q3wqnGuU2Jac2SFM").unwrap(), 18200000000), - (AccountId::from_ss58check("D8De43rHP6TweY442JkJgymByCbG3BEtc1WM7ndbZbzkZTP").unwrap(), 17920000000), - (AccountId::from_ss58check("Fu2gCyM4c4q9wWZjnoibJpiitf8UmPd9PHiXm2Ujui8v7oQ").unwrap(), 17524500000), - (AccountId::from_ss58check("Ctku4Swd8kUBJqJFRzWpbrMTgCQ1Cjhg1AdGoFx8gNRX5ac").unwrap(), 17500000000), - (AccountId::from_ss58check("GHTohCLUcLyB8w4xMr4TyDkvUzDnim6fadWfJ7edPke971d").unwrap(), 17500000000), - (AccountId::from_ss58check("Hk9onsyifiPMHhJikFDpLmsborDdhueXYTyZK6E6DEks1be").unwrap(), 17500000000), - (AccountId::from_ss58check("H1LtpBjoQN2R4FwG7nqZ1pkcoTBX3gqAAX5phuqktxSGSBF").unwrap(), 17500000000), - (AccountId::from_ss58check("HNqhkV96AtmyfpngbFz7DL3SWGpProxM5YFykEzb8T7bt1q").unwrap(), 17500000000), - (AccountId::from_ss58check("EG5zeu7oAYdsjYdwS9yAQ4d4qcgbYizk1EHZwSvTohoLahg").unwrap(), 17500000000), - (AccountId::from_ss58check("FyLsdyiCSm8Yn5XPUqSksHTnN3FXgQnwkFr9ncM8UGbQEcn").unwrap(), 17500000000), - (AccountId::from_ss58check("G57S58r5dzmJREcZmpJKZHRgAHhZQeuniriTXfLczrUzCVR").unwrap(), 17500000000), - (AccountId::from_ss58check("G1pFj2jTvnaLKRDj9H2Gcq3y6W1Q6amD64N5kT7nR4iTz2Z").unwrap(), 17500000000), - (AccountId::from_ss58check("EXzv9wBdgZ8xjYm4Qq4AiwmEf6kudiGi2JQtSW2hrZJSRvk").unwrap(), 17500000000), - (AccountId::from_ss58check("G4SrBW47D8Shk5BLCQhS8itzaHQdZqQmc6QHYaToyQrekac").unwrap(), 17500000000), - (AccountId::from_ss58check("GAjxSapcUGdLpYaBr2vV1Ge2j7cVScE1ebeaprKMDUJDMFY").unwrap(), 17500000000), - (AccountId::from_ss58check("Eg1eGzG2a63wkJ4cxahHtBFVWqqjTMVReGypkDag2P4sPbQ").unwrap(), 17500000000), - (AccountId::from_ss58check("H7dYTMpbuiwtC4rJfDB6CrJNJaJje8iA9mB7sZiDKgsr5n3").unwrap(), 17500000000), - (AccountId::from_ss58check("CxQsuxk9pCZNqZiG1nGD5JTnPVEzBThL5c2kpJvuBBEyYDC").unwrap(), 17500000000), - (AccountId::from_ss58check("EQJDXQgYvEvH4MPVccMYUKqoiuXXdidZ89AJTLVQ96JtQ6C").unwrap(), 17500000000), - (AccountId::from_ss58check("DG6DyueaHfBQrv233tV4Z4LVL7SZwVxwbov7amFEYirtwTx").unwrap(), 17500000000), - (AccountId::from_ss58check("HqPZEGhFuqDpMr3h4vHzXQ7ZHLun97PUL7ibPgdBytoQa3E").unwrap(), 17500000000), - (AccountId::from_ss58check("CadauT6Z3n1jKdPxYQdqDECTTBCm8DCoo73swCYghXodNsk").unwrap(), 17500000000), - (AccountId::from_ss58check("E8Gips4w5F9PXj5P3RT6Q8fQWP5SrMjbxGMmWtYr7FgS77q").unwrap(), 17500000000), - (AccountId::from_ss58check("E7jt8cR1ZAmkEuCZBUHh7fsh9XHQyZ2aDqxkKNBSZxcCsvw").unwrap(), 17500000000), - (AccountId::from_ss58check("D8trSLXXrk9UEEentig8pGGZhxaWv4wKuyg5CKswQZsTa7t").unwrap(), 17500000000), - (AccountId::from_ss58check("DzhXJ3AnaqsjyjUVc74LqoRqJh9Ph4czSMw6HPWqS536LZn").unwrap(), 17500000000), - (AccountId::from_ss58check("Gi2FWyrzauDatqHtky84RzjHHHpfDtf1LXNkWg3jUKQB3ed").unwrap(), 17500000000), - (AccountId::from_ss58check("CgjHH1YNfNeBzQawgqcfFVFYTL67CbVZ1p8pwxDbKmWxR8S").unwrap(), 17500000000), - (AccountId::from_ss58check("DtwRinukXwtuwg6p7n3PFdPZWqc4XjbhE4KDp9FQmeNHLHE").unwrap(), 17500000000), - (AccountId::from_ss58check("DFfxa4RY1CiQRMuZusxXP9LSiiueCF1hiev5k19Nr44G7cE").unwrap(), 17500000000), - (AccountId::from_ss58check("GREQpvQyvC2cCFDzQzSxuBXFVvu9cGmsHHFkDS4zxawBo5P").unwrap(), 17500000000), - (AccountId::from_ss58check("HvsnqV1gL1MiiCMyiC65MsT2hq43wmVrAJHu7ScZKqWVCti").unwrap(), 17500000000), - (AccountId::from_ss58check("E5oHRZd6EVZ9hS98yp5FbMarwzpojruKnyiLcYjvJjKjF5a").unwrap(), 17500000000), - (AccountId::from_ss58check("FkCKRJMvqKv2sEJgYT35zhQ7kKwVdfdXZEZdVgsQPAx3wvM").unwrap(), 17500000000), - (AccountId::from_ss58check("DBXwZrxDpfdrkVZr84zVmPaJYXJEj7Qpc6kNYrLG4cnWPzf").unwrap(), 17500000000), - (AccountId::from_ss58check("EiBLw1v6k1a5Yz7nRHMdAX3a2KdYnn12zR6kLjHorMoUbW5").unwrap(), 17500000000), - (AccountId::from_ss58check("Ekjx5Bu592uZoj7f87Shhxk2mxu5Uk4N8PDcJbRhqpTmr7m").unwrap(), 17500000000), - (AccountId::from_ss58check("E8GQn7ZWPQ941S2bum3ZvPShc2pb4Qev1NTg2cDbeydcU96").unwrap(), 17500000000), - (AccountId::from_ss58check("D8WRoMCC9QhLg42Wgvz68MUgN365uH42AUhc6A9HaH7e8Gx").unwrap(), 17500000000), - (AccountId::from_ss58check("DDP2QCxh7Bo39av5QvgXTv2eDjBrN83Q8SnRaSMMrXPfG2f").unwrap(), 17500000000), - (AccountId::from_ss58check("DSdW8bYH1DT5h1stDmXezcgLAJGdAxcD1ALiTP8X8nqMAtU").unwrap(), 17500000000), - (AccountId::from_ss58check("GFcWFw73WMQsTz1pnMCX5RWAvdKsr4v8925pVWqY8wdQ7WC").unwrap(), 17499650000), - (AccountId::from_ss58check("EJHALKhFtnwHQ3u8HiJcS1N7fXZMBGvQvRr45mP2Sv1moit").unwrap(), 17464825000), - (AccountId::from_ss58check("GNoDBVkKjvueoJWE8eXAkjTW83SWuS9rKXKGC3LfTFaJtiX").unwrap(), 17150000000), - (AccountId::from_ss58check("HREXJpBSou9PuZ7g6mUhhf8K27LB1aDJWsj546qyVMiADNR").unwrap(), 17150000000), - (AccountId::from_ss58check("H9jGbZGQnNwZBNzP7r3thU4HuHmaTWiwzt2ji2YFBDt4WTf").unwrap(), 16800000000), - (AccountId::from_ss58check("D3JdvoBTxVouhXGFSvmj8n3f7LAsbJcEzCvGAchvEHYHySr").unwrap(), 16498300000), - (AccountId::from_ss58check("EJpX12s5FwgbZDWpr7bkyFCdAhMUNdh9fiDjDStmY7E4ptq").unwrap(), 16100000000), - (AccountId::from_ss58check("CanbMma5kfNv84tLrBXsDDbEL3dr7WVZapZomkLFoYoRaaw").unwrap(), 15750000000), - (AccountId::from_ss58check("HLDUbRbN2qC7YpVBx9HpPQhvjgLXxYHEDdNCPh9FpckzWQM").unwrap(), 15400000000), - (AccountId::from_ss58check("HHnawHwJr7383xvYKt4kiNLDxE1q6JpTi6yZzf9uDCBfWDc").unwrap(), 15190700000), - (AccountId::from_ss58check("FJZiS3DYSXiLjdRdqjyFkvkdNfWifkd8mkG5WfVsDuTDDQN").unwrap(), 14945000000), - (AccountId::from_ss58check("HRYyUiPAxnK5ckFdry6RMLe2MhScV9Co58v9szCGHvTbnp1").unwrap(), 14350000000), - (AccountId::from_ss58check("DGaHm71gRHJGQVF2ubunkx37qgLpno2gYibq2WHoDJpFMt6").unwrap(), 14000000000), - (AccountId::from_ss58check("CrYym7rgcJfz82bUS2RT1LKS5FUSCr3kVtdAVExKd5rPpCd").unwrap(), 14000000000), - (AccountId::from_ss58check("HvFBSft46oGqVQGHCLfb5aao7GWuj5FeFKF4cLs3ZendFFW").unwrap(), 14000000000), - (AccountId::from_ss58check("Hh5zHWS64kFPbqV3oKgU67sdSRKDoJdEWpyukKopfp2Ggin").unwrap(), 14000000000), - (AccountId::from_ss58check("E55nnYjgDpvqQn6K1v8o3Y4WAPKYBMzTWnxPjb3knH4pC95").unwrap(), 14000000000), - (AccountId::from_ss58check("FFFEYJgyh46rAdf2nXm3ksx3oD5wJZAZYgRUzZtpY9iqhbD").unwrap(), 14000000000), - (AccountId::from_ss58check("Cz3pZaJKgiwVL2vo9tUdKcnwhkT4DngNynDa22eBdJJtL7d").unwrap(), 14000000000), - (AccountId::from_ss58check("DdCaffveK4DSXfwrhMbM7qsuaD8bHCK5KSmP448j58WaXqU").unwrap(), 14000000000), - (AccountId::from_ss58check("F59cJFqSb8Ss5kLfFpfzv6yciFbCRwRbYcXN48qGekniSvm").unwrap(), 14000000000), - (AccountId::from_ss58check("GWUSQezLyaWPUm6GxRYHjKM8Kf3ch6aGefhZWu2bm8rVqtr").unwrap(), 14000000000), - (AccountId::from_ss58check("GoLKaJbBRuEb6nGzcHXnicnewaNQQkXvd1uuErJCbJTsFkJ").unwrap(), 14000000000), - (AccountId::from_ss58check("GHtx9QAB1sS1QdMMDL9Z77xZerGo5pmUa8dfKd2FZCpKLBT").unwrap(), 14000000000), - (AccountId::from_ss58check("GCyWvTmycu4KBXk4WLFoFSeqjXM1a1ekD3Dwg6NTVRhJHNP").unwrap(), 14000000000), - (AccountId::from_ss58check("Gh6RybcSRKhFaW29smi6vADT379QoCT5HGJUH7hVCx8e9Hu").unwrap(), 14000000000), - (AccountId::from_ss58check("F2kNyMSaPNoJWUWqscepR8dPZGpdznFJMETapbZG5YtNYAC").unwrap(), 13999650000), - (AccountId::from_ss58check("FkWP4fuhRQdE5nsQQZ8nMkdSP8zskCTt2rHJGenoVRwxqGP").unwrap(), 12424650000), - (AccountId::from_ss58check("FXzkpjuiwKdYciEUhPBQU58XeQwheped5NoAYi1NGzB5vLz").unwrap(), 12250000000), - (AccountId::from_ss58check("DGtWeq7ac26yCDPCxqi9y5LKig4VGPA2VZGUdoAuvhJ6nT6").unwrap(), 11900000000), - (AccountId::from_ss58check("GxvC32ZkzAgEK2jtcpBGcNesjn2rJGhfHSfCT4WZ2rEnVkc").unwrap(), 11550000000), - (AccountId::from_ss58check("HPBgkJvVgmUCyyZ5wC6tctYALHCnhd5BXa3WB2bw5hC64o1").unwrap(), 11375000000), - (AccountId::from_ss58check("F4mbU5fXD399Taa8nRZodbBHYQLEi4otdb3bu5qkA8zPoRd").unwrap(), 11375000000), - (AccountId::from_ss58check("GkJqDjhZjxdJR1832gfiAPkzmADcREmo5nXdVjcMvD3d8Rn").unwrap(), 11200000000), - (AccountId::from_ss58check("Cont1BkQWr48KY2WL8aK9F3peATSn8Ur5MiVbkaQ3EnJErQ").unwrap(), 11200000000), - (AccountId::from_ss58check("HtCBVbf6EvF9wfoP9qUUpwP6YL4eVDKjf5hKoqnFqZPSvNJ").unwrap(), 10542070000), - (AccountId::from_ss58check("HjscvRsLZng4PkSHm3xp5G3nhidPdjagez14fSXrdvnmyfj").unwrap(), 10500000000), - (AccountId::from_ss58check("EBND5TsAr2oMV1oMaEg7dtoia8qHLEdKxGPrHpXxyHuHfG9").unwrap(), 10500000000), - (AccountId::from_ss58check("GfLzRpuBn2wPPD8eguHF4kVTi2DWcTXvYqZg8tdX3MALUG4").unwrap(), 10500000000), - (AccountId::from_ss58check("GZR4JjUeShPb3anBwGvozj1G67daoFUKvvCtR4ppgFfL5rG").unwrap(), 10500000000), - (AccountId::from_ss58check("Gqdbxj2EBKdJ2r4hkn8bWTQHLNtHgGggp5Uek7t6c6Ee18Z").unwrap(), 10500000000), - (AccountId::from_ss58check("GqFQMVzP32vXsjVnoux6HzwW4wcYNgvnQ1yfHkrEEQkJiNw").unwrap(), 10500000000), - (AccountId::from_ss58check("E84ypSizBDJDxwhtYy4Q4t5RKsy1DppPuU1AP47HVeKhXYt").unwrap(), 10500000000), - (AccountId::from_ss58check("D8hCPYdypvytevBkncyDzu3oCcYaQR1MurNCbk84ttSPfCE").unwrap(), 10500000000), - (AccountId::from_ss58check("CgEtZ94Ei9FWmsQd4WK4Jk7VjHDEnsg9Kez4XmegaYaUv4z").unwrap(), 10500000000), - (AccountId::from_ss58check("CeAg9upLUNjgzi4hSBQiN3C898r8b6brSjZ6yGEXy8G4JqE").unwrap(), 10500000000), - (AccountId::from_ss58check("FXxgdDJv7ucdyye7dfE2kvTMznGCRFkX1k9jEaB5urnTjeq").unwrap(), 10500000000), - (AccountId::from_ss58check("EBQNAuaAuhELQJXDWVhSFKhpQPU7pqTCMtWAosTeqCRBZsB").unwrap(), 10500000000), - (AccountId::from_ss58check("GfSBZ1sDrMyQdAhi5UGUfJyAjNMzZZbUTrcrXieacfwuC5m").unwrap(), 10500000000), - (AccountId::from_ss58check("EQQAESEVswRYiwHRUBZfizcURKTHx7W7jD2TuUtxFVy8Ur7").unwrap(), 10500000000), - (AccountId::from_ss58check("CsDQwXW7asVJzEBmpJVbRbkPaF7uk6D5MX4KzasGWavqmtj").unwrap(), 10500000000), - (AccountId::from_ss58check("EPfk3kCUx4H88QtNg5Xke3AxD2fkP8FVitvFSpgdQrkBqYw").unwrap(), 10500000000), - (AccountId::from_ss58check("EG3ZjkCHAZ4pUBMjbUFEYmAB7ygHjLGZbA52ZdYcEdSWEaw").unwrap(), 10500000000), - (AccountId::from_ss58check("DJenrohGRYDLLkMA8ZVwgyr3v76GhLHQvjUmqLofE7gWkn2").unwrap(), 10500000000), - (AccountId::from_ss58check("Dih6m18RgBPfB6zJ7thwiBMBr38apCyreBFQYqjrYTBpAxS").unwrap(), 10500000000), - (AccountId::from_ss58check("FHyuphwCURUh3ZMoSrCjj6BCLL9jg7LEhuXtLgSizPQu645").unwrap(), 10500000000), - (AccountId::from_ss58check("H9aQqNzJMA1HjJbonbCiU9BoiGNEKded8FuMHZifkLdK8Po").unwrap(), 10500000000), - (AccountId::from_ss58check("H7N2WSfmg8ru3eALPjMNdBwYo4UbeiwS72EtEpZFSCTASxy").unwrap(), 10500000000), - (AccountId::from_ss58check("G7MBGgHLCq4q6DnEXQHU4zp68nR2mQCJMcJSq4q7cccU9Ws").unwrap(), 10498950000), - (AccountId::from_ss58check("HULzQRU3XJPesWULXomo1wdR3Vg9FKi2TmZUkAFg2RPmSQB").unwrap(), 10325000000), - (AccountId::from_ss58check("CzYo9nUk3dJ9SPz8WEQZGofLMSHJtUCz6WPd1figfQ824vE").unwrap(), 10150000000), - (AccountId::from_ss58check("F5mvZzWggrMA9w4uJH3nAP8jzGzWtAqMmo8Keg89P7Utz64").unwrap(), 9800000000), - (AccountId::from_ss58check("EDyFYbwuLnuUc2Qsg5mZZYMkzxnJ2NF9nQiEi7Kj99cjExw").unwrap(), 9275000000), - (AccountId::from_ss58check("GfBT2BDFHHibq49LrasR2LHGNW4tpUuxXbsCwA7qdFT8QSP").unwrap(), 9100000000), - (AccountId::from_ss58check("DoEWriZvJJQ6jBTgx7HSBqAjsVkoXopzhCAQ2WUsv1drN1N").unwrap(), 9100000000), - (AccountId::from_ss58check("EJgdRddcYSd6XWnwr8oZkkzxJJX8SLwig38d5yxZSRgJGQZ").unwrap(), 9100000000), - (AccountId::from_ss58check("E53D8u7uvDVZyUqibJL7ZEsdLupAHBpMD7L6WrjEMgjzm7F").unwrap(), 8750000000), - (AccountId::from_ss58check("F7dERhPLne7NKHHjJMqLuKjp5uMCbcJfpdgZcqnxrgofGV5").unwrap(), 8750000000), - (AccountId::from_ss58check("EAboW8cJWby6Guj3EJn9hP5tndQVy6Cyr6ffBrZdARWMQqi").unwrap(), 8750000000), - (AccountId::from_ss58check("FRteYjoZGSKcWxF9QjBoWHFW2zFAGh3GKC9vU6AxY1TfiXi").unwrap(), 8750000000), - (AccountId::from_ss58check("D18cjkYvzv36KpNYR7meMhCGXbBKG9ECgtM9pz6Ge5y4rJF").unwrap(), 8750000000), - (AccountId::from_ss58check("HbvQvJreQjRcGYovmKNpEhmmca1zh2QMHHbnD6uyouzhdje").unwrap(), 8750000000), - (AccountId::from_ss58check("FQAeohj29tDGuM6S39fV3CTEk9zDVMzz13mqeocDjweFSEh").unwrap(), 8750000000), - (AccountId::from_ss58check("GEu5R4U8YU9sawj8wtHo1XAeWZxxUVQJQCAZ467bNqRG9D7").unwrap(), 8750000000), - (AccountId::from_ss58check("Hh8ErLcjZouA6nG7ovjky9iaMWa8DAtEDqooLMWD21R9Ewc").unwrap(), 8750000000), - (AccountId::from_ss58check("FaM87YswfiSorvahgwRMnW1nUbVHVxbyCrpqA2gVHLmh5Cv").unwrap(), 8750000000), - (AccountId::from_ss58check("F54USN4yPE9edZdrrpXxWDzZ2Eeh5YS59cixcuZ5BG6wTLk").unwrap(), 8573600000), - (AccountId::from_ss58check("CriLXpDm1avL3DXumPkowpW3wN13bhHmY6WhfE6GZ41nXgQ").unwrap(), 8400000000), - (AccountId::from_ss58check("GDMexcXaDeymazsEhEa6edLwAZ1wWVy9hKLRDTPjpZL8eFE").unwrap(), 8400000000), - (AccountId::from_ss58check("G2kphHt5emswdD1Aa6jcHFApELkbPXuSaAfDP6UHa8Knfhi").unwrap(), 8240050000), - (AccountId::from_ss58check("EDH9DRKv1yxpknDxhxGo6RfdacAH4jNiKstdFRetrpuQ9gm").unwrap(), 8103550000), - (AccountId::from_ss58check("Cwcm4qFBVr3WWHuYH5ujjgPad4GcqzG73gjiDD9QGH1Tnk4").unwrap(), 7931000000), - (AccountId::from_ss58check("ErXMDddviMa2P3FiJib2qCzV1mwtspakPVkv8pikXUsYM3S").unwrap(), 7910000000), - (AccountId::from_ss58check("GyHvK2PDJPPiK7V9BGnAiFk7xEW9XffnWuVsc3wN1B7M3YT").unwrap(), 7875000000), - (AccountId::from_ss58check("GRQsSvQcqWa4L2r5ZWyBcRnbJ5PvLCDauwa4ajQhiFXZdSe").unwrap(), 7862750000), - (AccountId::from_ss58check("FP9hvJt6cXcnwcHZjgYYGhiYm34jK5incSGnWVTcBW5oGUX").unwrap(), 7770000000), - (AccountId::from_ss58check("CrezkDBN3sH35szoScghwcYmGTHNnDJDL9iry6mKrMmy87F").unwrap(), 7700000000), - (AccountId::from_ss58check("HUBmEYjE8brQWfohcW47jKVKwznpmvsafzerHo8oaVWU3dh").unwrap(), 7525000000), - (AccountId::from_ss58check("Efd8mFc3ZXWwtwAUU4XChJD2MaT6Ry2NNX9dmi43CSgGdin").unwrap(), 7353500000), - (AccountId::from_ss58check("G7vrXSLpvA4nkA4J221FRt1xJgHJw92xrSEYE1c69PNrEwX").unwrap(), 7065800000), - (AccountId::from_ss58check("EzUQXqxyyRZDcki1h5wuVqV3amekuTYQ2A4ePmMUfHmg4p6").unwrap(), 7003500000), - (AccountId::from_ss58check("FegWWJq7AWgkYguRAd796uvNVYburnURpBz7wZ9kf5EoyZ5").unwrap(), 7001750000), - (AccountId::from_ss58check("J9pCSnb1Nt7gTQFXmrsCrDTANHeZY7jiGM81qddcLfnh7nn").unwrap(), 7000000000), - (AccountId::from_ss58check("EJQ5xM8Eyc8ACzHsFWhqecpQTaBTP36xjKh4ijswuAcvnq8").unwrap(), 7000000000), - (AccountId::from_ss58check("EwvrwHzXQZpp8PQMTNuficeFm36Db2xPG6RjUedf21XbVur").unwrap(), 7000000000), - (AccountId::from_ss58check("GWm8SCpqUAKEB7zfzr3a9e9P31LXgEVwF3o8hQ1ZSgDnyBS").unwrap(), 7000000000), - (AccountId::from_ss58check("FdFNxA9ojawmFzyJKcBAXmTKa4J7GyQVW8vSViiNSTb54aA").unwrap(), 7000000000), - (AccountId::from_ss58check("CieMfw4HtXB6hwNRonqsDWaHQRQ6qvi9YnDckJn12zzNbJK").unwrap(), 7000000000), - (AccountId::from_ss58check("F37TWKrSWsZ1Jhxefvd27z82nUeiVpZaM7QDFbwZ42dbEvW").unwrap(), 7000000000), - (AccountId::from_ss58check("CidfDfKdfHm3U3DfuVt29TMEFk5qJ4xHg7ZGcwkGdJAnveF").unwrap(), 7000000000), - (AccountId::from_ss58check("EJEJGtvLZhGUoL8bSCyd6jSsqbcm7CNm7q3sPdKCTFnBLfk").unwrap(), 7000000000), - (AccountId::from_ss58check("GLZRjbSqJWkvzTdQSUjD4Xb87ZZdBQycKLsmr1BnGnK69UQ").unwrap(), 7000000000), - (AccountId::from_ss58check("Ew4Kd9MrwTYYtSz6KJ31Lq24zdYecxDqdcJSM3BNSRo1Jeo").unwrap(), 7000000000), - (AccountId::from_ss58check("GHcYds5viKX2B7UwQHFDUzEPZR78Epsx4vujv9gAw6AnpFc").unwrap(), 7000000000), - (AccountId::from_ss58check("J6fX6nmUjQ1gDsKbhS9BuiUQwM9gyGuAjdDdSxAmQAN3P5M").unwrap(), 7000000000), - (AccountId::from_ss58check("F5rNxfVRUuQyY75tM8Z88H3FxYJqbXZbP2ZZjBwbT6nchWZ").unwrap(), 7000000000), - (AccountId::from_ss58check("DcgG7GsiYP4oD6xCyNjpzULit7KCUgcVLWWqyHyCGX4n3fq").unwrap(), 7000000000), - (AccountId::from_ss58check("F9p1Q7BQftAdwaFCKeVLpegg4Tuyv3amyNx4yEenkBDUeyi").unwrap(), 7000000000), - (AccountId::from_ss58check("FA7rR4LLsYdMR2YsoUivadgFZDsMg8GbmzgrXiy82NNigSw").unwrap(), 7000000000), - (AccountId::from_ss58check("DkkgifswG6ZrLM8c9jahrH79a8uUUZnMUqzFCozdgFKAZgf").unwrap(), 7000000000), - (AccountId::from_ss58check("Dx1jCzeig7wMD2iU6YzeNXPRTNXQ5zKqwj7fuZiutxsZZit").unwrap(), 7000000000), - (AccountId::from_ss58check("E7cYXoxMG2WK9DhEKg7ZrrQAfDAtrK1w5LTJdSFWRwNoFnd").unwrap(), 7000000000), - (AccountId::from_ss58check("Ed1t4DUGrpdarYFbfwHWrh7vWpsXRj2CXR5dQVfczYww197").unwrap(), 7000000000), - (AccountId::from_ss58check("CdXcFD5HQTxj3y5S8EMhb58L13NbDap7Pd2N3pAACjH7xeY").unwrap(), 7000000000), - (AccountId::from_ss58check("Hvp357Cn6KkvEhfAzQE3nMuv29E4fQ3JFTnzLVQn34LHWfE").unwrap(), 7000000000), - (AccountId::from_ss58check("GsXSEWPfDmcWJAiv45pguBj43UbqwhNFrBAgUn2QBtChbgf").unwrap(), 7000000000), - (AccountId::from_ss58check("Gqw8xh2xThAva5QYWW5mmR5MemVbyKny5oopAEBw7yv4SdL").unwrap(), 7000000000), - (AccountId::from_ss58check("Gw33vKt8j13qT3WUo5i5UUXGfJ65rdNBvAogz8aptTFZVMi").unwrap(), 7000000000), - (AccountId::from_ss58check("EhkErcyMjtG9VgCSyRZ6jNoQ9MSnK5jCcRUk5f1ZqDxgDCt").unwrap(), 7000000000), - (AccountId::from_ss58check("DgRui8yctT5g7KSyXMALYyDYMGrbxJCKFTYMugRojdLdotT").unwrap(), 7000000000), - (AccountId::from_ss58check("Gkgf9k8yddY5AHkFa1diiGgGaF7SkoPjZTiLANYM7DR5mos").unwrap(), 7000000000), - (AccountId::from_ss58check("CpLVRWcUd7PxDPSmtXwQC3628dwEYiMd3GbqZTnqvphMN3B").unwrap(), 7000000000), - (AccountId::from_ss58check("Hpat5A3u3qKrNQau1vNsmWDsitKCQDkQtM3yaXzwdR31chk").unwrap(), 7000000000), - (AccountId::from_ss58check("Dg4CCbEESfUCAW4j2AGKTparPAkdkMWLheSfyBqHw75BghW").unwrap(), 7000000000), - (AccountId::from_ss58check("HsXYt6CbejzWGnPeDFrpRdE9FSvvdKY45CrHhdnGqY6WTcC").unwrap(), 7000000000), - (AccountId::from_ss58check("EfRPs1y64ywPXjt3HZFmHE17Q9YNiPYM58HEbGAicd4ELmh").unwrap(), 7000000000), - (AccountId::from_ss58check("GcGUMrjQCYbXucm2Hf65EcBVxw78xhJy9i1N7LsTniAKi1A").unwrap(), 7000000000), - (AccountId::from_ss58check("Ga1zWTgmmctvUSGTVRCgnxta9xJeT2gGg5jStB6k7WjaC7J").unwrap(), 7000000000), - (AccountId::from_ss58check("D3RCaqWktzaHhCS53MT4HwZrgrYoCT9zyLvZLiCi6NfwMSq").unwrap(), 7000000000), - (AccountId::from_ss58check("GyboRffDJhC77Nvx65JTX66K5e3MduSyjb7p2fEbfNPAHhu").unwrap(), 7000000000), - (AccountId::from_ss58check("GyffkcGpZQw3uatHuaxGRnzoL757VeRprFUnudWk9nCpo9n").unwrap(), 7000000000), - (AccountId::from_ss58check("Hv6Qh4AUfzmjwaEDb8Th8CszJRsi6heyeLSJV9hQheoa933").unwrap(), 7000000000), - (AccountId::from_ss58check("Daz1abm43ueniRxPSDukgPZciG6PAgG8hvgyE6DstHXtcKa").unwrap(), 7000000000), - (AccountId::from_ss58check("D5WxiuCkRfGrFpRjH4uvmjdUQYH6bvHXiUVYp4eRnr7E1DA").unwrap(), 7000000000), - (AccountId::from_ss58check("JGmrBLZEqaaqLrfRmXkZhsD4JhoPkjRkfXJjj9smCk2UoYA").unwrap(), 7000000000), - (AccountId::from_ss58check("DM2WjPLk6VMX1FgnBXbaD4tjPmr6YoHHbSNwzS9LjMUYcuj").unwrap(), 7000000000), - (AccountId::from_ss58check("DMHkEp6zegzs8BcbcbjUdNjbXTWhZsCA8NCZXPJVzaCFewQ").unwrap(), 7000000000), - (AccountId::from_ss58check("JHXHd5oQbUTRoKsM9XJnq2y8AJo4C6uEnj5qVfDAHHZPfrR").unwrap(), 7000000000), - (AccountId::from_ss58check("Fw2CYFSkg813GJaGvdoBo9nVWBwbpp45xAKuywzLDBpECdV").unwrap(), 7000000000), - (AccountId::from_ss58check("FfivB6FMGa7i2Vz56deZ5Nzy7dHNdFfpRn88Zp3St6QY2Xj").unwrap(), 7000000000), - (AccountId::from_ss58check("HF9oYVPwq7x8za88QCENjjB82ucPBkxPDfBGQNx1bExLeSA").unwrap(), 7000000000), - (AccountId::from_ss58check("FWx9xA15MwH4YgXKB3G4UNyVZ1wWE6vGPxCPT9Nys5v8VPq").unwrap(), 7000000000), - (AccountId::from_ss58check("FWrxE6r8G4X3Rr7nVHoEQ7bsFyDBp6uzb2bZ1mUSTCifGWC").unwrap(), 7000000000), - (AccountId::from_ss58check("HEcG7h46aE4wnPLEgv6RozJercpkQmwZZFsctuhkMZg2Ztq").unwrap(), 7000000000), - (AccountId::from_ss58check("JCVLC7cicawLsxyi6imAuZcG8YpDibdbqm5nqYMY9Vxbr8x").unwrap(), 7000000000), - (AccountId::from_ss58check("CaeKCdiYTN3n8SC1hTMyVRNostJFr8J99Tpbu5jJWhDW9vS").unwrap(), 7000000000), - (AccountId::from_ss58check("HHuMkcE8NcmPcBTNn4NKi2Wi1fh8RRjo57K8SRTq2RJhRLc").unwrap(), 7000000000), - (AccountId::from_ss58check("HKkiLWuvVSWjneuwN8nwobxHNcqZCku4gGUkUCot23mNEid").unwrap(), 7000000000), - (AccountId::from_ss58check("FcSxWoxsbj3NnkLXF3vmUi8SFEcHgMeiXjDjkkQMrTwURuc").unwrap(), 7000000000), - (AccountId::from_ss58check("DK5kshC8a5dSgjDztkqUSEpBi1ChvedjsQgyYzqmdzMeNqG").unwrap(), 7000000000), - (AccountId::from_ss58check("DVe5cmdGhtypmVQUnPVM4cCbGqrzQoqx9tF3mawLFbJJ8MF").unwrap(), 7000000000), - (AccountId::from_ss58check("CuM84kPuSMsJier7fGtdMphyAEKPQxzmscLCsJr5p5zvU3C").unwrap(), 7000000000), - (AccountId::from_ss58check("DMjtdmNo44tjdiNBfnhZJfzQ1PsSf3S3VZXdUrQoMyUqywZ").unwrap(), 7000000000), - (AccountId::from_ss58check("F5ANiwwCfvpSynaTxWSSzvGAVHLs6vMijEueF9G9mmqbWB8").unwrap(), 6999779502), - (AccountId::from_ss58check("Eo7bMUJjV85QXiYsugskHfouGC69KqdR5d8DTcBjA8JfhVi").unwrap(), 6930000000), - (AccountId::from_ss58check("EB3NwAz9cQinEBAcs8d9LyjDV7ZjrjdQsTxSKVryYHcJRbG").unwrap(), 6482000000), - (AccountId::from_ss58check("ELotFHJFJ85zGjQCUB4hBBVKctYHMnKu8B58RKQf97WDmQa").unwrap(), 6370000000), - (AccountId::from_ss58check("DYCTBUPFtCnA9ucQ95yrryBgksBJYKMjGZY2A9Gi8jRXLLD").unwrap(), 6300000000), - (AccountId::from_ss58check("GAEi8yVpdBbeDPkhLy2JpQu1xVxUJa556FHa8PSV12whD9e").unwrap(), 5978000000), - (AccountId::from_ss58check("DJxqF819xKHZRpVUBaB7zvuS1LmnHWRbwSXu5xupmGSZvyc").unwrap(), 5950000000), - (AccountId::from_ss58check("H9H97XZpQ9BLsyxhWEbZdeR7G6T1Hnr8x68yBQ6vitdoCQk").unwrap(), 5447400000), - (AccountId::from_ss58check("DuHn1RTK6r64H5EPCt3V8kBm4FbkypzjEcyCosVjesFbDzN").unwrap(), 5250000000), - (AccountId::from_ss58check("JGoE6tbTUV4SJ5VKNEHRSsCfvWXYLKvfr5tMD97UYnc5AKa").unwrap(), 5250000000), - (AccountId::from_ss58check("CxBW1QeTGkzejRX9wkQg7RAgKE5wDPpUCvrak2cS1hBQcDp").unwrap(), 5250000000), - (AccountId::from_ss58check("CmXoMzAw3uEkGcZJxdP9vnXGYdozupZTEb37qkSbvLLxGzy").unwrap(), 5250000000), - (AccountId::from_ss58check("EkQWFRUHmSt8qCwmgYv8TNSaFu1Xo5DaDAHBZbZZFxXMwDr").unwrap(), 5250000000), - (AccountId::from_ss58check("Gv8TEpVnkRtBxrdE7pQ3bhSWp1uJ84Xc8ATFCas88gfdjUY").unwrap(), 5250000000), - (AccountId::from_ss58check("EAPU73ibJZyGwy4XLb3U5JUyTSXPJBSSZrgMDpDRpn7UPBQ").unwrap(), 5250000000), - (AccountId::from_ss58check("FkPQ2Kxr8RetYsvw5dw6L5ds6PpjRL1Z3Ycjnmi5MUnQrx4").unwrap(), 5249300000), - (AccountId::from_ss58check("DyiUtHVqfFm4bY8HhHde5LGWhccKSqEHH5mfQfjWcxBAYA9").unwrap(), 4900000000), - (AccountId::from_ss58check("HEgWrRVu59QUkAUZhktdgkWjqy6NvwkqpaQa6GRYuvy886m").unwrap(), 4830000000), - (AccountId::from_ss58check("GxnJ6B6dQTmcmcQJbZUiT39wvpT1gwK5a8Zs24nFjuDh88u").unwrap(), 4550000000), - (AccountId::from_ss58check("J9qDFBsVEsUDhbL11Uw5YzDAYW4vdVpfpi4uHjQ7K5gdBPi").unwrap(), 4550000000), - (AccountId::from_ss58check("H9jJGtyx5WqZyfH9ECZ16vc16xwP92sqwsMYqNa6YBLHLuz").unwrap(), 4515000000), - (AccountId::from_ss58check("Ei9M4JUc4vA7Un2yxkSrWc76NECR4NMP3hNk8rr25Cr51bx").unwrap(), 4375000000), - (AccountId::from_ss58check("DFyoRBHthCUhakFd4UMZ4aYUF3UdgHWM6XYCi5MqRo676JV").unwrap(), 4231500000), - (AccountId::from_ss58check("HEndDdgRpAYhA7xcSTfL8vnevhbH4EL9kg8Sg4RrVBn8m1b").unwrap(), 4200000000), - (AccountId::from_ss58check("EPRitwC9J8sms5bLh3Zk3G7fqvMnfs3zKCKbYyKxUzLaCCq").unwrap(), 4200000000), - (AccountId::from_ss58check("DxGHjpkgfDJxEp7z5m1YB5Qw4yur8Ufs43mhQP18DWhuupb").unwrap(), 4200000000), - (AccountId::from_ss58check("ESjKMozifinX1LaYZMJUznxRxMs7wnKZM54EBpw8aNc8eVe").unwrap(), 4093250000), - (AccountId::from_ss58check("JHE8Sp1JGoWjNjAnAY8dDuzou9xnKDyaj5hHKq2bm3x1nN5").unwrap(), 4025000000), - (AccountId::from_ss58check("FwFEebfDZGwypxdzoJt5uhCZuBYUzCZPfRqeqHJyXnJHWce").unwrap(), 3850000000), - (AccountId::from_ss58check("EfanHRhfU9nguAqCKrfxLZ6nKAQ71Gtkoo3KiWofsea3DKk").unwrap(), 3850000000), - (AccountId::from_ss58check("FXgLycrcn7RbLuU22dmV9TLEKNg5bBDGSrUoufUWXCDAAXy").unwrap(), 3850000000), - (AccountId::from_ss58check("Dfj7GHuySTkujd49LzBpzFrA2kmH9ATduDVg5aoRAD7tWqm").unwrap(), 3815000000), - (AccountId::from_ss58check("JFCegxPEfS9LrnNPKjRAKrLFN2bYd3neee1czmvTWw7kdr1").unwrap(), 3811500000), - (AccountId::from_ss58check("DJi8PNeyRpRfsLm1mSwatKwtCX6ge4verX94YjY3VL5ZC9d").unwrap(), 3733800000), - (AccountId::from_ss58check("GhYk7Ut6JxGhUYTqcRMcisZrQxPQGtgc92CjthhCNm3cBNP").unwrap(), 3675000000), - (AccountId::from_ss58check("FojD2Y6MbfB6dTLUYR4aPYCrPeicnKrUPLmLwCtwr4j9H3k").unwrap(), 3645250000), - (AccountId::from_ss58check("EmSpMBUHEJKMMLd145zPF3NdwkrqcM6B7dq6zUzVCvPkubR").unwrap(), 3605000000), - (AccountId::from_ss58check("H6qhN8h5NaxoFz6RvU8wnVSujYoreG8eJqvS214FPkbBHCp").unwrap(), 3570000000), - (AccountId::from_ss58check("DVri8ioVRADUxcaSyheWNrCpvJqqJxrbaqNuaSzm4Era2Vv").unwrap(), 3535000000), - (AccountId::from_ss58check("EG1mkwdiZ1YHN5xGhbNwP4VqAyw3DXFzRH73gcQc1SrUw7b").unwrap(), 3535000000), - (AccountId::from_ss58check("CotyRCvnPyPNWNJLLBGApWtyZThfuasuEoo9UkyEAjGhhEW").unwrap(), 3535000000), - (AccountId::from_ss58check("JKewQtcD58bLRBbG9quuxrkpc12An1S724r5PwnpbENwVsG").unwrap(), 3535000000), - (AccountId::from_ss58check("DXpjpmLGs4eT68YqrQSrGa6wCGrdTXhRVwPTGjhbQnM1qF3").unwrap(), 3531500000), - (AccountId::from_ss58check("Ech91S2e3NDm1uLAFN4p8nYcTQ5tkfapEpadgtvF9StDUqA").unwrap(), 3528000000), - (AccountId::from_ss58check("EFaM46bzGj4ZfbtYPho4wZJpjuMQe7kX8NN6V6MfhvPtEx9").unwrap(), 3524500000), - (AccountId::from_ss58check("FyesZRRc5pzyMwBByRNFRWjfZKQuE7967BiDvUuWpw57f5o").unwrap(), 3521000000), - (AccountId::from_ss58check("F5D3Exb9GmgMzfYPXJGkBHMqz6q696vWbPMiHb344TpZdvx").unwrap(), 3517500000), - (AccountId::from_ss58check("DBbWYtJVqbuMyCStzLQSp6XDaVyYGi4scvvoyiY8KAPNe6S").unwrap(), 3517500000), - (AccountId::from_ss58check("Hy4WnkZZtQgairs66thxGVKXA3zKx5U1JnY1FF39AK6HzEd").unwrap(), 3503500000), - (AccountId::from_ss58check("HWueBP2zPFCxFmkLxZuxxA67RQCYmQ78pWHrwFcvpuYvtgm").unwrap(), 3503499650), - (AccountId::from_ss58check("HUgZ6Vq7bXiWn4KShCDsHv9ck9rhmM4jF46kRrZuDgrrLF6").unwrap(), 3500000000), - (AccountId::from_ss58check("EMtwTkF1dWXnGhdiAcfdPnLDd2bZJiEsa2o5dGuY8csmeWx").unwrap(), 3500000000), - (AccountId::from_ss58check("Hc9yN2Fwva8pEEg6zjVVr14svKBpp2NHpFYxa5XyQtfMcBu").unwrap(), 3500000000), - (AccountId::from_ss58check("ELnbAPjnBCNPFM9hwZECPHrMasWLf1y82DAY8nL1dj7oARP").unwrap(), 3500000000), - (AccountId::from_ss58check("HetYUNSFvTJxGPPH5zJ7adMRMeLaZixebtvfFkD7eS7w7id").unwrap(), 3500000000), - (AccountId::from_ss58check("DiWzGLSE57XmxQPjBqffJenaajvyXynySGE7ckcKPrAzj8L").unwrap(), 3500000000), - (AccountId::from_ss58check("HLkdHdVgyQsjZfJFD3LjBbttiEsXv5yyANCe2M5CECGxoVx").unwrap(), 3500000000), - (AccountId::from_ss58check("HPZw9pH85UmFpKhe5Eqhw4bbcePj1YpcB6qJvHX48Anfn1f").unwrap(), 3500000000), - (AccountId::from_ss58check("HZrUY3jizvyrNknE9LSvTTSnkNayxAAW4GBcmRMoJMHZekM").unwrap(), 3500000000), - (AccountId::from_ss58check("CrDBK4aZCkZZKLLwkccnjby9dZoBeJkCMuhdNRwvY15PTrJ").unwrap(), 3500000000), - (AccountId::from_ss58check("CuGeqg6v7kJZJyigApfMpH2p7heffKkSK8xadD956FXSheK").unwrap(), 3500000000), - (AccountId::from_ss58check("HU7uhqP7aRYbu3xscqo8H4TYYCSbrypwcA9q1kmguG2dPfY").unwrap(), 3500000000), - (AccountId::from_ss58check("HZ829vaiYYKdC9epdCPjNc47MhDcQbYGXsij5q5UYF1vcae").unwrap(), 3500000000), - (AccountId::from_ss58check("He7hR4YfmGuUjJjENjjCZFdqJzc7ButcgCuEAM6MDzri5sm").unwrap(), 3500000000), - (AccountId::from_ss58check("FcihoExnmhirY6YEqNsn9Kqqid4W9jPAs1fKEotvVfmaRfZ").unwrap(), 3500000000), - (AccountId::from_ss58check("Hf5g3h59UWjYajLUaCNkbVdWmaRsKcavpvkCdkLwt4MQVMd").unwrap(), 3500000000), - (AccountId::from_ss58check("E3XaWZXZgP68tT7yCsxnLUMQB2gST6KUxX3LbR3Sfx9eHc5").unwrap(), 3500000000), - (AccountId::from_ss58check("E2eeBJ3QpbRRttpPSu1YPjY4xeCrs9J9BVJRvaxXe4P3XSB").unwrap(), 3500000000), - (AccountId::from_ss58check("DzYkbwxMb94kzwhXe9RV9UQnPUzb16A53sEiQjkDtLbHkHN").unwrap(), 3500000000), - (AccountId::from_ss58check("Dz8Btin3WZ3LfWZMEZeo9eyFPtdR9H2hDRoRgFP4if258tk").unwrap(), 3500000000), - (AccountId::from_ss58check("JA15SMqccDkMMCPn7UENU1zZTz4tdaD4k1VnywuzHnRrKpp").unwrap(), 3500000000), - (AccountId::from_ss58check("CdsB52NPmvUso3zBynNa7iaJZehLP4K9axbSFdiRqakTnwc").unwrap(), 3500000000), - (AccountId::from_ss58check("DwwHPq4qVwPuHUwL5KPxHK4Vj1q5BVbRr9zq1sFctr2CWns").unwrap(), 3500000000), - (AccountId::from_ss58check("JEd29WyjHXTUm8Vd2QwtkfhGaeLY6JjxKzDoEXNibAr6Jm3").unwrap(), 3500000000), - (AccountId::from_ss58check("JErMS99eHay5Loh85djAfDA3oA8MysyWr9Y1fzsz2YZ6e4M").unwrap(), 3500000000), - (AccountId::from_ss58check("JF6vkfWxHu93McPdjLkKSRECZAHrSf6mC4WdBYoaTz24qMT").unwrap(), 3500000000), - (AccountId::from_ss58check("CbRHHT1STptN4GcwZwuugadppYLqAgPjDwPHq3v594pJ3FU").unwrap(), 3500000000), - (AccountId::from_ss58check("DtPKBDH9Z9ejkuXFnyqCcb27v7fkj8Lpk5SGd8NdoTDkfNV").unwrap(), 3500000000), - (AccountId::from_ss58check("DrucxtNMXwzsQqcj6npw4LLskixV7bGg9fCDofB1NVK12dA").unwrap(), 3500000000), - (AccountId::from_ss58check("Drnr8FsQYXrzz3Vs68n49uRpebFuPvW5FmiprUcHJAZMzti").unwrap(), 3500000000), - (AccountId::from_ss58check("JH1Whx634XaQeNsnFyA5WLBE84E372fPaKYvhrdC6qZ4LJn").unwrap(), 3500000000), - (AccountId::from_ss58check("JHAsSFXKzJdG6k7GbHGQh4HNajRtVS9itAjvbv4mK9XVre3").unwrap(), 3500000000), - (AccountId::from_ss58check("CbLdKvBgWnXS4rJrsRGtUUH2bcBVURxECWMDW6VLuvS1E2y").unwrap(), 3500000000), - (AccountId::from_ss58check("DpGTd8XwTuYBErPFzLzqQPJjrd7GJBsqV7aZEj9AsKNj8wN").unwrap(), 3500000000), - (AccountId::from_ss58check("JHr7S1Yg2SGtXw8LVZBRcym7wcE6jzdUPSEpqHUFQcGUFs3").unwrap(), 3500000000), - (AccountId::from_ss58check("DotqtsTViXGZyrkd4QZQCTWiiHgEtm7rhPD3HQ2e2e8Q3XQ").unwrap(), 3500000000), - (AccountId::from_ss58check("J6uegQzk5VtwV38FhWewEfDpVDacneqVJhjm41T1MhqbyM7").unwrap(), 3500000000), - (AccountId::from_ss58check("J6P3ZUsuDoQeQMFYfXKUgMdbvEftXbCrk55RqmoNXDXANs4").unwrap(), 3500000000), - (AccountId::from_ss58check("CoxVn4egqjn16HNmomYmz8nYj3fwjz7arFSu4a58CMum6uP").unwrap(), 3500000000), - (AccountId::from_ss58check("CiKGaNyvtuFSLXoCSZ5RKg3cCQbfisuV1tFQGqqnb2Bd24u").unwrap(), 3500000000), - (AccountId::from_ss58check("HgnLCrvjB2eQwkUV3Hbjh4NrniNKTruitZvCVoerUxdcVq1").unwrap(), 3500000000), - (AccountId::from_ss58check("ECvJ8g1LKj4BGCX7tCtAiSaN9zqFvbrW38ZSEwDbXECCUni").unwrap(), 3500000000), - (AccountId::from_ss58check("EBaxFrzKCkKZsaU6uLi3V6uhjzEVv55M3wnnhzErVVNgF3f").unwrap(), 3500000000), - (AccountId::from_ss58check("CorzcQnUTp2uETRrJnHHkddLyqQ1o9nYrVhXEBvPQo5wMnz").unwrap(), 3500000000), - (AccountId::from_ss58check("HmvmuwRo62SU3PhypDkAAxCQpoS4F5DUx6ZcJpkCRXy1Vp2").unwrap(), 3500000000), - (AccountId::from_ss58check("EAnrmcgirTFZEfD4WRPuEW3nNovt1jpFovTG649XtVe8e1i").unwrap(), 3500000000), - (AccountId::from_ss58check("Ht1TkF41gSGUjsYxubKCzg7BshXr9HmQUfRfyRYgh8w8ddZ").unwrap(), 3500000000), - (AccountId::from_ss58check("Ht97KE9BZndP555ikYsQ4REg8Z5qrGgiUdkcioNKUzPxekZ").unwrap(), 3500000000), - (AccountId::from_ss58check("Ht9xgtqyuxEyzSnK3dA4aXfvZN2zVA7AkkiLio1ypT5i2XY").unwrap(), 3500000000), - (AccountId::from_ss58check("HukxzGz7CnjxWXDaPLzYhdZdzw5vEf91hUsucjRZ59QKqZS").unwrap(), 3500000000), - (AccountId::from_ss58check("CisLhsb1TVUK8umdSjW7Y3htUWMtZNJkuZpRmm6YhjLPhUn").unwrap(), 3500000000), - (AccountId::from_ss58check("EPRoUCp4KEjKu52JtkgyK56rBDHE3wPGhwfQd6bzTVtVQzD").unwrap(), 3500000000), - (AccountId::from_ss58check("Hw1ZLJsw14AWVPtVVeNdyGJvMLqUxKZ4vSegJGfDYEQiR9i").unwrap(), 3500000000), - (AccountId::from_ss58check("HxaoUvpueMfuymAx3wWpy8g4wHceGHBueNm2WzdR76Cmo3u").unwrap(), 3500000000), - (AccountId::from_ss58check("E5d7qvMBR2wc3hH2vt5BqhtPKPk7iQQc6cN3jSBPVpp8rDn").unwrap(), 3500000000), - (AccountId::from_ss58check("E59qNvTqQzNgBRcHWVQEBbetNszzUayKJYgYhjcmYXSA8nA").unwrap(), 3500000000), - (AccountId::from_ss58check("E53ad9n1xn924kVHPYjst5JK9aASgiDPHtBingogPHhEZXQ").unwrap(), 3500000000), - (AccountId::from_ss58check("J1RJbEo3LcpHwJL5U7FuZMTFKhhpR7U5LCa8ySRMnQYrvbN").unwrap(), 3500000000), - (AccountId::from_ss58check("J3jnoJ5MXduCE8y7DBN5WaHqMGdkra7PASNhaHgaGMKB4fA").unwrap(), 3500000000), - (AccountId::from_ss58check("Hw1W8z5HxVGudJ8vTi7BXBi5a2atExPAi5NSSUKPeqV51ct").unwrap(), 3500000000), - (AccountId::from_ss58check("H1eFjyqFYKaTw5ahviAVFAxBGti6LEwiBZCpLM95Qirb8bx").unwrap(), 3500000000), - (AccountId::from_ss58check("EPfe1AJPVY81MuT2LyeSgJXZdPpMmQ5FB6H8HrHsbP5FzTr").unwrap(), 3500000000), - (AccountId::from_ss58check("GHMZaDnwnbjNJ3KmzadXWz8FkKhZm2qKmFAtQfBY21JuSC5").unwrap(), 3500000000), - (AccountId::from_ss58check("G84PoGrXueMUeZRigdXQyvsphR8fjdz7MLyWnWddWKFPi5C").unwrap(), 3500000000), - (AccountId::from_ss58check("DG1RHFnZdajGX3836nKA5Umq8aLVJgUikyjtewVcEYLSe3V").unwrap(), 3500000000), - (AccountId::from_ss58check("GAUXYfMG3FipXSCXzoEtxXCMhw3xNsXsESSibTumDiytR1b").unwrap(), 3500000000), - (AccountId::from_ss58check("F88VyZQnjRddNVRvxbq3UTzWbKgksmTUBBsAxx1i7C625zh").unwrap(), 3500000000), - (AccountId::from_ss58check("GCaN5p2xLVE1ihfgHwCxBNXyQqci3sesRrtp5WkXJoaFkw5").unwrap(), 3500000000), - (AccountId::from_ss58check("GCo36TN94t11nNK7vY9RY3WwFwCNHCqbaqojht2wGxUUybw").unwrap(), 3500000000), - (AccountId::from_ss58check("Dci15jU4uvNabHHGhJhv4rVHhoC1gFsna8XPAK4Pfnits3H").unwrap(), 3500000000), - (AccountId::from_ss58check("GF2f2tx8CvLBdBDiCKdND6ti4dA43Jp1Fgc9Yw9p75sDhcT").unwrap(), 3500000000), - (AccountId::from_ss58check("GFYKk3XYTxtVJeEukUF1oWVVG3QGKaqHwtNkt2ZmYNwvLMo").unwrap(), 3500000000), - (AccountId::from_ss58check("GHdvD7z6XbZPC2XNcYzFkW5LaWUuFgZWAb7qgXtek51VyJg").unwrap(), 3500000000), - (AccountId::from_ss58check("G5JgAXHwvSPxp4WsV2Lpo3rTvqPNWoUNEVKPV49MQY5raRG").unwrap(), 3500000000), - (AccountId::from_ss58check("GLY459h9MZaGuY8AysSgv8LXbv4iREkaZG7PdBn3VargM37").unwrap(), 3500000000), - (AccountId::from_ss58check("GLhgKWZ1w915dRchiYmVNAoCxJ4zkT1RxnyxRk5Ynt4Mum2").unwrap(), 3500000000), - (AccountId::from_ss58check("GLhwvxKw7J8KxnTEmCXXhoNvJmf8sHEQyKqSWrHQMuEyNAG").unwrap(), 3500000000), - (AccountId::from_ss58check("F4jK1qbx3ausjbzRL5krVj2nDa7E1xzTf94XHuEU2Ksxtd8").unwrap(), 3500000000), - (AccountId::from_ss58check("F3DdcVUMzkYTRqbxenbYApn9zL8h7c4sSf7d2FcFW33YPzY").unwrap(), 3500000000), - (AccountId::from_ss58check("GPGLPLVbq89bfFt9KqyBqHkAdS9Dx4XRC6cW35gZzrcvmU4").unwrap(), 3500000000), - (AccountId::from_ss58check("HFj2P2au3BtuTbu9pQ8mCNMDL3ZbpSkJnHT6bZv6PZDTrg8").unwrap(), 3500000000), - (AccountId::from_ss58check("GPaxuy6M5EoSifJ95UZkT7io6RsS4yvwkPL5fvsxDPZJ6c5").unwrap(), 3500000000), - (AccountId::from_ss58check("GUevshzjp8SU9os3gXjudihyJ9gHj8wbm5p5rVp3xqWVVPP").unwrap(), 3500000000), - (AccountId::from_ss58check("G6u1zXpyWAB7uEESZEd4vGc1ayzRdLn76ech6ZGG5Ej6EhE").unwrap(), 3500000000), - (AccountId::from_ss58check("G52SB3ZnpwaQJGzU3uqkrEpqGnXAe7Cr83GsCEK54HD2hvZ").unwrap(), 3500000000), - (AccountId::from_ss58check("DdChmJ3DkFUiZbuueeRZqeurQkqAGzCRpCGtZoDCE7rNafC").unwrap(), 3500000000), - (AccountId::from_ss58check("DQ1S67yAVkAe9nw3D4Rc824724RPRzAggHyryBUAW7VEyvU").unwrap(), 3500000000), - (AccountId::from_ss58check("FdJ7be45jTRrxmYffZKdqLm2sNGp8DbbgUaM4haaPFUfmze").unwrap(), 3500000000), - (AccountId::from_ss58check("FZTMwo2fkHkG3Uh69i1hu1YzXbG66uuzC6Z4VFQf668x446").unwrap(), 3500000000), - (AccountId::from_ss58check("FevVXFzM2EDJ3J4jDwZn5EzrPVFaMZ2RMQFmiU8vRUu2Mvs").unwrap(), 3500000000), - (AccountId::from_ss58check("DSCsZdkxmJu6kXy9ArKAf77D8MkocVCy1y4sXhMWorVgVsH").unwrap(), 3500000000), - (AccountId::from_ss58check("FXJqtDhhj8CbF4gP4Bj1R1stgE5iT8967Pisf1qcD5bnhfp").unwrap(), 3500000000), - (AccountId::from_ss58check("FhkHP1YpVLopY1uRRKjM27Faba2wm1zz313FXW5Upu3KECY").unwrap(), 3500000000), - (AccountId::from_ss58check("Fi8s4pW6CwJnkLsRFhqTbg2t29ApEnMUMejUvZr1StF1UkV").unwrap(), 3500000000), - (AccountId::from_ss58check("FiEkjkoga9egTeNLLCR8m8pCc333c4yQ1K6kEhaFkBc5DLr").unwrap(), 3500000000), - (AccountId::from_ss58check("Fk6goFhSB8qTqwH9oG7rVfmM8wjVwA86m5Bt6sgX4Dh47tP").unwrap(), 3500000000), - (AccountId::from_ss58check("DNCqC8QLGoWxoeMpMaizwsTD6BCVpBWBRUtgvSbja1cDEyo").unwrap(), 3500000000), - (AccountId::from_ss58check("DGmehL27ghFqbLYrMBZGGxmUD84wyGpMihSYkXDWgwy5Nbc").unwrap(), 3500000000), - (AccountId::from_ss58check("DMYA6JdVFfeY7SnPtSjyv56hqA9WkazpAg2drBkFwg4V27o").unwrap(), 3500000000), - (AccountId::from_ss58check("Fqg7sEzW6t2tUGJjJ5JwjGnuQUK9ozgiPwSbbD1x4VRcxH3").unwrap(), 3500000000), - (AccountId::from_ss58check("DVaAHMeXX85gXDgb4W2x1cNhpsh5KKScSpeGgCQMoaf79ka").unwrap(), 3500000000), - (AccountId::from_ss58check("FrFjcpdMLbp7iPNua95kPsi7LmpNraPAyFq4WbHmEofGCuq").unwrap(), 3500000000), - (AccountId::from_ss58check("DMRZ8pC5N9jwPrKhgcRAR4KB4ve7ifs62HyD8zrSGb3wM4k").unwrap(), 3500000000), - (AccountId::from_ss58check("Ft1J25aTjShhB4NTxrkR9PzB4NpRCf1GeuWjPLEXm4TPM3K").unwrap(), 3500000000), - (AccountId::from_ss58check("FJ9A7d1Vz9MdCNKD9T9BdReFF92576A55n1j5rVMtsrzzDW").unwrap(), 3500000000), - (AccountId::from_ss58check("FHre5so43hCq5FVuTDqFb6G1SKtxgQFLSXCMkzovKUpVi8h").unwrap(), 3500000000), - (AccountId::from_ss58check("DamhJAjpjrpEDQSJj3K9mQFCq4iNtip3DkYhJ83TgQ5TD3b").unwrap(), 3500000000), - (AccountId::from_ss58check("GXGmhQc9Mkvwkad4bAZkBho8KBEGs1M2nSNXFybcC7aS92V").unwrap(), 3500000000), - (AccountId::from_ss58check("GPVrcBxZ19VqjoUXc7XkseRUv5gsHPqPY4BqgbJDssnYW2B").unwrap(), 3500000000), - (AccountId::from_ss58check("Ehb841rfNxpD3Q2qxLsdZKcjk7YsPLgumgkBfK24Cya9bxu").unwrap(), 3500000000), - (AccountId::from_ss58check("Ekn2grdNoEQ7KP8d8G3sa6UbAR2vW9jTymy87oAZbMgVWRc").unwrap(), 3500000000), - (AccountId::from_ss58check("Gqmdm9SkY5XPNeLN3W9A8pupiQKYuD86FDZa9gNSPXZzFGa").unwrap(), 3500000000), - (AccountId::from_ss58check("EinGqNZHzQsyoLs7XvekKyTzeuMKQZNMhTg3XLfskmJGC4f").unwrap(), 3500000000), - (AccountId::from_ss58check("Eib3ZnCoaoy1tz6R4iZhzpJnVxEbK5bZjTZcLDq4LgMRrZN").unwrap(), 3500000000), - (AccountId::from_ss58check("EiADrJHF98DLYuSvbgdApMTJBDYd6ij2GKL4suP3GspC5PP").unwrap(), 3500000000), - (AccountId::from_ss58check("Ecn1AdEhgcw895Fo1VTWcDPto3ByjEquLtQ46jjFnXwbhwm").unwrap(), 3500000000), - (AccountId::from_ss58check("Eccip6yhcwxTyZHJ4kUzvQyAH8KwueZVpwLnnUVHkRy82h2").unwrap(), 3500000000), - (AccountId::from_ss58check("EcXW9cBdSdX8S64Na611531PQwacsB6FjTENE7SncUX8sVk").unwrap(), 3500000000), - (AccountId::from_ss58check("Eavk48cVHqBycjkbEXBk5rRGgBdRCaDL4r6mPrfxeoxSsVP").unwrap(), 3500000000), - (AccountId::from_ss58check("H2QJKFqVueoCexZL3pjHphPCFCg3xpoxSCaL3MJKpwhMuj6").unwrap(), 3500000000), - (AccountId::from_ss58check("H4Y7s4DDTxkaGzMbThHfiKTSw2oPazgEc4jJ17s8ZWTX8x3").unwrap(), 3500000000), - (AccountId::from_ss58check("CzPupSs9zUwGEBFMF97cmonZmYxWnzjRgQWzWrFgipDkra5").unwrap(), 3500000000), - (AccountId::from_ss58check("Ea9miMykHyc3Hb5yUKjHeLGkHMeuhn4LnNvB9vZh1CrWPyy").unwrap(), 3500000000), - (AccountId::from_ss58check("EZzXyvnaQdowk1pbPiC9mDM8MMyeHmfLt3BNh3WJ3M1hM9U").unwrap(), 3500000000), - (AccountId::from_ss58check("H7NsU8CXBtxQi42x2gKqcu3jkNHuhyYCCsfPXqwvhTgkqsF").unwrap(), 3500000000), - (AccountId::from_ss58check("H9Rd4pzqzzif5j8iNUfLckVaX7V6RyXjPrCQy27HXVhGUWD").unwrap(), 3500000000), - (AccountId::from_ss58check("EXV4xS38iYEx5La3RbpF1mqf4ZLFCZ2m3D4K9gL1nvTyhgk").unwrap(), 3500000000), - (AccountId::from_ss58check("EUpZJBP4ycthqtGQum4ZUTMCxissiage6ffBgDBorJY7XRn").unwrap(), 3500000000), - (AccountId::from_ss58check("EUU4cb2uLxZv6idyK3561AYv55ovoG6jCfHiv4CjapU9tie").unwrap(), 3500000000), - (AccountId::from_ss58check("EScpXTDFAuiRF1kBhU6jZmt2t7i4SyS43sKjWbZ1Vw4BLQb").unwrap(), 3500000000), - (AccountId::from_ss58check("HCUNRtZpoVt8rjoFSASDme1WVrdtmixATHAhGk12ud2gqYU").unwrap(), 3500000000), - (AccountId::from_ss58check("GqVRFQ8TqvyAUrXPfSfrsd2w92hm8hJNF2wmSJuK4kHYNse").unwrap(), 3500000000), - (AccountId::from_ss58check("DoKTFzBHepuHXpaytTfHX2fXCCKfZdrND9zktwm7Cpxzi9P").unwrap(), 3500000000), - (AccountId::from_ss58check("D8Z7MVv23aPhnrsrUW1etfnjT93TmcuW3vz6fmcEcQZyVNp").unwrap(), 3500000000), - (AccountId::from_ss58check("EuHmzDsgLw1xgKR9bjhhChc9j5T6PjSek4ppGENrYYkBxqS").unwrap(), 3500000000), - (AccountId::from_ss58check("EtJ2LbZBhSt1stbgaWGXfBHhkmkNpAMdq5EJ7WjcZVVNB3L").unwrap(), 3500000000), - (AccountId::from_ss58check("DBdXt5TT8RCGVbCSbg2GibrHQw3y5CU9PD36Cj6pfTYAVY4").unwrap(), 3500000000), - (AccountId::from_ss58check("ErSQLr9UigRknfWhq8nUdcmC2DJAnPqrUxqntTyd37sxrsr").unwrap(), 3500000000), - (AccountId::from_ss58check("GbqzCGkFBq36rEfS1pwuCe3WVQBkSKBEnk1UZykgE9i1FKc").unwrap(), 3500000000), - (AccountId::from_ss58check("GebV3kaUViaQdnRiS5MpzSrVEMX6Qw5UNxy3bfzUJUWhbkR").unwrap(), 3500000000), - (AccountId::from_ss58check("D8vjWz48cKupH9Z3L3qfACgFgp7FteVpnekaPT4KjEkkPFv").unwrap(), 3500000000), - (AccountId::from_ss58check("DfU6GdbHqkXDJqdSA2uHVPkjUgLG8tFfAabFdacN2VP8tbp").unwrap(), 3500000000), - (AccountId::from_ss58check("DgKMBcBLzrjUvfeSj8FEFCUwouxNQavR7hVAJjUZudq8vVu").unwrap(), 3500000000), - (AccountId::from_ss58check("DgKakiXY5Kr6FhGxdhtYFpN4EkHuPjTTuSR1T35RL7juvan").unwrap(), 3500000000), - (AccountId::from_ss58check("D8f6aTe1NWa1vVUq9KTg9ANcHJkZk97qsHScNKyEiNQ54SR").unwrap(), 3500000000), - (AccountId::from_ss58check("Eo7fEdNNCNtWREueVZFMLcLgqSu1vLVDpGkxm1cdi7WVKXz").unwrap(), 3500000000), - (AccountId::from_ss58check("E2M71CFHzaFbeou5iMsk7Y8GMbr6rDGJBQ5vvHfBLgFx7rt").unwrap(), 3496500000), - (AccountId::from_ss58check("GLdmgauKv65SSwkYqRVtXEoPpxxgNvBSkBtaHfk3kuKGkfm").unwrap(), 3471650000), - (AccountId::from_ss58check("Dm41XAeufvL3MbiUqwrUYAK9tZ9xeqNtrNMZ25NrGKKLWXr").unwrap(), 3465000000), - (AccountId::from_ss58check("JHpgPa1dKeabN3wL5zvzFHsQ6gFimB4H6hzxw2nkTyPgA7w").unwrap(), 3465000000), - (AccountId::from_ss58check("H9tgYk6ueWGmDqDMKsJWZ7X1odFt2bjUavttHNSzZUGQS3R").unwrap(), 3465000000), - (AccountId::from_ss58check("HwFCfVhLznRPrd9ueP7tWae5QzzyKVRqheTu8Q5eYYensQ5").unwrap(), 3465000000), - (AccountId::from_ss58check("GwHuVfkSqXz4gktMJAuyDUDTa4F4H2atFyCTNbGxvEPhSQB").unwrap(), 3465000000), - (AccountId::from_ss58check("DuXZhfpyAYaZ5h5wYg4UnLRJ9iX3NpnBEG8UHuGFKgc27XT").unwrap(), 3430000000), - (AccountId::from_ss58check("GhA6wKNZEkXPPDX6UDKksrtBPREFfRCKbJcv87oULV9zThQ").unwrap(), 3237500000), - (AccountId::from_ss58check("Fc2rXRokFoJbpQ9VAwGDgoQKDrYPvZBFi16rPyKoqDUvyGu").unwrap(), 3150000000), - (AccountId::from_ss58check("FVShh563MuxXtvKhGjMqT8ksMXBSZLiF5jA5Uandm4PrGoj").unwrap(), 3150000000), - (AccountId::from_ss58check("HygMLofUW6d6YvFdRCgDmBNkUH4Af4RX1bdLzbG5HFrgBSp").unwrap(), 3150000000), - (AccountId::from_ss58check("HNxeMraDJxgbHWh7ksT68rUrozVsJvexBKqEKLssYNRyf8x").unwrap(), 3150000000), - (AccountId::from_ss58check("GMBQH4zDnfiMGnKEEecikYPmvbV6a9VkRzdTFb4sEVUkQi6").unwrap(), 3150000000), - (AccountId::from_ss58check("FszBjk2vazPKTZJ98CxbnQ2a1USdVJc1QTVnraCxsiBMDpF").unwrap(), 3150000000), - (AccountId::from_ss58check("H3zTcppYUc3iGJPSbZK2i9JWUJNnQ9qMTfh1PhKFYNUwsAq").unwrap(), 2835000000), - (AccountId::from_ss58check("EzBXY1kj1yGhdz5qhN6idAPoUvS6bFzy8CMdc7xsdWg9pPw").unwrap(), 2800000000), - (AccountId::from_ss58check("HD355YiupXxUuTWukY1Y29fdTZeMsG9WjxkSvRAsJWgrAkq").unwrap(), 2800000000), - (AccountId::from_ss58check("GjzSXMRpHZBppjyQQ9SekGTXfiSXJJxngi7HJTcNb7qqfRi").unwrap(), 2800000000), - (AccountId::from_ss58check("JBgCdTtHdDKgZW3qf3djae9SGTHPRRqrNvEkq2DrugsJMps").unwrap(), 2625000000), - (AccountId::from_ss58check("E8255pcgpHFuUJT4nsQRGiEU1z4oRsvs9PgCRiUTUL17xPj").unwrap(), 2625000000), - (AccountId::from_ss58check("Dj3KdHggqQUJ6sim4M5Pv7KxD8xYP3zLJ16BPJYg4wTJNGn").unwrap(), 2618000000), - (AccountId::from_ss58check("JLJxbSQMh7kknQBsdeNwxnEVWqEdkmz3nMr4YA2suvBpRKb").unwrap(), 2520000000), - (AccountId::from_ss58check("JA3hqsbjjFNRSpUrLR7crSDCA1qe6zvydDtB4MqGuF3Rfsw").unwrap(), 2450000000), - (AccountId::from_ss58check("HAFNF3V9LBVbeeo3settGruhPLbSdvytdN9FpRupiKMGQcF").unwrap(), 2450000000), - (AccountId::from_ss58check("HuyrHtrBcEcFEPXdJWDzHqBaWFHkUynEsgzD82ZRKevgcF5").unwrap(), 2450000000), - (AccountId::from_ss58check("G71HzbkB2ABUJhT8Ma8WLBT9tBbHFVWA3LUu6ysWPBxc3Pz").unwrap(), 2450000000), - (AccountId::from_ss58check("ELcmjJ95BfnJ26D7echTZpRvuK3bzvoy4zuo6d2tKMcG3XX").unwrap(), 2415000000), - (AccountId::from_ss58check("DQ3AigN4BtVAoqSAVVgjWyXpK2GyWQ2kPkPHzoGcNJJaTtE").unwrap(), 2345000000), - (AccountId::from_ss58check("G1qxuNNwhH71g77TiecLJSpuX2V23Xk2mdVFWNHmWXJSUg1").unwrap(), 2345000000), - (AccountId::from_ss58check("GqC37KSFFeGAoL7YxSeP1YDwr85WJvLmDDQiSaprTDAm8Jj").unwrap(), 2333100000), - (AccountId::from_ss58check("FUtVcRVku6UtKuw8WW1NF769uyWNQsuNYWhYHkgFQyc8Qp6").unwrap(), 2310000000), - (AccountId::from_ss58check("D2k234La83ViyTNHz12aWGPVSNe4P8X9AyERJMqeyYEC8x6").unwrap(), 2275000000), - (AccountId::from_ss58check("GcajU8aT3ThX1VmvmGRi2tmL5AnvGG9pKwNTNv4svjtpE7r").unwrap(), 2275000000), - (AccountId::from_ss58check("DgWcQBPW7dBCWnwDyqksHpgLG6nn2yVYGWMB86MLKKM9sor").unwrap(), 2275000000), - (AccountId::from_ss58check("CmAHp9wig2R5smkRzbmsUeHeB2zrAF6WYmEWd3KPAaoSX4A").unwrap(), 2170000000), - (AccountId::from_ss58check("GxpMV4CyhcHRPmQtyGu5XUs2ntqz7aJ2hrsrHS913YQUYUH").unwrap(), 2170000000), - (AccountId::from_ss58check("HUPe9bPNWXCbxNPzMtdLC5DQgMKN9mqfA3qRumzzMKCcf3T").unwrap(), 2135000000), - (AccountId::from_ss58check("GqWVuvq8XVQdgs2Vb6s2HWy22DNdaej39AXy2ABm74WPnXT").unwrap(), 2135000000), - (AccountId::from_ss58check("G28UXyfAoSbLjTYEs3vYDWD2vCTDQd9x5Upvt4hnzJJCvMw").unwrap(), 2100000000), - (AccountId::from_ss58check("HHoAAVdxXY3Fes7szsQ9sAqEBdrqusjDKhfP46oDyFGTeXF").unwrap(), 2100000000), - (AccountId::from_ss58check("G58BAdBZWNDX95vqT2gjR11LwQTQyAC79po3diqpLMZQpgJ").unwrap(), 2100000000), - (AccountId::from_ss58check("FnfSLA1ECJtpeNtira1RrNCp5jZfwvuwjtFwEmyTFgvxCxb").unwrap(), 2100000000), - (AccountId::from_ss58check("J4sW13h2HNerfxTzPGpLT66B3HVvuU32S6upxwSeFJQnAzg").unwrap(), 2100000000), - (AccountId::from_ss58check("JBm75oHqnxj512md2yJ4oGFL2iuoQ1Nv22ELUoiaRphz5Td").unwrap(), 2089500000), - (AccountId::from_ss58check("Cwzj77ZjLd6fmzy71Jf6kaLkRYdehpnkvtQ2ya4twUwcWnG").unwrap(), 2030000000), - (AccountId::from_ss58check("Corxdah6XqNb3z7KzhzLaUgcgB2n23jH8rRrfCx2DKR79f4").unwrap(), 1995000000), - (AccountId::from_ss58check("Eqvq1WVaimG1k27caBft95PApnEtiTGcc8JHFFixWGUV1Xv").unwrap(), 1942500000), - (AccountId::from_ss58check("Dchy1uFBkJKPhDrimnq71rAexuYqffE28tUeWc7ksVebtEa").unwrap(), 1925000000), - (AccountId::from_ss58check("J6sPZQWeJe2tjK92UiTzaX4vUVLWCirUvmryGBADqFZdkKB").unwrap(), 1890000000), - (AccountId::from_ss58check("FoRMDgb1mybWsApJLegxo3vaPHjc4E9ARxhXiwLbipUXFLB").unwrap(), 1890000000), - (AccountId::from_ss58check("HU5bnmipxs65e5tneNFeNGkCCP9fttaoyGmevNNXiuckjmf").unwrap(), 1855000000), - (AccountId::from_ss58check("G9jdqGemj87L2o6r81Fxx7WxY3sKhGYEbxjFChrbJxWHmqN").unwrap(), 1855000000), - (AccountId::from_ss58check("HA9xrobs8zMhwZuRSWNdGRHeMUygrTWq2KGxx6eBEbVtAPS").unwrap(), 1820000000), - (AccountId::from_ss58check("DrAT11oGWaMbxkLtUwsLoteqfzaSE2iHMYLdbTqBF9j1we4").unwrap(), 1820000000), - (AccountId::from_ss58check("Ce5s5ZVW87xZZhreKp8bUn76shazDqxf1dzQ5Rubo7o1Ubs").unwrap(), 1820000000), - (AccountId::from_ss58check("JFDtXDnSad96CgyfM2Mq3jr5pzzZ64434QyWfKDPkddc8ik").unwrap(), 1785000000), - (AccountId::from_ss58check("Hy3TooA8ZmyNuCpM8Xsigw43anMGPNXmNT7hnNk7GY422QM").unwrap(), 1767500000), - (AccountId::from_ss58check("D65xHJ2f6UnBmMTfjrj7m8EVCphLhWaRfuA2ANfgF7TSRSS").unwrap(), 1750000000), - (AccountId::from_ss58check("G2MBRdALuFBLNbnJiSBZTeW7d2kttjecTWiDYYHFCRBcR7y").unwrap(), 1750000000), - (AccountId::from_ss58check("DT7zGiYQGonCPqBgzLvdF6s35AmLkzqEodzZ67Vpw9oa2PQ").unwrap(), 1750000000), - (AccountId::from_ss58check("GXUBYiaRRNKSE4y184ekudmk2Z7gvKhWgh6PNNa2R8gq5Xa").unwrap(), 1750000000), - (AccountId::from_ss58check("G9mCiEhcDUKBPAbuatG1fCwLhymPNk4Dp2T8GjmRHS7YGyt").unwrap(), 1750000000), - (AccountId::from_ss58check("FexEEGtKX9527Bc3KbEUm8vr4cjL8Zt8vFP9rge6k57hjTr").unwrap(), 1750000000), - (AccountId::from_ss58check("FyyGzdkUbFVcAaiBz1GJSpdNvmzH9Rk6239cjTH6cMmXSP6").unwrap(), 1750000000), - (AccountId::from_ss58check("FJM978XdGsuY66HGTNasMLMjuYKbY7ahwfQDoFUY4bxmXPi").unwrap(), 1750000000), - (AccountId::from_ss58check("FSCCjyZ3hdvNuwtXisRbDDRZZwWxrZZt1qqoe66oP5QgAaF").unwrap(), 1750000000), - (AccountId::from_ss58check("F7qffFsm6dmmMYMNG2nsAxr57mypqNYbeYSJcfvzbwR6Cnt").unwrap(), 1750000000), - (AccountId::from_ss58check("FtBttXdB8bvy6FjKqnofzbC7M7Lem1ruEaDm93YJBz2HaA2").unwrap(), 1750000000), - (AccountId::from_ss58check("HXKSCDgc7gKghegAnFi2ASq3EAQ3aWZjPnAk5TctwKWZK8D").unwrap(), 1750000000), - (AccountId::from_ss58check("CzDmTcq7GPrHxHbzZVNFNLjC54oJBG87AvEjJssFBRpMWuP").unwrap(), 1750000000), - (AccountId::from_ss58check("DkXcGFypQqgSeKdWfg891zk8SaqNv34iTVkQ9tiqhVk76qn").unwrap(), 1750000000), - (AccountId::from_ss58check("HvjskqGqmjgAJka8HFsAwcNy4QQTUWy3DUmMhvDjLS5m2dX").unwrap(), 1750000000), - (AccountId::from_ss58check("CmF98sjfSUCnsxv22CGRpNLeseqC5WyJmRwNaz1WujAMe1b").unwrap(), 1750000000), - (AccountId::from_ss58check("Cp1o55bJijtPchgSFvptFFHiVMnQrs52pvqvUzMSYF6R7v4").unwrap(), 1750000000), - (AccountId::from_ss58check("F7RZxmNe9jbsFYBmrRHPBQ5oUViTUSwE1piCCFVAJ6PJdmW").unwrap(), 1750000000), - (AccountId::from_ss58check("HBtF5ABYRySFRzaNLYfY4iusJcxL8hWv3PaBeixfrUjhwsi").unwrap(), 1750000000), - (AccountId::from_ss58check("HHFZ2S2iSqGM3sKRMhisJ9htL63VoJ7zVYgPoKNweWHqJnB").unwrap(), 1750000000), - (AccountId::from_ss58check("EqXbK8WnvQYhRm9mm4jj3VE7bKztkAJv7EzcsfpTGjUc25K").unwrap(), 1750000000), - (AccountId::from_ss58check("Cr5DmsdG8QL4QvEfKuTyh1fBQ7oa6uRsw29ZVDQXgXeWHKm").unwrap(), 1750000000), - (AccountId::from_ss58check("Ftoq2DnmsSpSMpRwibvneqYkb6DcYrNuzgP9CiHQis2Q8vo").unwrap(), 1680000000), - (AccountId::from_ss58check("FFeVQAAvebm4fDtEv26QRomxLXiJ6CcxM1YNVMW4QT1aiK5").unwrap(), 1610000000), - (AccountId::from_ss58check("G21SjDynBYYzgcQwPVWogK3Gt89FpzrJJhw3cChd8xbjmpW").unwrap(), 1610000000), - (AccountId::from_ss58check("FkwjxLhBMaMD7NYAskQDHPjrXG22Q6UrRCL4hZaU6gM7WPo").unwrap(), 1610000000), - (AccountId::from_ss58check("Eou5ecM7dk5zVNV9Ln9bw3bb7JpXgapHXhqzSnYcjsHLnua").unwrap(), 1575000000), - (AccountId::from_ss58check("DVDEXGc6BMVQVVUz1qHyFtNPoTiUUmLmarEkWsrGCaaiNBY").unwrap(), 1544550000), - (AccountId::from_ss58check("H528UgnisSaYU7vmsxGY9NttSNGMvk7p8ZV2sy3duHZ1fVm").unwrap(), 1540000000), - (AccountId::from_ss58check("DpQc2hUCEFFxczGpdfqd4AScsdtUyzG7jXGbqztN1vsDVNx").unwrap(), 1540000000), - (AccountId::from_ss58check("J4Hb9Lv9cF65QS81mLtRVJ6s8ZJxP4o36Hv1pLy5HtAFKRZ").unwrap(), 1435000000), - (AccountId::from_ss58check("GjgJKrsVed38yzcocuStkLdNcSudqLfGpKDqM4fYw28fpcA").unwrap(), 1435000000), - (AccountId::from_ss58check("H6te2tc9W8FnhbY75zGC5ydpMUJdkRJWkWgWTFp9ewfzjkA").unwrap(), 1407000000), - (AccountId::from_ss58check("HLRJRnV19wRd1w1o4JTZKq8SAKzeVzdGtAHfd8nz9GsdjFN").unwrap(), 1400000000), - (AccountId::from_ss58check("Hee35pjoHWMaFuuxjwVgRPRN7HuAemMRNB5UkBtJxTgipa2").unwrap(), 1400000000), - (AccountId::from_ss58check("Ft5hLyHw28MW1WUSsNrV34Sfz2c3MwuWAbnXANcV36S9atH").unwrap(), 1400000000), - (AccountId::from_ss58check("FvtEEjYxYJ2ptstC9MJ4R1oL97K3R26GEJG2ZjieCFoN9mo").unwrap(), 1400000000), - (AccountId::from_ss58check("GkRY8Mkk3KZZt69U2eZMSCzV778e2VB5Bvit2pdzbF1z2kZ").unwrap(), 1400000000), - (AccountId::from_ss58check("H4Pppci2T6s1nxHsM3hB4AmcxJb9HvPdeXZdjAFKzyvHJi9").unwrap(), 1400000000), - (AccountId::from_ss58check("GWfsDKEWyzSJZjjwn5oD9iWYwPHT6V42dpoh1qQwU2BG2DS").unwrap(), 1400000000), - (AccountId::from_ss58check("FsoCY6VDM2jYvq4H8EWvM7CVrEqw5ZFL3qS16xkvtynVh7H").unwrap(), 1400000000), - (AccountId::from_ss58check("DkjYoeib5faDa6LVUuVFxKgvMk8am2JFxm6mtJVikb6FKUa").unwrap(), 1400000000), - (AccountId::from_ss58check("EmUEXGdgutDjhdTxnc3zqxGTahYTRsDzfBiAPx6zENcL4TD").unwrap(), 1400000000), - (AccountId::from_ss58check("FLzgz4qt5foC1DXRHQQwC2cLwu39eGkhx93x7UsM5uniBvM").unwrap(), 1400000000), - (AccountId::from_ss58check("FPETBCG5wTdUxSE5HFwR8dByNabDtsHHmrhbrNpY2XZnoh8").unwrap(), 1400000000), - (AccountId::from_ss58check("FPYwt5AGLHtpZJcJJiyZF6TsrTP4ng8fp3CWLzumyMfyMj4").unwrap(), 1400000000), - (AccountId::from_ss58check("ED7CJXLpkWPjFxyDtdMskijpZrVyoqxzpUHvK1j1j7Wq7nR").unwrap(), 1400000000), - (AccountId::from_ss58check("Dz1XFye2z6o3dQ5ywPXQHiz4kzg6rtyMS2mNt8MkhCQHfAp").unwrap(), 1382500000), - (AccountId::from_ss58check("Dp1eqK3ksHUBGTzc2VL1LM7pAc5na31fxR5nmx1LXM7iCMk").unwrap(), 1365000000), - (AccountId::from_ss58check("GUiDMkqBvUc8WHfbrbyHA21UXRN4pZB3XkNvc1EN9yiffs1").unwrap(), 1330000000), - (AccountId::from_ss58check("DV42CqPr8ZDrzrCtJ86ujK47sTq8CBVDYQQTo13DuLK4MzT").unwrap(), 1295000000), - (AccountId::from_ss58check("DftTUPUTkZiC5P5ch8SC8GPmg2KxKNysrNuCdHX1m7Qq4kb").unwrap(), 1260000000), - (AccountId::from_ss58check("HUUUANPEhvivstxQQNVaxc6tSNh2seRUk8VUgsaNzvZkEAa").unwrap(), 1225000000), - (AccountId::from_ss58check("HNqYsqFnghE1LrSVGK2fWJwziJFsDAuLgqLhfcMp235T2Jz").unwrap(), 1225000000), - (AccountId::from_ss58check("CkwsYrs3w753yRCoxBhPkJchBBxxsmDL6TNGZaESg1opmYR").unwrap(), 1225000000), - (AccountId::from_ss58check("F9vCbV6eoqf9eGiLP22ZenCAxPkmo2h7ENvHYN2XTTtyHiL").unwrap(), 1225000000), - (AccountId::from_ss58check("GwMkr32yT4MwLFjxtvx88pU3YRMh4ubBiuUKHSnXPsniLsW").unwrap(), 1155000000), - (AccountId::from_ss58check("DFnPrpkHJGacXLryummTyrXYSRomdKu6SdaLgjjAHHt71Br").unwrap(), 1155000000), - (AccountId::from_ss58check("CoxbtPgJUVzXjbLot7Wf8MegiUym4FngWHZvm5kvkfDDrQc").unwrap(), 1120000000), - (AccountId::from_ss58check("H4VfMZaHdhv5neh5DK9vwWCHNVi7WBRrFe8Siw53TxPxACz").unwrap(), 1120000000), - (AccountId::from_ss58check("GkMqae2d2RcCZPcyLKqikhmZu8cHecee5ATez2gNQ8Yw5BN").unwrap(), 1050000000), - (AccountId::from_ss58check("FSMLmTCHYeqxubkL36jC575FaYQGZwKpp55bJaTUX5tTqwD").unwrap(), 1050000000), - (AccountId::from_ss58check("GXR6g86nbAG6cyNjAANhe9yjV92Dztt9F7Eea3sLDYYxbRq").unwrap(), 1050000000), - (AccountId::from_ss58check("DaaxBM9aXx4u6JG3TP1GaunwxDU2qCUkGEqihA24PQjfphJ").unwrap(), 1050000000), - (AccountId::from_ss58check("HR5nW9AebE6STxUm3iiNN1XsLTRaM2ogJSP3hRAxc1xX9fd").unwrap(), 1050000000), - (AccountId::from_ss58check("GfUs38WKY3y31FBoRQyXQxmiz5MmysFvfJcaCuDbwRFxhrq").unwrap(), 1050000000), - (AccountId::from_ss58check("J4JbntrSEtb2UYJuSXpX4iWuT6FLaF2RxqimUq3u6BFTJRm").unwrap(), 1050000000), - (AccountId::from_ss58check("G5NJSkrhGovqLJmvJyBzkYQY1xHSgHyDkTQXtUJBqVmfpgL").unwrap(), 1050000000), - (AccountId::from_ss58check("G4vHe4xQ62CmYgZMimJADjEM79UX8pD6Eaea9nYCrxFC87q").unwrap(), 1050000000), - (AccountId::from_ss58check("CftES8E7Qx28KeXscFtevrhJmk1z6d1CucgJ89Z1Lxzdk9f").unwrap(), 1050000000), - (AccountId::from_ss58check("ELoC5aEupczB6SpvcJ3f9x4CiEvckzhr6gsEXDc4VdTQJoT").unwrap(), 1050000000), - (AccountId::from_ss58check("E3DZfmXnaoQrpx2ZqR4Z5n8FVQdjYAxSeKiAVDet24w3mWc").unwrap(), 980000000), - (AccountId::from_ss58check("HTtgbUgnvnqYBYWhpcd7iH45AXwRb6fDdM4WNgxBXF3cwbh").unwrap(), 980000000), - (AccountId::from_ss58check("J9peyYeKNE88QE4euobYScAdD6uiPMJhXfPh6pfd8fg6666").unwrap(), 933100000), - (AccountId::from_ss58check("JGnrYitDK12MymPHg7ubbvrZ33APqDHggfrwuv7D8R1h2Vi").unwrap(), 910000000), - (AccountId::from_ss58check("FHw6SZyRVfs1bKa2GXm91TgQqtC2tVWEZaPsNufXd81Y12r").unwrap(), 875000000), - (AccountId::from_ss58check("FoD4vwbp3EvTeCLyg2gtJe9wXVDSrWMFsVfQjKQjsd17Aoy").unwrap(), 875000000), - (AccountId::from_ss58check("HnBosrGjPabubaW1rNxD91P8yxbEBREKSaD6juQDCnRKZjV").unwrap(), 875000000), - (AccountId::from_ss58check("H58pZLohWFWzk3MnBcuHNqyG8hgQ8DsHwpsugVUhjvxBzQX").unwrap(), 875000000), - (AccountId::from_ss58check("GRZoKmbABMiWrj6PzsfK1CzBi9mpEw725pRBMEaQxNYMkuW").unwrap(), 875000000), - (AccountId::from_ss58check("Evp94f8Z26azobnAQC7fTfqAariSuCAzKmU66HBGAs8MjAN").unwrap(), 875000000), - (AccountId::from_ss58check("HeA8BrK3UhVGtfFVNiumRMSA7DmoR4qrf6NSE16ikpkxHAX").unwrap(), 856450000), - (AccountId::from_ss58check("EAQbqB8yWA2KTSRq4U2b79zK3UXK81i7d9UbiMGaMQraDYW").unwrap(), 840000000), - (AccountId::from_ss58check("FUGZsS3Kx6csJA7TSijGDJatd3a6JFi16LZaVd4i3tvLDAo").unwrap(), 836500000), - (AccountId::from_ss58check("CrCMcvbp6kicMj4BjrW1w4ac1QU9YyiiicD7h6XcyEeu2ub").unwrap(), 805000000), - (AccountId::from_ss58check("EJW9Jaou2w944KyS5q54e71pVQbo8ED95kwBLAVwBpErczW").unwrap(), 760550000), - (AccountId::from_ss58check("GtkDYo5v2WYGxsAqgNgM9rGV7tSdYfDGNsbeKkET6qzvFoR").unwrap(), 700000000), - (AccountId::from_ss58check("FMMQoxtEtoYJa6GMz4Ve77tQLQJbzshQQKxmJLPPDms8NzN").unwrap(), 700000000), - (AccountId::from_ss58check("EicUgPV7XKo5dzzuUT4zzcZJry6s9knZKFbxBDYtGF2BTCV").unwrap(), 700000000), - (AccountId::from_ss58check("D8YrXSwsX1oFujfagBdswzLcr6nqBT7CW16E78fCDAdBzXy").unwrap(), 700000000), - (AccountId::from_ss58check("CpduzZsCzZ3KVzvyBZw6fAANSXKvX1JzCf2cV1TKTGPwvem").unwrap(), 700000000), - (AccountId::from_ss58check("JJ11DPpzBTJmLF7M81dTE6ZT91pqjc4RBwauzaakBQAD5eR").unwrap(), 700000000), - (AccountId::from_ss58check("H6pqvikNHkEhvseyqyXC6YMVYZKJ8qHHPrcEB4Ba8seZ1MZ").unwrap(), 700000000), - (AccountId::from_ss58check("Hjec5gMGt1xABbiQrVjHn8mY8VZzri8NgSXyGTh7KwggXXB").unwrap(), 700000000), - (AccountId::from_ss58check("EGMZKSoPQPTr1Edio918f7WPRcwYjqa7maAyjFT4h8xrPq1").unwrap(), 700000000), - (AccountId::from_ss58check("H9Y1q7gPfUAmcujE4uN4hFtzAwESNnWPUbRKQJZ6WMPdnbP").unwrap(), 700000000), - (AccountId::from_ss58check("EAQEwP594jUu6cg1DPvvmioNSMNe3s4xb4iHMMvDw4ZHRnG").unwrap(), 700000000), - (AccountId::from_ss58check("CuJomcAqN5MaYagjJ3ERyhS3CpCoQrb7hsJdoDyeGBoKkaK").unwrap(), 700000000), - (AccountId::from_ss58check("CgL4VNJ8i7PrxvyYzZJ2EiF49GGNGDNRaf7Ahm96azd7zxc").unwrap(), 700000000), - (AccountId::from_ss58check("FkQQwmKTaX9EMMnJSqoow65tStGHFGBU2CVvuV57KEZi3Cx").unwrap(), 700000000), - (AccountId::from_ss58check("DMxz8nfsDKEwrTsbwMrqNX76JL3KYWZnN498dCY1Tb9kG7s").unwrap(), 696500000), - (AccountId::from_ss58check("Fno7Z9H1J3bpDJed6zfGcV6SkVjL6W7TSWfJyKKixV5iBa9").unwrap(), 665000000), - (AccountId::from_ss58check("EoqVpT2RdjsWxQ8tfGPqoR1LvXmuhwhUiF9EKxqYWJ1koRv").unwrap(), 595000000), - (AccountId::from_ss58check("GqjF32cNzxUg8KcwWsRBuXSERfBesZHpqWxBapb9HJus3g6").unwrap(), 595000000), - (AccountId::from_ss58check("HP6CBDJWyE6giFXRgdXHDxzBVyehrTC3i43yFwKGhbrq9aK").unwrap(), 572950000), - (AccountId::from_ss58check("HZLcNY6dorXrSyFek6csVtzzbEXqXrYFBKu3HG9AEszAJhC").unwrap(), 525000000), - (AccountId::from_ss58check("HyS7gS8xUZAtN5ZV5thLdK95TAEixpreGBv4kse1yYXSjCA").unwrap(), 420000000), - (AccountId::from_ss58check("EBHMekns8dNekd746zypnhb6CzFjumdDNFTV8h5nTTzm9EQ").unwrap(), 402500000), - (AccountId::from_ss58check("DFooijk9WuXyx7CY1QpoRwC9wXhiZsrMqRSAE1usdyB9GY9").unwrap(), 385000000), - (AccountId::from_ss58check("JHKtbXe4goCyKuX5VTAXLEDbJstyKpHunumqg7wwE1ZsVmL").unwrap(), 385000000), - (AccountId::from_ss58check("DJtTbv3WRK7Cjv8ZxMWfK2Nac9ibKf1UaYj9HrUwnEEQxaF").unwrap(), 385000000), - (AccountId::from_ss58check("DNVgED4QJQZ5wqbgJhcLhrRagkvjpp5yGyMonSJrSKzghRQ").unwrap(), 385000000), - (AccountId::from_ss58check("EmK7ng948z7oDH3JdGUyzRwA5m8tZqMiuwBHetLgiqWk2wB").unwrap(), 385000000), - (AccountId::from_ss58check("GezcmEVJAKbF691jGtwknuVmGZAkcMVZ6W9uhiuHJPDkxyz").unwrap(), 384965000), - (AccountId::from_ss58check("EtpBtrZDPhTfJBVR84z3WwSJa8ryrYcuoQH3MVKkcwgTTaR").unwrap(), 378000000), - (AccountId::from_ss58check("HfKPfvi9XLh2NdxdnKYR2MaYpCQDzyq1LCewpHgj6KrBWkH").unwrap(), 360500000), - (AccountId::from_ss58check("CdjZ78QvG8uqPAWhKnYnyA2UV68pg67eWE6VHNrzSMRGdF1").unwrap(), 350000000), - (AccountId::from_ss58check("EAFw7ydDCtqGFrPsMhSFeWs2t6e6eDGTXUdXtcsFvtJxGcM").unwrap(), 350000000), - (AccountId::from_ss58check("JKeEGNQDQJVvqWXZg9snic9hBTfsbJRW5Vwbc3FA2jCtiJk").unwrap(), 350000000), - (AccountId::from_ss58check("HvrvWxFdYFxr8o1m3YQCqUdDez5oZm7e7Rqvk77FZBAKBB9").unwrap(), 350000000), - (AccountId::from_ss58check("GD1gEe5qnRqNzJx9batMcM6gDvCEgzxhcsEaKWfX7Ynwhfi").unwrap(), 350000000), - (AccountId::from_ss58check("FqEmWJagaJcFaeZouS8fYcn7vjySjHucZ1unQRAbqbe2nRY").unwrap(), 350000000), - (AccountId::from_ss58check("HydpnRAxUCFmkFWNDWaA94LUnjhf3kuDj8u1iVK3ayGUpX1").unwrap(), 350000000), - (AccountId::from_ss58check("J3xMRahC2ieqQ9NWF6aXbiz18Yq1L86NNetJxfspUuyVsm4").unwrap(), 350000000), - (AccountId::from_ss58check("CiFQcKUgRuS53CEpmNr7doEU3ywm68oPnEKMBpr5E3bbSDR").unwrap(), 350000000), - (AccountId::from_ss58check("DSXJqshQ5SDEfehcwUd649DStczfxUnmV1bZu3GcRqV9544").unwrap(), 350000000), - (AccountId::from_ss58check("JHnAxcdUANjiszJVpfDCQyn6T8swMKbvrCAgMbyinAQM2Aj").unwrap(), 350000000), - (AccountId::from_ss58check("FfaXdsfqPX2QEzJtpA8MFRXSbBeAiqq47FtyxzM4A4maeCe").unwrap(), 350000000), - (AccountId::from_ss58check("JEDKGGw4prqCVWgJUySb2NmeSW4RmXMQP49Kt9KaCt324L2").unwrap(), 350000000), - (AccountId::from_ss58check("DQQhAW6f3ZX1Nv4HtaRv9w4QhyiWMdSooxSDWiWKp72DWk6").unwrap(), 350000000), - (AccountId::from_ss58check("J8uQ8YUF61yFGjfKb4Wfp278mYS5EeTcCJP7egNv1BHJLzN").unwrap(), 350000000), - (AccountId::from_ss58check("J9H3u1gWAU1WvWhC8YvXDN8Qj8YQJwWMG2P7w9YZ6RxP6NC").unwrap(), 350000000), - (AccountId::from_ss58check("FooA4ZZUyB9ib56f46XK4BREEyVCKCX5T1eLxNVTRkJ8t82").unwrap(), 350000000), - (AccountId::from_ss58check("EB1oqZ5MEnEwxhJ5DySCH3pyY55a2CUDfAbYKmLz2QcqWgx").unwrap(), 350000000), - (AccountId::from_ss58check("G2NCLmnVHVZs1U1LAqaF4FaUj49xPUmFYk4uwT5M6DTJNUS").unwrap(), 350000000), - (AccountId::from_ss58check("Dqxasp4cvSyW7inN36qFsjKGaXNSL5GxTv9vUHqFrwqXHAp").unwrap(), 350000000), - (AccountId::from_ss58check("E2sWd3ZuhfBFppDdqncEdofSFW99XUPLEmHtfW3NsPAGZPi").unwrap(), 350000000), - (AccountId::from_ss58check("G2hApprKXV9APwodBPPuw6GT1qSg1jqi86GmH7DR4QRou7J").unwrap(), 350000000), - (AccountId::from_ss58check("HqbhdkQ6GuXQkxpkXuf7Uoh2zypZrajXJgjVXKzLMaGPKZ3").unwrap(), 350000000), - (AccountId::from_ss58check("GHtyLkQqEGsPZnh369GW7xRcCfHauPJJNnFsvLjxFqmA2Hb").unwrap(), 350000000), - (AccountId::from_ss58check("GWY8qubAPt3Mn5RrZSKykEdSbB8DAQsvdK9T6KxXpJ6rDFn").unwrap(), 350000000), - (AccountId::from_ss58check("Cx7EWTMCgV7cb42V1d1pnAQbBVxtZ5sYioiPxicEKrYR63K").unwrap(), 350000000), - (AccountId::from_ss58check("EvsQLQN4kqmng2HjfPuQTcpZud8B7DrMrjNTdPJ6PtNNMYW").unwrap(), 350000000), - (AccountId::from_ss58check("F5YbLXR5Pdo5ExbXj5fu6TPn64mNBvAwCBLEGgX8skVUVrM").unwrap(), 350000000), - (AccountId::from_ss58check("FAkxhtmdtmZdBnLq5dPm6SdtCxoceF75ZSuKXathL7G82yB").unwrap(), 350000000), - (AccountId::from_ss58check("FFiZnLSL15RjQ92bAzKoP5EDkwWSBeT8pvrJeLNjXapanXk").unwrap(), 350000000), - (AccountId::from_ss58check("Gy8WrSv5BFYRRYtCmmJw6tNDxrW3BxUqwD2zo9njA2zrsza").unwrap(), 350000000), - (AccountId::from_ss58check("HWza6kyu9PLjdju3RFoLJFfK4u9DXuEWZUPShnRuQ53v2FL").unwrap(), 350000000), - (AccountId::from_ss58check("GsWgKdvEkx8TaUjKGhqD6njAirzb8qnT6snjHdsjpbr7Jt2").unwrap(), 350000000), - (AccountId::from_ss58check("FPQNkeMwJDQ7EhBeQ5RMSue8vNGkMrBHPzMRHqUzfUMNmiP").unwrap(), 350000000), - (AccountId::from_ss58check("FQ6xZSoqMpHRddYTYvjqpdrLma7xzUGtR2YYd9u22v6C3SM").unwrap(), 350000000), - (AccountId::from_ss58check("EY6eCnEhHpDjXXrvJiVDGHehrR7B6hsywULZano7nYS4ZLV").unwrap(), 350000000), - (AccountId::from_ss58check("Cp49fFnZWy4NVnF1zYc6xvcCzmBxaY2SFMm1g5YZU3b5PRT").unwrap(), 350000000), - (AccountId::from_ss58check("CoympEudKrkkLv4NhFzMp48uxo313Gb8A5vfrJkgLjySRfS").unwrap(), 350000000), - (AccountId::from_ss58check("DVT7MQfvoqcbYnH1pWXhvMhR2WbKdqZcvoGq5U8awe5hr2m").unwrap(), 350000000), - (AccountId::from_ss58check("HgpnXcrYehnfc9PNhy15Kd7mCkhrrzf6F4GUBdsGfiYjPRs").unwrap(), 350000000), - (AccountId::from_ss58check("HhPJ3ZrHt2n1ji7TwVaSyHiGw8oSSPnWotXVSBQgKpCo85T").unwrap(), 350000000), - (AccountId::from_ss58check("GcPsnise5ERRUuBy1fZ5Gu8vkrSq7khivbhs8RqUmkg9rms").unwrap(), 350000000), - (AccountId::from_ss58check("HjSgjMWfvCJHDSWob24gQBiPsymNX3rMvwF8p9pMB5i22nK").unwrap(), 350000000), - (AccountId::from_ss58check("Gc6SuAQuR4c8LbhQnmpcdpPygnHPENTt7W9HcmSbfBTLiey").unwrap(), 350000000), - (AccountId::from_ss58check("GX5VqbZ15aLEujKQbMX9q4xde6vTrz9JyUoQt3eDasv1WaA").unwrap(), 350000000), - (AccountId::from_ss58check("HpYSAu8LZEvLkANeEzy3ah5vX5fqRkYxvqrDQA81VJtkaRd").unwrap(), 350000000), - (AccountId::from_ss58check("Cn2E7ERMGCMw9viELKwBve9osVjBnXNWsZEVjVtJXsucTkQ").unwrap(), 350000000), - (AccountId::from_ss58check("HpbFHQjLCCuBpBwS2wJe8pB4ZrgVxD6w2SGEE1ckzT3Uxs4").unwrap(), 350000000), - (AccountId::from_ss58check("DfTQo2npkZv5iw7Ch4oAjzW5jXmMgedzU3Tfxkf6wFvF1Hp").unwrap(), 350000000), - (AccountId::from_ss58check("DMLgHWqdEPRGekJip32qW3JJ1W7KtM35hmZE7pxBxPzuyrY").unwrap(), 350000000), - (AccountId::from_ss58check("EooQXQzzA33Pt5xZVUKpUgVJUbivMxYpEV9xWazrfhk9EzA").unwrap(), 349999997), - ]; - } } /// Time constants. diff --git a/runtime/main/src/lib.rs b/runtime/main/src/lib.rs index 46631a793..72ad5c48d 100644 --- a/runtime/main/src/lib.rs +++ b/runtime/main/src/lib.rs @@ -41,7 +41,7 @@ use frame_support::{ traits::{Currency, EnsureOneOf, EqualPrivilegeOnly, Imbalance, OnUnbalanced}, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, - DispatchClass, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, + ConstantMultiplier, DispatchClass, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, }, PalletId, @@ -49,7 +49,9 @@ use frame_support::{ use frame_system::limits::{BlockLength, BlockWeights}; use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment}; use pallet_transaction_payment_rpc_runtime_api::{FeeDetails, RuntimeDispatchInfo}; -use robonomics_primitives::{AccountId, Balance, BlockNumber, Hash, Index, Moment, Signature}; +use robonomics_primitives::{ + AccountId, AssetId, Balance, BlockNumber, Hash, Index, Moment, Signature, +}; use sp_api::impl_runtime_apis; use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H256}; use sp_runtime::{ @@ -65,13 +67,15 @@ use sp_version::RuntimeVersion; use constants::{currency::*, time::*}; +mod xcm_config; + /// Standalone runtime version. #[sp_version::runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("robonomics"), impl_name: create_runtime_str!("robonomics-airalab"), authoring_version: 1, - spec_version: 17, + spec_version: 20, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, @@ -96,6 +100,12 @@ pub struct BaseFilter; impl frame_support::traits::Contains for BaseFilter { fn contains(call: &Call) -> bool { match call { + // Filter permissionless assets creation + Call::Assets(method) => match method { + pallet_assets::Call::create { id, .. } => *id < AssetId::max_value() / 2, + pallet_assets::Call::destroy { id, .. } => *id < AssetId::max_value() / 2, + _ => true, + }, // These modules are not allowed to be called by transactions: // Other modules should works: _ => true, @@ -272,13 +282,39 @@ impl WeightToFeePolynomial for WeightToFee { impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; - type TransactionByteFee = TransactionByteFee; + type LengthToFee = ConstantMultiplier; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = TargetedFeeAdjustment; type OperationalFeeMultiplier = OperationalFeeMultiplier; } +parameter_types! { + pub const AssetDeposit: Balance = 10 * XRT; // 10 XRT deposit to create asset + pub const AssetsStringLimit: 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 = AssetId; + type Currency = Balances; + type ForceOrigin = frame_system::EnsureRoot; + type AssetDeposit = AssetDeposit; + type AssetAccountDeposit = frame_support::traits::ConstU128; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ExistentialDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = (); +} + parameter_types! { pub const BasicDeposit: Balance = 10 * XRT; // 258 bytes on-chain pub const FieldDeposit: Balance = 250 * COASE; // 66 bytes on-chain @@ -484,19 +520,19 @@ impl pallet_multisig::Config for Runtime { } parameter_types! { - // We do anything the parent chain tells us in this runtime. - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 2; + 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 OnSystemEvent = (); type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = (); - type DmpMessageHandler = (); + type OutboundXcmpMessageSource = XcmpQueue; + type DmpMessageHandler = DmpQueue; type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = (); - type ReservedXcmpWeight = (); + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; } impl parachain_info::Config for Runtime {} @@ -608,6 +644,7 @@ construct_runtime! { Balances: pallet_balances::{Pallet, Call, Storage, Event, Config} = 31, TransactionPayment: pallet_transaction_payment::{Pallet, Storage} = 32, Vesting: pallet_vesting::{Pallet, Call, Storage, Event, Config} = 33, + Assets: pallet_assets::{Pallet, Call, Storage, Event} = 34, // Governance staff. Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event} = 40, @@ -626,6 +663,12 @@ construct_runtime! { Liability: pallet_robonomics_liability::{Pallet, Call, Storage, Event} = 56, Lighthouse: pallet_robonomics_lighthouse::{Pallet, Call, Storage, Inherent, Event} = 60, + + // XCM helpers. + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 70, + PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin} = 71, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 72, + DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 73, } } diff --git a/runtime/main/src/xcm_config.rs b/runtime/main/src/xcm_config.rs new file mode 100644 index 000000000..3d75b73a9 --- /dev/null +++ b/runtime/main/src/xcm_config.rs @@ -0,0 +1,247 @@ +use super::{ + AccountId, AssetId, Assets, Balance, Balances, Call, DealWithFees, Event, Origin, + ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, XcmpQueue, MAXIMUM_BLOCK_WEIGHT, +}; +use frame_support::{ + match_types, + pallet_prelude::Get, + parameter_types, + traits::{Everything, Nothing, PalletInfoAccess}, + weights::{IdentityFee, Weight}, +}; +use sp_runtime::traits::Bounded; +use sp_std::{borrow::Borrow, marker::PhantomData}; + +// Polkadot imports +use xcm::latest::prelude::*; +use xcm_builder::{ + AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, ConvertedConcreteAssetId, + CurrencyAdapter, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, FungiblesAdapter, + IsConcrete, LocationInverter, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, +}; +use xcm_executor::{ + traits::{FilterAssetLocation, JustTry}, + Config, XcmExecutor, +}; + +parameter_types! { + pub const RelayLocation: MultiLocation = MultiLocation::parent(); + pub RelayNetwork: NetworkId = NetworkId::Kusama; + pub RelayChainOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into(); + pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); + pub const Local: MultiLocation = Here.into(); + pub AssetsPalletLocation: MultiLocation = + PalletInstance(::index() as u8).into(); + pub AnchoringSelfReserve: MultiLocation = + PalletInstance(::index() as u8).into(); + pub CheckingAccount: AccountId = PolkadotXcm::check_account(); +} + +/// 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`. + ParentIsPreset, + // 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 the native currency on this chain. +pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Convert an XCM MultiLocation into a local 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 of `Balances`. + (), +>; + +pub struct AssetIdConvertion(PhantomData); +impl xcm_executor::traits::Convert for AssetIdConvertion +where + AssetId: Clone + Eq + Bounded, +{ + fn convert_ref(id: impl Borrow) -> Result { + if id.borrow().eq(&MultiLocation::parent()) { + Ok(AssetId::max_value()) + } else { + Err(()) + } + } + fn reverse_ref(what: impl Borrow) -> Result { + if what.borrow().eq(&AssetId::max_value()) { + Ok(MultiLocation::parent()) + } else { + Err(()) + } + } +} + +/// Means for transacting assets besides the native currency on this chain. +pub type FungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching the given location or name: + ConvertedConcreteAssetId, JustTry>, + // Convert an XCM MultiLocation into a local 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 of `Assets`. + Nothing, + // We don't track any teleports of `Assets`. + CheckingAccount, +>; + +/// Means for transacting assets on this chain. +pub type AssetTransactors = (FungiblesTransactor, CurrencyTransactor); + +/// 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, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + pallet_xcm::XcmPassthrough, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `Origin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, +); + +parameter_types! { + // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. + pub UnitWeightCost: Weight = 1_000_000_000; + pub const MaxInstructions: u32 = 100; + pub KsmPerSecond: (xcm::v1::AssetId, u128) = (MultiLocation::parent().into(), 1_000_000_000); +} + +match_types! { + pub type ParentOrParentsPlurality: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Plurality { .. }) } + }; +} + +pub type XcmBarrier = ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom, + // Parent and its plurality get free execution + AllowUnpaidExecutionFrom, + // Expected responses are OK. + AllowKnownQueryResponses, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, +); + +/// Asset filter that allows all assets from a certain location. +pub struct AssetsFrom(PhantomData); +impl> FilterAssetLocation for AssetsFrom { + fn filter_asset_location(_asset: &MultiAsset, origin: &MultiLocation) -> bool { + origin.eq(&T::get()) + } +} + +pub struct XcmConfig; +impl Config for XcmConfig { + type Call = Call; + type XcmSender = XcmRouter; + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = AssetsFrom; + type IsTeleporter = (); + type LocationInverter = LocationInverter; + type Barrier = XcmBarrier; + type Weigher = FixedWeightBounds; + type Trader = ( + FixedRateOfFungible, + UsingComponents< + IdentityFee, + AnchoringSelfReserve, + AccountId, + Balances, + DealWithFees, + >, + ); + type ResponseHandler = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type SubscriptionService = PolkadotXcm; +} + +parameter_types! { + pub const MaxDownwardMessageWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 10; +} + +/// 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 { + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + + type Event = Event; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Nothing; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type LocationInverter = LocationInverter; + type Origin = Origin; + type Call = Call; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; +} + +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; + type VersionWrapper = PolkadotXcm; + type ExecuteOverweightOrigin = frame_system::EnsureRoot; + type ControllerOrigin = frame_system::EnsureRoot; + type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; + type WeightInfo = (); +} + +impl cumulus_pallet_dmp_queue::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; + type ExecuteOverweightOrigin = frame_system::EnsureRoot; +} diff --git a/vendor/evercity/Cargo.toml b/vendor/evercity/Cargo.toml deleted file mode 100644 index 0546c3032..000000000 --- a/vendor/evercity/Cargo.toml +++ /dev/null @@ -1,50 +0,0 @@ -[package] -authors = ["Sergey Prilutskiy ", "Dmitry Dulesov "] -description = 'Pallet for Evercity green bonds emission project' -edition = '2018' -homepage = 'https://evercity.io' -license = 'Apache-2.0' -name = 'pallet-evercity' -readme = '../README.md' -repository = 'https://github.com/EvercityEcosystem/evercity-substrate' -version = '0.1.2' - -[package.metadata.docs.rs] -targets = ['x86_64-unknown-linux-gnu'] - -[dependencies.serde] -optional = true -features = ['derive'] -version = '1.0.124' - -[dependencies.codec] -default-features = false -features = ['derive'] -package = 'parity-scale-codec' -version = '2.0.0' - -[dependencies.impl-trait-for-tuples] -version = "0.1.3" - -[dependencies] -scale-info = { version = "1.0", default-features = false, features = ["derive"] } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -pallet-timestamp = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -sp-api = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } - -[dev-dependencies] -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -rand = "0.6" - -[features] -default = ['std'] -std = [ - 'serde', - 'codec/std', - 'sp-api/std', - 'frame-support/std', - 'frame-system/std', - 'pallet-timestamp/std', -] diff --git a/vendor/evercity/src/account.rs b/vendor/evercity/src/account.rs deleted file mode 100644 index 94992c3f0..000000000 --- a/vendor/evercity/src/account.rs +++ /dev/null @@ -1,92 +0,0 @@ -use frame_support::{ - codec::{Decode, Encode}, - sp_runtime::RuntimeDebug, -}; -use scale_info::TypeInfo; -#[cfg(feature = "std")] -use serde::{Deserialize, Serialize}; - -use crate::{EverUSDBalance, Expired}; - -pub const MASTER_ROLE_MASK: u8 = 1u8; -pub const CUSTODIAN_ROLE_MASK: u8 = 2u8; -pub const ISSUER_ROLE_MASK: u8 = 4u8; -pub const INVESTOR_ROLE_MASK: u8 = 8u8; -pub const AUDITOR_ROLE_MASK: u8 = 16u8; -pub const MANAGER_ROLE_MASK: u8 = 32u8; -pub const IMPACT_REPORTER_ROLE_MASK: u8 = 64u8; - -pub const ALL_ROLES_MASK: u8 = MASTER_ROLE_MASK - | CUSTODIAN_ROLE_MASK - | ISSUER_ROLE_MASK - | INVESTOR_ROLE_MASK - | AUDITOR_ROLE_MASK - | MANAGER_ROLE_MASK - | IMPACT_REPORTER_ROLE_MASK; - -#[inline] -pub const fn is_roles_correct(roles: u8) -> bool { - // max value of any roles combinations - roles <= ALL_ROLES_MASK && roles > 0 -} - -/// Main structure, containing account data: roles(bit mask), identity(external id), creation_time. -/// This structure is used to check and assign account roles -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, Default, RuntimeDebug, TypeInfo)] -pub struct EvercityAccountStructT { - pub roles: u8, - #[codec(compact)] - pub identity: u64, - #[codec(compact)] - pub create_time: Moment, -} - -pub type EvercityAccountStructOf = - EvercityAccountStructT<::Moment>; - -/// Structure, created by Issuer or Investor to receive EverUSD on her balance -/// by paying USD to Custodian. Then Custodian confirms request, adding corresponding -/// amount to mint request creator's balance -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, Default, RuntimeDebug, TypeInfo)] -pub struct TokenMintRequestStruct { - #[codec(compact)] - pub amount: EverUSDBalance, - #[codec(compact)] - pub deadline: Moment, -} - -impl Expired for TokenMintRequestStruct { - fn is_expired(&self, now: Moment) -> bool { - self.deadline <= now - } -} - -pub type TokenMintRequestStructOf = - TokenMintRequestStruct<::Moment>; - -/// Structure, created by Issuer or Investor to burn EverUSD on her balance -/// and receive corresponding amount of USD from Custodian. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, Default, RuntimeDebug, TypeInfo)] -pub struct TokenBurnRequestStruct { - #[codec(compact)] - pub amount: EverUSDBalance, - #[codec(compact)] - pub deadline: Moment, -} - -impl Expired for TokenBurnRequestStruct { - fn is_expired(&self, now: Moment) -> bool { - self.deadline <= now - } -} - -pub type TokenBurnRequestStructOf = - TokenBurnRequestStruct<::Moment>; - -#[impl_trait_for_tuples::impl_for_tuples(30)] -pub trait OnAddAccount { - fn on_add_account(account: &AccountId, data: &EvercityAccountStructT); -} diff --git a/vendor/evercity/src/bond.rs b/vendor/evercity/src/bond.rs deleted file mode 100644 index 68626ccd6..000000000 --- a/vendor/evercity/src/bond.rs +++ /dev/null @@ -1,587 +0,0 @@ -use crate::period::{PeriodDescr, PeriodIterator}; -use crate::{EverUSDBalance, Expired, MIN_BOND_DURATION}; -use frame_support::{ - codec::{Decode, Encode, EncodeLike}, - dispatch::{DispatchResult, Vec}, - sp_runtime::{ - traits::{AtLeast32Bit, SaturatedConversion, UniqueSaturatedInto}, - RuntimeDebug, - }, - sp_std::cmp::{min, Eq, PartialEq}, - sp_std::fmt, - sp_std::ops::Deref, - sp_std::str::from_utf8_unchecked, -}; -use scale_info::TypeInfo; -#[cfg(feature = "std")] -use serde::{Deserialize, Serialize}; - -/// Amount of seconds in 1 "DAY". Every period duration for Evercity bonds -/// should be a multiple of this constant. This constant can be changed in -/// testing environments to create bonds with short periods -pub const DEFAULT_DAY_DURATION: u32 = 86400; - -pub const MIN_PAYMENT_PERIOD: BondPeriod = 1; - -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Clone, Copy, Default, Encode, Eq, Decode, RuntimeDebug, TypeInfo)] -pub struct BondId([u8; 16]); - -impl fmt::Display for BondId { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "'{}'", unsafe { from_utf8_unchecked(&self.0[..]) }) - } -} - -impl PartialEq for BondId { - fn eq(&self, other: &Self) -> bool { - self.0 == other.0 - } -} - -//impl Eq for BondId {} - -impl Deref for BondId { - type Target = [u8; 16]; - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl EncodeLike<[u8; 16]> for BondId {} - -#[cfg(test)] -impl From<&str> for BondId { - fn from(name: &str) -> BondId { - let mut b = [0u8; 16]; - unsafe { - core::intrinsics::copy_nonoverlapping( - name.as_ptr(), - b.as_mut_ptr(), - min(8, name.len()), - ); - } - BondId(b) - } -} - -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, TypeInfo)] -#[allow(non_camel_case_types)] -pub enum BondImpactType { - POWER_GENERATED, - CO2_EMISSIONS_REDUCTION, -} - -impl Default for BondImpactType { - fn default() -> Self { - BondImpactType::POWER_GENERATED - } -} - -/// Bond state -#[allow(clippy::upper_case_acronyms)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, TypeInfo)] -pub enum BondState { - PREPARE, - BOOKING, - ACTIVE, - BANKRUPT, - FINISHED, -} - -impl Default for BondState { - fn default() -> Self { - BondState::PREPARE - } -} - -/// Bond period parametes type, seconds -pub type BondPeriod = u32; -/// The number of Bond units, -pub type BondUnitAmount = u32; -/// Annual coupon interest rate as 1/100000 of par value -pub type BondInterest = u32; -/// Bond period numerator -pub type BondPeriodNumber = u32; - -/// Inner part of BondStruct, containing parameters, related to -/// calculation of coupon interest rate using impact data, sent to bond. -/// This part of bond data can be configured only at BondState::PREPARE -/// and cannot be changed when Bond Units sell process is started -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, Default, PartialEq, RuntimeDebug, TypeInfo)] -pub struct BondInnerStruct { - // bond document hashes - /// Merkle root hash of general purpose documents pack of bond - pub docs_pack_root_hash_main: Hash, - /// Merkle root hash of legal documents pack of bond - pub docs_pack_root_hash_legal: Hash, - /// Merkle root hash of financial documents pack of bond - pub docs_pack_root_hash_finance: Hash, - /// Merkle root hash of technical documents pack of bond - pub docs_pack_root_hash_tech: Hash, - - // bond impact parameters - /// Type of data, sent to bond each payment_period. - /// It can be amount of power generated or CO2 emissions avoided (more types will be added) - /// This value affects the interest_rate calculation logic - /// (now all types have same linear dependency) - pub impact_data_type: BondImpactType, - /// Base value Now, all types has same interest_rate calculation logic - /// greater the value -> lower the interest_rate and vice-versa - pub impact_data_baseline: Vec, - - // Coupon interest regulatory options - /// Cap of impact_data value (absolute value). Values more then cap - /// are considered equal to impact_data_max_deviation_cap - /// when calculating coupon interest_rate depending on impact_data - #[codec(compact)] - pub impact_data_max_deviation_cap: u64, - /// Floor of impact_data value (absolute value). Values less then floor - /// are considered equal to impact_data_max_deviation_floor - /// when calculating coupon interest_rate depending on impact_data - #[codec(compact)] - pub impact_data_max_deviation_floor: u64, - /// Amount of seconds before end of a payment_period - /// when Issuer should release regular impact report (confirmed by Auditor) - #[codec(compact)] - pub impact_data_send_period: BondPeriod, - /// Penalty, adding to interest rate when impact report was not - /// released during impact_data_send_period, ppm - #[codec(compact)] - pub interest_rate_penalty_for_missed_report: BondInterest, - /// Base coupon interest rate, ppm. All changes of interest_rate - /// during payment periods are based on this value, ppm - #[codec(compact)] - pub interest_rate_base_value: BondInterest, - /// Upper margin of interest_rate. Interest rate cannot - /// be more than this value, ppm - #[codec(compact)] - pub interest_rate_margin_cap: BondInterest, - /// Lower margin of interest_rate. Interest rate cannot - /// be less than this value, ppm - #[codec(compact)] - pub interest_rate_margin_floor: BondInterest, - /// Interest rate during the start_periodm when interest rate is constant - /// (from activation to first payment period), ppm - #[codec(compact)] - pub interest_rate_start_period_value: BondInterest, - /// Period when Issuer should pay off coupon interests, sec - #[codec(compact)] - pub interest_pay_period: BondPeriod, - - /// Period from activation when effective interest rate - /// invariably equals to interest_rate_start_period_value, sec - #[codec(compact)] - pub start_period: BondPeriod, - - ///

-    /// This is "main" recalcualtion period of bond. Each payment_period:
-    ///  - impact_data is sent to bond and confirmed by Auditor (while impact_data_send_period is active)
-    ///  - coupon interest rate is recalculated for next payment_period
-    ///  - required coupon interest payment is sent to bond by Issuer (while interest_pay_period is active)
-    /// 
- #[codec(compact)] - pub payment_period: BondPeriod, - - /// The number of periods from active_start_date (when bond becomes active, - /// all periods and interest rate changes begin to work, funds become available for Issuer) - /// until maturity date (when full bond debt must be paid). - /// (bond maturity period = start_period + bond_duration * payment_period) - #[codec(compact)] - pub bond_duration: BondPeriodNumber, - - /// Period from maturity date until full repayment. - /// After this period bond can be moved to BondState::BANKRUPT, sec - #[codec(compact)] - pub bond_finishing_period: BondPeriod, - - /// Minimal amount(mincap_amount) of bond units should be raised up to this date, - /// otherwise bond can be withdrawn by issuer back to BondState::PREPARE - #[codec(compact)] - pub mincap_deadline: Moment, - /// Minimal amount of bond units, that should be raised - #[codec(compact)] - pub bond_units_mincap_amount: BondUnitAmount, - /// Maximal amount of bond units, that can be raised durill all bond lifetime - #[codec(compact)] - pub bond_units_maxcap_amount: BondUnitAmount, - - /// Base price of Bond Unit - #[codec(compact)] - pub bond_units_base_price: EverUSDBalance, -} - -pub type BondInnerStructOf = - BondInnerStruct<::Moment, ::Hash>; - -#[inline] -fn is_period_muliple_of_time_step(period: BondPeriod, time_step: BondPeriod) -> bool { - (period % time_step) == 0 -} - -impl BondInnerStruct { - /// Checks if other bond has the same financial properties - pub fn is_financial_options_eq(&self, other: &Self) -> bool { - self.bond_units_base_price == other.bond_units_base_price - && self.interest_rate_base_value == other.interest_rate_base_value - && self.interest_rate_margin_cap == other.interest_rate_margin_cap - && self.interest_rate_margin_floor == other.interest_rate_margin_floor - && self.impact_data_max_deviation_cap == other.impact_data_max_deviation_cap - && self.impact_data_max_deviation_floor == other.impact_data_max_deviation_floor - && self.bond_duration == other.bond_duration - && self.bond_units_mincap_amount == other.bond_units_mincap_amount - && self.bond_units_maxcap_amount == other.bond_units_maxcap_amount - && self.impact_data_type == other.impact_data_type - && self.impact_data_baseline == other.impact_data_baseline - && self.interest_pay_period == other.interest_pay_period - && self.impact_data_send_period == other.impact_data_send_period - && self.payment_period == other.payment_period - && self.bond_finishing_period == other.bond_finishing_period - } - /// Checks if bond data is valid. Checking mincap-maxcap, periods durations - /// (should be multiple of "time_step"), ranges of price and impact data baseline values - pub fn is_valid(&self, time_step: BondPeriod) -> bool { - self.bond_units_mincap_amount > 0 - && self.bond_units_maxcap_amount >= self.bond_units_mincap_amount - && self.payment_period >= MIN_PAYMENT_PERIOD * time_step - && self.impact_data_send_period <= self.payment_period - && is_period_muliple_of_time_step(self.payment_period, time_step) - && is_period_muliple_of_time_step(self.start_period, time_step) - && is_period_muliple_of_time_step(self.impact_data_send_period, time_step) - && is_period_muliple_of_time_step(self.bond_finishing_period, time_step) - && is_period_muliple_of_time_step(self.interest_pay_period, time_step) - && self.start_period >= self.impact_data_send_period - && self.interest_pay_period <= self.payment_period - && self.bond_units_base_price > 0 - && self - .bond_units_base_price - .saturating_mul(self.bond_units_maxcap_amount as EverUSDBalance) - < EverUSDBalance::MAX - && self.bond_duration >= MIN_BOND_DURATION - && self.impact_data_baseline.len() == self.bond_duration as usize - && self.impact_data_baseline.iter().all(|&bl| { - bl <= self.impact_data_max_deviation_cap - && bl >= self.impact_data_max_deviation_floor - }) - } -} - -///
-/// Main bond struct, storing all data about given bond
-/// Consists of:
-///  - issuance-related, inner part (BondInnerStruct): financial and impact data parameters, related to issuance of bond
-///  - working part: bond state, connected accounts, raised and issued amounts, dates, etc
-/// 
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, Default, PartialEq, RuntimeDebug, TypeInfo)] -pub struct BondStruct { - pub inner: BondInnerStruct, - - /// bond issuer account - pub issuer: AccountId, - - //#Auxiliary roles - /// bond manager account - pub manager: AccountId, - /// bond auditor - pub auditor: AccountId, - /// bond impact data reporter - pub impact_reporter: AccountId, - /// total amount of issued bond units - #[codec(compact)] - pub issued_amount: BondUnitAmount, - - //#Timestamps - /// Moment, when bond was created first time (moved to BondState::PREPARE) - #[codec(compact)] - pub creation_date: Moment, - /// Moment, when bond was opened for booking (moved to BondState::BOOKING) - #[codec(compact)] - pub booking_start_date: Moment, - /// Moment, when bond became active (moved to BondState::ACTIVE) - #[codec(compact)] - pub active_start_date: Moment, - /// Bond current state (PREPARE, BOOKING, ACTIVE, BANKRUPT, FINISHED) - pub state: BondState, - - //#Bond ledger - /// Bond fund, keeping EverUSD sent to bond - #[codec(compact)] - pub bond_debit: EverUSDBalance, - /// Bond liabilities: amount of EverUSD bond needs to pay to Bond Units bearers - #[codec(compact)] - pub bond_credit: EverUSDBalance, - // free balance is difference between bond_debit and bond_credit - /// Ever-increasing coupon fund which was distributed among bondholders. - /// Undistributed bond fund is equal to (bond_debit - coupon_yield) - #[codec(compact)] - pub coupon_yield: EverUSDBalance, - - /// Incrementing counter, the "version" of bond data. Used to avoid - /// situations with outdated updates bond data on frontend - #[codec(compact)] - pub nonce: u64, -} - -pub type BondStructOf = BondStruct< - ::AccountId, - ::Moment, - ::Hash, ->; - -impl BondStruct { - /// Returns nominal value of unit_amount Bond units - #[inline] - pub fn par_value(&self, unit_amount: BondUnitAmount) -> EverUSDBalance { - unit_amount as EverUSDBalance * self.inner.bond_units_base_price as EverUSDBalance - } - /// Returns true if bond has unpaid debt - #[inline] - pub fn is_shortage(&self) -> bool { - self.bond_credit > self.bond_debit - } - - /// Returns bond unpaid unliabilities - pub fn get_debt(&self) -> EverUSDBalance { - if self.bond_credit > self.bond_debit { - self.bond_credit - self.bond_debit - } else { - 0 - } - } - /// Returns the number of tokens available for issuer - pub fn get_free_balance(&self) -> EverUSDBalance { - if self.bond_debit > self.bond_credit { - self.bond_debit - self.bond_credit - } else { - 0 - } - } - /// Increase bond fund (credit + debit) - pub fn increase(&mut self, amount: EverUSDBalance) { - self.bond_credit += amount; - self.bond_debit += amount; - } - /// Decrease bond fund (credit + debit) - pub fn decrease(&mut self, amount: EverUSDBalance) { - self.bond_credit -= amount; - self.bond_debit -= amount; - } - - #[inline] - pub fn get_periods(&self) -> BondPeriodNumber { - if self.inner.start_period == 0 { - self.inner.bond_duration - } else { - self.inner.bond_duration + 1 - } - } - - #[allow(dead_code)] - pub fn iter_periods(&self) -> PeriodIterator<'_, AccountId, Moment, Hash> { - PeriodIterator::new(self) - } - - /// Returns time limits of the period - pub fn period_desc(&self, period: BondPeriodNumber) -> Option { - PeriodIterator::starts_with(&self, period).next() - } - - /// Calculate coupon effective interest rate using impact_data. - /// This method moves interest_rate up and down when good or bad impact_data - /// is sent to bond and approved by Auditor - pub fn calc_effective_interest_rate( - &self, - impact_data_baseline: u64, - impact_data: u64, - ) -> BondInterest { - let inner = &self.inner; - - if impact_data >= inner.impact_data_max_deviation_cap { - inner.interest_rate_margin_floor - } else if impact_data <= inner.impact_data_max_deviation_floor { - inner.interest_rate_margin_cap - } else if impact_data == impact_data_baseline { - inner.interest_rate_base_value - } else if impact_data > impact_data_baseline { - inner.interest_rate_base_value - - ((impact_data - impact_data_baseline) as u128 - * (inner.interest_rate_base_value - inner.interest_rate_margin_floor) as u128 - / (inner.impact_data_max_deviation_cap - impact_data_baseline) as u128) - as BondInterest - } else { - inner.interest_rate_base_value - + ((impact_data_baseline - impact_data) as u128 - * (inner.interest_rate_margin_cap - inner.interest_rate_base_value) as u128 - / (impact_data_baseline - inner.impact_data_max_deviation_floor) as u128) - as BondInterest - } - } -} - -impl + AtLeast32Bit + Copy, Hash> - BondStruct -{ - pub fn time_passed_after_activation( - &self, - now: Moment, - ) -> Option<(BondPeriod, BondPeriodNumber)> { - if !matches!(self.state, BondState::ACTIVE | BondState::BANKRUPT) - || now < self.active_start_date - { - None - } else { - // gets the number or seconds since the bond was activated - let moment = (now - self.active_start_date).saturated_into::() / 1000_u64; - if moment >= u32::MAX as u64 { - return None; - } - let moment = moment as u32; - if moment < self.inner.start_period { - Some((moment, 0)) - } else { - let period = min( - ((moment - self.inner.start_period) / self.inner.payment_period) - as BondPeriodNumber, - self.inner.bond_duration, - ); - Some((moment, period + 1)) - } - } - } -} - -/// Struct, accumulating per-account coupon_yield for each period num -#[derive(Encode, Decode, Clone, Default, PartialEq, RuntimeDebug, TypeInfo)] -pub struct AccountYield { - #[codec(compact)] - pub coupon_yield: EverUSDBalance, - #[codec(compact)] - pub period_num: BondPeriodNumber, -} - -/// Pack of bond units, bought at given time, belonging to given Bearer. -/// Created when performed a deal to aquire bond uints (booking, buy from bond, buy from market). -/// Contains data about amount of bondholder's acquired bond units, aquisition period and coupon_yield -#[derive(Encode, Decode, Clone, Default, PartialEq, RuntimeDebug, TypeInfo)] -pub struct BondUnitPackage { - /// amount of bond units - #[codec(compact)] - pub bond_units: BondUnitAmount, - /// acquisition moment (seconds after bond start date) - #[codec(compact)] - pub acquisition: BondPeriod, - /// paid coupon yield - #[codec(compact)] - pub coupon_yield: EverUSDBalance, -} - -/// Struct with impact_data sent to bond. In the future can become -/// more complicated for other types of impact_data and processing logic. -/// Field "signed" is set to true by Auditor, when impact_data is verified. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug, TypeInfo)] -pub struct BondImpactReportStruct { - #[codec(compact)] - pub create_period: BondPeriod, - #[codec(compact)] - pub impact_data: u64, - pub signed: bool, -} - -impl Default for BondImpactReportStruct { - fn default() -> Self { - BondImpactReportStruct { - create_period: 0, - impact_data: 0, - signed: false, - } - } -} - -/// Struct, representing pack of bond units for sale. -/// Can include target bearer (to sell bond units only to given person) -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, Default, Eq, PartialEq, RuntimeDebug, TypeInfo)] -pub struct BondUnitSaleLotStruct { - /// Sale lot is available for buy only before this deadline - #[codec(compact)] - pub deadline: Moment, - /// If set (can be empty) - then buying of this lot is possible - /// only for new_bondholder - pub new_bondholder: AccountId, - /// Amount of bond units to sell - #[codec(compact)] - pub bond_units: BondUnitAmount, - /// Total price of this lot - #[codec(compact)] - pub amount: EverUSDBalance, -} - -impl Expired - for BondUnitSaleLotStruct -{ - fn is_expired(&self, now: Moment) -> bool { - self.deadline < now - } -} - -pub type BondUnitSaleLotStructOf = BondUnitSaleLotStruct< - ::AccountId, - ::Moment, ->; - -// @TESTME try to compare sort performance with binaryheap -// @TODO try to find the package with exact match at fist - -///
-/// Method: transfer_bond_units(from_packages, to_packages, lot_bond_units)
-/// Arguments: from_packages: &mut Vec - pack of BU packages(seller), BUs should be transfered "from"
-///            to_packages: &mut Vec - pack of BU packages(buyer), BUs should be transfered "to"
-///            lot_bond_units: BondUnitAmount -  amount of BUs to transfer
-///
-/// Internal function, called when a lot with given amount of BUs is sold, and "lot_bond_units" should be transfered from
-/// seller's BUs packages pack to buyer's BUs packages. Functions accumulates needed amount of BUs,
-/// by removing and modifying seller's packages, beginning from last package
-/// 
-pub(crate) fn transfer_bond_units( - from_packages: &mut Vec, - to_packages: &mut Vec, - mut lot_bond_units: BondUnitAmount, -) -> DispatchResult { - from_packages.sort_by_key(|package| core::cmp::Reverse(package.bond_units)); - - while lot_bond_units > 0 { - // last element has smallest number of bond units - let mut last = from_packages - .pop() - .ok_or(crate::Error::::BondParamIncorrect)?; - let (bond_units, acquisition, coupon_yield) = if last.bond_units > lot_bond_units { - last.bond_units -= lot_bond_units; - let bond_units = lot_bond_units; - let acquisition = last.acquisition; - lot_bond_units = 0; - from_packages.push(last); - (bond_units, acquisition, 0) - } else { - lot_bond_units -= last.bond_units; - (last.bond_units, last.acquisition, last.coupon_yield) - }; - - to_packages.push(BondUnitPackage { - bond_units, - acquisition, - coupon_yield, - }); - } - from_packages.shrink_to_fit(); - Ok(()) -} - -#[impl_trait_for_tuples::impl_for_tuples(30)] -pub trait OnAddBond { - fn on_add_bond(bondid: &BondId, bond: &mut BondStruct); -} diff --git a/vendor/evercity/src/default_weight.rs b/vendor/evercity/src/default_weight.rs deleted file mode 100644 index 02b59ca4c..000000000 --- a/vendor/evercity/src/default_weight.rs +++ /dev/null @@ -1,187 +0,0 @@ -use frame_support::weights::{constants::RocksDbWeight as DbWeight, Weight}; - -pub trait WeightInfo { - fn on_finalize() -> Weight; - fn account_disable() -> Weight; - fn account_add_with_role_and_data() -> Weight; - fn account_set_with_role_and_data() -> Weight; - fn token_mint_request_create_everusd() -> Weight; - fn token_mint_request_revoke_everusd() -> Weight; - fn token_mint_request_confirm_everusd() -> Weight; - fn token_mint_request_decline_everusd() -> Weight; - fn token_burn_request_create_everusd() -> Weight; - fn token_burn_request_revoke_everusd() -> Weight; - fn token_burn_request_confirm_everusd() -> Weight; - fn token_burn_request_decline_everusd() -> Weight; - fn bond_add_new() -> Weight; - fn bond_set() -> Weight; - fn bond_update() -> Weight; - fn bond_release() -> Weight; - fn bond_unit_package_buy() -> Weight; - fn bond_unit_package_return() -> Weight; - fn bond_withdraw() -> Weight; - fn bond_activate() -> Weight; - fn bond_impact_report_send() -> Weight; - fn bond_impact_report_approve() -> Weight; - fn bond_redeem() -> Weight; - fn bond_declare_bankrupt() -> Weight; - fn bond_accrue_coupon_yield() -> Weight; - fn bond_revoke() -> Weight; - fn bond_withdraw_everusd() -> Weight; - fn bond_deposit_everusd() -> Weight; - fn bond_unit_lot_bid() -> Weight; - fn bond_unit_lot_settle() -> Weight; -} - -#[allow(clippy::unnecessary_cast)] -impl WeightInfo for () { - fn on_finalize() -> Weight { - 10000_u64 as Weight - } - - fn account_disable() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(4_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn account_add_with_role_and_data() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(2_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn account_set_with_role_and_data() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn token_mint_request_create_everusd() -> Weight { - (20000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn token_mint_request_revoke_everusd() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(2_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn token_mint_request_confirm_everusd() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(5_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn token_mint_request_decline_everusd() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(2_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn token_burn_request_create_everusd() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(4_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn token_burn_request_revoke_everusd() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(2_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn token_burn_request_confirm_everusd() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(2_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn token_burn_request_decline_everusd() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn bond_add_new() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn bond_set() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn bond_update() -> Weight { - (50000_u64 as Weight) - .saturating_add(DbWeight::get().reads(1_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn bond_release() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn bond_unit_package_buy() -> Weight { - (1000000_u64 as Weight) - .saturating_add(DbWeight::get().reads(4_u64 as Weight)) - .saturating_add(DbWeight::get().writes(3_u64 as Weight)) - } - fn bond_unit_package_return() -> Weight { - (1000000_u64 as Weight) - .saturating_add(DbWeight::get().reads(4_u64 as Weight)) - .saturating_add(DbWeight::get().writes(3_u64 as Weight)) - } - fn bond_withdraw() -> Weight { - (1000000_u64 as Weight) - .saturating_add(DbWeight::get().reads(4_u64 as Weight)) - .saturating_add(DbWeight::get().writes(10_u64 as Weight)) - } - fn bond_activate() -> Weight { - (100000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(3_u64 as Weight)) - } - fn bond_impact_report_send() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn bond_impact_report_approve() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn bond_redeem() -> Weight { - (1000000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(2_u64 as Weight)) - } - fn bond_declare_bankrupt() -> Weight { - (1000000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn bond_accrue_coupon_yield() -> Weight { - (1000000_u64 as Weight) - .saturating_add(DbWeight::get().reads(14_u64 as Weight)) - .saturating_add(DbWeight::get().writes(13_u64 as Weight)) - } - fn bond_revoke() -> Weight { - (10000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn bond_withdraw_everusd() -> Weight { - (1000000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(2_u64 as Weight)) - } - fn bond_deposit_everusd() -> Weight { - (1000000_u64 as Weight) - .saturating_add(DbWeight::get().reads(3_u64 as Weight)) - .saturating_add(DbWeight::get().writes(2_u64 as Weight)) - } - fn bond_unit_lot_bid() -> Weight { - (20000_u64 as Weight) - .saturating_add(DbWeight::get().reads(4_u64 as Weight)) - .saturating_add(DbWeight::get().writes(1_u64 as Weight)) - } - fn bond_unit_lot_settle() -> Weight { - (20000_u64 as Weight) - .saturating_add(DbWeight::get().reads(9_u64 as Weight)) - .saturating_add(DbWeight::get().writes(5_u64 as Weight)) - } -} diff --git a/vendor/evercity/src/ledger.rs b/vendor/evercity/src/ledger.rs deleted file mode 100644 index b90f48ca1..000000000 --- a/vendor/evercity/src/ledger.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::EverUSDBalance; - -pub struct EvercityBalance { - /// custodian supply - pub supply: EverUSDBalance, - /// account balance - pub account: EverUSDBalance, - /// bond fund balance - pub bond_fund: EverUSDBalance, -} - -impl EvercityBalance { - pub fn is_ok(&self) -> bool { - self.supply == self.account + self.bond_fund - } -} diff --git a/vendor/evercity/src/lib.rs b/vendor/evercity/src/lib.rs deleted file mode 100644 index 877125116..000000000 --- a/vendor/evercity/src/lib.rs +++ /dev/null @@ -1,2239 +0,0 @@ -//!
-//! Crate "pallet-evercity" implements functions for processing -//! the lifecycle of "green bonds", that copy financial mechanics -//! form traditional bonds, but allowing the dynamical change of -//! bond's interest rate, depending of "good/bad" reports from -//! green project, that this bond represents. -//! -//! Highlevel description of protocol: -//! -//! Bond - is the main entity of all protocol. Bond owns a pack of Bond Units, that -//! can be bought by Investors (by spending their EverUSD tokens). Bond Units later -//! can be used by Investors to claim corresponding coupon yield from bond later or be sold to -//! other Investors. -//! Single bond is the finite automation, passing states: [PREPARE]<->[BOOKING]->[ACTIVE or BANKRUPT]->[FINISHED]. -//! In PREPARE state Issuer and Managers prepare all Bond parameters: official documents, -//! configure coupon yield conditions, periods, etc. -//! In BOOKING state all financial paramters are fixed, and Investors can buy packs of Bond Units -//! (or return them back at any time). If some minimal amount of Bond Units was bought, bond -//! becomes ACTIVE. -//! In ACTIVE state Bond Units can be bought and sold by Investors on free market for EverUSD. -//! Also, periodically sending EverUSD to bond's balance, and these EverUSDs can be claimed by -//! Investors, that own them. -//! BANKRUPT state is the same state that ACTIVE, but bond don't have enough EverUSD to pay all its -//! debts, in this case Investors can claim only avalable funds, depending of owned Bond Units. -//! In FINISHED state bond cosidered closed, no operations with Bond Units are possible, Investors -//! can claim all coupon yield and principal debt of bond form its balance. -//! -//! Example scenario: - -//! More cases and information are presented in Evercity project materials. -//! Here we describe only example scenario with function calls and their meaning. -//! -//! - Issuer creates bond: bond_add_new(BondId, BondInnerStructOf), initial bond status is PREPARE -//! - Bond in PREPARE state: -//! - Master assigns Manager to help Issuer to configure Bond: bond_add_new(BondId, BondInnerStructOf) -//! - Manager or Issuer modifies Bondbond_update(BondId, u64, BondInnerStructOf) -//! - "bond_update()" can be called multiple times, allowing many updates of bond structure, -//! until all business requirements are met -//! - Master confirms that Bond is correct, moves Bond to go to BOOKING state: bond_release(BondId, u64) -//! -//! - Bond in BOOKING state -//! - Investors see Bond on platform, and each buys some amount Bond Units: (many -//! calls) bond_unit_package_buy(BondId, u64, BondUnitAmount) -//! - Some of Investors refuse, returning their bought BondUnitsPackage-s: (many calls) -//! bond_unit_package_return(BondId, BondUnitAmount) -//! - If Investors have bought NOT enough BondUnits until "mincap_deadline", Master, Issuer or Manager withdraws it back -//! to PREPARE state: bond_withdraw(BondId). Bond cannot be "canceled" until deadline. -//! All pre-bought Bond Units can be returned by Investors -//! - If Investors bought enough BondUnits until deadline, Master moves the Bond to ACTIVE state: -//! bond_activate(BondId, u64) -//! - Date, when bond becomes ACTIVE (BOOKING->ACTIVE) - is a bond start time. All next periods -//! will be calculated using this time as start moment -//! - During activation Bond transfers all EverUSD, received from Investors to bond Issuer -//! - During activation the structure, holding info about each payment_period is created: -//! [(start_period_data), (period_1_data), (period_2_data), ..., (period_N_data)]. -//! This structure(array, fixed size) will hold accumulated coupon yield values, confirmed -//! impact data, recieved for given period, etc) -//! - If deadline is passed, but "mincap" was not reached, bond returns to PREPARE state when -//! Master, Issuer or Manager calls bond_withdraw(BondId) -//! - \[TODO\] "bond_withdraw" logic can be changed, we're refactoring its logic currently -//! - Bond in ACTIVE state -//! - passes start_period, while interest_rate is fixed and Issuer constructs project in real world -//! - first payment period is coming, Issuer prepares report data about project and sum in EverUSD to pay to Investors -//! - It's the end of period, now it's time to send impact_data, it will affect NEXT payment period -//! - Issuer sends impact_data to bond: bond_impact_report_send(BondId, BondPeriodNumber, -//! u64) -//! - Auditor confirms data, sent by Issuer: bond_impact_report_approve(BondId, -//! BondPeriodNumber, u64) -//! - Confirmed impact data will later result in change of interest rate for NEXT period -//! - First payment_period begins (start period passed). Confirmed impact_data in previous -//! period results in calculation of current period coupon yield. -//! - the beginning of payment period is the time for Issuer to pay coupon interest rate to -//! Investors. Effective coupoun yield rate is calculated, using impcat_data of previous -//! period. Any operation with bond units and EverUSD balance will update "bond_credit", -//! representing overall accrued bond's debt to Investors -//! - Issuer sends EverUSD in bond using: bond_deposit_everusd(BondId, EverUSDBalance) -//! - All EverUSD, sent by Issuer are placed on bond's balance, added to bond_debit, then, -//! function calc_and_store_bond_coupon_yield(...) increases "bond_credit", -//! summarizing coupon yields for all previous periods. Later, difference between "bond_debit" -//! and "bond_credit" is used to calculate bond state (ACTIVE or BANKRUPT) and to calculate -//! amount ov EverUSD, that Investors can withdraw from bond at the current moment of time -//! - After all calculations, bond saves coupin rates and correct amounts of EverUSD that must be paid -//! to Investors for each of already passed payment_periods -//! - each Investor calls bond_withdraw_everusd(BondId, EverUSDBalance), -//! requesting coupon yield from bond. -//! - If there is not enough EverUSDfrom Issuer, any function working with debit/credit or -//! operating with Bond Units moves bond to BANKRUPT state -//! - Bond in BANKRUPT state -//! - bond still accept bond_deposit_everusd(BondId, EverUSDBalance) from Issuer, -//! increasing bond_debit -//! - in BANKRUPT state Investors can withdraw only part of coupon yield, corresponding -//! to amount of Bond Units they own -//! - Bond in ACTIVE state(finishing period) -//! - after all payment_period passed maturity period begins. It's time form Issuer to pay -//! full bond debt back to Investors -//! - Investor accumulates needed amount of EverUSD on his address and calls -//! bond_redeem(BondId) function. -//! - function "bond_redeem" recalculates all yields per each period, summarizes them with -//! full maturity debt and transfers needed amount of EverUSD from Issuer's balance -//! - if Issuer already deposited a lot of EverUSD on bond's balance, "bond_redeem()" will -//! pay a "charge" to Issuer, instead of withdrawing EverUSD from his balance -//! - if there is not enough EverUSD on Issuer's balance - "bond_redeem()" fails with -//! "unsufficient balance" error -//! - if there is enough of EverUSD to pay all debts, all coupn yields are recalculated, -//! actual "bond_debit" and "bond_credit" are stored, and function moves bond to FINISHED -//! state -//! - Bond in FINISHED state -//! - move to FINISHED state is possible ONLY if bond's debt was fully covered by EverUSDs, -//! taken from bond Issuer's balance -//! - if Issuer don't have enough EverUSDs on his balance to pay pricipal debt, his call to -//! bond_redeem(BondId) will be unsuccessful, and bond will be in BANKRUPT state -//! - full debt of Issuer is taken from his balance and added to "bond_debit" -//! - Investors can call bond_withdraw_everusd(BondId, EverUSDBalance) to receive -//! all their EverUSDs, including total accrued coupon yield and principal debt -//!
- -#![cfg_attr(not(feature = "std"), no_std)] -#![allow(clippy::unnecessary_mut_passed)] -#![allow(clippy::too_many_arguments)] -#![recursion_limit = "256"] - -use account::{ - is_roles_correct, EvercityAccountStructOf, EvercityAccountStructT, OnAddAccount, - TokenBurnRequestStruct, TokenBurnRequestStructOf, TokenMintRequestStruct, - TokenMintRequestStructOf, AUDITOR_ROLE_MASK, CUSTODIAN_ROLE_MASK, IMPACT_REPORTER_ROLE_MASK, - INVESTOR_ROLE_MASK, ISSUER_ROLE_MASK, MANAGER_ROLE_MASK, MASTER_ROLE_MASK, -}; -use bond::{ - transfer_bond_units, AccountYield, BondInnerStructOf, BondPeriodNumber, BondState, - BondUnitAmount, BondUnitSaleLotStructOf, OnAddBond, -}; -pub use bond::{ - BondId, BondImpactReportStruct, BondPeriod, BondStruct, BondStructOf, BondUnitPackage, - DEFAULT_DAY_DURATION, -}; -pub use default_weight::WeightInfo; -use frame_support::{ - decl_error, decl_event, decl_module, decl_storage, - dispatch::Vec, - dispatch::{DispatchResult, DispatchResultWithPostInfo}, - ensure, - sp_std::cmp::{min, Eq, PartialEq}, - sp_std::result::Result, - traits::Get, -}; -use frame_system::ensure_signed; -pub use period::{PeriodDataStruct, PeriodYield}; - -pub trait Config: frame_system::Config + pallet_timestamp::Config { - type Event: From> + Into<::Event>; - type BurnRequestTtl: Get; - type MintRequestTtl: Get; - type MaxMintAmount: Get; - type TimeStep: Get; - type WeightInfo: WeightInfo; - type OnAddAccount: OnAddAccount; - type OnAddBond: OnAddBond; -} - -pub trait Expired { - fn is_expired(&self, now: Moment) -> bool; -} -pub type EverUSDBalance = u64; -type Timestamp = pallet_timestamp::Pallet; - -/// EverUSD = USD * ( 10 ^ EVERUSD_DECIMALS ) -pub const EVERUSD_DECIMALS: u64 = 9; -/// Bank's year in days -const INTEREST_RATE_YEAR: u64 = 365; -/// Gas limit settings for purge mint/burn requests -const MAX_PURGE_REQUESTS: usize = 100; -/// Bond must have as least this amount of periods -const MIN_BOND_DURATION: BondPeriodNumber = 1; - -/// Evercity project types -/// All these types must be put in CUSTOM_TYPES part of config for polkadot.js -/// to be correctly presented in DApp -pub mod account; -pub mod bond; -mod default_weight; -#[cfg(test)] -pub mod ledger; -#[cfg(test)] -mod mock; -pub mod period; -pub mod runtime_api; -#[cfg(test)] -mod tests; - -macro_rules! ensure_active { - ($f:expr, $err:expr) => { - match ($f) { - Some(v) => v, - None => { - return $err.into(); - } - } - }; -} - -decl_storage! { - trait Store for Module as Evercity { - Fuse get(fn fuse) - build(|config| !config.genesis_account_registry.is_empty()): - bool; - /// Storage map for accounts, their roles and corresponding info - AccountRegistry - get(fn account_registry) - config(genesis_account_registry): - map hasher(blake2_128_concat) T::AccountId => EvercityAccountStructOf; - - /// Total supply of EverUSD token. Sum of all token balances in system - TotalSupplyEverUSD - get(fn total_supply_everusd): - EverUSDBalance; // total supply of EverUSD token (u64) - - /// Storage map for EverUSD token balances - BalanceEverUSD - get(fn balances_everusd): - map hasher(blake2_128_concat) T::AccountId => EverUSDBalance; - - /// Storage map for EverUSD token mint requests (see TokenMintRequestStruct) - MintRequestEverUSD - get(fn mint_request_everusd): - map hasher(blake2_128_concat) T::AccountId => TokenMintRequestStructOf; - - /// Storage map for EverUSD token burn requests (see TokenBurnRequestStruct) - BurnRequestEverUSD - get(fn burn_request_everusd): - map hasher(blake2_128_concat) T::AccountId => TokenBurnRequestStructOf; - - /// Structure for storing all platform bonds. - /// BondId is now a ticker [u8; 8]: 8-bytes unique identifier like "MUSKPWR1" or "WINDGEN2" - BondRegistry - get(fn bond_registry): - map hasher(blake2_128_concat) BondId => BondStructOf; - - /// Investor's Bond units (packs of bond_units, received at the same time, belonging to Investor) - BondUnitPackageRegistry - get(fn bond_unit_registry): - double_map hasher(blake2_128_concat) BondId, hasher(blake2_128_concat) T::AccountId => Vec; - - /// Bond coupon yield storage - /// Every element has total bond yield of passed period recorded on accrual basis - BondCouponYield - get(fn bond_coupon_yield): - map hasher(blake2_128_concat) BondId=>Vec; - - /// Bondholder's last requested coupon yield for given period and bond - BondLastCouponYield - get(fn bond_last_coupon_yield): - double_map hasher(blake2_128_concat) BondId, hasher(blake2_128_concat) T::AccountId => AccountYield; - - /// Bond sale lots for each bond - BondUnitPackageLot - get(fn bond_unit_lots): - double_map hasher(blake2_128_concat) BondId, hasher(blake2_128_concat) T::AccountId => Vec>; - - /// Bond impact report storage - BondImpactReport - get(fn impact_reports): - map hasher(blake2_128_concat) BondId => Vec; - } -} - -decl_event!( - pub enum Event - where - AccountId = ::AccountId, - BondUnitSaleLotStructOf = BondUnitSaleLotStructOf, - { - /// \[master, account, role, data\] - AccountAdd(AccountId, AccountId, u8, u64), - /// \[master, account, role, data\] - AccountSet(AccountId, AccountId, u8, u64), - /// \[master, account\] - AccountDisable(AccountId, AccountId), - /// \[account, everusd\] - MintRequestCreated(AccountId, EverUSDBalance), - /// \[account, everusd\] - MintRequestRevoked(AccountId, EverUSDBalance), - /// \[custodian, account, everusd\] - MintRequestConfirmed(AccountId, AccountId, EverUSDBalance), - /// \[custodian, account, everusd\] - MintRequestDeclined(AccountId, AccountId, EverUSDBalance), - /// \[account, everusd\] - BurnRequestCreated(AccountId, EverUSDBalance), - /// \[account, everusd\] - BurnRequestRevoked(AccountId, EverUSDBalance), - /// \[custodian, account, everusd\] - BurnRequestConfirmed(AccountId, AccountId, EverUSDBalance), - /// \[custodian,account, everusd\] - BurnRequestDeclined(AccountId, AccountId, EverUSDBalance), - // Bond events - /// \[issuer,bond\] - BondAdded(AccountId, BondId), - /// \[sender,bond\] - BondChanged(AccountId, BondId), - /// \[issuer,bond\] - BondRevoked(AccountId, BondId), - /// \[sender,bond\] - BondReleased(AccountId, BondId), - /// \[sender,bond,bondfund\] - BondActivated(AccountId, BondId, EverUSDBalance), - /// \[issuer,bond\] - BondWithdrawal(AccountId, BondId), - /// \[issuer,bond,bondfund\] - BondRedeemed(AccountId, BondId, EverUSDBalance), - /// \[sender,bond,credit,debit\] - BondBankrupted(AccountId, BondId, EverUSDBalance, EverUSDBalance), - /// \[sender,bond,everusd\] - BondWithdrawEverUSD(AccountId, BondId, EverUSDBalance), - /// \[issuer,bond,everusd\] - BondDepositEverUSD(AccountId, BondId, EverUSDBalance), - /// \[bondholder,bond,units,everusd\] - BondUnitSold(AccountId, BondId, u32, EverUSDBalance), - /// \[bondholder,bond,units,everusd\] - BondUnitReturned(AccountId, BondId, u32, EverUSDBalance), - /// \[issuer,bond,period,impact_data\] - BondImpactReportSent(AccountId, BondId, BondPeriodNumber, u64), - /// \[auditor,bond,period,impact_data\] - BondImpactReportApproved(AccountId, BondId, BondPeriodNumber, u64), - /// \[bond,everusd\] - BondCouponYield(BondId, EverUSDBalance), - /// \[bondholder, bond, lot\] - BondSaleLotBid(AccountId, BondId, BondUnitSaleLotStructOf), - /// \[from, to, bond, lot\] - BondSaleLotSettle(AccountId, AccountId, BondId, BondUnitSaleLotStructOf), - } -); - -decl_error! { - pub enum Error for Module { - /// Potentially dangerous action - InvalidAction, - /// Account tried to use more EverUSD than was available on the balance - BalanceOverdraft, - /// Account was already added and present in AccountRegistry - AccountToAddAlreadyExists, - /// Account not authorized(doesn't have a needed role, or doesnt present in AccountRegistry at all) - AccountNotAuthorized, - /// Account does not exist in AccountRegistry - AccountNotExist, - /// Role parameter is invalid (bit mask of available roles includes non-existent role) - AccountRoleParamIncorrect, - /// Account already created one mint request, only one allowed at a time(to be changed in future) - MintRequestAlreadyExist, - /// Mint request for given account doesnt exist - MintRequestDoesntExist, - /// Incorrect parameters for mint request(miant amount > MAX_MINT_AMOUNT) - MintRequestParamIncorrect, - /// Account already created one burn request, only one allowed at a time(to be changed in future) - BurnRequestAlreadyExist, - /// Mint request for given account doesnt exist - BurnRequestDoesntExist, - /// Incorrect parameters for mint request(mint amount > MAX_MINT_AMOUNT) - BurnRequestParamIncorrect, - /// Burn request exists but outdated - BurnRequestObsolete, - /// Mint request exists but outdated - MintRequestObsolete, - /// Bond with same ticker already exists - /// Every bond on the platform has unique BondId: 8 bytes, like "MUSKPWR1" or "SOLGEN02" - BondAlreadyExists, - /// Incorrect bond parameters (many different cases) - BondParamIncorrect, - /// Incorrect bond ticker provided or bond has been revoked - BondNotFound, - /// Requested action in bond is not permitted for this account - BondAccessDenied, - /// Current bond state doesn't permit the requested action - BondStateNotPermitAction, - /// Action requires some bond options to be properly initialized - BondIsNotConfigured, - /// Requested action is not allowed in current period of time - BondOutOfOrder, - /// Bond version is outdated - BondNonceObsolete, - /// Bid lot not found - LotNotFound, - /// Bid lot expired - LotObsolete, - /// Incorrect parameter for the bond sale lot - LotParamIncorrect, - } -} - -decl_module! { - pub struct Module for enum Call where origin: T::Origin { - // Errors must be initialized if they are used by the pallet. - type Error = Error; - - const BurnRequestTtl:u32 = T::BurnRequestTtl::get(); - const MintRequestTtl:u32 = T::MintRequestTtl::get(); - const MaxMintAmount: EverUSDBalance = T::MaxMintAmount::get(); - const TimeStep: BondPeriod = T::TimeStep::get(); - - // Events must be initialized if they are used by the pallet. - fn deposit_event() = default; - - // Account management functions - - #[weight = T::DbWeight::get().reads_writes(2,1)] - fn set_master(origin) -> DispatchResult { - let caller = ensure_signed(origin)?; - Fuse::try_mutate(|fuse|->DispatchResult{ - if *fuse { - Err( Error::::InvalidAction.into() ) - }else{ - Self::account_add(&caller, EvercityAccountStructT { roles: MASTER_ROLE_MASK, identity:0, create_time: Timestamp::::get() }); - *fuse = true; - Ok(()) - } - }) - } - - ///
-        /// Method: account_disable(who: AccountId)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            who: AccountId - account to disable
-        /// Access: Master role
-        ///
-        /// Disables all roles of account, setting roles bitmask to 0.
-        /// Accounts are not allowed to perform any actions without role,
-        /// but still have its data in blockchain (to not loose related entities)
-        /// 
- #[weight = ::WeightInfo::account_disable()] - fn account_disable(origin, who: T::AccountId) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_master(&caller), Error::::AccountNotAuthorized); - ensure!(caller != who, Error::::InvalidAction); - ensure!(AccountRegistry::::contains_key(&who), Error::::AccountNotExist); - - AccountRegistry::::mutate(&who,|acc|{ - acc.roles = 0; // set no roles - }); - - Self::deposit_event(RawEvent::AccountDisable(caller, who)); - Ok(()) - } - - ///
-        /// Method: account_add_with_role_and_data(origin, who: T::AccountId, role: u8, identity: u64)
-        /// Arguments:  origin: AccountId - transaction caller
-        ///             who: AccountId - id of account to add to accounts registry of platform
-        ///             role: u8 - role(s) of account (see ALL_ROLES_MASK for allowed roles)
-        ///             identity: u64 - reserved field for integration with external platforms
-        /// Access: Master role
-        ///
-        /// Adds new account with given role(s). Roles are set as bitmask. Contains parameter
-        /// "identity", planned to use in the future to connect accounts with external services like
-        /// KYC providers
-        /// 
- #[weight = ::WeightInfo::account_add_with_role_and_data()] - fn account_add_with_role_and_data(origin, who: T::AccountId, role: u8,#[compact] identity: u64) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_master(&caller), Error::::AccountNotAuthorized); - ensure!(!AccountRegistry::::contains_key(&who), Error::::AccountToAddAlreadyExists); - ensure!(is_roles_correct(role), Error::::AccountRoleParamIncorrect); - - Self::account_add( &who, EvercityAccountStructT { roles: role, identity, create_time: Timestamp::::get() } ); - - Self::deposit_event(RawEvent::AccountAdd(caller, who, role, identity)); - Ok(()) - } - - ///
-        /// Method: account_set_with_role_and_data(origin, who: T::AccountId, role: u8, identity: u64)
-        /// Arguments:  origin: AccountId - transaction caller
-        ///             who: AccountId - account to modify
-        ///             role: u8 - role(s) of account (see ALL_ROLES_MASK for allowed roles)
-        ///             identity: u64 - reserved field for integration with external platforms
-        /// Access: Master role
-        ///
-        /// Modifies existing account, assigning new role(s) or identity to it
-        /// 
- #[weight = ::WeightInfo::account_set_with_role_and_data()] - fn account_set_with_role_and_data(origin, who: T::AccountId, role: u8,#[compact] identity: u64) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(caller != who, Error::::InvalidAction); - ensure!(Self::account_is_master(&caller), Error::::AccountNotAuthorized); - ensure!(AccountRegistry::::contains_key(&who), Error::::AccountNotExist); - ensure!(is_roles_correct(role), Error::::AccountRoleParamIncorrect); - - AccountRegistry::::mutate(&who,|acc|{ - acc.roles |= role; - }); - - Self::deposit_event(RawEvent::AccountSet(caller, who, role, identity)); - Ok(()) - } - - // Token balances manipulation functions - - ///
-        /// Method: token_mint_request_create_everusd(origin, amount_to_mint: EverUSDBalance)
-        /// Arguments:  origin: AccountId - transaction caller
-        ///             amount_to_mint: EverUSDBalance - amount of tokens to mint
-        /// Access: Investor or Issuer role
-        ///
-        /// Creates a request to mint given amount of EverUSD tokens on caller's balance.
-        /// Custodian account confirms request after receiving payment in USD from target account's owner
-        /// It's possible to create only one request per account. Mint request has a time-to-live
-        /// and becomes invalidated after it.
-        /// 
- #[weight = ::WeightInfo::token_mint_request_create_everusd()] - fn token_mint_request_create_everusd(origin, #[compact] amount_to_mint: EverUSDBalance) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_token_mint_burn_allowed(&caller), Error::::AccountNotAuthorized); - ensure!(amount_to_mint <= T::MaxMintAmount::get(), Error::::MintRequestParamIncorrect); - - MintRequestEverUSD::::try_mutate(&caller, |request|->DispatchResult{ - let now = Timestamp::::get(); - if !request.is_expired(now) { - Err( Error::::MintRequestAlreadyExist.into() ) - }else{ - *request = TokenMintRequestStruct{ - amount: amount_to_mint, - deadline: now + T::MintRequestTtl::get().into(), - }; - Self::deposit_event(RawEvent::MintRequestCreated(caller.clone(), amount_to_mint)); - Ok(()) - } - }) - } - - ///
-        /// Method: token_mint_request_revoke_everusd(origin)
-        /// Arguments: origin: AccountId - transaction caller
-        /// Access: Investor or Issuer role
-        ///
-        /// Revokes and deletes currently existing mint request, created by caller's account
-        /// 
- #[weight = ::WeightInfo::token_mint_request_revoke_everusd()] - fn token_mint_request_revoke_everusd(origin) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(MintRequestEverUSD::::contains_key(&caller), Error::::MintRequestDoesntExist); - let _amount = MintRequestEverUSD::::get(&caller).amount; - MintRequestEverUSD::::remove(&caller); - Self::deposit_event(RawEvent::MintRequestRevoked(caller, _amount)); - Ok(()) - } - - ///
-        /// Method: token_mint_request_confirm_everusd(origin, who: T::AccountId, amount: EverUSDBalance)
-        /// Arguments:  origin: AccountId - transaction caller
-        ///             who: AccountId - target account
-        ///             amount: EverUSDBalance - amount of tokens to mint, confirmed by Custodian
-        /// Access: Custodian role
-        ///
-        /// Confirms the mint request of account, creating "amount" of tokens on its balance.
-        /// (note) Amount of tokens is sent as parameter to avoid data race problem, when
-        /// Custodian can confirm unwanted amount of tokens, because attacker is modified mint request
-        /// while Custodian makes a decision
-        /// 
- #[weight = ::WeightInfo::token_mint_request_confirm_everusd()] - fn token_mint_request_confirm_everusd(origin, who: T::AccountId, #[compact] amount: EverUSDBalance) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_custodian(&caller),Error::::AccountNotAuthorized); - ensure!(MintRequestEverUSD::::contains_key(&who), Error::::MintRequestDoesntExist); - let mint_request = MintRequestEverUSD::::get(&who); - let now = Timestamp::::get(); - ensure!(!mint_request.is_expired(now), Error::::MintRequestObsolete); - - // add tokens to user's balance and total supply of EverUSD - let amount_to_add = mint_request.amount; - ensure!(amount_to_add==amount,Error::::MintRequestParamIncorrect ); - - Self::balance_add(&who, amount_to_add)?; - - TotalSupplyEverUSD::try_mutate(|total|->DispatchResult{ - *total = total.checked_add(amount_to_add).ok_or( Error::::BalanceOverdraft )?; - Ok(()) - })?; - - MintRequestEverUSD::::remove(&who); - Self::deposit_event(RawEvent::MintRequestConfirmed(caller, who, amount_to_add)); - Self::purge_expired_mint_requests(now); - Ok(()) - } - - ///
-        /// Method: token_mint_request_decline_everusd(origin, who: T::AccountId)
-        /// Arguments:  origin: AccountId - transaction caller
-        ///             who: AccountId - target account
-        /// Access: Custodian role
-        ///
-        /// Declines and deletes the mint request of account (Custodian)
-        /// 
- #[weight = ::WeightInfo::token_mint_request_decline_everusd()] - fn token_mint_request_decline_everusd(origin, who: T::AccountId) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_custodian(&caller),Error::::AccountNotAuthorized); - ensure!(MintRequestEverUSD::::contains_key(&who), Error::::MintRequestDoesntExist); - let amount = MintRequestEverUSD::::get(&who).amount; - MintRequestEverUSD::::remove(&who); - Self::deposit_event(RawEvent::MintRequestDeclined(caller, who, amount)); - Ok(()) - } - - ///
-        /// Method: token_burn_request_create_everusd(origin, amount_to_burn: EverUSDBalance)
-        /// Arguments:  origin: AccountId - transaction caller
-        ///             amount_to_burn: EverUSDBalance - amount of tokens to burn
-        /// Access: Investor or Issuer role
-        ///
-        /// Creates a request to burn given amount of EverUSD tokens on caller's balance.
-        /// Custodian account confirms request after sending payment in USD to target account's owner
-        /// It's possible to create only one request per account. Burn request has a time-to-live
-        /// and becomes invalidated after it.
-        /// 
- #[weight = ::WeightInfo::token_burn_request_create_everusd()] - fn token_burn_request_create_everusd(origin, #[compact] amount_to_burn: EverUSDBalance) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_token_mint_burn_allowed(&caller), Error::::AccountNotAuthorized); - - let current_balance = BalanceEverUSD::::get(&caller); - ensure!(amount_to_burn <= current_balance, Error::::BalanceOverdraft); - - BurnRequestEverUSD::::try_mutate(&caller,|request|->DispatchResult{ - let now = Timestamp::::get(); - if !request.is_expired( now ) { - Err( Error::::BurnRequestAlreadyExist.into() ) - }else{ - *request = TokenBurnRequestStruct { - amount: amount_to_burn, - deadline: now + T::BurnRequestTtl::get().into(), - }; - Self::deposit_event(RawEvent::BurnRequestCreated(caller.clone(), amount_to_burn)); - Ok(()) - } - }) - } - - ///
-        /// Method: token_burn_request_revoke_everusd(origin)
-        /// Arguments: origin: AccountId - transaction caller
-        /// Access: Investor or Issuer role
-        ///
-        /// Revokes and deletes currently existing burn request, created by caller's account
-        /// 
- #[weight = ::WeightInfo::token_burn_request_revoke_everusd()] - fn token_burn_request_revoke_everusd(origin) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(BurnRequestEverUSD::::contains_key(&caller), Error::::BurnRequestDoesntExist); - let amount = BurnRequestEverUSD::::get(&caller).amount; - BurnRequestEverUSD::::remove(&caller); - Self::deposit_event(RawEvent::BurnRequestRevoked(caller, amount)); - Ok(()) - } - - ///
-        /// Method: token_burn_request_confirm_everusd(origin, who: T::AccountId, amount: EverUSDBalance)
-        /// Arguments:  origin: AccountId - transaction caller
-        ///             who: AccountId - target account
-        ///             amount: EverUSDBalance - amount of tokens to mint, confirmed by Custodian
-        /// Access: Custodian role
-        ///
-        /// Confirms the burn request of account, destroying "amount" of tokens on its balance.
-        /// 
- #[weight = ::WeightInfo::token_burn_request_confirm_everusd()] - fn token_burn_request_confirm_everusd(origin, who: T::AccountId, #[compact] amount: EverUSDBalance) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_custodian(&caller),Error::::AccountNotAuthorized); - ensure!(BurnRequestEverUSD::::contains_key(&who), Error::::BurnRequestDoesntExist); - let burn_request = BurnRequestEverUSD::::get(&who); - let now = Timestamp::::get(); - ensure!(!burn_request.is_expired(now), Error::::BurnRequestObsolete); - // remove tokens from user's balance and decrease total supply of EverUSD - let amount_to_sub = burn_request.amount; - // prevent unacceptable commit - ensure!(amount_to_sub==amount, Error::::MintRequestParamIncorrect ); - - Self::balance_sub(&who, amount_to_sub)?; - TotalSupplyEverUSD::mutate(|total|{ - *total-=amount_to_sub; - }); - - BurnRequestEverUSD::::remove(&who); - Self::deposit_event(RawEvent::BurnRequestConfirmed(caller, who, amount_to_sub)); - Self::purge_expired_burn_requests(now); - Ok(()) - } - - ///
-        /// Method: token_burn_request_decline_everusd(origin, who: T::AccountId)
-        /// Arguments:  origin: AccountId - transaction caller
-        ///             who: AccountId - target account
-        /// Access: Custodian role
-        ///
-        /// Declines and deletes the burn request of account (Custodian)
-        /// 
- #[weight = ::WeightInfo::token_burn_request_decline_everusd()] - fn token_burn_request_decline_everusd(origin, who: T::AccountId) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_custodian(&caller),Error::::AccountNotAuthorized); - ensure!(BurnRequestEverUSD::::contains_key(&who), Error::::BurnRequestDoesntExist); - let amount = BurnRequestEverUSD::::get(&who).amount; - BurnRequestEverUSD::::remove(&who); - Self::deposit_event(RawEvent::BurnRequestDeclined(caller, who, amount)); - Ok(()) - } - - // Bonds handling functions - - ///
-        /// Method: bond_add_new(origin, origin, bond: BondId, body: BondInnerStruct)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///            body: BondInnerStruct
-        /// Access: Issuer role
-        ///
-        /// Creates new bond with given BondId (8 bytes) and pack of parameters, set by BondInnerStruct.
-        /// Bond is created in BondState::PREPARE, and can be modified many times until it becomes ready
-        /// for next BondState::BOOKING (when most of BondInnerStruct parameters cannot be changed, and
-        /// Investors can buy bond units). There are many checks inside (see function bond.is_valid()).
-        /// All time periods must be a multiple of "time_step"(which is equal to DEFAULT_DAY_DURATION),
-        /// none of periods cannot be "out of bounds", amount of "impact_baselines" must be equal the
-        /// amount of "payment_periods", all min-max deviations must be correct
-        /// (max_deviation > baseline, min_deviation < baseline), etc...
-        /// If all checks were passed, bond object is created in BondRegistry, receives state "PREPARE"
-        /// and awaits when account with Master role allows it to be moved to state BOOKING
-        /// 
- #[weight = ::WeightInfo::bond_add_new()] - fn bond_add_new(origin, bond: BondId, body: BondInnerStructOf ) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_issuer(&caller),Error::::AccountNotAuthorized); - ensure!(body.is_valid(T::TimeStep::get()), Error::::BondParamIncorrect ); - ensure!(!BondRegistry::::contains_key(&bond), Error::::BondAlreadyExists); - - let now = Timestamp::::get(); - - let mut item = BondStruct{ - inner: body, - creation_date: now, - issuer: caller.clone(), - nonce: 0, - .. Default::default() - }; - T::OnAddBond::on_add_bond(&bond, &mut item); - BondRegistry::::insert(&bond, item); - - Self::deposit_event(RawEvent::BondAdded(caller, bond)); - Ok(()) - } - - ///
-        /// Method: bond_set_manager(origin, bond: BondId, acc: T::AccountId)
-        /// Arguments: origin: AccountId - transaction caller, assigner
-        ///            bond: BondId - bond identifier
-        ///            acc: AccountId - assignee account
-        /// Access: Master role
-        ///
-        /// Assigns target account to be the manager of the bond. Manager can make
-        /// almost the same actions with bond as Issuer, instead of most important,
-        /// like issuing the bond to market (moving it to states: BOOKING, ACTIVE, etc...).
-        /// Manager helps Issuer to manage bond parameters, work with documents. Also, Manager
-        /// can return bond back from BOOKING to PREPARE state (f.e. if mincap of sold Bond Units
-        /// is not reached)
-        /// 
- #[weight = ::WeightInfo::bond_set()] - fn bond_set_manager(origin, bond: BondId, acc: T::AccountId) -> DispatchResult { - let caller = ensure_signed(origin)?; - // Bond Auxiliary roles can be set only by Master - ensure!(Self::account_is_master(&caller), Error::::AccountNotAuthorized); - ensure!(Self::account_is_manager(&acc), Error::::AccountRoleParamIncorrect); - - Self::with_bond(&bond, |item|{ - ensure!( - matches!(item.state, BondState::PREPARE), - Error::::BondStateNotPermitAction - ); - item.manager = acc; - item.nonce += 1; - Self::deposit_event(RawEvent::BondChanged(caller, bond)); - Ok(()) - }) - } - - ///
-        /// Method: bond_set_auditor(origin, bond: BondId, acc: T::AccountId)
-        /// Arguments: origin: AccountId - transaction caller, assigner
-        ///            bond: BondId - bond identifier
-        ///            acc: AccountId - assignee
-        /// Access: Master role
-        ///
-        /// Assigns target account to be the auditor of the bond. Auditor confirms
-        /// impact data coming in bond, and performs other verification-related actions.
-        /// Assigned account must have a role AUDITOR. impact_data for given bond can be
-        /// confirmed only by assigned Auditor.
-        /// 
- #[weight = ::WeightInfo::bond_set()] - fn bond_set_auditor(origin, bond: BondId, acc: T::AccountId) -> DispatchResult { - let caller = ensure_signed(origin)?; - // Bond auxiliary roles can be set only by Master - ensure!(Self::account_is_master(&caller), Error::::AccountNotAuthorized); - ensure!(Self::account_is_auditor(&acc), Error::::AccountRoleParamIncorrect); - - Self::with_bond(&bond, |item|{ - ensure!( - matches!(item.state, BondState::PREPARE | BondState::BOOKING), - Error::::BondStateNotPermitAction - ); - item.auditor = acc; - item.nonce += 1; - Self::deposit_event(RawEvent::BondChanged(caller, bond)); - Ok(()) - }) - } - - ///
-        /// Method: bond_set_impact_reporter(origin, bond: BondId, acc: T::AccountId)
-        /// Arguments: origin: AccountId - transaction caller, assigner
-        ///            bond: BondId - bond identifier
-        ///            acc: AccountId - assignee
-        /// Access: only accounts with Master role
-        ///
-        /// Assigns an account to be a publisher of impact_data for this bond. Only assigned
-        /// by Master, target account must have IMPACT_REPORTER role.
-        /// 
- #[weight = ::WeightInfo::bond_set()] - fn bond_set_impact_reporter(origin, bond: BondId, acc: T::AccountId) -> DispatchResult { - let caller = ensure_signed(origin)?; - // Bond auxiliary roles can be set only by Master - ensure!(Self::account_is_master(&caller), Error::::AccountNotAuthorized); - ensure!(Self::account_is_impact_reporter(&acc), Error::::AccountRoleParamIncorrect); - - Self::with_bond(&bond, |item|{ - item.impact_reporter = acc; - item.nonce += 1; - Self::deposit_event(RawEvent::BondChanged(caller, bond)); - Ok(()) - }) - } - - ///
-        /// Method: bond_update(origin, origin, bond: BondId, body: BondInnerStruct)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///            nonce: u64 - bond nonce
-        ///            body: BondInnerStruct
-        /// Access: bond Issuer or bond Manager
-        ///
-        /// Updates bond data. Being released bond can be changed only in part, not related to financial
-        /// options(issuer cannot change rates, caps, prices after bon release on market). Only document hashes
-        /// can be changed to update information about bond, allowing to re-verify documentary history of bond
-        /// during its lifetime.
-        /// Function accepts same information as bond_add(), but requires, that only allowed options was
-        /// changed (calling "is_financial_options_eq()" with previous version of bond)
-        /// 
- #[weight = ::WeightInfo::bond_update()] - fn bond_update(origin, bond: BondId,#[compact] nonce: u64, body: BondInnerStructOf) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(body.is_valid(T::TimeStep::get()), Error::::BondParamIncorrect ); - // Bond can be update only by Owner or assigned Manager - Self::with_bond(&bond, |item|{ - ensure!(item.nonce == nonce, Error::::BondNonceObsolete ); - // preserving the bond_units_base_price value - ensure!( - matches!(item.state, BondState::PREPARE | BondState::BOOKING), - Error::::BondStateNotPermitAction - ); - ensure!( - item.issuer == caller || item.manager == caller , - Error::::BondAccessDenied - ); - // Financial data shall not be changed after release - if item.state == BondState::BOOKING { - ensure!( item.inner.is_financial_options_eq(&body), Error::::BondStateNotPermitAction ); - } - item.inner = body; - item.nonce += 1; - Self::deposit_event(RawEvent::BondChanged(caller, bond)); - - Ok(()) - }) - } - - ///
-        /// Method: bond_release(origin, bond: BondId)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///            nonce: u64 - bond nonce
-        /// Access: only accounts with Master role
-        ///
-        /// Releases the bond on the market starting presale.
-        /// Moves bond form PREPARE to BOOKING state, allowing investors to buy
-        /// packs of bond units(BU), denying any changes of financial parameters,
-        /// and waiting until "mincap" of bond units will be booked. If it happens,
-        /// bond can further be move to ACTIVE state, allowing Investors to trade
-        /// their Bond Units on free market with other Investors/
-        /// Function requires PREPARE state, not expired "mincap_deadline" to be successful.
-        /// Other checks are: nonce and "is_valid()", to avoid release of incorrect bond
-        /// 
- - #[weight = ::WeightInfo::bond_release()] - fn bond_release(origin, bond: BondId, #[compact] nonce: u64) -> DispatchResult { - let caller = ensure_signed(origin)?; - // Bond can be released only by Master - ensure!(Self::account_is_master(&caller), Error::::AccountNotAuthorized); - Self::with_bond(&bond, |item|{ - ensure!(item.nonce == nonce, Error::::BondNonceObsolete ); - ensure!(item.state == BondState::PREPARE, Error::::BondStateNotPermitAction); - ensure!(item.inner.is_valid(T::TimeStep::get()), Error::::BondParamIncorrect); - - let now = Timestamp::::get(); - // Ensure booking deadline is in the future - ensure!(item.inner.mincap_deadline>now, Error::::BondStateNotPermitAction); - - item.booking_start_date = now; - item.state = BondState::BOOKING; - item.nonce += 1; - Self::deposit_event(RawEvent::BondReleased(caller, bond)); - Ok(()) - }) - } - - - ///
-        /// Method: bond_unit_package_buy(origin, bond: BondId, unit_amount: BondUnitAmount )
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///            nonce: u64 - bond nonce
-        ///            unit_amount: BondUnitAmount - amount of bond units
-        /// Access: only accounts with Investor role
-        ///
-        /// Buy bond units from bond in BOOKING, ACTIVE or BANKRUPT state.
-        /// Investor passes amount of BUs he wants to buy. Function calculates price of BUs
-        /// and adds new BondUnitsPackage, with amount of BUs that was bought. BondUnitsPackage
-        /// contains:
-        ///  - amount of BUs bought
-        ///  - aquisition time(number of period when this BUs package was bought)
-        ///  - accrued coupon yield(EverUSD): internal field, calculated and saved only when any
-        ///    financial operations with this package are performed
-        ///
-        /// Bond must be in BOOKING, ACTIVE, BANKRUPT state, amount of Bond Units
-        /// should not except "bond_units_maxcap_amount"
-        /// 
- #[weight = ::WeightInfo::bond_unit_package_buy()] - fn bond_unit_package_buy(origin, bond: BondId,#[compact] nonce: u64,#[compact] unit_amount: BondUnitAmount ) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_investor(&caller), Error::::AccountNotAuthorized); - Self::with_bond(&bond, |mut item|{ - ensure!(item.nonce == nonce, Error::::BondNonceObsolete); - ensure!( - matches!(item.state, BondState::BANKRUPT | BondState::ACTIVE | BondState::BOOKING), - Error::::BondStateNotPermitAction - ); - // issuer cannot buy his own bonds - ensure!(item.issuer != caller, Error::::AccountNotAuthorized); - - let issued_amount = unit_amount.checked_add(item.issued_amount) - .ok_or(Error::::BalanceOverdraft)?; - - ensure!( - issued_amount <= item.inner.bond_units_maxcap_amount, - Error::::BondParamIncorrect - ); - - let package_value = item.par_value( unit_amount ) ; - - Self::balance_sub(&caller, package_value)?; - - let now = Timestamp::::get(); - - // get the number of seconds after bond activation. - // zero value if the bond has not activated yet - let (acquisition,_) = item.time_passed_after_activation( now ).unwrap_or( (0,0) ); - // @FIXME assess the costs of current array struct for storing packages and - // compare them with a more efficient way to store data - BondUnitPackageRegistry::::mutate(&bond, &caller, |packages|{ - packages.push( - BondUnitPackage{ - bond_units: unit_amount, - acquisition, - coupon_yield: 0, - } - ); - }); - - item.issued_amount = issued_amount; - - - if matches!(item.state, BondState::ACTIVE | BondState::BANKRUPT) { - item.bond_debit += package_value; - // in BondState::ACTIVE or BondState::BANKRUPT received everusd - // can be forwarded to pay off the debt - // @TODO add postdispatch weight - Self::calc_and_store_bond_coupon_yield(&bond, &mut item, now); - // surplus to the issuer balance - let free_balance = item.get_free_balance(); - if free_balance > 0 { - item.bond_debit -= free_balance; - Self::balance_add(&item.issuer, free_balance)?; - } - }else{ - // in BondState::PREPARE just increase assets and liabilities of the Bond - item.increase( package_value ); - } - - Self::deposit_event(RawEvent::BondUnitSold(caller.clone(), bond, unit_amount, package_value)); - - Ok(()) - }) - } - - ///
-        /// Method: bond_unit_package_return(origin, bond: BondId, unit_amount: BondUnitAmount )
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///            unit_amount: BondUnitAmount - amount of bond units
-        ///
-        /// Access: only accounts with Investor role, holding bond units
-        /// In BOOKING state Investor can return "unit_amount" of BUs, and return EverUSD paid.
-        /// Removes BondUnitsPackages, owned by Investor, matching amount on BUs, he wants to return.
-        /// BUs are returned to common pool, decreasing "issued_amount" of bond.
-        /// 
- // Investor gives back bond units and withdraw tokens - #[weight = ::WeightInfo::bond_unit_package_return()] - fn bond_unit_package_return(origin, bond: BondId,#[compact] unit_amount: BondUnitAmount ) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_investor(&caller), Error::::AccountNotAuthorized); - ensure!(unit_amount > 0, Error::::BondParamIncorrect); - // Active Bond cannot be withdrawn - Self::with_bond(&bond, |item|{ - ensure!(item.state == BondState::BOOKING, Error::::BondStateNotPermitAction ); - ensure!(item.issued_amount >= unit_amount, Error::::BondParamIncorrect); - let package_value = item.par_value( unit_amount ) ; - ensure!(item.bond_credit >= package_value, Error::::BondParamIncorrect); - - BondUnitPackageRegistry::::try_mutate(&bond, &caller, |packages|->DispatchResult{ - ensure!(!packages.is_empty(), Error::::BondParamIncorrect); - if packages.iter().map(|item| item.bond_units).sum::() == unit_amount { - packages.clear(); - Ok(()) - } else if let Some(index) = packages.iter().position(|item| item.bond_units == unit_amount ){ - packages.remove( index ); - Ok(()) - } else { - Err( Error::::BondParamIncorrect.into() ) - } - })?; - - item.decrease( package_value ); - item.issued_amount -= unit_amount; - - Self::balance_add(&caller, package_value)?; - Self::deposit_event(RawEvent::BondUnitReturned(caller, bond, unit_amount, package_value)); - - Ok(()) - }) - } - - ///
-        /// Method: bond_withdraw(origin, bond: BondId)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///
-        /// Access: accounts with Master role, bond Issuer, or bond Manager
-        /// Can be called after the bond was released but not raised enough capacity after deadline.
-        /// In BOOKING state only. If bond haven't reached "bond_units_mincap_amount" (Investors
-        /// haven't bought enough of BUs), bond managers(Issuer, Manager) or Master can return
-        /// bond in PREPARE state, denying acquisiton of new bond units, and allowing
-        /// team to change parameters of bond and then try to release it with more suitable
-        /// for Investors parameters. Cannot be called until "mincap_deadline"
-        /// 
- // Called after the Bond was released but not raised enough tokens until the deadline - #[weight = ::WeightInfo::bond_withdraw()] - fn bond_withdraw(origin, bond: BondId) -> DispatchResult { - let caller = ensure_signed(origin)?; - // Bond issuer, bond Manager, or Master can do it - Self::with_bond(&bond, |item|{ - ensure!( item.state == BondState::BOOKING, Error::::BondStateNotPermitAction ); - // Ensure the Bond raises less then bond_units_mincap_amount bond units - ensure!(item.inner.bond_units_mincap_amount > item.issued_amount, Error::::BondParamIncorrect); - ensure!( - item.issuer == caller || item.manager == caller || Self::account_is_master(&caller) , - Error::::BondAccessDenied - ); - let now = Timestamp::::get(); - // Ensure booking deadline is in the future - ensure!(item.inner.mincap_deadline <= now, Error::::BondStateNotPermitAction); - - item.state = BondState::PREPARE; - item.nonce += 1; - assert!(item.bond_credit == item.par_value(item.issued_amount)); - // @TODO make it lazy. this implementation do much work to restore balances - // that is too CPU and memory expensive. - // For each bondholder - for (bondholder, package) in BondUnitPackageRegistry::::iter_prefix(&bond){ - let bondholder_total_amount: BondUnitAmount = package.iter() - .map(|item| item.bond_units ) - .sum(); - - item.issued_amount -= bondholder_total_amount; - - let transfer = item.par_value( bondholder_total_amount ) ; - item.decrease(transfer); - - Self::balance_add(&bondholder, transfer)?; - } - assert!(item.bond_credit == 0); - assert!(item.issued_amount == 0); - - BondUnitPackageRegistry::::remove_prefix(&bond, None); - - Self::deposit_event(RawEvent::BondWithdrawal(caller, bond)); - Ok(()) - }) - } - - ///
-        /// Method: bond_activate(origin, bond: BondId)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///            nonce: u64 - bond nonce
-        /// Access: only accounts with Master role
-        ///
-        /// Activates the bond after it raised minimum capacity of bond units, opening
-        /// BondUnitsPackages, owned by Investors, to be traded of free market. Function
-        /// moves bond from BOOKING to ACTIVE state, and transfers all the sum(EverUSD),
-        /// paid by Investors to bond Issuer. Also, function creates the fixed size array of
-        /// BondImpactReportStruct-s with amount of elements, equal to amount of payment periods.
-        /// This array will be used to store future impact_report_data and effective
-        /// coupon_yield_rate (depending on impact_report_data for each period). Requires that
-        /// "bond_units_mincap_amount" was reached.
-        /// 
- #[weight = ::WeightInfo::bond_activate()] - fn bond_activate(origin, bond: BondId,#[compact] nonce: u64) -> DispatchResult { - let caller = ensure_signed(origin)?; - //Bond can be activated only by Master - ensure!(Self::account_is_master(&caller), Error::::AccountNotAuthorized); - //if it's raised enough bond units during bidding process - Self::with_bond(&bond, |item|{ - ensure!(item.nonce == nonce, Error::::BondNonceObsolete ); - ensure!(item.state == BondState::BOOKING, Error::::BondStateNotPermitAction); - ensure!(item.inner.bond_units_mincap_amount <= item.issued_amount, Error::::BondParamIncorrect); - // auditor should be assigned before - ensure!(item.auditor != Default::default(), Error::::BondIsNotConfigured); - - let now = Timestamp::::get(); - item.state = BondState::ACTIVE; - item.nonce += 1; - item.active_start_date = now; - // Decrease liabilities by value of fund - assert_eq!(item.bond_credit, item.par_value( item.issued_amount ) ); - assert!(item.bond_credit == item.bond_debit); - item.bond_credit = 0 ; - - // create impact report struct. - // the total number or reports is equal to the number of periods. - // start period coupon interest isn't calculated using impact data. - let mut reports: Vec = Vec::new(); - // reports length cannot be larger than item.inner.impact_data_baseline - // because bond_duration is limited in "is_valid()" function. - reports.resize( item.inner.bond_duration as usize, Default::default() ); - - BondImpactReport::insert(&bond, &reports); - - // withdraw all available bond fund - let amount = item.bond_debit; - Self::balance_add(&item.issuer, item.bond_debit)?; - item.bond_debit = 0; - - Self::deposit_event(RawEvent::BondActivated(caller, bond, amount)); - Ok(()) - }) - } - - ///
-        /// Method: bond_impact_report_send(origin, bond: BondId, impact_data: u64 )
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///            impact_data: u64 - report value
-        /// Access: bond Issuer or ImpactReporter, assigned to the bond
-        ///
-        /// Saves inital impact_report_data for current period, for later confirmation by Auditor.
-        /// Data must be send during correct period (depending on "impact_data_send_period" and "payment_period"
-        /// properties of bond). Also, impact_data for this period must be not confirmed by Auditor yet.
-        /// 
- #[weight = ::WeightInfo::bond_impact_report_send()] - fn bond_impact_report_send(origin, bond: BondId,#[compact] period: BondPeriodNumber,#[compact] impact_data: u64 ) -> DispatchResult { - let caller = ensure_signed(origin)?; - let now = Timestamp::::get(); - let moment = { - let item = BondRegistry::::get(bond); - ensure!(item.issuer == caller || item.impact_reporter == caller, Error::::BondAccessDenied ); - ensure!(Self::is_report_in_time(&item, now, period), Error::::BondOutOfOrder ); - item.time_passed_after_activation(now).map(|(moment, _period)| moment ).unwrap() - }; - - let index: usize = period as usize; - BondImpactReport::try_mutate(&bond, |reports|->DispatchResult { - - ensure!(index < reports.len() && !reports[index].signed, Error::::BondParamIncorrect); - - reports[index].create_period = moment; - reports[index].impact_data = impact_data; - - Self::deposit_event(RawEvent::BondImpactReportSent( caller, bond, period, impact_data)); - Ok(()) - }) - } - - ///
-        /// Method: bond_impact_report_approve(origin, bond: BondId, period: u64, impact_data: u64 )
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///            period: u32 - report period starting from 0
-        ///            impact_data: u64 - report value
-        ///
-        /// Access: only Auditor assigned to the bond
-        /// Confirms "impact_report_data", that already being sent by the bond Issuer or ImpactReporter.
-        /// Auditor sends period number and exact value of impact_data, he confirms. Confirmation must be
-        /// send during the correct period (depending on "impact_data_send_period" and "payment_period"
-        /// properties of bond)
-        /// 
- // Auditor signs impact report - #[weight = ::WeightInfo::bond_impact_report_approve()] - fn bond_impact_report_approve(origin, bond: BondId,#[compact] period: BondPeriodNumber,#[compact] impact_data: u64 ) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_auditor(&caller), Error::::AccountNotAuthorized); - let now = Timestamp::::get(); - { - let item = BondRegistry::::get(bond); - ensure!(item.auditor == caller, Error::::BondAccessDenied ); - ensure!(Self::is_report_in_time(&item, now, period), Error::::BondOutOfOrder ); - } - - let index: usize = period as usize; - BondImpactReport::try_mutate(&bond, |reports|->DispatchResult { - - ensure!(index < reports.len(), Error::::BondParamIncorrect ); - let report = &reports[index]; - ensure!(report.create_period > 0 , Error::::BondParamIncorrect); - ensure!(!report.signed && report.impact_data == impact_data, - Error::::BondParamIncorrect - ); - - reports[index].signed = true; - - Self::deposit_event(RawEvent::BondImpactReportApproved( caller, bond, period, impact_data)); - Ok(()) - }) - } - - ///
-        /// Method: bond_redeem(origin, bond: BondId)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///
-        /// Access: any account
-        /// Makes the bond reached maturity date. Requires the bond Issuer to pay back
-        /// redemption yield. Function moves bond from ACTIVE or BANKRUPT state to FINISHED.
-        /// Function checks correct time (all payment_periods must be passed),
-        /// calculates total bond credit and debit, summarizing all debts and yields,
-        /// and transfers needed sum from/to Issuer's(!) EverUSD balance (calculated
-        /// using "bond_debit", "bond_credit" and "issued_amount" (bond price)). Any account
-        /// can call this function
-        /// If all operations are successful, bond_debit will be fully covered EverUSD, paid
-        /// by Issuer and Issuer don't have any obligations. Investors now can
-        /// withdraw all their accrued coupon yield and parts of bond maturity debt
-        /// Bond becomes FINISHED.
-        /// 
- #[weight = ::WeightInfo::bond_redeem()] - fn bond_redeem(origin, bond: BondId) -> DispatchResult { - let caller = ensure_signed(origin)?; - let now = Timestamp::::get(); - Self::with_bond(&bond, |mut item|{ - ensure!( matches!(item.state, BondState::ACTIVE|BondState::BANKRUPT), Error::::BondStateNotPermitAction ); - - match item.time_passed_after_activation(now){ - Some((_, period)) if period == item.get_periods() => (), - _ => return Err( Error::::BondOutOfOrder.into() ), - }; - - Self::calc_and_store_bond_coupon_yield(&bond, &mut item, now); - // now bond_credit has YTM ( yield to mature ) - let amount = item.bond_credit + item.par_value( item.issued_amount ) ; - if amount <= item.bond_debit { - // withdraw free balance - Self::balance_add(&item.issuer, item.bond_debit - amount)?; - }else{ - let transfer = amount - item.bond_debit; - // pay off debt - Self::balance_sub(&item.issuer, transfer)?; - } - let ytm = item.bond_credit; - item.bond_credit = amount; - //item.coupon_yield = amount; - item.bond_debit = amount; - item.state = BondState::FINISHED; - item.nonce += 1; - Self::deposit_event(RawEvent::BondRedeemed(caller, bond, ytm)); - Ok(()) - }) - } - - ///
-        /// Method: bond_declare_bankrupt(origin, bond: BondId)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        /// Access: Master role
-        ///
-        /// Marks the bond as bankrupt, moving it from ACTIVE to BANKRUPT state.
-        /// Function checks, that "get_debt()" of bond is > 0 (bond_credit > bond_debit),
-        /// and that "interest_pay_period" is not active(Issuer still have a chance to pay debt).
-        /// Then function calculates and stores all accumulated coupon_yield and marks bond as BANKRUPT
-        /// 
- #[weight = ::WeightInfo::bond_declare_bankrupt()] - fn bond_declare_bankrupt(origin, bond: BondId) -> DispatchResult { - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_master(&caller), Error::::AccountNotAuthorized); - - Self::with_bond(&bond, |mut item|{ - ensure!(item.state == BondState::ACTIVE, Error::::BondStateNotPermitAction); - ensure!(item.get_debt() > 0, Error::::BondParamIncorrect ); - let now = Timestamp::::get(); - ensure!( !Self::is_interest_pay_period(&item, now),Error::::BondOutOfOrder ); - Self::calc_and_store_bond_coupon_yield(&bond, &mut item, now); - - item.state = BondState::BANKRUPT; - item.nonce += 1; - Self::deposit_event(RawEvent::BondBankrupted(caller.clone(), bond, item.bond_credit, item.bond_debit)); - Ok(()) - }) - } - - ///
-        /// Method: bond_accrue_coupon_yield(origin, bond: BondId)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        /// Access: any account
-        ///
-        /// Calculates total bond coupon yield(EverUSD) and stores it in "bond_credit"
-        /// by calculating effective interest rates for each passed payment_period.
-        /// This function is a call to "lazy" function "calc_and_store_bond_coupon_yield()"
-        /// that is called in many operations, changing Investors BondUnitsPackage-s (like buy/sell BUs).
-        /// Have the complexity O(N), where N - amount of BondUnitsPackage-s
-        /// 
- #[weight = ::WeightInfo::bond_accrue_coupon_yield()] - fn bond_accrue_coupon_yield(origin, bond: BondId) -> DispatchResultWithPostInfo { - let _ = ensure_signed(origin)?; - - Self::with_bond(&bond, |mut item|->DispatchResultWithPostInfo { - let now = Timestamp::::get(); - let processed: u64 = Self::calc_and_store_bond_coupon_yield(&bond, &mut item, now) as u64; - Ok(Some( T::DbWeight::get().reads_writes(processed+2, processed+1) ).into()) - }) - } - - ///
-        /// Method: bond_revoke(origin, bond: BondId)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        /// Access: Bond Issuer or Manager, assigned to the bond
-        ///
-        /// Totally removes bond from BondsRegistry before it was issued(in PREPARE state)
-        /// 
- #[weight = ::WeightInfo::bond_revoke()] - fn bond_revoke(origin, bond: BondId) -> DispatchResult { - let caller = ensure_signed(origin)?; - // Bond can be revoked only by Owner or by Manager assigned to the Bond - // Bond should be in Prepare state, so no bids can exist at this time - ensure!( BondRegistry::::contains_key(&bond), Error::::BondNotFound ); - let item = BondRegistry::::get(bond); - ensure!(item.issuer == caller || item.manager == caller, Error::::BondAccessDenied); - ensure!(item.state == BondState::PREPARE, Error::::BondStateNotPermitAction); - assert!( BondRegistry::::contains_key(bond) ); - BondRegistry::::remove( &bond ); - - Self::deposit_event(RawEvent::BondRevoked(caller, bond)); - Ok(()) - } - - ///
-        /// Method: bond_withdraw_everusd(origin, bond: BondId, amount: EverUSDBalance)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///
-        /// Access: Bond Issuer or any Investor
-        ///
-        /// This function is mainly used by Investors to recieve accrued coupon yield in any moment.
-        /// Also, this function is used by bond Issuer to withdraw EverUSD from `free bond balance`.
-        /// Available only in ACTIVE, BANKRUPT of FINISHED states.
-        /// If caller is Issuer of this bond, "get_free_balance()" amount of EverUSD tokens are transfered
-        /// to bond.issuer address. If caller is the Investor of bond, then, in FINISHED state he
-        /// receives all bond debt (principal value + coupon yield), or coupon yield only
-        /// (by calling "request_coupon_yield()") if bond still ACTIVE or BANKRUPT. If amount
-        /// of EverUSD on bond's balance is not enough to pay to Investors, bond moves to BANKRUPT state.
-        /// 
- // @TODO add parameter beneficiary:AccountId who will receive coupon yield - // @TODO consider separate functions for Issuer and Investor - #[weight = ::WeightInfo::bond_withdraw_everusd()] - fn bond_withdraw_everusd(origin, bond: BondId) -> DispatchResult { - let caller = ensure_signed(origin)?; - Self::with_bond(&bond, |mut item|{ - ensure!( matches!(item.state , BondState::ACTIVE | BondState::BANKRUPT | BondState::FINISHED), Error::::BondStateNotPermitAction); - - let now = Timestamp::::get(); - Self::calc_and_store_bond_coupon_yield(&bond, &mut item, now); - - let amount: EverUSDBalance = if item.issuer == caller { - // issuer withdraw bond fund - let amount = item.get_free_balance(); - if amount>0{ - Self::balance_add(&item.issuer, amount)?; - // it's safe to do unchecked subtraction - item.bond_debit -= amount; - } - amount - }else if item.state == BondState::FINISHED { - // investor (bondholder) withdraw principal value - Self::redeem_bond_units(&bond, &mut item, &caller) - }else{ - // investor (bondholder) withdraw coupon yield - // set bankrupt state if bond fund cannot pay off - if item.state == BondState::ACTIVE && item.get_debt()>0 && !Self::is_interest_pay_period(&item, now){ - item.state = BondState::BANKRUPT; - Self::deposit_event(RawEvent::BondBankrupted(caller.clone(), bond, item.bond_credit, item.bond_debit )); - } - - Self::request_coupon_yield(&bond, &mut item, &caller) - }; - - if amount>0{ - Self::deposit_event(RawEvent::BondWithdrawEverUSD(caller, bond, amount)); - } - Ok(()) - }) - } - - ///
-        /// Method: bond_deposit_everusd(origin, bond: BondId, amount: EverUSDBalance)
-        /// Arguments: origin: AccountId - transaction caller
-        ///            bond: BondId - bond identifier
-        ///            amount: EverUSDBalance - the number of EverUSD  deposited to bond fund
-        /// Access: Bond issuer
-        ///
-        /// Transfers `amount` of EverUSD tokens from bond Issuer's balance to the bond fund
-        /// to pay coupon yield and principal debt to Investors. Bond must be in ACTIVE or BANKRUPT
-        /// state. Transfered EverUSD amount is added to bond_debit, and will be distributed between
-        /// Investors, according to their ownership of Bond Units.
-        /// "Lazy" call for function "calc_and_store_bond_coupon_yield()", that calculates and stores
-        /// coupon yield amounts for each payment_period, where it's possible
-        /// 
- #[weight = ::WeightInfo::bond_deposit_everusd()] - fn bond_deposit_everusd(origin, bond: BondId,#[compact] amount: EverUSDBalance) -> DispatchResult { - let caller = ensure_signed(origin)?; - Self::with_bond(&bond, |mut item|{ - ensure!( - matches!(item.state , BondState::ACTIVE | BondState::BANKRUPT), - Error::::BondStateNotPermitAction - ); - ensure!(item.issuer == caller, Error::::BondAccessDenied); - - Self::balance_sub(&caller, amount)?; - - item.bond_debit = item.bond_debit.checked_add(amount) - .ok_or( Error::::BondParamIncorrect )?; - let now = Timestamp::::get(); - Self::calc_and_store_bond_coupon_yield(&bond, &mut item, now); - if item.state == BondState::BANKRUPT && !item.is_shortage(){ - item.state = BondState::ACTIVE; - } - - Self::deposit_event(RawEvent::BondDepositEverUSD(caller, bond, amount)); - Ok(()) - }) - } - - ///
-        /// Method: bond_unit_lot_bid(origin, bond: BondId, lot: BondUnitSaleLotStruct)
-        /// Arguments: origin: AccountId - bond unit bondholder
-        ///            bond: BondId - bond identifier
-        ///            lot: BondUnitSaleLotStruct - lot data
-        /// Access: any account, holding Bond Units (having BondUnitsPackage-s)
-        ///
-        /// Creates sale lot: pack of Bond Units to sale for given price. Accepts BondUnitSaleLotStruct,
-        /// containing:
-        ///   - "bond_units": amount of selling Bond Units
-        ///   - "amount": price of whole lot in EverUSD
-        ///   - "deadline": moment, after that lot cannot be sold
-        ///   - "new_bondholder": (optional) target buyer(to restrict sale of this lot to given buyer)
-        /// Function checks, that seller have BondUnitsPackage-s, containing enough BUs for lot creation,
-        /// expiration date. Then, creates new lot in BondUnitPackageLot registry. Later, buyers can
-        /// choose this lot and buy it.
-        /// Also, function purges expired lots for this bond and seller from BondUnitPackageLot storage.
-        /// 
- #[weight = ::WeightInfo::bond_unit_lot_bid()] - fn bond_unit_lot_bid(origin, bond: BondId, lot: BondUnitSaleLotStructOf) -> DispatchResult{ - let caller = ensure_signed(origin)?; - let now = Timestamp::::get(); - // @TODO - maybe restrict this operation only to Investors? - ensure!(!lot.is_expired(now), Error::::LotParamIncorrect); - - let packages = BondUnitPackageRegistry::::get(&bond, &caller); - // how many bond units does the caller have - let total_bond_units: BondUnitAmount = packages.iter() - .map(|package| package.bond_units) - .sum(); - - ensure!(total_bond_units>=lot.bond_units && lot.bond_units>0, Error::::BondParamIncorrect ); - - // all lots of the caller. - let mut lots: Vec<_> = BondUnitPackageLot::::get(&bond, &caller); - // purge expired lots - lots.retain(|lot| !lot.is_expired(now) ); - - let total_bond_units_inlot: BondUnitAmount = lots.iter().map(|lot| lot.bond_units).sum(); - // prevent new bid if the caller doesn't have enough bond units - ensure!(total_bond_units>= total_bond_units_inlot+lot.bond_units, Error::::BalanceOverdraft); - - lots.push( - lot.clone() - ); - // save lots - BondUnitPackageLot::::insert(&bond, &caller, lots); - Self::deposit_event(RawEvent::BondSaleLotBid(caller, bond, lot)); - Ok(()) - } - - ///
-        /// Method: bond_unit_lot_settle(origin, bond: BondId,bondholder: AccountId, lot: BondUnitSaleLotStruct)
-        /// Arguments: origin: AccountId - bond unit bondholder
-        ///            bond: BondId - bond identifier
-        ///            bondholder: Current bondholder of of bond
-        ///            lot: BondUnitSaleLotStruct - lot data
-        /// Access: any account with Investor role
-        ///
-        /// Buy the lot created by bond_unit_lot_bid() call. Lot should not be expired.
-        /// If "new_bondholder" field of lot is set, only given account can buy this lot.
-        /// Buyer should have enough EverUSD to buy the lot. When lot is sold,
-        /// expired lots (fixed amount) are purged from BondUnitPackageLot registry.
-        ///
-        /// Before transfer of EverUSD, function caluclates and stores bond coupon yield for bondholder(seller)
-        /// and caller(buyer), because this deal changes BondUnitsPackages of buyer and seller
-        /// (buyer receives "newer" BondUnitsPackage, that buyer owned)
-        /// 
- #[weight = ::WeightInfo::bond_unit_lot_settle()] - fn bond_unit_lot_settle(origin, bond: BondId, bondholder: T::AccountId, lot: BondUnitSaleLotStructOf)->DispatchResult{ - let caller = ensure_signed(origin)?; - ensure!(Self::account_is_investor(&caller), Error::::AccountNotAuthorized); - let now = Timestamp::::get(); - // prevent expired lots sales - ensure!(!lot.is_expired( now ), Error::::LotObsolete); - - ensure!(lot.new_bondholder == Default::default() || lot.new_bondholder == caller, Error::::LotNotFound); - let balance = Self::balance_everusd(&caller); - // ensure caller has enough tokens on its balance - ensure!(lot.amount <= balance , Error::::BalanceOverdraft); - - BondUnitPackageLot::::try_mutate(&bond, &bondholder, |lots|->DispatchResult{ - if let Some(index) = lots.iter().position(|item| item==&lot ){ - lots.remove( index ); - if !lots.is_empty() { - // purge expired lots - lots.retain( |item| !item.is_expired( now ) ); - } - // @TODO optimize out access to balances - BondRegistry::::mutate(bond, |mut item|{ - Self::calc_and_store_bond_coupon_yield(&bond, &mut item, now); - Self::request_coupon_yield(&bond, &mut item, &bondholder); - Self::request_coupon_yield(&bond, &mut item, &caller); - }); - - let mut from_packages = BondUnitPackageRegistry::::get(&bond, &bondholder); - let mut to_packages = BondUnitPackageRegistry::::get(&bond, &caller); - // transfer lot.bond_units from bondholder to caller - transfer_bond_units::(&mut from_packages, &mut to_packages, lot.bond_units)?; - // store new packages - BondUnitPackageRegistry::::insert(&bond, &bondholder, from_packages); - BondUnitPackageRegistry::::insert(&bond, &caller, to_packages); - - // pay off deal - Self::balance_sub(&caller, lot.amount)?; - Self::balance_add(&bondholder, lot.amount)?; - Self::deposit_event(RawEvent::BondSaleLotSettle(caller, bondholder.clone(), bond, lot)); - Ok(()) - }else{ - Err(Error::::BondParamIncorrect.into()) - } - }) - } - } -} - -impl Module { - fn account_add(account: &T::AccountId, mut data: EvercityAccountStructOf) { - data.create_time = Timestamp::::get(); - AccountRegistry::::insert(account, &data); - T::OnAddAccount::on_add_account(account, &data); - } - - ///
-    /// Method: account_is_master(acc: &T::AccountId) -> bool
-    /// Arguments: acc: AccountId - checked account id
-    ///
-    /// Checks if the acc has global Master role
-    /// 
- pub fn account_is_master(acc: &T::AccountId) -> bool { - AccountRegistry::::get(acc).roles & MASTER_ROLE_MASK != 0 - } - - ///
-    /// Method: account_is_custodian(acc: &T::AccountId) -> bool
-    /// Arguments: acc: AccountId - checked account id
-    ///
-    /// Checks if the acc has global Custodian role
-    /// 
- pub fn account_is_custodian(acc: &T::AccountId) -> bool { - AccountRegistry::::get(acc).roles & CUSTODIAN_ROLE_MASK != 0 - } - - ///
-    /// Method: account_is_issuer(acc: &T::AccountId) -> bool
-    /// Arguments: acc: AccountId - checked account id
-    ///
-    /// Checks if the acc has global Issuer role
-    /// 
- pub fn account_is_issuer(acc: &T::AccountId) -> bool { - AccountRegistry::::get(acc).roles & ISSUER_ROLE_MASK != 0 - } - - ///
-    /// Method: account_is_investor(acc: &T::AccountId) -> bool
-    /// Arguments: acc: AccountId - checked account id
-    ///
-    /// Checks if the acc has global Investor role
-    /// 
- pub fn account_is_investor(acc: &T::AccountId) -> bool { - AccountRegistry::::get(acc).roles & INVESTOR_ROLE_MASK != 0 - } - - ///
-    /// Method: account_is_auditor(acc: &T::AccountId) -> bool
-    /// Arguments: acc: AccountId - checked account id
-    ///
-    /// Checks if the acc has global Auditor role
-    /// 
- pub fn account_is_auditor(acc: &T::AccountId) -> bool { - AccountRegistry::::get(acc).roles & AUDITOR_ROLE_MASK != 0 - } - - ///
-    /// Method: account_is_manager(acc: &T::AccountId) -> bool
-    /// Arguments: acc: AccountId - checked account id
-    ///
-    /// Checks if the acc has global Manager role
-    /// 
- pub fn account_is_manager(acc: &T::AccountId) -> bool { - AccountRegistry::::get(acc).roles & MANAGER_ROLE_MASK != 0 - } - - ///
-    /// Method: account_is_impact_reporter(acc: &T::AccountId) -> bool
-    /// Arguments: acc: AccountId - checked account id
-    ///
-    /// Checks if the acc has global Impact Reporter role
-    /// 
- pub fn account_is_impact_reporter(acc: &T::AccountId) -> bool { - AccountRegistry::::get(acc).roles & IMPACT_REPORTER_ROLE_MASK != 0 - } - - ///
-    /// Method: account_token_mint_burn_allowed(acc: &T::AccountId) -> bool
-    /// Arguments: acc: AccountId - checked account id
-    ///
-    /// Checks if the acc can create burn and mint tokens requests(INVESTOR or ISSUER)
-    /// 
- pub fn account_token_mint_burn_allowed(acc: &T::AccountId) -> bool { - const ALLOWED_ROLES_MASK: u8 = INVESTOR_ROLE_MASK | ISSUER_ROLE_MASK; - AccountRegistry::::get(acc).roles & ALLOWED_ROLES_MASK != 0 - } - - ///
-    /// Method: balance_everusd(acc: &T::AccountId) -> EverUSDBalance
-    /// Arguments: acc: AccountId - account id
-    ///
-    /// Returns account's balance as the number of EverUSD tokens.
-    /// Amount is returned as unsigned integer in smallest units of EverUSD
-    ///  "1" EverUSD is presented as "1 000 000 000"(depends on EVERUSD_DECIMALS == 9)
-    /// 
- pub fn balance_everusd(acc: &T::AccountId) -> EverUSDBalance { - BalanceEverUSD::::get(acc) - } - - ///
-    /// Method: total_supply() -> EverUSDBalance
-    /// Arguments: none
-    ///
-    /// Returns the total number of EverUSD tokens, owned by all holders, that was
-    /// supplied by the custodian. Every mint() operation inreases total_supply, while
-    /// burn() - decreases it. Initial total_supply of EverUSD == 0
-    /// 
- #[cfg(test)] - pub fn total_supply() -> EverUSDBalance { - TotalSupplyEverUSD::get() - } - - ///
-    /// Method: get_bond(bond: BondId) -> bond: BondId) -> BondStruct
-    /// Arguments: bond: BondId - bond unique identifier
-    ///
-    ///  Returns bond structure if it was found in BondRegistry by given BondId
-    /// 
- #[cfg(test)] - pub fn get_bond(bond: &BondId) -> BondStructOf { - BondRegistry::::get(bond) - } - - #[cfg(test)] - pub fn bond_check_invariant(bond: &BondId) -> bool { - let (bond_units, coupon_yield) = BondUnitPackageRegistry::::iter_prefix_values(bond) - .fold((0, 0), |acc, packages| { - packages.iter().fold(acc, |acc, package| { - (acc.0 + package.bond_units, acc.1 + package.coupon_yield) - }) - }); - let bond = BondRegistry::::get(bond); - - bond.issued_amount == bond_units && bond.coupon_yield == coupon_yield - } - - #[cfg(test)] - pub fn bond_holder_packages(bond: &BondId, bondholder: &T::AccountId) -> Vec { - BondUnitPackageRegistry::::get(bond, bondholder) - } - - pub fn bond_impact_data(bond: &BondId) -> Vec { - BondImpactReport::get(bond) - } - - #[cfg(test)] - fn bond_packages(id: &BondId) -> std::collections::HashMap> - where - ::AccountId: std::hash::Hash, - { - BondUnitPackageRegistry::::iter_prefix(id).collect() - } - - ///
-    /// Same as BondRegistry::::mutate(bond, f).
-    /// Unlike BondRegistry::::mutate(bond, f) `with_bond` doesn't write to storage
-    /// if call returns error or bond key doesn't exist in the registry
-    /// 
- fn with_bond>, F: FnOnce(&mut BondStructOf) -> Result>( - bond: &BondId, - f: F, - ) -> Result { - ensure!( - BondRegistry::::contains_key(bond), - Error::::BondNotFound - ); - - BondRegistry::::try_mutate(bond, |mut item| f(&mut item)) - } - - ///
-    /// Increase account balance by `amount` EverUSD
-    /// 
- fn balance_add(who: &T::AccountId, amount: EverUSDBalance) -> DispatchResult { - BalanceEverUSD::::try_mutate(who, |balance| -> DispatchResult { - *balance = balance - .checked_add(amount) - .ok_or(Error::::BalanceOverdraft)?; - Ok(()) - }) - } - - ///
-    /// Decrease account balance by `amount` EverUSD
-    /// 
- fn balance_sub(who: &T::AccountId, amount: EverUSDBalance) -> DispatchResult { - BalanceEverUSD::::try_mutate(who, |balance| -> DispatchResult { - *balance = balance - .checked_sub(amount) - .ok_or(Error::::BalanceOverdraft)?; - Ok(()) - }) - } - - ///
-    /// Deletes expired burn requests.
-    /// Process less or equal than MAX_PURGE_REQUESTS expired requests
-    /// 
- fn purge_expired_burn_requests(before: T::Moment) { - let to_purge: Vec<_> = BurnRequestEverUSD::::iter() - .filter(|(_, request)| request.is_expired(before)) - .map(|(acc, _)| acc) - .take(MAX_PURGE_REQUESTS) - .collect(); - - for acc in to_purge { - BurnRequestEverUSD::::remove(acc); - } - } - - ///
-    /// Deletes expired mint requests from the queue.
-    /// Process less or equal than MAX_PURGE_REQUESTS expired requests
-    /// 
- fn purge_expired_mint_requests(before: T::Moment) { - let to_purge: Vec<_> = MintRequestEverUSD::::iter() - .filter(|(_, request)| request.is_expired(before)) - .map(|(acc, _)| acc) - .take(MAX_PURGE_REQUESTS) - .collect(); - - for acc in to_purge { - MintRequestEverUSD::::remove(acc); - } - } - - #[cfg(test)] - pub fn get_coupon_yields(bond: &BondId) -> Vec { - BondCouponYield::get(bond) - } - - ///
-    /// Returns combination of impact data and interest_rate for given BondId.
-    /// 
- pub fn get_impact_reports(bond: BondId) -> Vec { - let impact_data = BondImpactReport::get(bond); - let coupon_yields = BondCouponYield::get(bond); - coupon_yields - .into_iter() - .zip(impact_data.into_iter()) - .map(|(coupon_yields, impact_data)| PeriodDataStruct { - interest_rate: coupon_yields.interest_rate, - create_period: impact_data.create_period, - impact_data: impact_data.impact_data, - signed: impact_data.signed, - }) - .collect() - } - - ///
-    /// Calculates bond coupon yield and store accrued values in BondCouponYield map.
-    /// Calculated values are stored in array, holding data for each payment_period.
-    /// Function also updats bond's "bond_credit" value to the currently accrued coupon yield.
-    /// Returns the number of processed periods.
-    /// Common function complexity is O(N), where N is the number of issued bond unit packages.
-    /// For each BondUnitsPackage of bond (containing payment_period when it was bought),
-    /// the "package_yield" is calculated (yield per one bond unit), and then used to summarise
-    /// yields of all bond's BondUnitsPackages.
-    /// 
- fn calc_and_store_bond_coupon_yield( - id: &BondId, - bond: &mut BondStructOf, - now: ::Moment, - ) -> usize { - let (_, period) = ensure_active!(bond.time_passed_after_activation(now), false); - // here is current pay period - let period = period as usize; - // @TODO refactor. use `mutate` method instead of get+insert - let mut bond_yields = BondCouponYield::get(id); - // get last accrued coupon yield - let mut total_yield = bond_yields - .last() - .map(|period_yield| period_yield.total_yield) - .unwrap_or(0); - // period should be ended up before we can calc it - if bond_yields.len() >= period { - // term hasn't come yet (if period=0 ) - // or current period has been calculated - bond.bond_credit = total_yield; - return 0; - } - let time_step = T::TimeStep::get(); - - let reports = BondImpactReport::get(id); - assert!(reports.len() + 1 >= period); - - let mut processed: usize = 0; - while bond_yields.len() < period { - // index - accrued period number - let index = bond_yields.len(); - let interest_rate = if index == 0 { - // There is no periods and data yet, set start period interest rate value - bond.inner.interest_rate_start_period_value - } else if reports[index - 1].signed { - // There is confirmed impact_data about this period - // Calculate interest rate, based on impact_data and baseline,min,max parameters of bond - bond.calc_effective_interest_rate( - bond.inner.impact_data_baseline[index - 1], - reports[index - 1].impact_data, - ) - } else { - // Report is missed, apply penalty for missed report(but not more than interest_rate_margin_cap) - min( - bond_yields[index - 1].interest_rate - + bond.inner.interest_rate_penalty_for_missed_report, - bond.inner.interest_rate_margin_cap, - ) - }; - - let package_yield = bond.inner.bond_units_base_price / 1000 - * interest_rate as EverUSDBalance - / INTEREST_RATE_YEAR; - - // calculate yield for period equal to bond_yields.len() - let period_coupon_yield: EverUSDBalance = match bond - .period_desc(index as BondPeriodNumber) - { - Some(period_desc) => { - // for every bond bondholder - BondUnitPackageRegistry::::iter_prefix(id) - .map(|(_bondholder, packages)| { - // flat_map - // for every package - packages - .iter() - .map(|package| { - // @TODO use checked arithmetics - package_yield - * package.bond_units as EverUSDBalance - * (period_desc.duration(package.acquisition) / time_step) - as EverUSDBalance - / 100 - }) - .sum::() - }) - .sum() - } - None => { - // @TODO it's best panic instead of return false - return 0; - } - }; - - total_yield += period_coupon_yield; - - bond_yields.push(PeriodYield { - total_yield, - interest_rate, - //coupon_yield_before: 0, - }); - processed += 1; - Self::deposit_event(RawEvent::BondCouponYield(*id, total_yield)); - } - // save current liability in bond_credit field - bond.bond_credit = total_yield; - BondCouponYield::insert(id, bond_yields); - - Self::deposit_event(RawEvent::BondCouponYield(*id, total_yield)); - processed - } - - ///
-    /// Redeem bond units, get principal value, and coupon yield in the balance
-    /// Function summarizes data from all passed periods,
-    /// calculates coupon yield for each BondUnitsPackage, owned by bondholder.
-    /// For each BondUnitsPackage, owned by "bondholder"(containing "payment_period"
-    /// when it was bought), the "package_yield" value is calculated (yield per one bond unit).
-    /// This "package_yield" then used to summarize yields of all bond's BondUnitsPackages.
-    /// 
- pub fn redeem_bond_units( - id: &BondId, - bond: &mut BondStructOf, - bondholder: &T::AccountId, - ) -> EverUSDBalance { - let packages = BondUnitPackageRegistry::::take(id, &bondholder); - let time_step = T::TimeStep::get(); - let bond_yields = BondCouponYield::get(id); - assert!(!bond_yields.is_empty()); - // calc coupon yield - let mut payable: EverUSDBalance = bond_yields - .iter() - .enumerate() - .map(|(i, bond_yield)| { - let period_desc = bond.period_desc(i as BondPeriodNumber).unwrap(); - let package_yield = bond.inner.bond_units_base_price / 1000 - * bond_yield.interest_rate as EverUSDBalance - / INTEREST_RATE_YEAR; - packages - .iter() - .map(|package| { - package_yield - * package.bond_units as EverUSDBalance - * (period_desc.duration(package.acquisition) / time_step) - as EverUSDBalance - / 100 - }) - .sum::() - }) - .sum::(); - - let (bond_units, paid_yield): (BondUnitAmount, EverUSDBalance) = - packages.iter().fold((0, 0), |acc, package| { - (acc.0 + package.bond_units, acc.1 + package.coupon_yield) - }); - // substrate paid coupon - payable -= paid_yield; - // add principal value - payable += bond.par_value(bond_units); - bond.coupon_yield += payable; - - Self::balance_add(bondholder, payable).unwrap(); - - payable - } - - ///
-    /// Transfer accrued coupon yield into bondholder balance
-
-    /// Calculates "non-spent" amount of EverUSD, that bondholder can receive,
-    /// (gathering separate yields from all his BondUnitsPackage-s), transfers
-    /// EverUSD to bondholder and stores information about "aready-transfered"
-    /// amount of EverUSD for given bondholder.
-    /// For each BondUnitsPackage, owned by "bondholder"(containing "payment_period"
-    /// when it was bought), the "package_yield" value is calculated (yield per one bond unit).
-    /// This "package_yield" then used to summarize yields of all bond's BondUnitsPackages
-    /// and transfers this amount to bondholder from bond's balance.
-    /// 
- pub fn request_coupon_yield( - id: &BondId, - bond: &mut BondStructOf, - bondholder: &T::AccountId, - ) -> EverUSDBalance { - let bond_yields = BondCouponYield::get(id); - - let total_yield = bond_yields - .last() - .map(|period_yield| period_yield.total_yield) - .unwrap_or(0); - - if total_yield == 0 || bond.bond_debit == 0 { - return 0; - } - - debug_assert!(!bond_yields.is_empty()); - - let current_coupon_yield = min(bond.bond_debit, total_yield); - - let mut last_bondholder_coupon_yield = BondLastCouponYield::::get(id, bondholder); - debug_assert!(current_coupon_yield >= last_bondholder_coupon_yield.coupon_yield); - debug_assert!(bond_yields.len() > last_bondholder_coupon_yield.period_num as usize); - - if last_bondholder_coupon_yield.coupon_yield == current_coupon_yield { - // no more accrued coupon yield - return 0; - } - - let time_step = T::TimeStep::get(); - let mut payable = 0; - - let mut prev_total_yield = if last_bondholder_coupon_yield.period_num == 0 { - 0 - } else { - bond_yields[last_bondholder_coupon_yield.period_num as usize - 1].total_yield - }; - - for (i, bond_yield) in bond_yields - .iter() - .enumerate() - .skip(last_bondholder_coupon_yield.period_num as usize) - { - /* - native::info!( - "period {}. period_yield {}-{}, current total coupon yield {}, bondholder {};", - i, - prev_total_yield, - bond_yield.total_yield, - current_coupon_yield, - last_bondholder_coupon_yield.coupon_yield, - ); - */ - - if last_bondholder_coupon_yield.coupon_yield >= current_coupon_yield { - break; - } - // don't open next period till the current period be fully repaid - if current_coupon_yield <= prev_total_yield { - break; - } - // current period accrued coupon yield - let accrued_yield = bond_yield.total_yield.saturating_sub(prev_total_yield); - prev_total_yield = bond_yield.total_yield; - - let coupon_yield = if current_coupon_yield >= bond_yield.total_yield { - bond_yield.total_yield - } else { - current_coupon_yield - }; - // to be distributed among bondholders - let installment = - coupon_yield.saturating_sub(last_bondholder_coupon_yield.coupon_yield); - - last_bondholder_coupon_yield.coupon_yield = coupon_yield; - last_bondholder_coupon_yield.period_num = i as BondPeriodNumber; - - if installment == 0 { - continue; - } - - debug_assert!(installment <= accrued_yield); - - let package_yield = bond.inner.bond_units_base_price / 1000 - * bond_yield.interest_rate as EverUSDBalance - / INTEREST_RATE_YEAR; - - let period_desc = bond.period_desc(i as BondPeriodNumber).unwrap(); - - BondUnitPackageRegistry::::mutate(id, &bondholder, |packages| { - for package in packages.iter_mut() { - let accrued = package_yield - * package.bond_units as EverUSDBalance - * (period_desc.duration(package.acquisition) / time_step) as EverUSDBalance - / 100; - - let package_coupon_yield = if installment == accrued_yield { - accrued - } else { - (installment as u128 * accrued as u128 / accrued_yield as u128) as u64 - }; - - payable += package_coupon_yield; - package.coupon_yield += package_coupon_yield; - } - }); - } - - bond.coupon_yield = bond.coupon_yield.saturating_add(payable); - - BondLastCouponYield::::insert(id, &bondholder, last_bondholder_coupon_yield); - Self::balance_add(bondholder, payable).unwrap(); - payable - } - - ///
-    /// Returns effective coupon interest rate for `period`.
-    /// Iterates through periods, calculating interest_rate for each period
-    /// based on data of previous period(data can be absent). In case of absence
-    /// of impact data, "interest_rate_penalty_for_missed_report" is applied
-    /// to each new "empty" period, until "interest_rate_margin_cap" is reached.
-    /// Common complexity is O(1), O(N) in worst case(when no reports were sent)
-    /// 
- #[cfg(test)] - pub fn calc_bond_interest_rate( - bond: &BondStructOf, - reports: &[BondImpactReportStruct], - period: usize, - ) -> bond::BondInterest { - assert!(reports.len() >= period); - - let mut missed_periods = 0; - let mut interest: bond::BondInterest = bond.inner.interest_rate_start_period_value; - - for (report, baseline) in reports[0..period] - .iter() - .zip(bond.inner.impact_data_baseline[0..period].iter()) - .rev() - { - if report.signed { - interest = bond.calc_effective_interest_rate(*baseline, report.impact_data); - break; - } - missed_periods += 1; - } - - min( - bond.inner.interest_rate_margin_cap, - interest + missed_periods * bond.inner.interest_rate_penalty_for_missed_report, - ) - } - ///
-    /// Checks if a report comes at the right time.
-    /// Impact data (and confirmation by Auditor) must be sent
-    /// after "impact_data_send_period" seconds before end of a payment_period
-    /// and before end of a payment_period.
-    /// 
- fn is_report_in_time( - bond: &BondStructOf, - now: ::Moment, - period: BondPeriodNumber, - ) -> bool { - // get the number of seconds from bond activation - let (moment, _current_period) = - ensure_active!(bond.time_passed_after_activation(now), false); - // impact report should be sent and signed not early than interval for send report begins - // and not later than current period ends - bond.period_desc(period) - .map(|desc| moment >= desc.impact_data_send_period && moment < desc.payment_period) - .unwrap_or(false) - } - - ///
-    /// Checks if it's a right time for Issuer to pay interest for this period
-    /// Payment must be sent before "interest_pay_period" seconds are passed
-    /// after payment_period beginning
-    /// 
- fn is_interest_pay_period( - bond: &BondStructOf, - now: ::Moment, - ) -> bool { - let (moment, period) = ensure_active!(bond.time_passed_after_activation(now), true); - - bond.period_desc(period) - .map(|desc| moment < desc.interest_pay_period) - .unwrap_or(true) - } - - #[cfg(test)] - fn set_balance(who: &T::AccountId, amount: EverUSDBalance) { - BalanceEverUSD::::insert(who, amount) - } - - #[cfg(test)] - fn set_impact_data( - bond: &BondId, - period: BondPeriodNumber, - impact_data: u64, - ) -> DispatchResult { - BondImpactReport::try_mutate(&bond, |reports| -> DispatchResult { - let index = period as usize; - - reports[index].signed = true; - reports[index].impact_data = impact_data; - reports[index].create_period = 1; //dirty hack. test require nonzero value - - Ok(()) - }) - } - - #[cfg(test)] - fn evercity_balance() -> ledger::EvercityBalance { - let account: EverUSDBalance = BalanceEverUSD::::iter_values().sum(); - let bond_fund: EverUSDBalance = BondRegistry::::iter_values() - .map(|bond| bond.bond_debit - bond.coupon_yield) - .sum(); - - ledger::EvercityBalance { - supply: TotalSupplyEverUSD::get(), - account, - bond_fund, - } - } -} diff --git a/vendor/evercity/src/mock.rs b/vendor/evercity/src/mock.rs deleted file mode 100644 index 80787a34a..000000000 --- a/vendor/evercity/src/mock.rs +++ /dev/null @@ -1,204 +0,0 @@ -#![allow(clippy::from_over_into)] -#![allow(clippy::large_enum_variant)] - -use crate::{self as pallet_evercity, *}; -use frame_support::parameter_types; -use frame_support::sp_runtime::{ - testing::Header, - traits::{BlakeTwo256, IdentityLookup}, -}; -use sp_core::H256; - -type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; -type Block = frame_system::mocking::MockBlock; - -frame_support::construct_runtime!( - pub enum TestRuntime where - Block = Block, - NodeBlock = Block, - UncheckedExtrinsic = UncheckedExtrinsic, - { - System: frame_system::{Module, Call, Config, Storage, Event}, - Balances: pallet_balances::{Module, Call, Storage, Config, Event}, - Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, - Evercity: pallet_evercity::{Module, Call, Storage, Event}, - } -); - -// Configure a mock runtime to test the pallet. -pub const MILLISECS_PER_BLOCK: u64 = 6000; -pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; -pub const EVERUSD_MAX_MINT_AMOUNT: EverUSDBalance = 60_000_000_000_000_000; // =60 million dollar -pub const UNIT: EverUSDBalance = 1_000_000_000; - -parameter_types! { - pub const BlockHashCount: u64 = 2400; -} - -impl frame_system::Config for TestRuntime { - type Origin = Origin; - type Index = u64; - type BlockNumber = u64; - type Call = Call; - 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 DbWeight = (); - type BaseCallFilter = (); - type SystemWeightInfo = (); - type BlockWeights = (); - type BlockLength = (); - type SS58Prefix = (); -} - -parameter_types! { - pub const BurnRequestTtl: u32 = DEFAULT_DAY_DURATION as u32 * 7 * 1000; - pub const MintRequestTtl: u32 = DEFAULT_DAY_DURATION as u32 * 7 * 1000; - pub const MaxMintAmount: EverUSDBalance = EVERUSD_MAX_MINT_AMOUNT; - pub const TimeStep: BondPeriod = DEFAULT_DAY_DURATION; -} - -impl Config for TestRuntime { - type Event = Event; - type BurnRequestTtl = BurnRequestTtl; - type MintRequestTtl = MintRequestTtl; - type MaxMintAmount = MaxMintAmount; - type TimeStep = TimeStep; - type WeightInfo = (); - type OnAddAccount = (); - type OnAddBond = (); -} - -parameter_types! { - pub const MinimumPeriod: u64 = SLOT_DURATION / 2; -} - -impl pallet_timestamp::Config for TestRuntime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); -} - -parameter_types! { - pub const ExistentialDeposit: u64 = 0; - pub const MaxLocks: u32 = 50; -} - -impl pallet_balances::Config for TestRuntime { - type Balance = u64; - type Event = Event; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = MaxLocks; -} -// (AccountId, role) -static ROLES: [(u64, u8); 8] = [ - (1_u64, MASTER_ROLE_MASK), - (2_u64, CUSTODIAN_ROLE_MASK), - (3_u64, ISSUER_ROLE_MASK), - (4_u64, INVESTOR_ROLE_MASK), - (5_u64, AUDITOR_ROLE_MASK), - (6_u64, INVESTOR_ROLE_MASK), - (7_u64, ISSUER_ROLE_MASK | INVESTOR_ROLE_MASK), - (8_u64, MANAGER_ROLE_MASK), -]; - -// Build genesis storage according to the mock runtime. -pub fn new_test_ext() -> frame_support::sp_io::TestExternalities { - let mut t = frame_system::GenesisConfig::default() - .build_storage::() - .unwrap(); - pallet_balances::GenesisConfig:: { - // Provide some initial balances - balances: ROLES.iter().map(|x| (x.0, 100000)).collect(), - } - .assimilate_storage(&mut t) - .unwrap(); - - super::GenesisConfig:: { - // Accounts for tests - genesis_account_registry: ROLES - .iter() - .map(|(acc, role)| { - ( - *acc, - EvercityAccountStructT:: { - roles: *role, - identity: 0, - create_time: 0, - }, - ) - }) - .collect(), - } - .assimilate_storage(&mut t) - .unwrap(); - - t.into() -} - -type BondInnerStruct = BondInnerStructOf; -type BondStruct = BondStructOf; - -pub fn get_test_bond() -> BondStruct { - const PERIODS: usize = 12; - BondStruct { - inner: BondInnerStruct { - docs_pack_root_hash_main: Default::default(), - docs_pack_root_hash_legal: Default::default(), - docs_pack_root_hash_finance: Default::default(), - docs_pack_root_hash_tech: Default::default(), - - impact_data_type: Default::default(), - impact_data_baseline: vec![20000_u64; PERIODS], - impact_data_max_deviation_cap: 30000_u64, - impact_data_max_deviation_floor: 14000_u64, - interest_rate_penalty_for_missed_report: 400, // +0.4% - - interest_rate_base_value: 2000, // 2.0% - interest_rate_margin_cap: 4000, // 4.0% - interest_rate_margin_floor: 1000, // 1.0% - interest_rate_start_period_value: 1900, - start_period: 120 * DEFAULT_DAY_DURATION, - payment_period: 30 * DEFAULT_DAY_DURATION, // every month (30 days) - interest_pay_period: 7 * DEFAULT_DAY_DURATION, // up to 7 days after new period started - mincap_deadline: (20 * DEFAULT_DAY_DURATION * 1000) as u64, - impact_data_send_period: 10 * DEFAULT_DAY_DURATION, // 10 days before next period - bond_duration: PERIODS as BondPeriodNumber, // PERIODS periods for 30 days - bond_finishing_period: 14 * DEFAULT_DAY_DURATION, // 14 days after mature date - - bond_units_mincap_amount: 1000, - bond_units_maxcap_amount: 1800, - bond_units_base_price: 4_000_000_000_000, - }, - - issuer: 0, - manager: 0, - auditor: 0, - impact_reporter: 0, - - issued_amount: 0, - booking_start_date: Default::default(), - active_start_date: Default::default(), - creation_date: Default::default(), - state: Default::default(), - - bond_debit: 0, - bond_credit: 0, - coupon_yield: 0, - nonce: 0, - } -} diff --git a/vendor/evercity/src/period.rs b/vendor/evercity/src/period.rs deleted file mode 100644 index 740c303a1..000000000 --- a/vendor/evercity/src/period.rs +++ /dev/null @@ -1,117 +0,0 @@ -use crate::bond::{BondInterest, BondPeriod, BondPeriodNumber, BondStruct}; -use crate::EverUSDBalance; -use frame_support::{ - codec::{Decode, Encode}, - sp_runtime::RuntimeDebug, - sp_std::cmp::Ordering, -}; -use scale_info::TypeInfo; -#[cfg(feature = "std")] -use serde::{Deserialize, Serialize}; - -// ... | period | ... -// --- | ------------------------- | -------------... -// | | | | -// start report payment interest pay -// >----------------------------< coupon accrual -// report release period >--------< -// coupon pay period >----------< - -pub struct PeriodDescr { - pub start_period: BondPeriod, // sec from activation - pub impact_data_send_period: BondPeriod, // sec from activation - pub payment_period: BondPeriod, // sec from activation - pub interest_pay_period: BondPeriod, // sec from activation -} - -impl PeriodDescr { - /// Returns bond usage time for the period. - /// moment is a time when bond was bought. - pub fn duration(&self, moment: BondPeriod) -> BondPeriod { - if moment <= self.start_period { - self.payment_period - self.start_period - } else if moment >= self.payment_period { - 0 - } else { - self.payment_period - moment - } - } -} - -/// Struct, storing per-period coupon_yield and effective interest_rate for given bond -#[derive(Encode, Decode, Clone, Default, PartialEq, RuntimeDebug, TypeInfo)] -pub struct PeriodYield { - /// bond cumulative accrued yield for this period - #[codec(compact)] - pub total_yield: EverUSDBalance, - // obsolete - // pub coupon_yield_before: EverUSDBalance, - /// effective interest rate for current period - #[codec(compact)] - pub interest_rate: BondInterest, -} - -/// Struct, used by BondApi::get_impact_reports -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Clone, Default, PartialEq, RuntimeDebug)] -pub struct PeriodDataStruct { - pub interest_rate: BondInterest, - pub create_period: BondPeriod, - pub impact_data: u64, - pub signed: bool, -} - -pub struct PeriodIterator<'a, AccountId, Moment, Hash> { - bond: &'a BondStruct, - index: BondPeriodNumber, -} - -impl<'a, AccountId, Moment, Hash> PeriodIterator<'a, AccountId, Moment, Hash> { - pub fn new(bond: &'a BondStruct) -> Self { - PeriodIterator { bond, index: 0 } - } - pub fn starts_with( - bond: &'a BondStruct, - index: BondPeriodNumber, - ) -> Self { - PeriodIterator { bond, index } - } -} - -impl<'a, AccountId, Moment, Hash> core::iter::Iterator - for PeriodIterator<'a, AccountId, Moment, Hash> -{ - type Item = PeriodDescr; - - fn next(&mut self) -> Option { - let inner = &self.bond.inner; - let index = self.index as BondPeriodNumber; - self.index += 1; - let payment_period: BondPeriod = - inner.start_period + inner.payment_period.saturating_mul(index); - match (inner.bond_duration + 1).cmp(&index) { - Ordering::Greater => { - let start_period = if index == 0 { - 0 - } else { - payment_period - inner.payment_period - }; - - Some(PeriodDescr { - payment_period, - start_period, - impact_data_send_period: payment_period - inner.impact_data_send_period, - interest_pay_period: start_period + inner.interest_pay_period, - }) - } - Ordering::Less => None, - Ordering::Equal => Some(PeriodDescr { - payment_period, - start_period: payment_period - inner.payment_period, - impact_data_send_period: payment_period, - // last pay period is special and lasts bond_finishing_period seconds - interest_pay_period: payment_period + inner.bond_finishing_period, - }), - } - } -} diff --git a/vendor/evercity/src/runtime_api.rs b/vendor/evercity/src/runtime_api.rs deleted file mode 100644 index d28da32f9..000000000 --- a/vendor/evercity/src/runtime_api.rs +++ /dev/null @@ -1,8 +0,0 @@ -use frame_support::dispatch::Vec; - -sp_api::decl_runtime_apis! { - pub trait BondApi { - /// delegate call to the pallet get_impact_reports() - fn get_impact_reports(bond: crate::BondId)->Vec; - } -} diff --git a/vendor/evercity/src/tests.rs b/vendor/evercity/src/tests.rs deleted file mode 100644 index c5f9bdd67..000000000 --- a/vendor/evercity/src/tests.rs +++ /dev/null @@ -1,3537 +0,0 @@ -#![allow(clippy::from_over_into)] -use frame_support::{ - assert_noop, assert_ok, dispatch::DispatchResult, sp_io, sp_std::ops::RangeInclusive, - Blake2_256, StorageHasher, -}; - -use crate::bond::transfer_bond_units; -use crate::mock::*; -use crate::{ - BondId, BondImpactReportStruct, BondInnerStructOf, BondPeriodNumber, BondState, BondStructOf, - BondUnitAmount, BondUnitPackage, BondUnitSaleLotStructOf, Error, EverUSDBalance, Module, - AUDITOR_ROLE_MASK, DEFAULT_DAY_DURATION, ISSUER_ROLE_MASK, MASTER_ROLE_MASK, -}; - -type Evercity = Module; -type Timestamp = pallet_timestamp::Module; -type Moment = ::Moment; -type BondInnerStruct = BondInnerStructOf; -type BondStruct = BondStructOf; -type RuntimeError = Error; -type AccountId = ::AccountId; -type BondUnitSaleLotStruct = BondUnitSaleLotStructOf; - -////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Test uses pack of accounts, pre-set in new_test_ext in mock.rs: -// (1, EvercityAccountStruct { roles: MASTER, identity: 10u64}), // MASTER (accountId: 1) -// (2, EvercityAccountStruct { roles: CUSTODIAN, identity: 20u64}), // CUSTODIAN (accountID: 2) -// (3, EvercityAccountStruct { roles: ISSUER, identity: 30u64}), // ISSUER (accountID: 3) -// (4, EvercityAccountStruct { roles: INVESTOR, identity: 40u64}), // INVESTOR (accountId: 4) -// (5, EvercityAccountStruct { roles: AUDITOR, identity: 50u64}), // AUDITOR (accountId: 5) -// (7, EvercityAccountStruct { roles: ISSUER | ISSUER, identity: 70u64}), // ISSUER (accountId: 5) -// (8, EvercityAccountStruct { roles: MANAGER, identity: 80u64}), // MANAGER (accountId: 8) -// (101+ : some external accounts -////////////////////////////////////////////////////////////////////////////////////////////////////////// - -fn bond_current_period(bond: &BondStruct, now: Moment) -> u32 { - bond.time_passed_after_activation(now).unwrap().1 -} - -/// Auxiliary function that replenish account balance -fn add_token(id: AccountId, amount: EverUSDBalance) -> DispatchResult { - Evercity::token_mint_request_create_everusd(Origin::signed(id), amount)?; - Evercity::token_mint_request_confirm_everusd(Origin::signed(CUSTODIAN_ID), id, amount) -} - -/// Converts days into milliseconds -fn days2timestamp(days: u32) -> Moment { - (days * DEFAULT_DAY_DURATION) as u64 * 1000_u64 -} - -/// Returns all accounts -fn iter_accounts() -> RangeInclusive { - 1_u64..=9 -} - -const CUSTODIAN_ID: u64 = 2; - -#[test] -fn it_returns_true_for_correct_role_checks() { - new_test_ext().execute_with(|| { - assert_eq!(Evercity::account_is_master(&1), true); - assert_eq!(Evercity::account_is_custodian(&2), true); - assert_eq!(Evercity::account_is_issuer(&3), true); - assert_eq!(Evercity::account_is_investor(&4), true); - assert_eq!(Evercity::account_is_auditor(&5), true); - assert_eq!(Evercity::account_is_manager(&8), true); - assert_eq!(Evercity::account_is_issuer(&7), true); - assert_eq!(Evercity::account_is_investor(&7), true); - - assert_eq!(Evercity::account_is_master(&100), false); - assert_eq!(Evercity::account_is_custodian(&100), false); - assert_eq!(Evercity::account_is_issuer(&100), false); - assert_eq!(Evercity::account_is_investor(&100), false); - assert_eq!(Evercity::account_is_auditor(&100), false); - assert_eq!(Evercity::account_token_mint_burn_allowed(&100), false); - }); -} - -#[test] -fn it_returns_false_for_incorrect_role_checks() { - new_test_ext().execute_with(|| { - // Dispatch a signed extrinsic. - //assert_ok!(AccountRegistry::insert(Origin::signed(1), EvercityAccountStruct {roles: 1u8, identity: 67u64})); - // Read pallet storage and assert an expected result. - assert_eq!(Evercity::account_is_auditor(&1), false); - assert_eq!(Evercity::account_is_issuer(&2), false); - assert_eq!(Evercity::account_is_investor(&3), false); - assert_eq!(Evercity::account_is_custodian(&4), false); - assert_eq!(Evercity::account_is_master(&5), false); - }); -} - -#[test] -fn it_adds_new_account_with_correct_roles() { - new_test_ext().execute_with(|| { - Timestamp::set_timestamp(12345); - - assert_ok!(Evercity::account_add_with_role_and_data( - Origin::signed(1), - 101, - MASTER_ROLE_MASK, - 88u64 - )); - assert_eq!(Evercity::account_is_master(&101), true); - assert_eq!(Evercity::account_is_investor(&101), false); - - assert_ok!(Evercity::account_add_with_role_and_data( - Origin::signed(1), - 102, - AUDITOR_ROLE_MASK, - 89u64 - )); - assert_eq!(Evercity::account_is_master(&102), false); - assert_eq!(Evercity::account_is_auditor(&102), true); - }); -} - -#[test] -fn it_correctly_sets_new_role_to_existing_account() { - new_test_ext().execute_with(|| { - // add new role to existing account (allowed only for master) - assert_eq!(Evercity::account_is_issuer(&3), true); - assert_ok!(Evercity::account_set_with_role_and_data( - Origin::signed(1), - 3, - AUDITOR_ROLE_MASK, - 88u64 - )); - assert_eq!(Evercity::account_is_issuer(&3), true); - assert_eq!(Evercity::account_is_auditor(&3), true); - assert_eq!(Evercity::account_is_investor(&3), false); - - assert_eq!(Evercity::account_is_custodian(&2), true); - assert_eq!(Evercity::account_is_issuer(&2), false); - assert_ok!(Evercity::account_set_with_role_and_data( - Origin::signed(1), - 2, - ISSUER_ROLE_MASK, - 89u64 - )); - assert_eq!(Evercity::account_is_custodian(&2), true); - assert_eq!(Evercity::account_is_issuer(&2), true); - }); -} - -#[test] -fn it_disable_account() { - new_test_ext().execute_with(|| { - assert_ok!(Evercity::account_add_with_role_and_data( - Origin::signed(1), - 101, - MASTER_ROLE_MASK, - 88u64 - )); - assert_eq!(Evercity::account_is_master(&101), true); - assert_ok!(Evercity::account_disable(Origin::signed(1), 101)); - - assert_eq!(Evercity::account_is_master(&101), false); - }); -} - -#[test] -fn it_try_disable_yourself() { - new_test_ext().execute_with(|| { - assert_noop!( - Evercity::account_disable(Origin::signed(1), 1), - RuntimeError::InvalidAction - ); - assert_noop!( - Evercity::account_set_with_role_and_data(Origin::signed(1), 1, 0, 0), - RuntimeError::InvalidAction - ); - }); -} - -#[test] -fn it_denies_add_and_set_roles_for_non_master() { - new_test_ext().execute_with(|| { - // trying to add account form non-master account - >::set_timestamp(12345); - assert_noop!( - Evercity::account_add_with_role_and_data( - Origin::signed(2), - 101, - MASTER_ROLE_MASK, - 88u64 - ), - RuntimeError::AccountNotAuthorized - ); - - assert_noop!( - Evercity::account_set_with_role_and_data(Origin::signed(2), 3, ISSUER_ROLE_MASK, 88u64), - RuntimeError::AccountNotAuthorized - ); - }); -} - -// mint tokens - -#[test] -fn it_token_mint_create_with_confirm() { - const ACCOUNT: u64 = 4; // INVESTOR - new_test_ext().execute_with(|| { - assert_ok!(Evercity::token_mint_request_create_everusd( - Origin::signed(ACCOUNT), - 100000 - )); - assert_eq!(Evercity::total_supply(), 0); - - assert_ok!(Evercity::token_mint_request_confirm_everusd( - Origin::signed(CUSTODIAN_ID), - ACCOUNT, - 100000 - )); - assert_eq!(Evercity::total_supply(), 100000); - }); -} - -#[test] -fn it_token_mint_create_with_revoke() { - const ACCOUNT: u64 = 4; // INVESTOR - new_test_ext().execute_with(|| { - assert_ok!(Evercity::token_mint_request_create_everusd( - Origin::signed(ACCOUNT), // INVESTOR - 100000 - )); - - assert_ok!(Evercity::token_mint_request_revoke_everusd(Origin::signed( - ACCOUNT - ),)); - - assert_noop!( - Evercity::token_mint_request_confirm_everusd( - Origin::signed(CUSTODIAN_ID), - ACCOUNT, - 100000 - ), - RuntimeError::MintRequestDoesntExist - ); - }); -} - -#[test] -fn it_token_mint_create_with_decline() { - const ACCOUNT: u64 = 4; // INVESTOR - new_test_ext().execute_with(|| { - assert_ok!(Evercity::token_mint_request_create_everusd( - Origin::signed(ACCOUNT), - 100000 - )); - - assert_ok!(Evercity::token_mint_request_decline_everusd( - Origin::signed(CUSTODIAN_ID), - ACCOUNT - )); - - assert_noop!( - Evercity::token_mint_request_revoke_everusd(Origin::signed(ACCOUNT)), - RuntimeError::MintRequestDoesntExist - ); - }); -} - -#[test] -fn it_token_mint_create_denied() { - const ACCOUNT: u64 = 5; // AUDITOR - new_test_ext().execute_with(|| { - assert_noop!( - Evercity::token_mint_request_create_everusd(Origin::signed(ACCOUNT), 100000), - RuntimeError::AccountNotAuthorized - ); - }); -} - -#[test] -fn it_token_mint_create_hasty() { - const ACCOUNT: u64 = 4; // INVESTOR - new_test_ext().execute_with(|| { - assert_ok!(Evercity::token_mint_request_create_everusd( - Origin::signed(ACCOUNT), - 100000 - )); - - assert_noop!( - Evercity::token_mint_request_create_everusd(Origin::signed(ACCOUNT), 10), - RuntimeError::MintRequestAlreadyExist - ); - - // make amend - let ttl: u32 = ::MintRequestTtl::get(); - >::set_timestamp(ttl.into()); - - assert_ok!(Evercity::token_mint_request_create_everusd( - Origin::signed(ACCOUNT), - 10 - )); - }); -} - -#[test] -fn it_token_mint_create_toolarge() { - const ACCOUNT: u64 = 4; - new_test_ext().execute_with(|| { - assert_noop!( - Evercity::token_mint_request_create_everusd( - Origin::signed(ACCOUNT), // INVESTOR - EVERUSD_MAX_MINT_AMOUNT + 1 - ), - RuntimeError::MintRequestParamIncorrect - ); - }); -} - -#[test] -fn it_token_burn_mint_overflow() { - const ACCOUNT: u64 = 4; - new_test_ext().execute_with(|| { - assert_ok!(Evercity::token_mint_request_create_everusd( - Origin::signed(ACCOUNT), - 1000 - )); - - assert_ok!(Evercity::token_mint_request_confirm_everusd( - Origin::signed(CUSTODIAN_ID), - ACCOUNT, - 1000 - )); - assert_noop!( - Evercity::token_burn_request_create_everusd( - Origin::signed(ACCOUNT), - EverUSDBalance::MAX - 1000 - ), - RuntimeError::BalanceOverdraft - ); - // assert_noop!( - // Evercity::token_burn_request_confirm_everusd( - // Origin::signed(CUSTODIAN_ID), - // ACCOUNT, - // EverUSDBalance::MAX - 1000 - // ), - // RuntimeError::BalanceOverdraft - // ); - }); -} - -#[test] -fn it_token_mint_try_confirm_expired() { - const ACCOUNT: u64 = 4; - new_test_ext().execute_with(|| { - assert_ok!(Evercity::token_mint_request_create_everusd( - Origin::signed(ACCOUNT), // INVESTOR - 1000 - )); - >::set_timestamp(days2timestamp(10)); - assert_noop!( - Evercity::token_mint_request_confirm_everusd( - Origin::signed(CUSTODIAN_ID), - ACCOUNT, - 1000 - ), - RuntimeError::MintRequestObsolete - ); - }); -} - -// burn tokens - -#[test] -fn it_token_burn_create_with_confirm() { - const ACCOUNT: u64 = 4; // INVESTOR - - new_test_ext().execute_with(|| { - assert_ok!(add_token(ACCOUNT, 10000)); - - assert_ok!(Evercity::token_burn_request_create_everusd( - Origin::signed(ACCOUNT), - 10000 - )); - - assert_eq!(Evercity::total_supply(), 10000); - - assert_ok!(Evercity::token_burn_request_confirm_everusd( - Origin::signed(CUSTODIAN_ID), - ACCOUNT, - 10000 - )); - - assert_eq!(Evercity::total_supply(), 0); - // duplicate confirmations is not allowed - assert_noop!( - Evercity::token_burn_request_confirm_everusd( - Origin::signed(CUSTODIAN_ID), - ACCOUNT, - 10000 - ), - RuntimeError::BurnRequestDoesntExist - ); - }); -} - -#[test] -fn it_token_burn_create_overrun() { - const ACCOUNT: u64 = 3; // ISSUER - const BALANCE: EverUSDBalance = 10000; - - new_test_ext().execute_with(|| { - assert_ok!(add_token(ACCOUNT, BALANCE)); - - assert_noop!( - Evercity::token_burn_request_create_everusd(Origin::signed(ACCOUNT), BALANCE + 1), - RuntimeError::BalanceOverdraft - ); - }); -} - -#[test] -fn it_token_burn_create_with_revoke() { - const ACCOUNT: u64 = 3; // ISSUER - - new_test_ext().execute_with(|| { - assert_ok!(add_token(ACCOUNT, 10000)); - - assert_ok!(Evercity::token_burn_request_create_everusd( - Origin::signed(ACCOUNT), - 10000 - )); - - assert_ok!(Evercity::token_burn_request_revoke_everusd(Origin::signed( - ACCOUNT - ),)); - - assert_noop!( - Evercity::token_burn_request_confirm_everusd( - Origin::signed(CUSTODIAN_ID), - ACCOUNT, - 10000 - ), - RuntimeError::BurnRequestDoesntExist - ); - }); -} - -#[test] -fn it_token_burn_try_confirm_expired() { - const ACCOUNT: u64 = 4; - new_test_ext().execute_with(|| { - assert_ok!(add_token(ACCOUNT, 10000)); - assert_ok!(Evercity::token_burn_request_create_everusd( - Origin::signed(ACCOUNT), // INVESTOR - 1000 - )); - >::set_timestamp(days2timestamp(10)); - assert_noop!( - Evercity::token_burn_request_confirm_everusd( - Origin::signed(CUSTODIAN_ID), - ACCOUNT, - 1000 - ), - RuntimeError::BurnRequestObsolete - ); - }); -} - -#[test] -fn it_token_burn_hasty() { - const ACCOUNT: u64 = 4; // INVESTOR - - new_test_ext().execute_with(|| { - assert_ok!(add_token(ACCOUNT, 10000)); - - assert_ok!(Evercity::token_burn_request_create_everusd( - Origin::signed(ACCOUNT), - 5000 - )); - assert_noop!( - Evercity::token_burn_request_create_everusd(Origin::signed(ACCOUNT), 10000), - RuntimeError::BurnRequestAlreadyExist - ); - - // make amend - let ttl: u32 = ::BurnRequestTtl::get(); - >::set_timestamp(ttl.into()); - - assert_ok!(Evercity::token_burn_request_create_everusd( - Origin::signed(ACCOUNT), - 10000 - )); - }) -} -// fuse - -#[test] -fn fuse_is_blone() { - new_test_ext().execute_with(|| { - let fuse = Evercity::fuse(); - assert_eq!(fuse, true); - - assert_noop!( - Evercity::set_master(Origin::signed(2),), - RuntimeError::InvalidAction - ); - }) -} - -#[test] -fn fuse_is_intact_on_bare_storage() { - let mut ext: sp_io::TestExternalities = frame_system::GenesisConfig::default() - .build_storage::() - .unwrap() - .into(); - - ext.execute_with(|| { - assert_eq!(Evercity::fuse(), false); - - assert_noop!( - Evercity::account_add_with_role_and_data(Origin::signed(1), 101, MASTER_ROLE_MASK, 0), - RuntimeError::AccountNotAuthorized - ); - assert_ok!(Evercity::set_master(Origin::signed(1),)); - // make amend - assert_ok!(Evercity::account_add_with_role_and_data( - Origin::signed(1), - 101, - MASTER_ROLE_MASK, - 0 - )); - - assert_eq!(Evercity::fuse(), true); - assert_noop!( - Evercity::set_master(Origin::signed(2),), - RuntimeError::InvalidAction - ); - }); -} -// bonds - -fn create_bond_unit_package(amount: Vec) -> Vec { - amount - .into_iter() - .map(|bond_units| BondUnitPackage { - bond_units, - acquisition: 0, - coupon_yield: 0, - }) - .collect() -} - -fn bond_unit_package_amount(package: Vec) -> Vec { - package.into_iter().map(|item| item.bond_units).collect() -} - -#[test] -fn bond_transfer_units() { - new_test_ext().execute_with(|| { - let mut from_package = create_bond_unit_package(vec![5, 2, 10, 1]); - let mut to_package = create_bond_unit_package(vec![]); - assert_ok!(transfer_bond_units::( - &mut from_package, - &mut to_package, - 3 - )); - - assert_eq!(bond_unit_package_amount(from_package), vec![10, 5]); - assert_eq!(bond_unit_package_amount(to_package), vec![1, 2]); - - let mut from_package = create_bond_unit_package(vec![5, 2, 10, 1]); - let mut to_package = create_bond_unit_package(vec![]); - - assert_ok!(transfer_bond_units::( - &mut from_package, - &mut to_package, - 10 - )); - - assert_eq!(bond_unit_package_amount(from_package), vec![8]); - assert_eq!(bond_unit_package_amount(to_package), vec![1, 2, 5, 2]); - - let mut from_package = create_bond_unit_package(vec![5, 2, 10, 1]); - let mut to_package = create_bond_unit_package(vec![]); - - assert_ok!(transfer_bond_units::( - &mut from_package, - &mut to_package, - 2 - )); - - assert_eq!(bond_unit_package_amount(from_package), vec![10, 5, 1]); - assert_eq!(bond_unit_package_amount(to_package), vec![1, 1]); - - let mut from_package = create_bond_unit_package(vec![5, 2, 10, 1]); - let mut to_package = create_bond_unit_package(vec![]); - - assert_noop!( - transfer_bond_units::(&mut from_package, &mut to_package, 20), - RuntimeError::BondParamIncorrect - ); - }); -} - -#[test] -fn bond_validation() { - new_test_ext().execute_with(|| { - let bond = get_test_bond(); - assert_eq!(bond.inner.is_valid(DEFAULT_DAY_DURATION), true); - }); -} - -#[test] -fn bond_check_equation() { - new_test_ext().execute_with(|| { - let bond1 = get_test_bond(); - - let mut bond2 = bond1.clone(); - assert_eq!(bond1.inner, bond2.inner); - bond2.inner.docs_pack_root_hash_legal = Blake2_256::hash(b"").into(); - - assert!(bond1.inner.is_financial_options_eq(&bond2.inner)); - assert_ne!(bond1.inner, bond2.inner); - - bond2.inner.docs_pack_root_hash_legal = bond1.inner.docs_pack_root_hash_legal; - bond2.inner.payment_period += 1; - - assert!(!bond1.inner.is_financial_options_eq(&bond2.inner)); - assert_ne!(bond1.inner, bond2.inner); - }); -} - -#[test] -fn bond_interest_min_max() { - new_test_ext().execute_with(|| { - let bond = get_test_bond(); - let impact_base_value = bond.inner.impact_data_baseline[0]; - // full amplitude - assert_eq!( - bond.calc_effective_interest_rate(impact_base_value, impact_base_value), - bond.inner.interest_rate_base_value - ); - assert_eq!( - bond.calc_effective_interest_rate( - impact_base_value, - bond.inner.impact_data_max_deviation_cap, - ), - bond.inner.interest_rate_margin_floor - ); - assert_eq!( - bond.calc_effective_interest_rate( - impact_base_value, - bond.inner.impact_data_max_deviation_cap + 1, - ), - bond.inner.interest_rate_margin_floor - ); - assert_eq!( - bond.calc_effective_interest_rate( - impact_base_value, - bond.inner.impact_data_max_deviation_floor, - ), - bond.inner.interest_rate_margin_cap - ); - assert_eq!( - bond.calc_effective_interest_rate( - impact_base_value, - bond.inner.impact_data_max_deviation_floor - 1, - ), - bond.inner.interest_rate_margin_cap - ); - - // partial amplitude - assert_eq!( - bond.calc_effective_interest_rate(impact_base_value, 25000_u64), - 1500 - ); - assert_eq!( - bond.calc_effective_interest_rate(impact_base_value, 29000_u64), - 1100 - ); - - assert_eq!( - bond.calc_effective_interest_rate(impact_base_value, 17000_u64), - 3000 - ); - assert_eq!( - bond.calc_effective_interest_rate(impact_base_value, 15000_u64), - 3666 - ); - }); -} - -#[test] -fn bond_period_interest_rate() { - new_test_ext().execute_with(|| { - let bond = get_test_bond(); - - assert!(bond - .inner - .impact_data_baseline - .iter() - .all(|&v| v == 20000_u64)); - - let reports: Vec = vec![ - //missing report - BondImpactReportStruct { - create_period: 0, - impact_data: 0, - signed: false, - }, - BondImpactReportStruct { - create_period: 0, - impact_data: 20000_u64, - signed: true, - }, - //missing report - BondImpactReportStruct { - create_period: 0, - impact_data: 0, - signed: false, - }, - // worst result and maximal interest rate value - BondImpactReportStruct { - create_period: 0, - impact_data: 14000_u64, - signed: true, - }, - //missing report. it cannot make interest rate worse - BondImpactReportStruct { - create_period: 0, - impact_data: 0, - signed: false, - }, - // very good result lead to mininal interest rate - BondImpactReportStruct { - create_period: 0, - impact_data: 100000_u64, - signed: true, - }, - //first missing report. - BondImpactReportStruct { - create_period: 0, - impact_data: 0, - signed: false, - }, - //second missing report. - BondImpactReportStruct { - create_period: 0, - impact_data: 0, - signed: false, - }, - ]; - - assert_eq!( - bond.inner.interest_rate_start_period_value, - Evercity::calc_bond_interest_rate(&bond, reports.as_ref(), 0) - ); - - assert_eq!( - bond.inner.interest_rate_start_period_value - + bond.inner.interest_rate_penalty_for_missed_report, - Evercity::calc_bond_interest_rate(&bond, reports.as_ref(), 1) - ); - - assert_eq!( - bond.inner.interest_rate_base_value, - Evercity::calc_bond_interest_rate(&bond, reports.as_ref(), 2) - ); - - assert_eq!( - bond.inner.interest_rate_base_value - + bond.inner.interest_rate_penalty_for_missed_report, - Evercity::calc_bond_interest_rate(&bond, reports.as_ref(), 3) - ); - - assert_eq!( - bond.inner.interest_rate_margin_cap, - Evercity::calc_bond_interest_rate(&bond, reports.as_ref(), 4) - ); - // missing report cannot increase insterested rate above maximal value - assert_eq!( - bond.inner.interest_rate_margin_cap, - Evercity::calc_bond_interest_rate(&bond, reports.as_ref(), 5) - ); - - assert_eq!( - bond.inner.interest_rate_margin_floor, - Evercity::calc_bond_interest_rate(&bond, reports.as_ref(), 6) - ); - - assert_eq!( - bond.inner.interest_rate_margin_floor - + bond.inner.interest_rate_penalty_for_missed_report, - Evercity::calc_bond_interest_rate(&bond, reports.as_ref(), 7) - ); - - assert_eq!( - bond.inner.interest_rate_margin_floor - + 2 * bond.inner.interest_rate_penalty_for_missed_report, - Evercity::calc_bond_interest_rate(&bond, reports.as_ref(), 8) - ); - }); -} - -#[test] -fn bond_create_with_small_start_period() { - let bondid1: BondId = "B1".into(); - const ACCOUNT: u64 = 3; - new_test_ext().execute_with(|| { - let mut bond = get_test_bond().inner; - bond.start_period = bond.impact_data_send_period; - assert!(bond.start_period < bond.payment_period); - assert!(bond.start_period >= bond.impact_data_send_period); - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid1, - bond - )); - }) -} - -#[test] -fn bond_create_with_min_period() { - let bondid1: BondId = "B1".into(); - const ACCOUNT: u64 = 3; - - new_test_ext().execute_with(|| { - let mut bond = get_test_bond().inner; - bond.bond_finishing_period = DEFAULT_DAY_DURATION; - bond.payment_period = DEFAULT_DAY_DURATION; - bond.start_period = DEFAULT_DAY_DURATION; - bond.interest_pay_period = DEFAULT_DAY_DURATION; - bond.impact_data_send_period = DEFAULT_DAY_DURATION; - - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid1, - bond - )); - }) -} - -#[test] -fn bond_create_series() { - let bond = get_test_bond(); - let bondid1: BondId = "B1".into(); - let bondid2: BondId = "B2".into(); - let bondid3: BondId = "B3".into(); - - const ACCOUNT: u64 = 3; - - new_test_ext().execute_with(|| { - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid1, - bond.inner.clone() - )); - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid2, - bond.inner.clone() - )); - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid3, - bond.inner.clone() - )); - assert_noop!( - Evercity::bond_add_new(Origin::signed(ACCOUNT), bondid3, bond.inner.clone()), - RuntimeError::BondAlreadyExists - ); - }); -} - -#[test] -// unique case scenario -fn bond_buy_bond_uc() { - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const AUDITOR: u64 = 5; - const INVESTOR1: u64 = 4; - - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - assert_ok!(add_token(INVESTOR1, 4_000_000_000_000_000)); - - let mut bond = get_test_bond().inner; - bond.mincap_deadline = 50_000; - bond.bond_units_mincap_amount = 1000; - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond - )); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - - >::set_timestamp(50_000); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 1000 - )); - assert_ok!(Evercity::bond_set_auditor( - Origin::signed(MASTER), - bondid, - AUDITOR - )); - assert_ok!(Evercity::bond_activate(Origin::signed(MASTER), bondid, 2)); - - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.issued_amount, 1000); - assert_eq!(Evercity::balance_everusd(&ACCOUNT), 4_000_000_000_000_000); - assert_eq!(Evercity::balance_everusd(&INVESTOR1), 0); - }); -} - -#[test] -fn bond_try_create_by_nonissuer() { - let bond = get_test_bond(); - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - for acc in iter_accounts().filter(|acc| !Evercity::account_is_issuer(acc)) { - assert_noop!( - Evercity::bond_add_new(Origin::signed(acc), bondid, bond.inner.clone()), - RuntimeError::AccountNotAuthorized - ); - } - }); -} - -#[test] -fn bond_try_activate_without_release() { - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - get_test_bond().inner - )); - >::set_timestamp(days2timestamp(1)); - // try to buy some bonds in prepare state - assert_noop!( - Evercity::bond_unit_package_buy(Origin::signed(INVESTOR1), bondid, 0, 600), - RuntimeError::BondStateNotPermitAction - ); - // try to activate bond - assert_noop!( - Evercity::bond_activate(Origin::signed(MASTER), bondid, 0), - RuntimeError::BondStateNotPermitAction - ); - }) -} - -#[test] -fn bond_try_activate_by_nonmaster() { - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const AUDITOR: u64 = 5; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - get_test_bond().inner - )); - >::set_timestamp(days2timestamp(1)); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - // try to buy some bonds in prepare state - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 1000 - )); - assert_ok!(Evercity::bond_set_auditor( - Origin::signed(MASTER), - bondid, - AUDITOR - )); - // try to activate bond - for acc in iter_accounts().filter(|acc| !Evercity::account_is_master(acc)) { - assert_noop!( - Evercity::bond_activate(Origin::signed(acc), bondid, 0), - RuntimeError::AccountNotAuthorized - ); - } - // make amend - assert_ok!(Evercity::bond_activate(Origin::signed(MASTER), bondid, 2)); - }) -} - -#[test] -fn bond_try_activate_without_auditor() { - let mut bond = get_test_bond(); - let bondid: BondId = "BOND".into(); - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const AUDITOR: u64 = 5; - - new_test_ext().execute_with(|| { - assert_ok!(add_token(INVESTOR1, 50_000_000_000_000_000)); - - bond.inner.mincap_deadline = 50000; - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner - )); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 1000 - )); - assert_noop!( - Evercity::bond_activate(Origin::signed(MASTER), bondid, 1), - RuntimeError::BondIsNotConfigured - ); - // make amends - assert_ok!(Evercity::bond_set_auditor( - Origin::signed(MASTER), - bondid, - AUDITOR - )); - assert_ok!(Evercity::bond_activate(Origin::signed(MASTER), bondid, 2)); - }); -} - -#[test] -fn bond_try_revoke_after_release() { - const ACCOUNT: u64 = 3; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, get_test_bond().inner); - - assert_noop!( - Evercity::bond_withdraw(Origin::signed(ACCOUNT), bondid), - RuntimeError::BondStateNotPermitAction - ); - assert_noop!( - Evercity::bond_revoke(Origin::signed(ACCOUNT), bondid), - RuntimeError::BondStateNotPermitAction - ); - }); -} - -#[test] -fn bond_try_withdraw_before_deadline() { - let mut bond = get_test_bond(); - let bondid: BondId = "BOND".into(); - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - - new_test_ext().execute_with(|| { - assert_ok!(add_token(INVESTOR1, 50_000_000_000_000_000)); - - bond.inner.mincap_deadline = 50000; - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner - )); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 100 - )); - >::set_timestamp(49000); - assert_noop!( - Evercity::bond_withdraw(Origin::signed(MASTER), bondid,), - RuntimeError::BondStateNotPermitAction - ); - // make amends - >::set_timestamp(51000); - assert_ok!(Evercity::bond_withdraw(Origin::signed(MASTER), bondid,)); - let chain_bond_item = Evercity::get_bond(&bondid); - - assert_eq!(chain_bond_item.state, BondState::PREPARE); - assert_eq!(chain_bond_item.bond_credit, 0); - }); -} - -#[test] -fn bond_try_withdraw_by_investor() { - let mut bond = get_test_bond(); - let bondid: BondId = "BOND".into(); - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - - new_test_ext().execute_with(|| { - assert_ok!(add_token(INVESTOR1, 50_000_000_000_000_000)); - - bond.inner.mincap_deadline = 50000; - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner - )); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 100 - )); - - >::set_timestamp(51000); - assert_noop!( - Evercity::bond_withdraw(Origin::signed(INVESTOR1), bondid,), - RuntimeError::BondAccessDenied - ); - - // make amends - assert_ok!(Evercity::bond_withdraw(Origin::signed(MASTER), bondid,)); - - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.state, BondState::PREPARE); - assert_eq!(chain_bond_item.issued_amount, 0); - assert_eq!(chain_bond_item.bond_credit, 0); - assert_eq!(chain_bond_item.bond_debit, 0); - assert_eq!( - Evercity::balance_everusd(&INVESTOR1), - 50_000_000_000_000_000 - ); - - assert_eq!(Evercity::bond_packages(&bondid).is_empty(), true); - }); -} - -#[test] -fn bond_try_manage_foreign_bond() { - let mut bond = get_test_bond(); - let bondid: BondId = "BOND".into(); - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const MANAGER: u64 = 8; - - new_test_ext().execute_with(|| { - bond.inner.mincap_deadline = 50000; - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner - )); - - let mut update = get_test_bond().inner; - update.mincap_deadline = 60000; - - for acc in iter_accounts().filter(|acc| *acc != ACCOUNT) { - assert_noop!( - Evercity::bond_update(Origin::signed(acc), bondid, 0, update.clone()), - RuntimeError::BondAccessDenied - ); - } - // make amend - assert_ok!(Evercity::bond_set_manager( - Origin::signed(MASTER), - bondid, - MANAGER - )); - assert_ok!(Evercity::bond_update( - Origin::signed(MANAGER), - bondid, - 1, - update - ),); - }); -} - -#[test] -fn bond_try_update_after_release() { - let mut bond = get_test_bond(); - let bondid: BondId = "BOND".into(); - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const AUDITOR: u64 = 5; - - new_test_ext().execute_with(|| { - assert_ok!(add_token(INVESTOR1, 50_000_000_000_000_000)); - - bond.inner.mincap_deadline = 50000; - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner - )); - - // release bond - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - - // hashes can be changed - let mut update = get_test_bond().inner; - update.docs_pack_root_hash_finance = Blake2_256::hash(b"merkle tree hash").into(); - assert_ok!(Evercity::bond_update( - Origin::signed(ACCOUNT), - bondid, - 1, - update - )); - - // the others cannot. TODO add other fields to check - let mut update = get_test_bond().inner; - update.payment_period *= 2; - assert_noop!( - Evercity::bond_update(Origin::signed(ACCOUNT), bondid, 2, update), - RuntimeError::BondStateNotPermitAction - ); - let mut update = get_test_bond().inner; - update.bond_units_base_price = 3_000_000_000_000; - assert_noop!( - Evercity::bond_update(Origin::signed(ACCOUNT), bondid, 2, update), - RuntimeError::BondStateNotPermitAction - ); - let mut update = get_test_bond().inner; - update.impact_data_baseline[0] += 1; - assert_noop!( - Evercity::bond_update(Origin::signed(ACCOUNT), bondid, 2, update), - RuntimeError::BondStateNotPermitAction - ); - - // buy bonds - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 2, - 1200 - )); - assert_ok!(Evercity::bond_set_auditor( - Origin::signed(MASTER), - bondid, - AUDITOR - )); - // activate - assert_ok!(Evercity::bond_activate(Origin::signed(MASTER), bondid, 3)); - - let mut update = get_test_bond().inner; - update.docs_pack_root_hash_finance = Blake2_256::hash(b"merkle tree hash").into(); - // try change after activation - assert_noop!( - Evercity::bond_update(Origin::signed(ACCOUNT), bondid, 4, update), - RuntimeError::BondStateNotPermitAction - ); - }); -} - -#[test] -fn bond_try_activate_insufficient_fund_raising() { - let mut bond = get_test_bond(); - let bondid: BondId = "BOND".into(); - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const AUDITOR: u64 = 5; - - new_test_ext().execute_with(|| { - assert_ok!(add_token(INVESTOR1, 50_000_000_000_000_000)); - - bond.inner.mincap_deadline = 50000; - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner - )); - - // try activate before been issued - assert_noop!( - Evercity::bond_activate(Origin::signed(MASTER), bondid, 0), - RuntimeError::BondStateNotPermitAction - ); - // try buy bonds before been issued - assert_noop!( - Evercity::bond_unit_package_buy(Origin::signed(INVESTOR1), bondid, 0, 100), - RuntimeError::BondStateNotPermitAction - ); - // release bond - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - // buy limited number of bonds - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 100 - )); - assert_ok!(Evercity::bond_set_auditor( - Origin::signed(MASTER), - bondid, - AUDITOR - )); - - assert_noop!( - Evercity::bond_activate(Origin::signed(MASTER), bondid, 2), - RuntimeError::BondParamIncorrect - ); - // make amends - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 2, - 900 - )); - assert_ok!(Evercity::bond_activate(Origin::signed(MASTER), bondid, 2)); - }); -} - -#[test] -fn bond_try_activate_expired_fund_raising() { - let mut bond = get_test_bond(); - let bondid: BondId = "BOND".into(); - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const AUDITOR: u64 = 5; - - new_test_ext().execute_with(|| { - assert_ok!(add_token(INVESTOR1, 50_000_000_000_000_000)); - assert!(bond.inner.mincap_deadline < days2timestamp(21)); - - bond.inner.mincap_deadline = 50000; - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner - )); - - // release bond - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - // buy limited number of bonds - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 100 - )); - assert_ok!(Evercity::bond_set_auditor( - Origin::signed(MASTER), - bondid, - AUDITOR - )); - - >::set_timestamp(days2timestamp(21)); - - assert_noop!( - Evercity::bond_activate(Origin::signed(MASTER), bondid, 2), - RuntimeError::BondParamIncorrect - ); - // workaround - assert_ok!(Evercity::bond_withdraw(Origin::signed(ACCOUNT), bondid)); - assert_eq!(Evercity::bond_packages(&bondid).is_empty(), true); - }); -} - -#[test] -fn bond_try_create_with_overflow() { - const ACCOUNT: u64 = 3; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - let mut bond = get_test_bond().inner; - bond.bond_units_maxcap_amount = BondUnitAmount::MAX - 1; - - assert_noop!( - Evercity::bond_add_new(Origin::signed(ACCOUNT), bondid, bond), - RuntimeError::BondParamIncorrect - ); - }); -} - -#[test] -fn bond_try_buy_unit_with_overflow() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - let bond = get_test_bond().inner; - let amount = bond.bond_units_maxcap_amount; - bond_release(bondid, ACCOUNT, bond); - - >::set_timestamp(100_000); - assert_noop!( - Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 2, - BondUnitAmount::MAX - amount - ), - RuntimeError::BondParamIncorrect - ); - }); -} - -#[test] -fn bond_calc_coupon_yield_basic() { - const ACCOUNT: u64 = 3; - let bondid: BondId = "BOND2".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, get_test_bond().inner); - - let mut chain_bond_item = Evercity::get_bond(&bondid); - - assert_eq!(chain_bond_item.active_start_date, 30000); - // pass first (index=0) period - let mut moment: Moment = - 30000_u64 + (chain_bond_item.inner.start_period) as u64 * 1000_u64 + 1_u64; - >::set_timestamp(moment); - - assert_eq!(bond_current_period(&chain_bond_item, moment), 1); - assert!( - Evercity::calc_and_store_bond_coupon_yield(&bondid, &mut chain_bond_item, moment) > 0 - ); - // second call should return false - assert!( - !Evercity::calc_and_store_bond_coupon_yield(&bondid, &mut chain_bond_item, moment) > 0 - ); - - // pass second (index=1) period - moment += chain_bond_item.inner.payment_period as u64 * 1000_u64; - assert_eq!(bond_current_period(&chain_bond_item, moment), 2); - chain_bond_item.bond_debit = 2000; - - assert!( - Evercity::calc_and_store_bond_coupon_yield(&bondid, &mut chain_bond_item, moment) > 0 - ); - - let bond_yields = Evercity::get_coupon_yields(&bondid); - - assert_eq!(bond_yields.len(), 2); - assert_eq!( - bond_yields[0].interest_rate, - chain_bond_item.inner.interest_rate_start_period_value - ); - assert_eq!(bond_yields[0].total_yield, 29_983_561_643_520); - - assert_eq!( - bond_yields[1].interest_rate, - chain_bond_item.inner.interest_rate_start_period_value - + chain_bond_item - .inner - .interest_rate_penalty_for_missed_report - ); - assert_eq!(bond_yields[1].total_yield, 39_057_534_246_240); - }); -} - -#[test] -fn bond_calc_coupon_yield_advanced() { - const ACCOUNT1: u64 = 3; - const ACCOUNT2: u64 = 7; - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - let bondid1: BondId = "BOND1".into(); - let bondid2: BondId = "BOND2".into(); - - fn deposit(account: u64, bond: BondId, amount: EverUSDBalance) -> BondStructOf { - assert_ok!(Evercity::bond_deposit_everusd( - Origin::signed(account), - bond, - amount - )); - Evercity::get_bond(&bond) - } - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid1, ACCOUNT1, get_test_bond().inner); - bond_activate(bondid2, ACCOUNT2, get_test_bond().inner); - - let chain_bond_item1 = Evercity::get_bond(&bondid1); - let chain_bond_item2 = Evercity::get_bond(&bondid2); - - assert_eq!( - chain_bond_item1.active_start_date, - chain_bond_item2.active_start_date - ); - - let start_moment = chain_bond_item1.active_start_date; - - // set impact data - for period in 0..12_usize { - assert_ok!(Evercity::set_impact_data( - &bondid1, - period as BondPeriodNumber, - chain_bond_item1.inner.impact_data_baseline[period] - )); - - assert_ok!(Evercity::set_impact_data( - &bondid2, - period as BondPeriodNumber, - chain_bond_item2.inner.impact_data_baseline[period] - )); - } - Evercity::set_balance(&INVESTOR1, 0); - Evercity::set_balance(&INVESTOR2, 0); - - Evercity::set_balance(&ACCOUNT1, 124668493149600 + 4000 * 600 * 2 * UNIT); - Evercity::set_balance(&ACCOUNT2, 124668493149600 + 4000 * 600 * 2 * UNIT); - - let mut chain_bond_item1 = deposit(ACCOUNT1, bondid1, 20000 * UNIT); - let mut chain_bond_item2 = deposit(ACCOUNT2, bondid2, 20000 * UNIT); - - let now = start_moment + (160 * DEFAULT_DAY_DURATION) as u64 * 1000; - - Evercity::calc_and_store_bond_coupon_yield(&bondid1, &mut chain_bond_item1, now); - Evercity::calc_and_store_bond_coupon_yield(&bondid2, &mut chain_bond_item2, now); - - let bond_yield = Evercity::get_coupon_yields(&bondid1); - println!("bond 1 = {:?}", bond_yield); - let bond_yield = Evercity::get_coupon_yields(&bondid2); - println!("bond 2 = {:?}", bond_yield); - - chain_bond_item1 = deposit(ACCOUNT1, bondid1, 8000 * UNIT); - chain_bond_item2 = deposit(ACCOUNT2, bondid2, 20000 * UNIT); - - let now = start_moment + (220 * DEFAULT_DAY_DURATION) as u64 * 1000; - - Evercity::calc_and_store_bond_coupon_yield(&bondid1, &mut chain_bond_item1, now); - Evercity::calc_and_store_bond_coupon_yield(&bondid2, &mut chain_bond_item2, now); - - let bond_yield = Evercity::get_coupon_yields(&bondid1); - println!("bond 1 = {:?}", bond_yield); - assert_eq!( - bond_yield - .into_iter() - .map(|x| x.total_yield) - .collect::>(), - [ - 29983561643520, - 37873972602360, - 45764383561200, - 53654794520040 - ] - ); - - let bond_yield = Evercity::get_coupon_yields(&bondid2); - println!("bond 2 = {:?}", bond_yield); - - >::set_timestamp(now); - - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR1), - bondid1, - )); - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR2), - bondid1, - )); - - let balance1 = Evercity::balances_everusd(INVESTOR1); - let balance2 = Evercity::balances_everusd(INVESTOR2); - assert_eq!(balance1, balance2); - assert_eq!(balance1, 14000 * UNIT); - println!("balance investor1 {}, investor2 {}", balance1, balance2); - - deposit(ACCOUNT1, bondid1, 30000 * UNIT); - - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR1), - bondid1, - )); - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR2), - bondid1, - )); - - let balance1 = Evercity::balances_everusd(INVESTOR1); - let balance2 = Evercity::balances_everusd(INVESTOR2); - assert_eq!(balance1, balance2); - assert_eq!(balance1, 26827397260020); // 2 * 26827397260020 = 53654794520040 - println!("balance investor1 {}, investor2 {}", balance1, balance2); - - chain_bond_item1 = deposit(ACCOUNT1, bondid1, 20000 * UNIT); - - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR1), - bondid1, - )); - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR2), - bondid1, - )); - - let balance1 = Evercity::balances_everusd(INVESTOR1); - let balance2 = Evercity::balances_everusd(INVESTOR2); - assert_eq!(balance1, balance2); - assert_eq!(balance1, 26827397260020); - println!("balance investor1 {}, investor2 {}", balance1, balance2); - println!("{:?}", chain_bond_item1); - - let now = start_moment + ((12 * 30 + 120) * DEFAULT_DAY_DURATION) as u64 * 1000 + 100; - >::set_timestamp(now); - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT1), bondid1)); - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT2), bondid2)); - - assert_eq!(Evercity::balances_everusd(ACCOUNT1), 0); - assert_eq!(Evercity::balances_everusd(ACCOUNT2), 0); - - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR1), - bondid1, - )); - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR2), - bondid1, - )); - - let balance1 = Evercity::balances_everusd(INVESTOR1); - let balance2 = Evercity::balances_everusd(INVESTOR2); - - assert_eq!(balance1, balance2); - assert_eq!(balance1, 124668493149600 / 2 + 4000 * 600 * UNIT); - // check bond debt after been redeemed - chain_bond_item1 = Evercity::get_bond(&bondid1); - chain_bond_item2 = Evercity::get_bond(&bondid2); - - assert_eq!(chain_bond_item1.bond_debit, chain_bond_item1.bond_credit); - assert_eq!(chain_bond_item2.bond_debit, chain_bond_item2.bond_credit); - }); -} - -#[test] -fn bond_restore_from_bankrupt() { - const ACCOUNT1: u64 = 3; - const INVESTOR1: u64 = 4; - let bondid1: BondId = "BOND1".into(); - - fn deposit(account: u64, bond: BondId, amount: EverUSDBalance) -> BondStructOf { - assert_ok!(Evercity::bond_deposit_everusd( - Origin::signed(account), - bond, - amount - )); - Evercity::get_bond(&bond) - } - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid1, ACCOUNT1, get_test_bond().inner); - let chain_bond_item1 = Evercity::get_bond(&bondid1); - let start_moment = chain_bond_item1.active_start_date; - - for period in 0..12_usize { - assert_ok!(Evercity::set_impact_data( - &bondid1, - period as BondPeriodNumber, - chain_bond_item1.inner.impact_data_baseline[period] - )); - } - //reset balance - Evercity::set_balance(&INVESTOR1, 0); - Evercity::set_balance(&ACCOUNT1, 124668493149600 + 4000 * 600 * 2 * UNIT); - - let mut investor_balance = 0; - - let mut now = start_moment + (160 * DEFAULT_DAY_DURATION) as u64 * 1000; - for _ in 0..11_usize { - >::set_timestamp(now); - deposit(ACCOUNT1, bondid1, 10000 * UNIT); - - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR1), - bondid1, - )); - let b = Evercity::balances_everusd(&INVESTOR1); - assert!(b > investor_balance); - investor_balance = b; - println!("balance {:}", b); - - now += (DEFAULT_DAY_DURATION * 30) as u64 * 1000; - let chain_bond_item1 = Evercity::get_bond(&bondid1); - assert_eq!(chain_bond_item1.state, BondState::BANKRUPT); - } - - deposit(ACCOUNT1, bondid1, 50000 * UNIT); - >::set_timestamp(now); - - let chain_bond_item1 = Evercity::get_bond(&bondid1); - assert_eq!(chain_bond_item1.state, BondState::ACTIVE); - - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT1), bondid1)); - let chain_bond_item1 = Evercity::get_bond(&bondid1); - assert_eq!(chain_bond_item1.state, BondState::FINISHED); - assert_eq!(chain_bond_item1.bond_credit, chain_bond_item1.bond_debit); - assert_eq!(Evercity::balances_everusd(&ACCOUNT1), 0); - }); -} - -#[test] -fn bond_withdraw_everusd() { - const ACCOUNT1: u64 = 3; - const INVESTOR1: u64 = 4; - let bondid1: BondId = "BOND1".into(); - - fn deposit(account: u64, bond: BondId, amount: EverUSDBalance) -> BondStructOf { - assert_ok!(Evercity::bond_deposit_everusd( - Origin::signed(account), - bond, - amount - )); - Evercity::get_bond(&bond) - } - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid1, ACCOUNT1, get_test_bond().inner); - let chain_bond_item1 = Evercity::get_bond(&bondid1); - let start_moment = chain_bond_item1.active_start_date; - - for period in 0..12_usize { - assert_ok!(Evercity::set_impact_data( - &bondid1, - period as BondPeriodNumber, - chain_bond_item1.inner.impact_data_baseline[period] - )); - } - //reset balance - Evercity::set_balance(&INVESTOR1, 0); - Evercity::set_balance(&ACCOUNT1, 124668493149600 + 4000 * 600 * 2 * UNIT); - - let mut now = start_moment + (130 * DEFAULT_DAY_DURATION) as u64 * 1000; - >::set_timestamp(now); - // 29983 UNIT in start period - deposit(ACCOUNT1, bondid1, 30000 * UNIT); - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR1), - bondid1, - )); - - let mut investor_balance = Evercity::balances_everusd(&INVESTOR1); - println!("balance {:}", investor_balance); - // after first non-start period - now += (DEFAULT_DAY_DURATION * 30) as u64 * 1000; - - for m in 0..11_usize { - // 7891 UNIT every payment period that is paid by two payments - >::set_timestamp(now); - deposit(ACCOUNT1, bondid1, 5891 * UNIT); - - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR1), - bondid1, - )); - - let b = Evercity::balances_everusd(&INVESTOR1); - assert!(b > investor_balance); - investor_balance = b; - println!("{} balance {:}", m, b); - - let chain_bond_item1 = Evercity::get_bond(&bondid1); - assert_eq!(chain_bond_item1.state, BondState::BANKRUPT); - - deposit(ACCOUNT1, bondid1, 2000 * UNIT); - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR1), - bondid1, - )); - - let b = Evercity::balances_everusd(&INVESTOR1); - assert!(b > investor_balance); - investor_balance = b; - println!("{} balance {:}", m, b); - - now += (DEFAULT_DAY_DURATION * 30) as u64 * 1000; - let chain_bond_item1 = Evercity::get_bond(&bondid1); - assert_eq!(chain_bond_item1.state, BondState::ACTIVE); - } - }); -} - -#[test] -fn bond_try_create_arbitrary_period() { - let bondid: BondId = "BOND".into(); - const ACCOUNT: u64 = 3; - - new_test_ext().execute_with(|| { - let mut bond = get_test_bond(); - bond.inner.start_period += 1; - assert_noop!( - Evercity::bond_add_new(Origin::signed(ACCOUNT), bondid, bond.inner), - RuntimeError::BondParamIncorrect - ); - - bond = get_test_bond(); - bond.inner.payment_period += 1; - assert_noop!( - Evercity::bond_add_new(Origin::signed(ACCOUNT), bondid, bond.inner), - RuntimeError::BondParamIncorrect - ); - - bond = get_test_bond(); - bond.inner.bond_finishing_period += 1; - assert_noop!( - Evercity::bond_add_new(Origin::signed(ACCOUNT), bondid, bond.inner), - RuntimeError::BondParamIncorrect - ); - - bond = get_test_bond(); - bond.inner.interest_pay_period += 1; - assert_noop!( - Evercity::bond_add_new(Origin::signed(ACCOUNT), bondid, bond.inner), - RuntimeError::BondParamIncorrect - ); - - bond = get_test_bond(); - bond.inner.impact_data_send_period += 1; - assert_noop!( - Evercity::bond_add_new(Origin::signed(ACCOUNT), bondid, bond.inner), - RuntimeError::BondParamIncorrect - ); - }); -} - -#[test] -fn bond_try_release_without_fundraising_period() { - let bondid: BondId = "BOND".into(); - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - - new_test_ext().execute_with(|| { - let mut bond = get_test_bond(); - bond.inner.mincap_deadline = 100000; - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner - )); - >::set_timestamp(100000); - assert_noop!( - Evercity::bond_release(Origin::signed(MASTER), bondid, 0), - RuntimeError::BondStateNotPermitAction - ); - - bond = get_test_bond(); - bond.inner.mincap_deadline = 200000; - assert_ok!(Evercity::bond_update( - Origin::signed(ACCOUNT), - bondid, - 0, - bond.inner - )); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 1)); - }); -} - -#[test] -fn bond_calc_redeemed_yield() { - // YMT - yield to maturity - total coupon yield after bond redemption - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - assert!(Evercity::evercity_balance().is_ok()); - let initial_balace1 = Evercity::balance_everusd(&INVESTOR1); - let initial_balace2 = Evercity::balance_everusd(&INVESTOR2); - bond_activate(bondid, ACCOUNT, get_test_bond().inner); - assert!(Evercity::evercity_balance().is_ok()); - - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.active_start_date, 30000); - assert_eq!(chain_bond_item.issued_amount, 1200); - assert!(chain_bond_item - .inner - .impact_data_baseline - .iter() - .all(|&v| v == 20000_u64)); - - let num_periods = chain_bond_item.get_periods(); - // all period except start period will have interest rate = interest_rate_base_value - // for start period interest rate will be interest_rate_start_period_value - for period in 0..num_periods - 1 { - assert_ok!(Evercity::set_impact_data( - &bondid, - period, - chain_bond_item.inner.impact_data_baseline[period as usize] - )); - } - // go to the last period - >::set_timestamp( - chain_bond_item.active_start_date - + days2timestamp(120 + chain_bond_item.inner.bond_duration * 30 + 1), - ); - // add extra everusd to pay off coupon yield - assert_ok!(add_token(ACCOUNT, 125_000_000_000_000)); - assert!(Evercity::evercity_balance().is_ok()); - - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT), bondid)); - assert!(Evercity::bond_check_invariant(&bondid)); - // withdraw coupon & principal value - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR1), - bondid - )); - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR2), - bondid - )); - - assert!(Evercity::evercity_balance().is_ok()); - - let chain_bond_item = Evercity::get_bond(&bondid); - let yield1 = Evercity::balance_everusd(&INVESTOR1) - initial_balace1; - let yield2 = Evercity::balance_everusd(&INVESTOR2) - initial_balace2; - - assert_eq!( - yield1 + yield2 + Evercity::balance_everusd(&ACCOUNT), - 125_000_000_000_000 - ); - assert_eq!(yield1, yield2); - assert_eq!(yield1, 62_334_246_574_800); - assert_eq!(Evercity::balance_everusd(&ACCOUNT), 331_506_850_400); - - assert_eq!(chain_bond_item.state, BondState::FINISHED); - // @TODO descrees credit on redemption - //assert_eq!(chain_bond_item.bond_credit, 0); - //assert_eq!(chain_bond_item.bond_debit, 0); - }); -} - -#[test] -fn bond_try_redeem_prior_maturity() { - const MASTER: u64 = 1; - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - - let bondid1: BondId = "BOND1".into(); - let bondid2: BondId = "BOND2".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - // bond before activation - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid1, - get_test_bond().inner - )); - >::set_timestamp(days2timestamp(1)); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid1, 0)); - - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid1, - 1, - 600 - )); - assert_noop!( - Evercity::bond_redeem(Origin::signed(ACCOUNT), bondid1), - RuntimeError::BondStateNotPermitAction - ); - - // active bond - bond_activate(bondid2, ACCOUNT, get_test_bond().inner); - - // go to the end of the first period. n - >::set_timestamp(days2timestamp(120 + 1)); - - assert_ok!(add_token(ACCOUNT, 200_000_000_000_000)); - assert_noop!( - Evercity::bond_redeem(Origin::signed(ACCOUNT), bondid2), - RuntimeError::BondOutOfOrder - ); - }) -} - -#[test] -fn bond_send_impact_reports() { - const ACCOUNT: u64 = 3; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, get_test_bond().inner); - }); -} - -#[test] -fn bond_periods() { - let mut bond = get_test_bond(); - bond.state = BondState::ACTIVE; - bond.active_start_date += 10; - - assert_eq!(bond.time_passed_after_activation(0), None); - assert_eq!( - bond.time_passed_after_activation(bond.active_start_date), - Some((0, 0)) - ); - let start_period = bond.active_start_date + 120 * 1000 * DEFAULT_DAY_DURATION as u64; - assert_eq!(bond.inner.start_period, 120 * DEFAULT_DAY_DURATION); - - assert_eq!( - bond.time_passed_after_activation(start_period), - Some((120 * DEFAULT_DAY_DURATION, 1)) - ); - assert_eq!( - bond.time_passed_after_activation(start_period - 1), - Some((120 * DEFAULT_DAY_DURATION - 1, 0)) - ); - - assert_eq!(bond.inner.payment_period, 30 * DEFAULT_DAY_DURATION); - assert_eq!( - bond.time_passed_after_activation(start_period + 30 * 1000 * DEFAULT_DAY_DURATION as u64), - Some(((120 + 30) * DEFAULT_DAY_DURATION, 2)) - ); - assert_eq!( - bond.time_passed_after_activation(start_period + 29 * 1000 * DEFAULT_DAY_DURATION as u64), - Some(((120 + 29) * DEFAULT_DAY_DURATION, 1)) - ); - assert_eq!( - bond.time_passed_after_activation(start_period + 1000 * DEFAULT_DAY_DURATION as u64), - Some(((120 + 1) * DEFAULT_DAY_DURATION, 1)) - ); - assert_eq!( - bond.time_passed_after_activation(start_period + 31 * 1000 * DEFAULT_DAY_DURATION as u64), - Some(((31 + 120) * DEFAULT_DAY_DURATION, 2)) - ); - assert_eq!( - bond.time_passed_after_activation(start_period + 310 * 1000 * DEFAULT_DAY_DURATION as u64), - Some(((120 + 310) * DEFAULT_DAY_DURATION, 11)) - ); - - assert_eq!( - bond.time_passed_after_activation(4294967295000), - Some((4294967294, 13)) - ); - - assert_eq!(bond.time_passed_after_activation(6300000000000), None); -} - -#[test] -fn bond_try_create_with_same_id() { - let bond = get_test_bond(); - let bondid: BondId = "TEST".into(); - const ACCOUNT: u64 = 3; - - new_test_ext().execute_with(|| { - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner.clone() - )); - assert_noop!( - Evercity::bond_add_new(Origin::signed(ACCOUNT), bondid, bond.inner.clone()), - RuntimeError::BondAlreadyExists - ); - assert_ok!(Evercity::bond_revoke(Origin::signed(ACCOUNT), bondid)); - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner.clone() - )); - }); -} - -#[test] -fn bond_create_delete() { - let bond = get_test_bond(); - let bondid: BondId = "TEST".into(); - - const ACCOUNT: u64 = 3; - new_test_ext().execute_with(|| { - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner.clone() - )); - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(bond.inner, chain_bond_item.inner); - - assert_ok!(Evercity::bond_revoke(Origin::signed(ACCOUNT), bondid)); - let chain_bond_item = Evercity::get_bond(&bondid); - assert_ne!(bond.inner, chain_bond_item.inner); - assert_eq!(chain_bond_item.inner, Default::default()); - }); -} - -fn bond_grand_everusd() { - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - - assert_ok!(add_token(INVESTOR1, 50_000_000_000_000_000)); - assert_ok!(add_token(INVESTOR2, 50_000_000_000_000_000)); -} - -fn bond_release(bondid: BondId, acc: u64, mut bond: BondInnerStruct) -> BondStruct { - const MASTER: u64 = 1; - const AUDITOR: u64 = 5; - bond.mincap_deadline = 50000; - assert_ok!(Evercity::bond_add_new(Origin::signed(acc), bondid, bond)); - >::set_timestamp(10_000); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - assert_ok!(Evercity::bond_set_auditor( - Origin::signed(MASTER), - bondid, - AUDITOR - )); - Evercity::get_bond(&bondid) -} - -fn bond_activate(bondid: BondId, acc: u64, mut bond: BondInnerStruct) { - const MASTER: u64 = 1; - const AUDITOR: u64 = 5; - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - - let investor1_balance = Evercity::balance_everusd(&INVESTOR1); - let investor2_balance = Evercity::balance_everusd(&INVESTOR2); - - bond.mincap_deadline = 50000; - assert_ok!(Evercity::bond_add_new(Origin::signed(acc), bondid, bond)); - >::set_timestamp(10_000); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.issued_amount, 0); - - // Buy two packages - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 600 - )); - - assert!(Evercity::bond_check_invariant(&bondid)); - - >::set_timestamp(20_000); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR2), - bondid, - 1, - 600 - )); - - assert!(Evercity::bond_check_invariant(&bondid)); - - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.issued_amount, 1200); - assert_eq!(chain_bond_item.bond_debit, 1200 * 4_000_000_000_000); - assert_eq!(chain_bond_item.bond_debit, chain_bond_item.bond_credit); - - assert_ok!(Evercity::bond_set_auditor( - Origin::signed(MASTER), - bondid, - AUDITOR - )); - - // Activate bond - >::set_timestamp(30000); - assert_ok!(Evercity::bond_activate( - Origin::signed(MASTER), - bondid, - chain_bond_item.nonce + 1 - )); - let chain_bond_item = Evercity::get_bond(&bondid); - - assert_eq!(chain_bond_item.issued_amount, 1200); - assert_eq!(chain_bond_item.bond_debit, 0); - assert_eq!(chain_bond_item.bond_credit, 0); - - assert_eq!(Evercity::balance_everusd(&acc), 1200 * 4_000_000_000_000); - - assert_eq!( - investor1_balance - Evercity::balance_everusd(&INVESTOR1), - 600 * 4_000_000_000_000 - ); - assert_eq!( - investor2_balance - Evercity::balance_everusd(&INVESTOR2), - 600 * 4_000_000_000_000 - ); - // Try revoke - assert_noop!( - Evercity::bond_revoke(Origin::signed(acc), bondid), - RuntimeError::BondStateNotPermitAction - ); - // Try give back - assert_noop!( - Evercity::bond_unit_package_return(Origin::signed(INVESTOR1), bondid, 600), - RuntimeError::BondStateNotPermitAction - ); -} - -#[test] -fn bond_create_release_update() { - let bond = get_test_bond(); - let bondid: BondId = "TEST".into(); - - const ACCOUNT: u64 = 3; - const MASTER: u64 = 1; - const MANAGER: u64 = 8; - new_test_ext().execute_with(|| { - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond.inner.clone() - )); - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.state, BondState::PREPARE); - - // set Manager - assert_noop!( - Evercity::bond_set_manager(Origin::signed(ACCOUNT), bondid, MANAGER), - RuntimeError::AccountNotAuthorized - ); - assert_ok!(Evercity::bond_set_manager( - Origin::signed(MASTER), - bondid, - MANAGER - )); - // Manager can change bond_units_base_price - let mut new_bond = bond.inner.clone(); - new_bond.bond_units_base_price = 100000; - assert_ok!(Evercity::bond_update( - Origin::signed(MANAGER), - bondid, - 1, - new_bond - )); - - >::set_timestamp(10_000); - - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 2)); - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.state, BondState::BOOKING); - assert_eq!(chain_bond_item.booking_start_date, 10_000); - assert_eq!(chain_bond_item.manager, MANAGER); - assert_eq!(chain_bond_item.inner.bond_units_base_price, 100_000); - }); -} - -#[test] -fn bond_activate_bond_and_withdraw_bondfund() { - const ACCOUNT: u64 = 3; - let bondid: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, get_test_bond().inner); - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.state, BondState::ACTIVE); - assert_eq!(chain_bond_item.active_start_date, 30000); - assert_eq!(chain_bond_item.bond_debit, 0); - assert_eq!(chain_bond_item.bond_credit, 0); - - assert_eq!( - Evercity::balance_everusd(&ACCOUNT), - 1200 * 4_000_000_000_000 - ); - - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.bond_debit, 0); - assert_eq!( - Evercity::balance_everusd(&ACCOUNT), - 1200 * 4_000_000_000_000 - ); - assert_eq!(Evercity::bond_packages(&bondid).is_empty(), false); - let acquired_bond_units: BondUnitAmount = Evercity::bond_packages(&bondid) - .iter() - .map(|(_, packages)| { - packages - .iter() - .map(|package| package.bond_units) - .sum::() - }) - .sum::(); - - assert_eq!(acquired_bond_units, 1200); - }); -} - -#[test] -fn bond_buy_bond_units_after_activation() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - let bondid: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, get_test_bond().inner); - >::set_timestamp(600_000); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 3, - 400 - )); - - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!( - Evercity::balance_everusd(&ACCOUNT), - 1600 * 4_000_000_000_000 - ); // (600 + 600 + 400) * 4000 - assert_eq!(chain_bond_item.bond_debit, 0); - assert_eq!(bond_current_period(&chain_bond_item, 600_000), 0); - }); -} - -#[test] -fn bond_try_return_foreign_bonds() { - const ACCOUNT1: u64 = 3; - const ACCOUNT2: u64 = 7; - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - let bondid1: BondId = "BOND1".into(); - let bondid2: BondId = "BOND2".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_release(bondid1, ACCOUNT1, get_test_bond().inner); - bond_release(bondid2, ACCOUNT2, get_test_bond().inner); - - >::set_timestamp(600_000); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid1, - 2, - 400 - )); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR2), - bondid2, - 2, - 400 - )); - - // bond1 != bond2 - assert_noop!( - Evercity::bond_unit_package_return(Origin::signed(INVESTOR1), bondid2, 400), - RuntimeError::BondParamIncorrect - ); - - // make amend - assert_ok!(Evercity::bond_unit_package_return( - Origin::signed(INVESTOR1), - bondid1, - 400 - )); - assert_ok!(Evercity::bond_unit_package_return( - Origin::signed(INVESTOR2), - bondid2, - 400 - )); - }); -} - -#[test] -fn bond_return_bondunit_package() { - const ACCOUNT: u64 = 3; - const MASTER: u64 = 1; - - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - - let bondid: BondId = "BOND0".into(); - - new_test_ext().execute_with(|| { - assert_ok!(add_token(INVESTOR1, 6_000_000_000_000_000)); - assert_ok!(add_token(INVESTOR2, 6_000_000_000_000_000)); - - let mut bond = get_test_bond().inner; - bond.mincap_deadline = 50000; - - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond - )); - >::set_timestamp(10000); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - assert!(Evercity::evercity_balance().is_ok()); - - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 600 - )); - >::set_timestamp(20000); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR2), - bondid, - 1, - 600 - )); - assert!(Evercity::evercity_balance().is_ok()); - - let packages1 = Evercity::bond_holder_packages(&bondid, &INVESTOR1); - assert_eq!(packages1.len(), 1); - assert_eq!(packages1[0].bond_units, 600); - assert_ok!(Evercity::bond_unit_package_return( - Origin::signed(INVESTOR1), - bondid, - 600 - )); - - let packages1 = Evercity::bond_holder_packages(&bondid, &INVESTOR1); - assert_eq!(packages1.len(), 0); - // you cannot give back part of the package - assert_noop!( - Evercity::bond_unit_package_return(Origin::signed(INVESTOR2), bondid, 100), - RuntimeError::BondParamIncorrect - ); - let packages2 = Evercity::bond_holder_packages(&bondid, &INVESTOR2); - assert_eq!(packages2.len(), 1); - assert!(Evercity::evercity_balance().is_ok()); - assert!(Evercity::bond_check_invariant(&bondid)); - }); -} - -#[test] -fn bond_return_partial_bondunit_package() { - const ACCOUNT: u64 = 3; - const MASTER: u64 = 1; - - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - - let bondid: BondId = "BOND0".into(); - // investor1 = 100 + 100 + 200 - // return 200 + 200 - // investor2 = 200 - // return 200 - - new_test_ext().execute_with(|| { - assert_ok!(add_token(INVESTOR1, 6_000_000_000_000_000)); - assert_ok!(add_token(INVESTOR2, 6_000_000_000_000_000)); - - let mut bond = get_test_bond().inner; - bond.mincap_deadline = 50000; - - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond - )); - - >::set_timestamp(20000); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - assert!(Evercity::evercity_balance().is_ok()); - - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 200 - )); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 100 - )); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 100 - )); - - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR2), - bondid, - 1, - 200 - )); - assert!(Evercity::bond_check_invariant(&bondid)); - - assert_ok!(Evercity::bond_unit_package_return( - Origin::signed(INVESTOR1), - bondid, - 200 - )); - assert_ok!(Evercity::bond_unit_package_return( - Origin::signed(INVESTOR1), - bondid, - 200 - )); - assert!(Evercity::bond_check_invariant(&bondid)); - assert_noop!( - Evercity::bond_unit_package_return(Origin::signed(INVESTOR2), bondid, 100), - RuntimeError::BondParamIncorrect - ); - - assert_ok!(Evercity::bond_unit_package_return( - Origin::signed(INVESTOR2), - bondid, - 200 - )); - assert!(Evercity::bond_check_invariant(&bondid)); - }); -} - -#[test] -fn bond_iter_periods() { - const ACCOUNT: u64 = 3; - let bondid: BondId = "BOND1".into(); - - let mut ext = new_test_ext(); - ext.execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, get_test_bond().inner); - let chain_bond_item = Evercity::get_bond(&bondid); - - let mut start = 0; - let mut count = 0; - for period in chain_bond_item.iter_periods() { - assert_eq!(period.start_period, start); - start = period.payment_period; - count += 1; - } - - assert_eq!(count, 14); - assert_eq!(chain_bond_item.get_periods(), count - 1); - }); -} - -#[test] -fn bond_cancel_after_release() { - const ACCOUNT: u64 = 3; - const MASTER: u64 = 1; - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - assert_ok!(add_token(INVESTOR1, 10_000_000_000_000_000)); - assert_ok!(add_token(INVESTOR2, 10_000_000_000_000_000)); - - let mut bond = get_test_bond().inner; - bond.mincap_deadline = 50000; - assert_ok!(Evercity::bond_add_new( - Origin::signed(ACCOUNT), - bondid, - bond - )); - >::set_timestamp(10000); - assert_ok!(Evercity::bond_release(Origin::signed(MASTER), bondid, 0)); - - // Buy three packages - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 1, - 400 - )); - >::set_timestamp(20_000); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR2), - bondid, - 1, - 200 - )); - >::set_timestamp(30_000); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR2), - bondid, - 1, - 200 - )); - - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.issued_amount, 800); - assert_eq!(chain_bond_item.bond_debit, 800 * 4_000_000_000_000); - assert_eq!(chain_bond_item.bond_debit, chain_bond_item.bond_credit); - - assert_eq!( - Evercity::balance_everusd(&INVESTOR1), - 10_000_000_000_000_000 - 400 * 4_000_000_000_000 - ); - assert_eq!( - Evercity::balance_everusd(&INVESTOR2), - 10_000_000_000_000_000 - 400 * 4_000_000_000_000 - ); - - // Bond unit packages - - let packages1 = Evercity::bond_holder_packages(&bondid, &INVESTOR1); - let packages2 = Evercity::bond_holder_packages(&bondid, &INVESTOR2); - - assert_eq!(packages1.len(), 1); - assert_eq!(packages2.len(), 2); - - assert_eq!(packages1[0].bond_units, 400); - assert_eq!(packages2[0].bond_units, 200); - assert_eq!(packages2[0].bond_units, 200); - - assert_eq!(packages1[0].acquisition, 0); - assert_eq!(packages2[0].acquisition, 0); - assert_eq!(packages2[1].acquisition, 0); - - // We raised up less than bond_units_mincap_amount, so we should revoke the bond - >::set_timestamp(60000); - assert_ok!(Evercity::bond_withdraw(Origin::signed(MASTER), bondid)); - let chain_bond_item = Evercity::get_bond(&bondid); - - assert_eq!(chain_bond_item.issued_amount, 0); - assert_eq!(chain_bond_item.state, BondState::PREPARE); - assert_eq!(chain_bond_item.bond_debit, 0); - assert_eq!(chain_bond_item.bond_credit, 0); - - assert_eq!( - Evercity::balance_everusd(&INVESTOR1), - 10_000_000_000_000_000 - ); - assert_eq!( - Evercity::balance_everusd(&INVESTOR2), - 10_000_000_000_000_000 - ); - - let packages1 = Evercity::bond_holder_packages(&bondid, &INVESTOR1); - let packages2 = Evercity::bond_holder_packages(&bondid, &INVESTOR2); - - assert_eq!(packages1.len(), 0); - assert_eq!(packages2.len(), 0); - }); -} - -#[test] -fn bond_impact_report_missing_data() { - const ACCOUNT1: u64 = 3; - - let bondid1: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - let bond = get_test_bond().inner; - bond_activate(bondid1, ACCOUNT1, bond.clone()); - - for &period in &[0, 1, 3, 5, 7, 9] { - assert_ok!(Evercity::set_impact_data( - &bondid1, - period, - bond.impact_data_baseline[period as usize] - )); - } - let chain_bond_item = Evercity::get_bond(&bondid1); - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 - * (bond.start_period + bond.bond_duration * bond.payment_period + 1) as u64, - ); - assert_ok!(add_token(ACCOUNT1, 500_000_000_000_000)); - // force interest rate calculation - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT1), bondid1)); - - let ref_interest_rate1 = vec![ - 1900, 2000, 2000, 2400, 2000, 2400, 2000, 2400, 2000, 2400, 2000, 2400, 2800, - ]; - for (calc_interest_rate, ref_interest_rate) in Evercity::get_coupon_yields(&bondid1) - .iter() - .map(|coupon| coupon.interest_rate) - .zip(ref_interest_rate1) - { - assert_eq!(calc_interest_rate, ref_interest_rate); - } - }); -} - -#[test] -fn bond_impact_report_no_data() { - const ACCOUNT1: u64 = 3; - - let bondid1: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - let bond = get_test_bond().inner; - bond_activate(bondid1, ACCOUNT1, bond.clone()); - - let chain_bond_item = Evercity::get_bond(&bondid1); - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 - * (bond.start_period + bond.bond_duration * bond.payment_period + 1) as u64, - ); - assert_ok!(add_token(ACCOUNT1, 500_000_000_000_000)); - // force interest rate calculation - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT1), bondid1)); - - let ref_interest_rate = vec![ - 1900, 2300, 2700, 3100, 3500, 3900, 4000, 4000, 4000, 4000, 4000, 4000, 4000, - ]; - - for (calc_interest_rate, ref_interest_rate) in Evercity::get_coupon_yields(&bondid1) - .iter() - .map(|coupon| coupon.interest_rate) - .zip(ref_interest_rate) - { - assert_eq!(calc_interest_rate, ref_interest_rate); - } - }); -} - -#[test] -fn bond_interest_rate_rnd() { - use rand::{ - self, - distributions::{Distribution, Uniform}, - }; - - const ACCOUNT: u64 = 3; - let bondid: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - let mut rng = rand::thread_rng(); - - let mut bond = get_test_bond().inner; - let impact_data_range = Uniform::new_inclusive( - bond.impact_data_max_deviation_floor, - bond.impact_data_max_deviation_cap, - ); - for period in 0..bond.bond_duration as usize { - bond.impact_data_baseline[period] = impact_data_range.sample(&mut rng); - } - let periods: usize = bond.bond_duration as usize; - //create bond - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, bond); - - for period in 0..periods { - assert_ok!(Evercity::set_impact_data( - &bondid, - period as BondPeriodNumber, - 20000_u64 - )); - } - // force impact interesting rate calculation - let chain_bond_item = Evercity::get_bond(&bondid); - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 - * (chain_bond_item.inner.start_period - + chain_bond_item.inner.bond_duration - * chain_bond_item.inner.payment_period - + 1) as u64, - ); - - assert_ok!(add_token(ACCOUNT, 500_000_000_000_000)); - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT), bondid)); - - // - let bond_coupon_yields = Evercity::bond_coupon_yield(&bondid); - let impact_reports = Evercity::impact_reports(&bondid); - - assert_eq!(bond_coupon_yields.len(), periods + 1); - assert_eq!( - bond_coupon_yields[0].interest_rate, - chain_bond_item.inner.interest_rate_start_period_value - ); - for period in 0..periods { - let interest_rate = bond_coupon_yields[period + 1].interest_rate; - let impact_data = impact_reports[period].impact_data; - assert_eq!(impact_data, 20000_u64); - // if impact data is less than baseline value then interest rate is more than base value - assert_eq!( - impact_data < chain_bond_item.inner.impact_data_baseline[period], - interest_rate > chain_bond_item.inner.interest_rate_base_value - ); - - println!( - "{}: impact_data={} <> baseline={}, base interest rate={} <> interest rate={}", - period, - impact_data, - chain_bond_item.inner.impact_data_baseline[period], - chain_bond_item.inner.interest_rate_base_value, - interest_rate - ) - } - }); -} - -#[test] -fn bond_impact_report_interest_rate() { - const ACCOUNT1: u64 = 3; - let bondid: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - let bond = get_test_bond().inner; - bond_activate(bondid, ACCOUNT1, bond.clone()); - - for (period, impact_data) in [ - bond.impact_data_baseline[0], - 0, - 60000, - bond.impact_data_max_deviation_floor, - bond.impact_data_max_deviation_cap, - 25000, - 16000, - ] - .iter() - .enumerate() - { - assert_ok!(Evercity::set_impact_data( - &bondid, - period as BondPeriodNumber, - *impact_data - )); - } - let chain_bond_item = Evercity::get_bond(&bondid); - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 - * (bond.start_period + bond.bond_duration * bond.payment_period + 1) as u64, - ); - - assert_ok!(add_token(ACCOUNT1, 500_000_000_000_000)); - - //force interest rate calculation - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT1), bondid)); - - let ref_interest_rate = vec![ - bond.interest_rate_start_period_value, - bond.interest_rate_base_value, - bond.interest_rate_margin_cap, - bond.interest_rate_margin_floor, - bond.interest_rate_margin_cap, - bond.interest_rate_margin_floor, - 1500, - 3333, - ]; - for (calc_interest_rate, ref_interest_rate) in Evercity::get_coupon_yields(&bondid) - .iter() - .map(|coupon| coupon.interest_rate) - .zip(ref_interest_rate) - { - assert_eq!(calc_interest_rate, ref_interest_rate); - } - }); -} - -#[test] -fn bond_impact_report_send_approve() { - const ACCOUNT1: u64 = 3; - const AUDITOR: u64 = 5; - let bondid: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - let bond = get_test_bond().inner; - bond_activate(bondid, ACCOUNT1, bond.clone()); - - let chain_bond_item = Evercity::get_bond(&bondid); - - for period in 0..bond.bond_duration { - // day before end of the period - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 * (bond.start_period + period * bond.payment_period - 1) as u64, - ); - assert_ok!(Evercity::bond_impact_report_send( - Origin::signed(ACCOUNT1), - bondid, - period, - bond.impact_data_baseline[period as usize] - )); - assert_ok!(Evercity::bond_impact_report_approve( - Origin::signed(AUDITOR), - bondid, - period, - bond.impact_data_baseline[period as usize] - )); - } - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 - * (bond.start_period + bond.bond_duration * bond.payment_period + 1) as u64, - ); - - assert_ok!(add_token(ACCOUNT1, 500_000_000_000_000)); - //force interest rate calculation - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT1), bondid)); - - let ref_interest_rate = vec![ - bond.interest_rate_start_period_value, - bond.interest_rate_base_value, - bond.interest_rate_base_value, - bond.interest_rate_base_value, - bond.interest_rate_base_value, - bond.interest_rate_base_value, - bond.interest_rate_base_value, - bond.interest_rate_base_value, - bond.interest_rate_base_value, - ]; - for (calc_interest_rate, ref_interest_rate) in Evercity::get_coupon_yields(&bondid) - .iter() - .map(|coupon| coupon.interest_rate) - .zip(ref_interest_rate) - { - assert_eq!(calc_interest_rate, ref_interest_rate); - } - }); -} - -#[test] -fn bond_impact_report_try_approve_unauthorized() { - const ACCOUNT1: u64 = 3; - const AUDITOR: u64 = 5; - let bondid: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - let bond = get_test_bond().inner; - bond_activate(bondid, ACCOUNT1, bond.clone()); - - let chain_bond_item = Evercity::get_bond(&bondid); - // first period - >::set_timestamp( - chain_bond_item.active_start_date + 1000_u64 * (bond.start_period - 1) as u64, - ); - - // send report - assert_ok!(Evercity::bond_impact_report_send( - Origin::signed(ACCOUNT1), - bondid, - 0, - 1000 - )); - - for acc in iter_accounts().filter(|acc| *acc != AUDITOR) { - assert_noop!( - Evercity::bond_impact_report_approve(Origin::signed(acc), bondid, 0, 1000), - RuntimeError::AccountNotAuthorized - ); - } - - // make amend - - assert_ok!(Evercity::bond_impact_report_approve( - Origin::signed(AUDITOR), - bondid, - 0, - 1000 - )); - }); -} - -#[test] -fn bond_impact_report_try_approve_unattended() { - const ACCOUNT1: u64 = 3; - const AUDITOR: u64 = 5; - let bondid: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - let bond = get_test_bond().inner; - bond_activate(bondid, ACCOUNT1, bond.clone()); - - let chain_bond_item = Evercity::get_bond(&bondid); - // first period - >::set_timestamp( - chain_bond_item.active_start_date + 1000_u64 * (bond.start_period - 1) as u64, - ); - // try approve without report - assert_noop!( - Evercity::bond_impact_report_approve(Origin::signed(AUDITOR), bondid, 0, 0), - RuntimeError::BondParamIncorrect - ); - - // make amend - assert_ok!(Evercity::bond_impact_report_send( - Origin::signed(ACCOUNT1), - bondid, - 0, - 0 - )); - - assert_ok!(Evercity::bond_impact_report_approve( - Origin::signed(AUDITOR), - bondid, - 0, - 0 - )); - }); -} - -#[test] -fn bond_impact_report_outof_order() { - const ACCOUNT1: u64 = 3; - const AUDITOR: u64 = 5; - let bondid: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - let bond = get_test_bond().inner; - bond_activate(bondid, ACCOUNT1, bond.clone()); - - let chain_bond_item = Evercity::get_bond(&bondid); - - for period in 0..bond.bond_duration { - // before start of the report period - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 - * (bond.start_period + period * bond.payment_period - - bond.impact_data_send_period - - 1) as u64, - ); - assert_noop!( - Evercity::bond_impact_report_send( - Origin::signed(ACCOUNT1), - bondid, - period, - bond.impact_data_baseline[period as usize] - ), - RuntimeError::BondOutOfOrder - ); - - // after current period end - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 * (bond.start_period + period * bond.payment_period + 1) as u64, - ); - - assert_noop!( - Evercity::bond_impact_report_send( - Origin::signed(ACCOUNT1), - bondid, - period, - bond.impact_data_baseline[period as usize] - ), - RuntimeError::BondOutOfOrder - ); - - // between report period start and current period end - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 * (bond.start_period + period * bond.payment_period - 1000) as u64, - ); - - assert_ok!(Evercity::bond_impact_report_send( - Origin::signed(ACCOUNT1), - bondid, - period, - bond.impact_data_baseline[period as usize] - )); - - assert_ok!(Evercity::bond_impact_report_approve( - Origin::signed(AUDITOR), - bondid, - period, - bond.impact_data_baseline[period as usize] - )); - } - }); -} - -#[test] -fn bond_acquire_try_exceed_max() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - let bondid: BondId = "BOND1".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, get_test_bond().inner); - - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 3, - 599 - )); - assert_noop!( - Evercity::bond_unit_package_buy(Origin::signed(INVESTOR2), bondid, 3, 2), - RuntimeError::BondParamIncorrect - ); - - // make amend - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 3, - 1 - )); - }); -} - -#[test] -fn bond_acquire_try_own_bond() { - const ACCOUNT1: u64 = 7; - const ACCOUNT2: u64 = 3; - let bondid1: BondId = "BOND1".into(); - let bondid2: BondId = "BOND2".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - bond_activate(bondid1, ACCOUNT1, get_test_bond().inner); - bond_activate(bondid2, ACCOUNT2, get_test_bond().inner); - let chain_bond_item = Evercity::get_bond(&bondid1); - - assert_eq!(chain_bond_item.issued_amount, 1200); - - assert_noop!( - Evercity::bond_unit_package_buy(Origin::signed(ACCOUNT1), bondid1, 3, 1), - RuntimeError::AccountNotAuthorized - ); - - let chain_bond_item = Evercity::get_bond(&bondid1); - assert_eq!(chain_bond_item.issued_amount, 1200); - - // make amend by acquiring other bond - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(ACCOUNT1), - bondid2, - 3, - 1 - )); - }); -} - -#[test] -fn bond_acquire_try_after_redemption() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - let bondid: BondId = "BOND0000".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - let bond = get_test_bond().inner; - bond_activate(bondid, ACCOUNT, bond.clone()); - let chain_bond_item = Evercity::get_bond(&bondid); - - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 - * (bond.start_period + bond.bond_duration * bond.payment_period + 1) as u64, - ); - // add everusd to pay off bond yield - assert_ok!(add_token(ACCOUNT, 500_000_000_000_000)); - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT), bondid)); - - assert_noop!( - Evercity::bond_unit_package_buy(Origin::signed(INVESTOR1), bondid, 4, 2), - RuntimeError::BondStateNotPermitAction - ); - }); -} - -#[test] -fn bond_deposit_bond() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - assert!(Evercity::evercity_balance().is_ok()); - - let bond = get_test_bond().inner; - bond_activate(bondid, ACCOUNT, bond.clone()); - let chain_bond_item = Evercity::get_bond(&bondid); - - >::set_timestamp( - chain_bond_item.active_start_date + 1000_u64 * (bond.start_period + 1) as u64, - ); - - assert_eq!(chain_bond_item.bond_debit, 0); - assert_eq!(chain_bond_item.coupon_yield, 0); - assert_eq!( - Evercity::balance_everusd(&ACCOUNT), - 1200 * 4_000_000_000_000 - ); - - assert_ok!(Evercity::bond_deposit_everusd( - Origin::signed(ACCOUNT), - bondid, - 100_000_000_000_000 - )); - - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.bond_debit, 100_000_000_000_000); - assert_eq!(chain_bond_item.coupon_yield, 0); - assert!(Evercity::evercity_balance().is_ok()); - - assert_eq!( - Evercity::balance_everusd(&ACCOUNT), - 1200 * 4_000_000_000_000 - 100_000_000_000_000 - ); - - assert_ok!(Evercity::bond_withdraw_everusd( - Origin::signed(INVESTOR1), - bondid - )); - let chain_bond_item = Evercity::get_bond(&bondid); - assert_eq!(chain_bond_item.coupon_yield, 14_991_780_821_760); - assert_eq!(chain_bond_item.get_debt(), 0); - // 1.9 % - (600 + 600) x 4000 usd - 120 days - assert_eq!(chain_bond_item.bond_credit, 29_983_561_643_520); - assert_eq!( - chain_bond_item.get_free_balance(), - 100_000_000_000_000 - 29_983_561_643_520 - ); - assert!(Evercity::evercity_balance().is_ok()); - }); -} - -#[test] -fn bond_deposit_return_after_redemption() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - let bond = get_test_bond().inner; - bond_activate(bondid, ACCOUNT, bond.clone()); - let chain_bond_item = Evercity::get_bond(&bondid); - - >::set_timestamp( - chain_bond_item.active_start_date - + 1000_u64 - * (bond.start_period + bond.bond_duration * bond.payment_period + 1) as u64, - ); - // add everusd to pay off bond yield - assert_ok!(add_token(ACCOUNT, 500_000_000_000_000)); - - assert_ok!(Evercity::bond_redeem(Origin::signed(ACCOUNT), bondid)); - - assert_noop!( - Evercity::bond_unit_package_buy(Origin::signed(INVESTOR1), bondid, 4, 2), - RuntimeError::BondStateNotPermitAction - ); - }); -} - -#[test] -fn bond_deposit_try_foreign() { - const ACCOUNT1: u64 = 3; - const ACCOUNT2: u64 = 7; - - let bondid1: BondId = "BOND1".into(); - let bondid2: BondId = "BOND2".into(); - - new_test_ext().execute_with(|| { - bond_grand_everusd(); - assert!(Evercity::evercity_balance().is_ok()); - - let bond = get_test_bond().inner; - bond_activate(bondid1, ACCOUNT1, bond.clone()); - bond_activate(bondid2, ACCOUNT2, bond); - assert!(Evercity::evercity_balance().is_ok()); - - assert_noop!( - Evercity::bond_deposit_everusd(Origin::signed(ACCOUNT1), bondid2, 100_000_000_000_000), - RuntimeError::BondAccessDenied - ); - }); -} - -#[test] -fn bond_lot_bit_n_buy() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - let bond = get_test_bond().inner; - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, bond); - - assert!(Evercity::bond_check_invariant(&bondid)); - - let lot = BondUnitSaleLotStruct { - deadline: 100000, - new_bondholder: Default::default(), - bond_units: 600, - amount: 600 * 3_000_000_000_000, - }; - assert!(Evercity::evercity_balance().is_ok()); - assert_ok!(Evercity::bond_unit_lot_bid( - Origin::signed(INVESTOR1), - bondid, - lot.clone() - )); - assert_ok!(Evercity::bond_unit_lot_settle( - Origin::signed(INVESTOR2), - bondid, - INVESTOR1, - lot - )); - assert!(Evercity::bond_check_invariant(&bondid)); - assert!(Evercity::evercity_balance().is_ok()); - let packages1 = Evercity::bond_holder_packages(&bondid, &INVESTOR1); - let bond_units1: BondUnitAmount = packages1.iter().map(|p| p.bond_units).sum(); - let packages2 = Evercity::bond_holder_packages(&bondid, &INVESTOR2); - let bond_units2: BondUnitAmount = packages2.iter().map(|p| p.bond_units).sum(); - - assert_eq!(bond_units1, 0); - assert_eq!(bond_units2, 1200); - }); -} - -#[test] -fn bond_lot_paid_coupon() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - let bond = get_test_bond().inner; - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, bond.clone()); - let chain_bond_item = Evercity::get_bond(&bondid); - - // buy additional 200 + 100 - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 3, - 100 - )); - assert_ok!(Evercity::bond_unit_package_buy( - Origin::signed(INVESTOR1), - bondid, - 3, - 200 - )); - assert!(Evercity::bond_check_invariant(&bondid)); - // first period - let moment = chain_bond_item.active_start_date + 1000_u64 * (bond.start_period + 1) as u64; - >::set_timestamp(moment); - - let (_, period) = chain_bond_item - .time_passed_after_activation(moment) - .unwrap(); - assert_eq!(period, 1); - - let lot = BondUnitSaleLotStruct { - deadline: moment + 1, - new_bondholder: Default::default(), - bond_units: 400, - amount: 400 * 3_000_000_000_000, - }; - - // deposit will be used to pay coupon - assert_ok!(Evercity::bond_deposit_everusd( - Origin::signed(ACCOUNT), - bondid, - 100_000_000_000_000 - )); - - let balance1 = Evercity::balance_everusd(&INVESTOR1); - - assert!(Evercity::evercity_balance().is_ok()); - assert_ok!(Evercity::bond_unit_lot_bid( - Origin::signed(INVESTOR1), - bondid, - lot.clone() - )); - assert_ok!(Evercity::bond_unit_lot_settle( - Origin::signed(INVESTOR2), - bondid, - INVESTOR1, - lot - )); - assert!(Evercity::evercity_balance().is_ok()); - - let packages1 = Evercity::bond_holder_packages(&bondid, &INVESTOR1); - let bond_units1: BondUnitAmount = packages1.iter().map(|p| p.bond_units).sum(); - - let packages2 = Evercity::bond_holder_packages(&bondid, &INVESTOR2); - let bond_units2: BondUnitAmount = packages2.iter().map(|p| p.bond_units).sum(); - - assert_eq!(bond_units1, 500); - assert_eq!(bond_units2, 1000); - - let bond_units1: Vec<_> = packages1.iter().map(|p| p.bond_units).collect(); - let bond_units2: Vec<_> = packages2.iter().map(|p| p.bond_units).collect(); - - assert_eq!(bond_units1, vec![500]); - assert_eq!(bond_units2, vec![600, 100, 200, 100]); - // 1.9% - 120 days - (600 + 200 + 100) units x 4000 usd =22487.671 usd - // @TODO calc coupon yield - assert_eq!( - Evercity::balance_everusd(&INVESTOR1) - balance1, - 400 * 3_000_000_000_000 + 22_487_671_232_640 // 1200000000000000 - ); - }); -} - -#[test] -fn bond_lot_try_buy_foreign() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - let bond = get_test_bond().inner; - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, bond); - - let lot = BondUnitSaleLotStruct { - deadline: 100000, - new_bondholder: 7, - bond_units: 600, - amount: 600 * 3_000_000_000_000, - }; - assert!(Evercity::evercity_balance().is_ok()); - assert_ok!(Evercity::bond_unit_lot_bid( - Origin::signed(INVESTOR1), - bondid, - lot.clone() - )); - assert_noop!( - Evercity::bond_unit_lot_settle(Origin::signed(INVESTOR2), bondid, INVESTOR1, lot), - RuntimeError::LotNotFound - ); - }); -} - -#[test] -fn bond_lot_try_create_expired() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - let bond = get_test_bond().inner; - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, bond); - - let lot = BondUnitSaleLotStruct { - deadline: 100000, - new_bondholder: Default::default(), - bond_units: 600, - amount: 600 * 3_000_000_000_000, - }; - // move forward - >::set_timestamp(1000000 + 1); - assert_noop!( - Evercity::bond_unit_lot_bid(Origin::signed(INVESTOR1), bondid, lot), - RuntimeError::LotParamIncorrect - ); - }); -} - -#[test] -fn bond_lot_try_buy_expired() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - const INVESTOR2: u64 = 6; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - let bond = get_test_bond().inner; - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, bond); - - let lot = BondUnitSaleLotStruct { - deadline: 100000, - new_bondholder: Default::default(), - bond_units: 600, - amount: 600 * 3_000_000_000_000, - }; - assert!(Evercity::evercity_balance().is_ok()); - assert_ok!(Evercity::bond_unit_lot_bid( - Origin::signed(INVESTOR1), - bondid, - lot.clone() - )); - - // move forward - >::set_timestamp(1000000 + 1); - - assert_noop!( - Evercity::bond_unit_lot_settle(Origin::signed(INVESTOR2), bondid, INVESTOR1, lot), - RuntimeError::LotObsolete - ); - }); -} - -#[test] -fn bond_lot_try_exceed_portfolio() { - const ACCOUNT: u64 = 3; - const INVESTOR1: u64 = 4; - let bondid: BondId = "BOND".into(); - - new_test_ext().execute_with(|| { - let bond = get_test_bond().inner; - bond_grand_everusd(); - bond_activate(bondid, ACCOUNT, bond); - - let lot = BondUnitSaleLotStruct { - deadline: 100000, - new_bondholder: Default::default(), - bond_units: 500, - amount: 600 * 3_000_000_000_000, - }; - - assert_ok!(Evercity::bond_unit_lot_bid( - Origin::signed(INVESTOR1), - bondid, - lot.clone() - )); - assert_noop!( - Evercity::bond_unit_lot_bid(Origin::signed(INVESTOR1), bondid, lot.clone()), - RuntimeError::BalanceOverdraft - ); - // make amend. make prior lots expired - >::set_timestamp(100000 + 1); - let mut lot = lot; - lot.deadline = 100000 + 2; - assert_ok!(Evercity::bond_unit_lot_bid( - Origin::signed(INVESTOR1), - bondid, - lot - )); - }); -} diff --git a/vendor/evercity/transfer/Cargo.toml b/vendor/evercity/transfer/Cargo.toml deleted file mode 100644 index b43ccf41c..000000000 --- a/vendor/evercity/transfer/Cargo.toml +++ /dev/null @@ -1,41 +0,0 @@ -[package] -authors = ["Dmitry Dulesov "] -description = 'Endowing functions for Evercity green bonds emission project' -edition = '2018' -homepage = 'https://evercity.io' -license = 'Apache-2.0' -name = 'pallet-evercity-transfer' -repository = 'https://github.com/EvercityEcosystem/evercity-substrate' -version = '0.1.1' - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -scale-info = { version = "1.0", default-features = false, features = ["derive"] } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } - -[dev-dependencies] -sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" } - -[dependencies.serde] -optional = true -features = ['derive'] -version = '1.0.124' - -[dependencies.codec] -default-features = false -features = ['derive'] -package = 'parity-scale-codec' -version = '2.0.0' - -[features] -default = ['std'] -std = [ - 'serde', - 'codec/std', - 'frame-support/std', - 'frame-system/std', -] diff --git a/vendor/evercity/transfer/src/lib.rs b/vendor/evercity/transfer/src/lib.rs deleted file mode 100644 index 6549e6f9e..000000000 --- a/vendor/evercity/transfer/src/lib.rs +++ /dev/null @@ -1,86 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] - -use frame_support::{ - decl_error, decl_event, decl_module, decl_storage, - dispatch::DispatchResult, - ensure, - traits::{ - Currency, ExistenceRequirement, Get, LockIdentifier, LockableCurrency, WithdrawReasons, - }, - weights::Weight, -}; -use frame_system::ensure_signed; -#[cfg(test)] -mod tests; - -const EVERCITY_LOCK_ID: LockIdentifier = *b"ever/fee"; - -type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; - -pub trait WeightInfo { - fn transfer() -> Weight; -} - -impl WeightInfo for () { - #[allow(clippy::unnecessary_cast)] - fn transfer() -> Weight { - 10000_u64 as Weight - } -} - -pub trait Config: frame_system::Config { - type Event: From> + Into<::Event>; - /// The currency in which fees are paid and contract balances are held. - type Currency: LockableCurrency; - type WeightInfo: WeightInfo; - /// The maximum value that can be transferred at once - type MaximumTransferValue: Get>; -} - -decl_event!( - pub enum Event - where - AccountId = ::AccountId, - BalanceOf = BalanceOf, - { - /// Account endowed. \[account, value\] - Endow(AccountId, BalanceOf), - } -); - -decl_storage! { - trait Store for Module as EvercityTransfer { - - } -} - -decl_error! { - /// Error for the Transfer module - pub enum Error for Module { - /// Attempt to transfer more than defined limit - TransferRestriction, - } -} - -decl_module! { - /// Transfer module declaration. - pub struct Module for enum Call where origin: T::Origin { - type Error = Error; - const MaximumTransferValue: BalanceOf = T::MaximumTransferValue::get(); - - fn deposit_event() = default; - - #[weight = ::WeightInfo::transfer()] - fn transfer(origin, who: T::AccountId, value: BalanceOf) -> DispatchResult { - let sender = ensure_signed(origin)?; - ensure!(value<= T::MaximumTransferValue::get(), Error::::TransferRestriction); - - T::Currency::transfer(&sender, &who, value, ExistenceRequirement::AllowDeath )?; - - T::Currency::extend_lock(EVERCITY_LOCK_ID, &who, value, WithdrawReasons::except(WithdrawReasons::FEE) ); - Self::deposit_event(RawEvent::Endow(who, value)); - Ok(()) - } - } -} diff --git a/vendor/evercity/transfer/src/tests.rs b/vendor/evercity/transfer/src/tests.rs deleted file mode 100644 index b84f5fdd9..000000000 --- a/vendor/evercity/transfer/src/tests.rs +++ /dev/null @@ -1,116 +0,0 @@ -#![allow(clippy::from_over_into)] -use crate::{self as pallet_evercity_transfer, *}; - -use crate::*; -use frame_support::{ - assert_err, assert_ok, parameter_types, - sp_runtime::{ - testing::Header, - traits::{BlakeTwo256, IdentityLookup}, - }, -}; -use sp_core::H256; - -pub type Balance = u64; -const UNIT: Balance = 1_000_000; -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::{Module, Call, Config, Storage, Event}, - //Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, - Balances: pallet_balances::{Module, Call, Storage, Config, Event}, - //Evercity: pallet_evercity::{Module, Call, Storage, Event}, - EvercityTransfer: pallet_evercity_transfer::{Module, Call, Storage, Event}, - } -); - -parameter_types! { - pub const BlockHashCount: u64 = 2400; -} - -impl frame_system::Config for Test { - type Origin = Origin; - type Index = u64; - type BlockNumber = u64; - type Call = Call; - 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 DbWeight = (); - type BaseCallFilter = (); - type SystemWeightInfo = (); - type BlockWeights = (); - type BlockLength = (); - type SS58Prefix = (); -} - -parameter_types! { - pub const MaximumTransferValue: Balance = 10_000_000_000_000; -} - -impl Config for Test { - type Event = Event; - type MaximumTransferValue = MaximumTransferValue; - type Currency = Balances; - type WeightInfo = (); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = 0; - pub const MaxLocks: u32 = 5; -} - -impl pallet_balances::Config for Test { - type Balance = Balance; - type Event = Event; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = MaxLocks; -} - -fn new_test_ext() -> frame_support::sp_io::TestExternalities { - let mut storage = frame_system::GenesisConfig::default() - .build_storage::() - .unwrap(); - - pallet_balances::GenesisConfig:: { - // Provide some initial balances - balances: vec![(1, UNIT)], - } - .assimilate_storage(&mut storage) - .unwrap(); - - storage.into() -} - -#[test] -fn test_spend_endowed_balance() { - new_test_ext().execute_with(|| { - assert_ok!(EvercityTransfer::transfer(Origin::signed(1), 2, 1000)); - assert_eq!(Balances::free_balance(2), 1000); - assert_err!( - Balances::transfer(Origin::signed(2), 3, 10), - pallet_balances::Error::::LiquidityRestrictions - ); - assert_ok!(EvercityTransfer::transfer(Origin::signed(1), 2, 1000)); - assert_eq!(Balances::free_balance(2), 2000); - assert_ok!(Balances::transfer(Origin::signed(2), 3, 10)); - }) -} diff --git a/vendor/evercity/types.json b/vendor/evercity/types.json deleted file mode 100644 index 4d4e2c641..000000000 --- a/vendor/evercity/types.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "Address": "AccountId", - "LookupSource": "AccountId", - "EverUSDBalance": "u64", - "Moment": "u64", - "BondId": "[u8;16]", - "EvercityAccountStructOf": { - "roles": "u8", - "identity": "Compact", - "create_time": "Compact" - }, - "TokenMintRequestStructOf": { - "amount": "Compact", - "deadline": "Compact" - }, - "TokenBurnRequestStructOf": { - "amount": "Compact", - "deadline": "Compact" - }, - "BondImpactType": { - "_enum": [ - "POWER_GENERATED", - "CO2_EMISSIONS_REDUCTION" - ] - }, - "BondState": { - "_enum": [ - "PREPARE", - "BOOKING", - "ACTIVE", - "BANKRUPT", - "FINISHED" - ] - }, - "Hash": "[u8;32]", - "BondPeriod": "u32", - "BondUnitAmount": "u32", - "BondInterest": "u32", - "BondPeriodNumber": "u32", - "BondInnerStructOf": { - "docs_pack_root_hash_main": "Hash", - "docs_pack_root_hash_legal": "Hash", - "docs_pack_root_hash_finance": "Hash", - "docs_pack_root_hash_tech": "Hash", - "impact_data_type": "BondImpactType", - "impact_data_baseline": "Vec", - "impact_data_max_deviation_cap": "Compact", - "impact_data_max_deviation_floor": "Compact", - "impact_data_send_period": "Compact", - "interest_rate_penalty_for_missed_report": "Compact", - "interest_rate_base_value": "Compact", - "interest_rate_margin_cap": "Compact", - "interest_rate_margin_floor": "Compact", - "interest_rate_start_period_value": "Compact", - "interest_pay_period": "Compact", - "start_period": "Compact", - "payment_period": "Compact", - "bond_duration": "Compact", - "bond_finishing_period": "Compact", - "mincap_deadline": "Compact", - "bond_units_mincap_amount": "Compact", - "bond_units_maxcap_amount": "Compact", - "bond_units_base_price": "Compact" - }, - "BondStructOf": { - "inner": "BondInnerStructOf", - "issuer": "AccountId", - "manager": "AccountId", - "auditor": "AccountId", - "impact_reporter": "AccountId", - "issued_amount": "Compact", - "creation_date": "Compact", - "booking_start_date": "Compact", - "active_start_date": "Compact", - "state": "BondState", - "bond_debit": "Compact", - "bond_credit": "Compact", - "coupon_yield": "Compact", - "nonce": "Compact" - }, - "AccountYield": { - "coupon_yield": "Compact", - "period_num": "Compact" - }, - "BondUnitPackage": { - "bond_units": "Compact", - "acquisition": "Compact", - "coupon_yield": "Compact" - }, - "BondImpactReportStruct": { - "create_date": "Compact", - "impact_data": "Compact", - "signed": "bool" - }, - "BondUnitSaleLotStructOf": { - "deadline": "Compact", - "new_bondholder": "AccountId", - "bond_units": "Compact", - "amount": "Compact" - }, - "PeriodYield": { - "total_yield": "Compact", - "interest_rate": "Compact" - } - } \ No newline at end of file diff --git a/vendor/pallet-xcm/Cargo.toml b/vendor/pallet-xcm/Cargo.toml new file mode 100644 index 000000000..a698409c9 --- /dev/null +++ b/vendor/pallet-xcm/Cargo.toml @@ -0,0 +1,48 @@ +[package] +authors = ["Parity Technologies "] +edition = "2021" +name = "pallet-xcm" +version = "0.9.23" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.1.0", default-features = false, features = ["derive"] } +serde = { version = "1.0.136", optional = true, features = ["derive"] } +log = { version = "0.4.16", default-features = false } + +sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.23" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.23" } +sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.23" } +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.23" } +frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-v0.9.23" } + +xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.23" } +xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.23" } + +[dev-dependencies] +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.23" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.23" } +xcm-builder = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.23" } +polkadot-parachain = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.23" } + +[features] +default = ["std"] +std = [ + "codec/std", + "scale-info/std", + "serde", + "sp-std/std", + "sp-core/std", + "sp-runtime/std", + "frame-support/std", + "frame-system/std", + "xcm/std", + "xcm-executor/std", +] +runtime-benchmarks = [ + "xcm/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", +] diff --git a/vendor/pallet-xcm/src/lib.rs b/vendor/pallet-xcm/src/lib.rs new file mode 100644 index 000000000..89fe22aa1 --- /dev/null +++ b/vendor/pallet-xcm/src/lib.rs @@ -0,0 +1,1833 @@ +// Copyright 2020-2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Pallet to handle XCM messages. + +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(test)] +mod mock; +#[cfg(test)] +mod tests; + +use codec::{Decode, Encode, EncodeLike}; +use frame_support::traits::{Contains, EnsureOrigin, Get, OriginTrait}; +use scale_info::TypeInfo; +use sp_runtime::{ + traits::{BadOrigin, Saturating}, + RuntimeDebug, +}; +use sp_std::{boxed::Box, marker::PhantomData, prelude::*, result::Result, vec}; +use xcm::prelude::*; +use xcm_executor::traits::ConvertOrigin; + +use frame_support::PalletId; +pub use pallet::*; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use frame_support::{ + dispatch::{Dispatchable, GetDispatchInfo, PostDispatchInfo}, + pallet_prelude::*, + parameter_types, + }; + use frame_system::{pallet_prelude::*, Config as SysConfig}; + use sp_core::H256; + use sp_runtime::traits::{AccountIdConversion, BlakeTwo256, BlockNumberProvider, Hash}; + use xcm_executor::{ + traits::{ + ClaimAssets, DropAssets, InvertLocation, OnResponse, VersionChangeNotifier, + WeightBounds, + }, + Assets, + }; + + parameter_types! { + /// An implementation of `Get` which just returns the latest XCM version which we can + /// support. + pub const CurrentXcmVersion: u32 = XCM_VERSION; + } + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::config] + /// The module configuration trait. + pub trait Config: frame_system::Config { + /// The overarching event type. + type Event: From> + IsType<::Event>; + + /// Required origin for sending XCM messages. If successful, it resolves to `MultiLocation` + /// which exists as an interior location within this chain's XCM context. + type SendXcmOrigin: EnsureOrigin<::Origin, Success = MultiLocation>; + + /// The type used to actually dispatch an XCM to its destination. + type XcmRouter: SendXcm; + + /// Required origin for executing XCM messages, including the teleport functionality. If successful, + /// then it resolves to `MultiLocation` which exists as an interior location within this chain's XCM + /// context. + type ExecuteXcmOrigin: EnsureOrigin<::Origin, Success = MultiLocation>; + + /// Our XCM filter which messages to be executed using `XcmExecutor` must pass. + type XcmExecuteFilter: Contains<(MultiLocation, Xcm<::Call>)>; + + /// Something to execute an XCM message. + type XcmExecutor: ExecuteXcm<::Call>; + + /// Our XCM filter which messages to be teleported using the dedicated extrinsic must pass. + type XcmTeleportFilter: Contains<(MultiLocation, Vec)>; + + /// Our XCM filter which messages to be reserve-transferred using the dedicated extrinsic must pass. + type XcmReserveTransferFilter: Contains<(MultiLocation, Vec)>; + + /// Means of measuring the weight consumed by an XCM message locally. + type Weigher: WeightBounds<::Call>; + + /// Means of inverting a location. + type LocationInverter: InvertLocation; + + /// The outer `Origin` type. + type Origin: From + From<::Origin>; + + /// The outer `Call` type. + type Call: Parameter + + GetDispatchInfo + + IsType<::Call> + + Dispatchable::Origin, PostInfo = PostDispatchInfo>; + + const VERSION_DISCOVERY_QUEUE_SIZE: u32; + + /// The latest supported version that we advertise. Generally just set it to + /// `pallet_xcm::CurrentXcmVersion`. + type AdvertisedXcmVersion: Get; + } + + /// The maximum number of distinct assets allowed to be transferred in a single helper extrinsic. + const MAX_ASSETS_FOR_TRANSFER: usize = 2; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + /// Execution of an XCM message was attempted. + /// + /// \[ outcome \] + Attempted(xcm::latest::Outcome), + /// A XCM message was sent. + /// + /// \[ origin, destination, message \] + Sent(MultiLocation, MultiLocation, Xcm<()>), + /// Query response received which does not match a registered query. This may be because a + /// matching query was never registered, it may be because it is a duplicate response, or + /// because the query timed out. + /// + /// \[ origin location, id \] + UnexpectedResponse(MultiLocation, QueryId), + /// Query response has been received and is ready for taking with `take_response`. There is + /// no registered notification call. + /// + /// \[ id, response \] + ResponseReady(QueryId, Response), + /// Query response has been received and query is removed. The registered notification has + /// been dispatched and executed successfully. + /// + /// \[ id, pallet index, call index \] + Notified(QueryId, u8, u8), + /// Query response has been received and query is removed. The registered notification could + /// not be dispatched because the dispatch weight is greater than the maximum weight + /// originally budgeted by this runtime for the query result. + /// + /// \[ id, pallet index, call index, actual weight, max budgeted weight \] + NotifyOverweight(QueryId, u8, u8, Weight, Weight), + /// Query response has been received and query is removed. There was a general error with + /// dispatching the notification call. + /// + /// \[ id, pallet index, call index \] + NotifyDispatchError(QueryId, u8, u8), + /// Query response has been received and query is removed. The dispatch was unable to be + /// decoded into a `Call`; this might be due to dispatch function having a signature which + /// is not `(origin, QueryId, Response)`. + /// + /// \[ id, pallet index, call index \] + NotifyDecodeFailed(QueryId, u8, u8), + /// Expected query response has been received but the origin location of the response does + /// not match that expected. The query remains registered for a later, valid, response to + /// be received and acted upon. + /// + /// \[ origin location, id, expected location \] + InvalidResponder(MultiLocation, QueryId, Option), + /// Expected query response has been received but the expected origin location placed in + /// storage by this runtime previously cannot be decoded. The query remains registered. + /// + /// This is unexpected (since a location placed in storage in a previously executing + /// runtime should be readable prior to query timeout) and dangerous since the possibly + /// valid response will be dropped. Manual governance intervention is probably going to be + /// needed. + /// + /// \[ origin location, id \] + InvalidResponderVersion(MultiLocation, QueryId), + /// Received query response has been read and removed. + /// + /// \[ id \] + ResponseTaken(QueryId), + /// Some assets have been placed in an asset trap. + /// + /// \[ hash, origin, assets \] + AssetsTrapped(H256, MultiLocation, VersionedMultiAssets), + /// An XCM version change notification message has been attempted to be sent. + /// + /// \[ destination, result \] + VersionChangeNotified(MultiLocation, XcmVersion), + /// The supported version of a location has been changed. This might be through an + /// automatic notification or a manual intervention. + /// + /// \[ location, XCM version \] + SupportedVersionChanged(MultiLocation, XcmVersion), + /// A given location which had a version change subscription was dropped owing to an error + /// sending the notification to it. + /// + /// \[ location, query ID, error \] + NotifyTargetSendFail(MultiLocation, QueryId, XcmError), + /// A given location which had a version change subscription was dropped owing to an error + /// migrating the location to our new XCM format. + /// + /// \[ location, query ID \] + NotifyTargetMigrationFail(VersionedMultiLocation, QueryId), + } + + #[pallet::origin] + #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)] + pub enum Origin { + /// It comes from somewhere in the XCM space wanting to transact. + Xcm(MultiLocation), + /// It comes as an expected response from an XCM location. + Response(MultiLocation), + } + impl From for Origin { + fn from(location: MultiLocation) -> Origin { + Origin::Xcm(location) + } + } + + #[pallet::error] + pub enum Error { + /// The desired destination was unreachable, generally because there is a no way of routing + /// to it. + Unreachable, + /// There was some other issue (i.e. not to do with routing) in sending the message. Perhaps + /// a lack of space for buffering the message. + SendFailure, + /// The message execution fails the filter. + Filtered, + /// The message's weight could not be determined. + UnweighableMessage, + /// The destination `MultiLocation` provided cannot be inverted. + DestinationNotInvertible, + /// The assets to be sent are empty. + Empty, + /// Could not re-anchor the assets to declare the fees for the destination chain. + CannotReanchor, + /// Too many assets have been attempted for transfer. + TooManyAssets, + /// Origin is invalid for sending. + InvalidOrigin, + /// The version of the `Versioned` value used is not able to be interpreted. + BadVersion, + /// The given location could not be used (e.g. because it cannot be expressed in the + /// desired version of XCM). + BadLocation, + /// The referenced subscription could not be found. + NoSubscription, + /// The location is invalid since it already has a subscription from us. + AlreadySubscribed, + } + + /// The status of a query. + #[derive(Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug, TypeInfo)] + pub enum QueryStatus { + /// The query was sent but no response has yet been received. + Pending { + responder: VersionedMultiLocation, + maybe_notify: Option<(u8, u8)>, + timeout: BlockNumber, + }, + /// The query is for an ongoing version notification subscription. + VersionNotifier { + origin: VersionedMultiLocation, + is_active: bool, + }, + /// A response has been received. + Ready { + response: VersionedResponse, + at: BlockNumber, + }, + } + + #[derive(Copy, Clone)] + pub(crate) struct LatestVersionedMultiLocation<'a>(pub(crate) &'a MultiLocation); + impl<'a> EncodeLike for LatestVersionedMultiLocation<'a> {} + impl<'a> Encode for LatestVersionedMultiLocation<'a> { + fn encode(&self) -> Vec { + let mut r = VersionedMultiLocation::from(MultiLocation::default()).encode(); + r.truncate(1); + self.0.using_encoded(|d| r.extend_from_slice(d)); + r + } + } + + #[derive(Clone, Encode, Decode, Eq, PartialEq, Ord, PartialOrd, TypeInfo)] + pub enum VersionMigrationStage { + MigrateSupportedVersion, + MigrateVersionNotifiers, + NotifyCurrentTargets(Option>), + MigrateAndNotifyOldTargets, + } + + impl Default for VersionMigrationStage { + fn default() -> Self { + Self::MigrateSupportedVersion + } + } + + /// The latest available query index. + #[pallet::storage] + pub(super) type QueryCounter = StorageValue<_, QueryId, ValueQuery>; + + /// The ongoing queries. + #[pallet::storage] + #[pallet::getter(fn query)] + pub(super) type Queries = + StorageMap<_, Blake2_128Concat, QueryId, QueryStatus, OptionQuery>; + + /// The existing asset traps. + /// + /// Key is the blake2 256 hash of (origin, versioned `MultiAssets`) pair. Value is the number of + /// times this pair has been trapped (usually just 1 if it exists at all). + #[pallet::storage] + #[pallet::getter(fn asset_trap)] + pub(super) type AssetTraps = StorageMap<_, Identity, H256, u32, ValueQuery>; + + /// Default version to encode XCM when latest version of destination is unknown. If `None`, + /// then the destinations whose XCM version is unknown are considered unreachable. + #[pallet::storage] + pub(super) type SafeXcmVersion = StorageValue<_, XcmVersion, OptionQuery>; + + /// The Latest versions that we know various locations support. + #[pallet::storage] + pub(super) type SupportedVersion = StorageDoubleMap< + _, + Twox64Concat, + XcmVersion, + Blake2_128Concat, + VersionedMultiLocation, + XcmVersion, + OptionQuery, + >; + + /// All locations that we have requested version notifications from. + #[pallet::storage] + pub(super) type VersionNotifiers = StorageDoubleMap< + _, + Twox64Concat, + XcmVersion, + Blake2_128Concat, + VersionedMultiLocation, + QueryId, + OptionQuery, + >; + + /// The target locations that are subscribed to our version changes, as well as the most recent + /// of our versions we informed them of. + #[pallet::storage] + pub(super) type VersionNotifyTargets = StorageDoubleMap< + _, + Twox64Concat, + XcmVersion, + Blake2_128Concat, + VersionedMultiLocation, + (QueryId, u64, XcmVersion), + OptionQuery, + >; + + pub struct VersionDiscoveryQueueSize(PhantomData); + impl Get for VersionDiscoveryQueueSize { + fn get() -> u32 { + T::VERSION_DISCOVERY_QUEUE_SIZE + } + } + + /// Destinations whose latest XCM version we would like to know. Duplicates not allowed, and + /// the `u32` counter is the number of times that a send to the destination has been attempted, + /// which is used as a prioritization. + #[pallet::storage] + pub(super) type VersionDiscoveryQueue = StorageValue< + _, + BoundedVec<(VersionedMultiLocation, u32), VersionDiscoveryQueueSize>, + ValueQuery, + >; + + /// The current migration's stage, if any. + #[pallet::storage] + pub(super) type CurrentMigration = + StorageValue<_, VersionMigrationStage, OptionQuery>; + + #[pallet::genesis_config] + pub struct GenesisConfig { + /// The default version to encode outgoing XCM messages with. + pub safe_xcm_version: Option, + } + + #[cfg(feature = "std")] + impl Default for GenesisConfig { + fn default() -> Self { + Self { + safe_xcm_version: Some(XCM_VERSION), + } + } + } + + #[pallet::genesis_build] + impl GenesisBuild for GenesisConfig { + fn build(&self) { + SafeXcmVersion::::set(self.safe_xcm_version); + } + } + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_initialize(_n: BlockNumberFor) -> Weight { + let mut weight_used = 0; + if let Some(migration) = CurrentMigration::::get() { + // Consume 10% of block at most + let max_weight = T::BlockWeights::get().max_block / 10; + let (w, maybe_migration) = Self::check_xcm_version_change(migration, max_weight); + CurrentMigration::::set(maybe_migration); + weight_used.saturating_accrue(w); + } + + // Here we aim to get one successful version negotiation request sent per block, ordered + // by the destinations being most sent to. + let mut q = VersionDiscoveryQueue::::take().into_inner(); + // TODO: correct weights. + weight_used += T::DbWeight::get().read + T::DbWeight::get().write; + q.sort_by_key(|i| i.1); + while let Some((versioned_dest, _)) = q.pop() { + if let Ok(dest) = MultiLocation::try_from(versioned_dest) { + if Self::request_version_notify(dest).is_ok() { + // TODO: correct weights. + weight_used += T::DbWeight::get().read + T::DbWeight::get().write; + break; + } + } + } + // Should never fail since we only removed items. But better safe than panicking as it's + // way better to drop the queue than panic on initialize. + if let Ok(q) = BoundedVec::try_from(q) { + VersionDiscoveryQueue::::put(q); + } + weight_used + } + fn on_runtime_upgrade() -> Weight { + // Start a migration (this happens before on_initialize so it'll happen later in this + // block, which should be good enough)... + CurrentMigration::::put(VersionMigrationStage::default()); + T::DbWeight::get().write + } + } + + #[pallet::call] + impl Pallet { + #[pallet::weight(100_000_000)] + pub fn send( + origin: OriginFor, + dest: Box, + message: Box>, + ) -> DispatchResult { + let origin_location = T::SendXcmOrigin::ensure_origin(origin)?; + let interior: Junctions = origin_location + .clone() + .try_into() + .map_err(|_| Error::::InvalidOrigin)?; + let dest = MultiLocation::try_from(*dest).map_err(|()| Error::::BadVersion)?; + let message: Xcm<()> = (*message).try_into().map_err(|()| Error::::BadVersion)?; + + Self::send_xcm(interior, dest.clone(), message.clone()).map_err(|e| match e { + SendError::CannotReachDestination(..) => Error::::Unreachable, + _ => Error::::SendFailure, + })?; + Self::deposit_event(Event::Sent(origin_location, dest, message)); + Ok(()) + } + + /// Teleport some assets from the local chain to some destination chain. + /// + /// Fee payment on the destination side is made from the asset in the `assets` vector of + /// index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + /// with all fees taken as needed from the asset. + /// + /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. + /// - `dest`: Destination context for the assets. Will typically be `X2(Parent, Parachain(..))` to send + /// from parachain to parachain, or `X1(Parachain(..))` to send from relay to parachain. + /// - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will generally be + /// an `AccountId32` value. + /// - `assets`: The assets to be withdrawn. The first item should be the currency used to to pay the fee on the + /// `dest` side. May not be empty. + /// - `fee_asset_item`: The index into `assets` of the item which should be used to pay + /// fees. + #[pallet::weight({ + let maybe_assets: Result = (*assets.clone()).try_into(); + let maybe_dest: Result = (*dest.clone()).try_into(); + match (maybe_assets, maybe_dest) { + (Ok(assets), Ok(dest)) => { + use sp_std::vec; + let mut message = Xcm(vec![ + WithdrawAsset(assets), + InitiateTeleport { assets: Wild(All), dest, xcm: Xcm(vec![]) }, + ]); + T::Weigher::weight(&mut message).map_or(Weight::max_value(), |w| 100_000_000 + w) + }, + _ => Weight::max_value(), + } + })] + pub fn teleport_assets( + origin: OriginFor, + dest: Box, + beneficiary: Box, + assets: Box, + fee_asset_item: u32, + ) -> DispatchResult { + Self::do_teleport_assets(origin, dest, beneficiary, assets, fee_asset_item, None) + } + + /// Transfer some assets from the local chain to the sovereign account of a destination + /// chain and forward a notification XCM. + /// + /// Fee payment on the destination side is made from the asset in the `assets` vector of + /// index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + /// with all fees taken as needed from the asset. + /// + /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. + /// - `dest`: Destination context for the assets. Will typically be `X2(Parent, Parachain(..))` to send + /// from parachain to parachain, or `X1(Parachain(..))` to send from relay to parachain. + /// - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will generally be + /// an `AccountId32` value. + /// - `assets`: The assets to be withdrawn. This should include the assets used to pay the fee on the + /// `dest` side. + /// - `fee_asset_item`: The index into `assets` of the item which should be used to pay + /// fees. + #[pallet::weight({ + match ((*assets.clone()).try_into(), (*dest.clone()).try_into()) { + (Ok(assets), Ok(dest)) => { + use sp_std::vec; + let mut message = Xcm(vec![ + TransferReserveAsset { assets, dest, xcm: Xcm(vec![]) } + ]); + T::Weigher::weight(&mut message).map_or(Weight::max_value(), |w| 100_000_000 + w) + }, + _ => Weight::max_value(), + } + })] + pub fn reserve_transfer_assets( + origin: OriginFor, + dest: Box, + beneficiary: Box, + assets: Box, + fee_asset_item: u32, + ) -> DispatchResult { + Self::do_reserve_transfer_assets( + origin, + dest, + beneficiary, + assets, + fee_asset_item, + None, + ) + } + + /// Transfer some assets from sovereign account to reserve holder chain and + /// forward a notification XCM. + /// + /// Fee payment on the destination side is made from the asset in the `assets` vector of + /// index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + /// with all fees taken as needed from the asset. + /// + /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. + /// - `dest`: Destination context for the assets. Will typically be `X2(Parent, Parachain(..))` to send + /// from parachain to parachain, or `X1(Parachain(..))` to send from relay to parachain. + /// - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will generally be + /// an `AccountId32` value. + /// - `assets`: The assets to be withdrawn. This should include the assets used to pay the fee on the + /// `dest` side. + /// - `fee_asset_item`: The index into `assets` of the item which should be used to pay + /// fees. + #[pallet::weight({ + match ((*assets.clone()).try_into(), (*dest.clone()).try_into()) { + (Ok(assets), Ok(dest)) => { + use sp_std::vec; + let mut message = Xcm(vec![ + WithdrawAsset(assets), + InitiateReserveWithdraw { assets: Wild(All), reserve: dest, xcm: Xcm(vec![]) } + ]); + T::Weigher::weight(&mut message).map_or(Weight::max_value(), |w| 100_000_000 + w) + }, + _ => Weight::max_value(), + } + })] + pub fn reserve_withdraw_assets( + origin: OriginFor, + dest: Box, + beneficiary: Box, + assets: Box, + fee_asset_item: u32, + ) -> DispatchResult { + Self::do_reserve_withdraw_assets( + origin, + dest, + beneficiary, + assets, + fee_asset_item, + None, + ) + } + + /// Execute an XCM message from a local, signed, origin. + /// + /// An event is deposited indicating whether `msg` could be executed completely or only + /// partially. + /// + /// No more than `max_weight` will be used in its attempted execution. If this is less than the + /// maximum amount of weight that the message could take to be executed, then no execution + /// attempt will be made. + /// + /// NOTE: A successful return to this does *not* imply that the `msg` was executed successfully + /// to completion; only that *some* of it was executed. + #[pallet::weight(max_weight.saturating_add(100_000_000u64))] + pub fn execute( + origin: OriginFor, + message: Box::Call>>, + max_weight: Weight, + ) -> DispatchResultWithPostInfo { + let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; + let message = (*message).try_into().map_err(|()| Error::::BadVersion)?; + let value = (origin_location, message); + ensure!(T::XcmExecuteFilter::contains(&value), Error::::Filtered); + let (origin_location, message) = value; + let outcome = T::XcmExecutor::execute_xcm_in_credit( + origin_location, + message, + max_weight, + max_weight, + ); + let result = Ok(Some(outcome.weight_used().saturating_add(100_000_000)).into()); + Self::deposit_event(Event::Attempted(outcome)); + result + } + + /// Extoll that a particular destination can be communicated with through a particular + /// version of XCM. + /// + /// - `origin`: Must be Root. + /// - `location`: The destination that is being described. + /// - `xcm_version`: The latest version of XCM that `location` supports. + #[pallet::weight(100_000_000u64)] + pub fn force_xcm_version( + origin: OriginFor, + location: Box, + xcm_version: XcmVersion, + ) -> DispatchResult { + ensure_root(origin)?; + let location = *location; + SupportedVersion::::insert( + XCM_VERSION, + LatestVersionedMultiLocation(&location), + xcm_version, + ); + Self::deposit_event(Event::SupportedVersionChanged(location, xcm_version)); + Ok(()) + } + + /// Set a safe XCM version (the version that XCM should be encoded with if the most recent + /// version a destination can accept is unknown). + /// + /// - `origin`: Must be Root. + /// - `maybe_xcm_version`: The default XCM encoding version, or `None` to disable. + #[pallet::weight(100_000_000u64)] + pub fn force_default_xcm_version( + origin: OriginFor, + maybe_xcm_version: Option, + ) -> DispatchResult { + ensure_root(origin)?; + SafeXcmVersion::::set(maybe_xcm_version); + Ok(()) + } + + /// Ask a location to notify us regarding their XCM version and any changes to it. + /// + /// - `origin`: Must be Root. + /// - `location`: The location to which we should subscribe for XCM version notifications. + #[pallet::weight(100_000_000u64)] + pub fn force_subscribe_version_notify( + origin: OriginFor, + location: Box, + ) -> DispatchResult { + ensure_root(origin)?; + let location: MultiLocation = (*location) + .try_into() + .map_err(|()| Error::::BadLocation)?; + Self::request_version_notify(location).map_err(|e| { + match e { + XcmError::InvalidLocation => Error::::AlreadySubscribed, + _ => Error::::InvalidOrigin, + } + .into() + }) + } + + /// Require that a particular destination should no longer notify us regarding any XCM + /// version changes. + /// + /// - `origin`: Must be Root. + /// - `location`: The location to which we are currently subscribed for XCM version + /// notifications which we no longer desire. + #[pallet::weight(100_000_000u64)] + pub fn force_unsubscribe_version_notify( + origin: OriginFor, + location: Box, + ) -> DispatchResult { + ensure_root(origin)?; + let location: MultiLocation = (*location) + .try_into() + .map_err(|()| Error::::BadLocation)?; + Self::unrequest_version_notify(location).map_err(|e| { + match e { + XcmError::InvalidLocation => Error::::NoSubscription, + _ => Error::::InvalidOrigin, + } + .into() + }) + } + + /// Transfer some assets from the local chain to the sovereign account of a destination + /// chain and forward a notification XCM. + /// + /// Fee payment on the destination side is made from the asset in the `assets` vector of + /// index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + /// is needed than `weight_limit`, then the operation will fail and the assets send may be + /// at risk. + /// + /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. + /// - `dest`: Destination context for the assets. Will typically be `X2(Parent, Parachain(..))` to send + /// from parachain to parachain, or `X1(Parachain(..))` to send from relay to parachain. + /// - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will generally be + /// an `AccountId32` value. + /// - `assets`: The assets to be withdrawn. This should include the assets used to pay the fee on the + /// `dest` side. + /// - `fee_asset_item`: The index into `assets` of the item which should be used to pay + /// fees. + /// - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + #[pallet::weight({ + match ((*assets.clone()).try_into(), (*dest.clone()).try_into()) { + (Ok(assets), Ok(dest)) => { + use sp_std::vec; + let mut message = Xcm(vec![ + TransferReserveAsset { assets, dest, xcm: Xcm(vec![]) } + ]); + T::Weigher::weight(&mut message).map_or(Weight::max_value(), |w| 100_000_000 + w) + }, + _ => Weight::max_value(), + } + })] + pub fn limited_reserve_transfer_assets( + origin: OriginFor, + dest: Box, + beneficiary: Box, + assets: Box, + fee_asset_item: u32, + weight_limit: WeightLimit, + ) -> DispatchResult { + Self::do_reserve_transfer_assets( + origin, + dest, + beneficiary, + assets, + fee_asset_item, + Some(weight_limit), + ) + } + + /// Teleport some assets from the local chain to some destination chain. + /// + /// Fee payment on the destination side is made from the asset in the `assets` vector of + /// index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + /// is needed than `weight_limit`, then the operation will fail and the assets send may be + /// at risk. + /// + /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. + /// - `dest`: Destination context for the assets. Will typically be `X2(Parent, Parachain(..))` to send + /// from parachain to parachain, or `X1(Parachain(..))` to send from relay to parachain. + /// - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will generally be + /// an `AccountId32` value. + /// - `assets`: The assets to be withdrawn. The first item should be the currency used to to pay the fee on the + /// `dest` side. May not be empty. + /// - `fee_asset_item`: The index into `assets` of the item which should be used to pay + /// fees. + /// - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + #[pallet::weight({ + let maybe_assets: Result = (*assets.clone()).try_into(); + let maybe_dest: Result = (*dest.clone()).try_into(); + match (maybe_assets, maybe_dest) { + (Ok(assets), Ok(dest)) => { + use sp_std::vec; + let mut message = Xcm(vec![ + WithdrawAsset(assets), + InitiateTeleport { assets: Wild(All), dest, xcm: Xcm(vec![]) }, + ]); + T::Weigher::weight(&mut message).map_or(Weight::max_value(), |w| 100_000_000 + w) + }, + _ => Weight::max_value(), + } + })] + pub fn limited_teleport_assets( + origin: OriginFor, + dest: Box, + beneficiary: Box, + assets: Box, + fee_asset_item: u32, + weight_limit: WeightLimit, + ) -> DispatchResult { + Self::do_teleport_assets( + origin, + dest, + beneficiary, + assets, + fee_asset_item, + Some(weight_limit), + ) + } + + /// Transfer some assets from sovereign account to reserve holder chain and + /// forward a notification XCM. + /// + /// Fee payment on the destination side is made from the asset in the `assets` vector of + /// index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + /// with all fees taken as needed from the asset. + /// + /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. + /// - `dest`: Destination context for the assets. Will typically be `X2(Parent, Parachain(..))` to send + /// from parachain to parachain, or `X1(Parachain(..))` to send from relay to parachain. + /// - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will generally be + /// an `AccountId32` value. + /// - `assets`: The assets to be withdrawn. This should include the assets used to pay the fee on the + /// `dest` side. + /// - `fee_asset_item`: The index into `assets` of the item which should be used to pay + /// fees. + /// - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + #[pallet::weight({ + match ((*assets.clone()).try_into(), (*dest.clone()).try_into()) { + (Ok(assets), Ok(dest)) => { + use sp_std::vec; + let mut message = Xcm(vec![ + TransferReserveAsset { assets, dest, xcm: Xcm(vec![]) } + ]); + T::Weigher::weight(&mut message).map_or(Weight::max_value(), |w| 100_000_000 + w) + }, + _ => Weight::max_value(), + } + })] + pub fn limited_reserve_withdraw_assets( + origin: OriginFor, + dest: Box, + beneficiary: Box, + assets: Box, + fee_asset_item: u32, + weight_limit: WeightLimit, + ) -> DispatchResult { + Self::do_reserve_withdraw_assets( + origin, + dest, + beneficiary, + assets, + fee_asset_item, + Some(weight_limit), + ) + } + } + + impl Pallet { + fn do_reserve_transfer_assets( + origin: OriginFor, + dest: Box, + beneficiary: Box, + assets: Box, + fee_asset_item: u32, + maybe_weight_limit: Option, + ) -> DispatchResult { + let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; + let dest = (*dest).try_into().map_err(|()| Error::::BadVersion)?; + let beneficiary: MultiLocation = (*beneficiary) + .try_into() + .map_err(|()| Error::::BadVersion)?; + let assets: MultiAssets = (*assets).try_into().map_err(|()| Error::::BadVersion)?; + + ensure!( + assets.len() <= MAX_ASSETS_FOR_TRANSFER, + Error::::TooManyAssets + ); + let value = (origin_location, assets.drain()); + ensure!( + T::XcmReserveTransferFilter::contains(&value), + Error::::Filtered + ); + let (origin_location, assets) = value; + let ancestry = T::LocationInverter::ancestry(); + let fees = assets + .get(fee_asset_item as usize) + .ok_or(Error::::Empty)? + .clone() + .reanchored(&dest, &ancestry) + .map_err(|_| Error::::CannotReanchor)?; + let max_assets = assets.len() as u32; + let assets: MultiAssets = assets.into(); + let weight_limit = match maybe_weight_limit { + Some(weight_limit) => weight_limit, + None => { + let beneficiary = beneficiary.clone(); + let fees = fees.clone(); + let mut remote_message = Xcm(vec![ + ReserveAssetDeposited(assets.clone()), + ClearOrigin, + BuyExecution { + fees, + weight_limit: Limited(0), + }, + DepositAsset { + assets: Wild(All), + max_assets, + beneficiary, + }, + ]); + // use local weight for remote message and hope for the best. + let remote_weight = T::Weigher::weight(&mut remote_message) + .map_err(|()| Error::::UnweighableMessage)?; + Limited(remote_weight) + } + }; + let xcm = Xcm(vec![ + BuyExecution { fees, weight_limit }, + DepositAsset { + assets: Wild(All), + max_assets, + beneficiary, + }, + ]); + let mut message = Xcm(vec![TransferReserveAsset { assets, dest, xcm }]); + let weight = + T::Weigher::weight(&mut message).map_err(|()| Error::::UnweighableMessage)?; + let outcome = + T::XcmExecutor::execute_xcm_in_credit(origin_location, message, weight, weight); + Self::deposit_event(Event::Attempted(outcome)); + Ok(()) + } + + fn do_teleport_assets( + origin: OriginFor, + dest: Box, + beneficiary: Box, + assets: Box, + fee_asset_item: u32, + maybe_weight_limit: Option, + ) -> DispatchResult { + let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; + let dest = (*dest).try_into().map_err(|()| Error::::BadVersion)?; + let beneficiary: MultiLocation = (*beneficiary) + .try_into() + .map_err(|()| Error::::BadVersion)?; + let assets: MultiAssets = (*assets).try_into().map_err(|()| Error::::BadVersion)?; + + ensure!( + assets.len() <= MAX_ASSETS_FOR_TRANSFER, + Error::::TooManyAssets + ); + let value = (origin_location, assets.drain()); + ensure!(T::XcmTeleportFilter::contains(&value), Error::::Filtered); + let (origin_location, assets) = value; + let ancestry = T::LocationInverter::ancestry(); + let fees = assets + .get(fee_asset_item as usize) + .ok_or(Error::::Empty)? + .clone() + .reanchored(&dest, &ancestry) + .map_err(|_| Error::::CannotReanchor)?; + let max_assets = assets.len() as u32; + let assets: MultiAssets = assets.into(); + let weight_limit = match maybe_weight_limit { + Some(weight_limit) => weight_limit, + None => { + let beneficiary = beneficiary.clone(); + let fees = fees.clone(); + let mut remote_message = Xcm(vec![ + ReceiveTeleportedAsset(assets.clone()), + ClearOrigin, + BuyExecution { + fees, + weight_limit: Limited(0), + }, + DepositAsset { + assets: Wild(All), + max_assets, + beneficiary, + }, + ]); + // use local weight for remote message and hope for the best. + let remote_weight = T::Weigher::weight(&mut remote_message) + .map_err(|()| Error::::UnweighableMessage)?; + Limited(remote_weight) + } + }; + let xcm = Xcm(vec![ + BuyExecution { fees, weight_limit }, + DepositAsset { + assets: Wild(All), + max_assets, + beneficiary, + }, + ]); + let mut message = Xcm(vec![ + WithdrawAsset(assets), + InitiateTeleport { + assets: Wild(All), + dest, + xcm, + }, + ]); + let weight = + T::Weigher::weight(&mut message).map_err(|()| Error::::UnweighableMessage)?; + let outcome = + T::XcmExecutor::execute_xcm_in_credit(origin_location, message, weight, weight); + Self::deposit_event(Event::Attempted(outcome)); + Ok(()) + } + + fn do_reserve_withdraw_assets( + origin: OriginFor, + dest: Box, + beneficiary: Box, + assets: Box, + fee_asset_item: u32, + maybe_weight_limit: Option, + ) -> DispatchResult { + let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; + let dest = (*dest).try_into().map_err(|()| Error::::BadVersion)?; + let beneficiary: MultiLocation = (*beneficiary) + .try_into() + .map_err(|()| Error::::BadVersion)?; + let assets: MultiAssets = (*assets).try_into().map_err(|()| Error::::BadVersion)?; + + ensure!( + assets.len() <= MAX_ASSETS_FOR_TRANSFER, + Error::::TooManyAssets + ); + let value = (origin_location, assets.drain()); + ensure!( + T::XcmReserveTransferFilter::contains(&value), + Error::::Filtered + ); + let (origin_location, assets) = value; + let ancestry = T::LocationInverter::ancestry(); + let fees = assets + .get(fee_asset_item as usize) + .ok_or(Error::::Empty)? + .clone() + .reanchored(&dest, &ancestry) + .map_err(|_| Error::::CannotReanchor)?; + let max_assets = assets.len() as u32; + let assets: MultiAssets = assets.into(); + let weight_limit = match maybe_weight_limit { + Some(weight_limit) => weight_limit, + None => { + let beneficiary = beneficiary.clone(); + let fees = fees.clone(); + let mut remote_message = Xcm(vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { + fees, + weight_limit: Limited(0), + }, + DepositAsset { + assets: Wild(All), + max_assets, + beneficiary, + }, + ]); + // use local weight for remote message and hope for the best. + let remote_weight = T::Weigher::weight(&mut remote_message) + .map_err(|()| Error::::UnweighableMessage)?; + Limited(remote_weight) + } + }; + let xcm = Xcm(vec![ + BuyExecution { fees, weight_limit }, + DepositAsset { + assets: Wild(All), + max_assets, + beneficiary, + }, + ]); + let mut message = Xcm(vec![ + WithdrawAsset(assets), + InitiateReserveWithdraw { + assets: Wild(All), + reserve: dest, + xcm, + }, + ]); + let weight = + T::Weigher::weight(&mut message).map_err(|()| Error::::UnweighableMessage)?; + let outcome = + T::XcmExecutor::execute_xcm_in_credit(origin_location, message, weight, weight); + Self::deposit_event(Event::Attempted(outcome)); + Ok(()) + } + + /// Will always make progress, and will do its best not to use much more than `weight_cutoff` + /// in doing so. + pub(crate) fn check_xcm_version_change( + mut stage: VersionMigrationStage, + weight_cutoff: Weight, + ) -> (Weight, Option) { + let mut weight_used = 0; + + // TODO: Correct weights for the components of this: + let todo_sv_migrate_weight: Weight = T::DbWeight::get().read + T::DbWeight::get().write; + let todo_vn_migrate_weight: Weight = T::DbWeight::get().read + T::DbWeight::get().write; + let todo_vnt_already_notified_weight: Weight = T::DbWeight::get().read; + let todo_vnt_notify_weight: Weight = + T::DbWeight::get().read + T::DbWeight::get().write * 3; + let todo_vnt_migrate_weight: Weight = + T::DbWeight::get().read + T::DbWeight::get().write; + let todo_vnt_migrate_fail_weight: Weight = + T::DbWeight::get().read + T::DbWeight::get().write; + let todo_vnt_notify_migrate_weight: Weight = + T::DbWeight::get().read + T::DbWeight::get().write * 3; + + use VersionMigrationStage::*; + + if stage == MigrateSupportedVersion { + // We assume that supported XCM version only ever increases, so just cycle through lower + // XCM versioned from the current. + for v in 0..XCM_VERSION { + for (old_key, value) in SupportedVersion::::drain_prefix(v) { + if let Ok(new_key) = old_key.into_latest() { + SupportedVersion::::insert(XCM_VERSION, new_key, value); + } + weight_used.saturating_accrue(todo_sv_migrate_weight); + if weight_used >= weight_cutoff { + return (weight_used, Some(stage)); + } + } + } + stage = MigrateVersionNotifiers; + } + if stage == MigrateVersionNotifiers { + for v in 0..XCM_VERSION { + for (old_key, value) in VersionNotifiers::::drain_prefix(v) { + if let Ok(new_key) = old_key.into_latest() { + VersionNotifiers::::insert(XCM_VERSION, new_key, value); + } + weight_used.saturating_accrue(todo_vn_migrate_weight); + if weight_used >= weight_cutoff { + return (weight_used, Some(stage)); + } + } + } + stage = NotifyCurrentTargets(None); + } + + let xcm_version = T::AdvertisedXcmVersion::get(); + + if let NotifyCurrentTargets(maybe_last_raw_key) = stage { + let mut iter = match maybe_last_raw_key { + Some(k) => VersionNotifyTargets::::iter_prefix_from(XCM_VERSION, k), + None => VersionNotifyTargets::::iter_prefix(XCM_VERSION), + }; + while let Some((key, value)) = iter.next() { + let (query_id, max_weight, target_xcm_version) = value; + let new_key: MultiLocation = match key.clone().try_into() { + Ok(k) if target_xcm_version != xcm_version => k, + _ => { + // We don't early return here since we need to be certain that we + // make some progress. + weight_used.saturating_accrue(todo_vnt_already_notified_weight); + continue; + } + }; + let response = Response::Version(xcm_version); + let message = Xcm(vec![QueryResponse { + query_id, + response, + max_weight, + }]); + let event = match T::XcmRouter::send_xcm(new_key.clone(), message) { + Ok(()) => { + let value = (query_id, max_weight, xcm_version); + VersionNotifyTargets::::insert(XCM_VERSION, key, value); + Event::VersionChangeNotified(new_key, xcm_version) + } + Err(e) => { + VersionNotifyTargets::::remove(XCM_VERSION, key); + Event::NotifyTargetSendFail(new_key, query_id, e.into()) + } + }; + Self::deposit_event(event); + weight_used.saturating_accrue(todo_vnt_notify_weight); + if weight_used >= weight_cutoff { + let last = Some(iter.last_raw_key().into()); + return (weight_used, Some(NotifyCurrentTargets(last))); + } + } + stage = MigrateAndNotifyOldTargets; + } + if stage == MigrateAndNotifyOldTargets { + for v in 0..XCM_VERSION { + for (old_key, value) in VersionNotifyTargets::::drain_prefix(v) { + let (query_id, max_weight, target_xcm_version) = value; + let new_key = match MultiLocation::try_from(old_key.clone()) { + Ok(k) => k, + Err(()) => { + Self::deposit_event(Event::NotifyTargetMigrationFail( + old_key, value.0, + )); + weight_used.saturating_accrue(todo_vnt_migrate_fail_weight); + if weight_used >= weight_cutoff { + return (weight_used, Some(stage)); + } + continue; + } + }; + + let versioned_key = LatestVersionedMultiLocation(&new_key); + if target_xcm_version == xcm_version { + VersionNotifyTargets::::insert(XCM_VERSION, versioned_key, value); + weight_used.saturating_accrue(todo_vnt_migrate_weight); + } else { + // Need to notify target. + let response = Response::Version(xcm_version); + let message = Xcm(vec![QueryResponse { + query_id, + response, + max_weight, + }]); + let event = match T::XcmRouter::send_xcm(new_key.clone(), message) { + Ok(()) => { + VersionNotifyTargets::::insert( + XCM_VERSION, + versioned_key, + (query_id, max_weight, xcm_version), + ); + Event::VersionChangeNotified(new_key, xcm_version) + } + Err(e) => Event::NotifyTargetSendFail(new_key, query_id, e.into()), + }; + Self::deposit_event(event); + weight_used.saturating_accrue(todo_vnt_notify_migrate_weight); + } + if weight_used >= weight_cutoff { + return (weight_used, Some(stage)); + } + } + } + } + (weight_used, None) + } + + /// Request that `dest` informs us of its version. + pub fn request_version_notify(dest: impl Into) -> XcmResult { + let dest = dest.into(); + let versioned_dest = VersionedMultiLocation::from(dest.clone()); + let already = VersionNotifiers::::contains_key(XCM_VERSION, &versioned_dest); + ensure!(!already, XcmError::InvalidLocation); + let query_id = QueryCounter::::mutate(|q| { + let r = *q; + q.saturating_inc(); + r + }); + // TODO #3735: Correct weight. + let instruction = SubscribeVersion { + query_id, + max_response_weight: 0, + }; + T::XcmRouter::send_xcm(dest, Xcm(vec![instruction]))?; + VersionNotifiers::::insert(XCM_VERSION, &versioned_dest, query_id); + let query_status = QueryStatus::VersionNotifier { + origin: versioned_dest, + is_active: false, + }; + Queries::::insert(query_id, query_status); + Ok(()) + } + + /// Request that `dest` ceases informing us of its version. + pub fn unrequest_version_notify(dest: impl Into) -> XcmResult { + let dest = dest.into(); + let versioned_dest = LatestVersionedMultiLocation(&dest); + let query_id = VersionNotifiers::::take(XCM_VERSION, versioned_dest) + .ok_or(XcmError::InvalidLocation)?; + T::XcmRouter::send_xcm(dest.clone(), Xcm(vec![UnsubscribeVersion]))?; + Queries::::remove(query_id); + Ok(()) + } + + /// Relay an XCM `message` from a given `interior` location in this context to a given `dest` + /// location. A null `dest` is not handled. + pub fn send_xcm( + interior: impl Into, + dest: impl Into, + mut message: Xcm<()>, + ) -> Result<(), SendError> { + let interior = interior.into(); + let dest = dest.into(); + if interior != Junctions::Here { + message.0.insert(0, DescendOrigin(interior)) + }; + log::trace!(target: "xcm::send_xcm", "dest: {:?}, message: {:?}", &dest, &message); + T::XcmRouter::send_xcm(dest, message) + } + + pub fn check_account() -> T::AccountId { + const ID: PalletId = PalletId(*b"py/xcmch"); + AccountIdConversion::::into_account_truncating(&ID) + } + + fn do_new_query( + responder: impl Into, + maybe_notify: Option<(u8, u8)>, + timeout: T::BlockNumber, + ) -> u64 { + QueryCounter::::mutate(|q| { + let r = *q; + q.saturating_inc(); + Queries::::insert( + r, + QueryStatus::Pending { + responder: responder.into().into(), + maybe_notify, + timeout, + }, + ); + r + }) + } + + /// Consume `message` and return another which is equivalent to it except that it reports + /// back the outcome. + /// + /// - `message`: The message whose outcome should be reported. + /// - `responder`: The origin from which a response should be expected. + /// - `timeout`: The block number after which it is permissible for `notify` not to be + /// called even if a response is received. + /// + /// `report_outcome` may return an error if the `responder` is not invertible. + /// + /// To check the status of the query, use `fn query()` passing the resultant `QueryId` + /// value. + pub fn report_outcome( + message: &mut Xcm<()>, + responder: impl Into, + timeout: T::BlockNumber, + ) -> Result { + let responder = responder.into(); + let dest = T::LocationInverter::invert_location(&responder) + .map_err(|()| XcmError::MultiLocationNotInvertible)?; + let query_id = Self::new_query(responder, timeout); + let report_error = Xcm(vec![ReportError { + dest, + query_id, + max_response_weight: 0, + }]); + message.0.insert(0, SetAppendix(report_error)); + Ok(query_id) + } + + /// Consume `message` and return another which is equivalent to it except that it reports + /// back the outcome and dispatches `notify` on this chain. + /// + /// - `message`: The message whose outcome should be reported. + /// - `responder`: The origin from which a response should be expected. + /// - `notify`: A dispatchable function which will be called once the outcome of `message` + /// is known. It may be a dispatchable in any pallet of the local chain, but other than + /// the usual origin, it must accept exactly two arguments: `query_id: QueryId` and + /// `outcome: Response`, and in that order. It should expect that the origin is + /// `Origin::Response` and will contain the responder's location. + /// - `timeout`: The block number after which it is permissible for `notify` not to be + /// called even if a response is received. + /// + /// `report_outcome_notify` may return an error if the `responder` is not invertible. + /// + /// NOTE: `notify` gets called as part of handling an incoming message, so it should be + /// lightweight. Its weight is estimated during this function and stored ready for + /// weighing `ReportOutcome` on the way back. If it turns out to be heavier once it returns + /// then reporting the outcome will fail. Futhermore if the estimate is too high, then it + /// may be put in the overweight queue and need to be manually executed. + pub fn report_outcome_notify( + message: &mut Xcm<()>, + responder: impl Into, + notify: impl Into<::Call>, + timeout: T::BlockNumber, + ) -> Result<(), XcmError> { + let responder = responder.into(); + let dest = T::LocationInverter::invert_location(&responder) + .map_err(|()| XcmError::MultiLocationNotInvertible)?; + let notify: ::Call = notify.into(); + let max_response_weight = notify.get_dispatch_info().weight; + let query_id = Self::new_notify_query(responder, notify, timeout); + let report_error = Xcm(vec![ReportError { + dest, + query_id, + max_response_weight, + }]); + message.0.insert(0, SetAppendix(report_error)); + Ok(()) + } + + /// Attempt to create a new query ID and register it as a query that is yet to respond. + pub fn new_query(responder: impl Into, timeout: T::BlockNumber) -> u64 { + Self::do_new_query(responder, None, timeout) + } + + /// Attempt to create a new query ID and register it as a query that is yet to respond, and + /// which will call a dispatchable when a response happens. + pub fn new_notify_query( + responder: impl Into, + notify: impl Into<::Call>, + timeout: T::BlockNumber, + ) -> u64 { + let notify = notify + .into() + .using_encoded(|mut bytes| Decode::decode(&mut bytes)) + .expect( + "decode input is output of Call encode; Call guaranteed to have two enums; qed", + ); + Self::do_new_query(responder, Some(notify), timeout) + } + + /// Attempt to remove and return the response of query with ID `query_id`. + /// + /// Returns `None` if the response is not (yet) available. + pub fn take_response(query_id: QueryId) -> Option<(Response, T::BlockNumber)> { + if let Some(QueryStatus::Ready { response, at }) = Queries::::get(query_id) { + let response = response.try_into().ok()?; + Queries::::remove(query_id); + Self::deposit_event(Event::ResponseTaken(query_id)); + Some((response, at)) + } else { + None + } + } + + /// Note that a particular destination to whom we would like to send a message is unknown + /// and queue it for version discovery. + fn note_unknown_version(dest: &MultiLocation) { + log::trace!( + target: "xcm::pallet_xcm::note_unknown_version", + "XCM version is unknown for destination: {:?}", + dest, + ); + let versioned_dest = VersionedMultiLocation::from(dest.clone()); + VersionDiscoveryQueue::::mutate(|q| { + if let Some(index) = q.iter().position(|i| &i.0 == &versioned_dest) { + // exists - just bump the count. + q[index].1.saturating_inc(); + } else { + let _ = q.try_push((versioned_dest, 1)); + } + }); + } + } + + impl WrapVersion for Pallet { + fn wrap_version( + dest: &MultiLocation, + xcm: impl Into>, + ) -> Result, ()> { + SupportedVersion::::get(XCM_VERSION, LatestVersionedMultiLocation(dest)) + .or_else(|| { + Self::note_unknown_version(dest); + SafeXcmVersion::::get() + }) + .ok_or_else(|| { + log::trace!( + target: "xcm::pallet_xcm::wrap_version", + "Could not determine a version to wrap XCM for destination: {:?}", + dest, + ); + () + }) + .and_then(|v| xcm.into().into_version(v.min(XCM_VERSION))) + } + } + + impl VersionChangeNotifier for Pallet { + /// Start notifying `location` should the XCM version of this chain change. + /// + /// When it does, this type should ensure a `QueryResponse` message is sent with the given + /// `query_id` & `max_weight` and with a `response` of `Repsonse::Version`. This should happen + /// until/unless `stop` is called with the correct `query_id`. + /// + /// If the `location` has an ongoing notification and when this function is called, then an + /// error should be returned. + fn start(dest: &MultiLocation, query_id: QueryId, max_weight: u64) -> XcmResult { + let versioned_dest = LatestVersionedMultiLocation(dest); + let already = VersionNotifyTargets::::contains_key(XCM_VERSION, versioned_dest); + ensure!(!already, XcmError::InvalidLocation); + + let xcm_version = T::AdvertisedXcmVersion::get(); + let response = Response::Version(xcm_version); + let instruction = QueryResponse { + query_id, + response, + max_weight, + }; + T::XcmRouter::send_xcm(dest.clone(), Xcm(vec![instruction]))?; + + let value = (query_id, max_weight, xcm_version); + VersionNotifyTargets::::insert(XCM_VERSION, versioned_dest, value); + Ok(()) + } + + /// Stop notifying `location` should the XCM change. This is a no-op if there was never a + /// subscription. + fn stop(dest: &MultiLocation) -> XcmResult { + VersionNotifyTargets::::remove(XCM_VERSION, LatestVersionedMultiLocation(dest)); + Ok(()) + } + + /// Return true if a location is subscribed to XCM version changes. + fn is_subscribed(dest: &MultiLocation) -> bool { + let versioned_dest = LatestVersionedMultiLocation(dest); + VersionNotifyTargets::::contains_key(XCM_VERSION, versioned_dest) + } + } + + impl DropAssets for Pallet { + fn drop_assets(origin: &MultiLocation, assets: Assets) -> Weight { + if assets.is_empty() { + return 0; + } + let versioned = VersionedMultiAssets::from(MultiAssets::from(assets)); + let hash = BlakeTwo256::hash_of(&(&origin, &versioned)); + AssetTraps::::mutate(hash, |n| *n += 1); + Self::deposit_event(Event::AssetsTrapped(hash, origin.clone(), versioned)); + // TODO #3735: Put the real weight in there. + 0 + } + } + + impl ClaimAssets for Pallet { + fn claim_assets( + origin: &MultiLocation, + ticket: &MultiLocation, + assets: &MultiAssets, + ) -> bool { + let mut versioned = VersionedMultiAssets::from(assets.clone()); + match (ticket.parents, &ticket.interior) { + (0, X1(GeneralIndex(i))) => { + versioned = match versioned.into_version(*i as u32) { + Ok(v) => v, + Err(()) => return false, + } + } + (0, Here) => (), + _ => return false, + }; + let hash = BlakeTwo256::hash_of(&(origin, versioned)); + match AssetTraps::::get(hash) { + 0 => return false, + 1 => AssetTraps::::remove(hash), + n => AssetTraps::::insert(hash, n - 1), + } + return true; + } + } + + impl OnResponse for Pallet { + fn expecting_response(origin: &MultiLocation, query_id: QueryId) -> bool { + match Queries::::get(query_id) { + Some(QueryStatus::Pending { responder, .. }) => { + MultiLocation::try_from(responder).map_or(false, |r| origin == &r) + } + Some(QueryStatus::VersionNotifier { origin: r, .. }) => { + MultiLocation::try_from(r).map_or(false, |r| origin == &r) + } + _ => false, + } + } + + fn on_response( + origin: &MultiLocation, + query_id: QueryId, + response: Response, + max_weight: Weight, + ) -> Weight { + match (response, Queries::::get(query_id)) { + ( + Response::Version(v), + Some(QueryStatus::VersionNotifier { + origin: expected_origin, + is_active, + }), + ) => { + let origin: MultiLocation = match expected_origin.try_into() { + Ok(o) if &o == origin => o, + Ok(o) => { + Self::deposit_event(Event::InvalidResponder( + origin.clone(), + query_id, + Some(o), + )); + return 0; + } + _ => { + Self::deposit_event(Event::InvalidResponder( + origin.clone(), + query_id, + None, + )); + // TODO #3735: Correct weight for this. + return 0; + } + }; + // TODO #3735: Check max_weight is correct. + if !is_active { + Queries::::insert( + query_id, + QueryStatus::VersionNotifier { + origin: origin.clone().into(), + is_active: true, + }, + ); + } + // We're being notified of a version change. + SupportedVersion::::insert( + XCM_VERSION, + LatestVersionedMultiLocation(&origin), + v, + ); + Self::deposit_event(Event::SupportedVersionChanged(origin, v)); + 0 + } + ( + response, + Some(QueryStatus::Pending { + responder, + maybe_notify, + .. + }), + ) => { + let responder = match MultiLocation::try_from(responder) { + Ok(r) => r, + Err(_) => { + Self::deposit_event(Event::InvalidResponderVersion( + origin.clone(), + query_id, + )); + return 0; + } + }; + if origin != &responder { + Self::deposit_event(Event::InvalidResponder( + origin.clone(), + query_id, + Some(responder), + )); + return 0; + } + return match maybe_notify { + Some((pallet_index, call_index)) => { + // This is a bit horrible, but we happen to know that the `Call` will + // be built by `(pallet_index: u8, call_index: u8, QueryId, Response)`. + // So we just encode that and then re-encode to a real Call. + let bare = (pallet_index, call_index, query_id, response); + if let Ok(call) = bare + .using_encoded(|mut bytes| ::Call::decode(&mut bytes)) + { + Queries::::remove(query_id); + let weight = call.get_dispatch_info().weight; + if weight > max_weight { + let e = Event::NotifyOverweight( + query_id, + pallet_index, + call_index, + weight, + max_weight, + ); + Self::deposit_event(e); + return 0; + } + let dispatch_origin = Origin::Response(origin.clone()).into(); + match call.dispatch(dispatch_origin) { + Ok(post_info) => { + let e = Event::Notified(query_id, pallet_index, call_index); + Self::deposit_event(e); + post_info.actual_weight + } + Err(error_and_info) => { + let e = Event::NotifyDispatchError( + query_id, + pallet_index, + call_index, + ); + Self::deposit_event(e); + // Not much to do with the result as it is. It's up to the parachain to ensure that the + // message makes sense. + error_and_info.post_info.actual_weight + } + } + .unwrap_or(weight) + } else { + let e = + Event::NotifyDecodeFailed(query_id, pallet_index, call_index); + Self::deposit_event(e); + 0 + } + } + None => { + let e = Event::ResponseReady(query_id, response.clone()); + Self::deposit_event(e); + let at = frame_system::Pallet::::current_block_number(); + let response = response.into(); + Queries::::insert(query_id, QueryStatus::Ready { response, at }); + 0 + } + }; + } + _ => { + Self::deposit_event(Event::UnexpectedResponse(origin.clone(), query_id)); + return 0; + } + } + } + } +} + +/// Ensure that the origin `o` represents an XCM (`Transact`) origin. +/// +/// Returns `Ok` with the location of the XCM sender or an `Err` otherwise. +pub fn ensure_xcm(o: OuterOrigin) -> Result +where + OuterOrigin: Into>, +{ + match o.into() { + Ok(Origin::Xcm(location)) => Ok(location), + _ => Err(BadOrigin), + } +} + +/// Ensure that the origin `o` represents an XCM response origin. +/// +/// Returns `Ok` with the location of the responder or an `Err` otherwise. +pub fn ensure_response(o: OuterOrigin) -> Result +where + OuterOrigin: Into>, +{ + match o.into() { + Ok(Origin::Response(location)) => Ok(location), + _ => Err(BadOrigin), + } +} + +/// Filter for `MultiLocation` to find those which represent a strict majority approval of an identified +/// plurality. +/// +/// May reasonably be used with `EnsureXcm`. +pub struct IsMajorityOfBody(PhantomData<(Prefix, Body)>); +impl, Body: Get> Contains + for IsMajorityOfBody +{ + fn contains(l: &MultiLocation) -> bool { + let maybe_suffix = l.match_and_split(&Prefix::get()); + matches!(maybe_suffix, Some(Plurality { id, part }) if id == &Body::get() && part.is_majority()) + } +} + +/// `EnsureOrigin` implementation succeeding with a `MultiLocation` value to recognize and filter the +/// `Origin::Xcm` item. +pub struct EnsureXcm(PhantomData); +impl, F: Contains> EnsureOrigin for EnsureXcm +where + O::PalletsOrigin: From + TryInto, +{ + type Success = MultiLocation; + + fn try_origin(outer: O) -> Result { + outer.try_with_caller(|caller| { + caller.try_into().and_then(|o| match o { + Origin::Xcm(location) if F::contains(&location) => Ok(location), + Origin::Xcm(location) => Err(Origin::Xcm(location).into()), + o => Err(o.into()), + }) + }) + } + + #[cfg(feature = "runtime-benchmarks")] + fn successful_origin() -> O { + O::from(Origin::Xcm(Here.into())) + } +} + +/// `EnsureOrigin` implementation succeeding with a `MultiLocation` value to recognize and filter +/// the `Origin::Response` item. +pub struct EnsureResponse(PhantomData); +impl, F: Contains> EnsureOrigin + for EnsureResponse +where + O::PalletsOrigin: From + TryInto, +{ + type Success = MultiLocation; + + fn try_origin(outer: O) -> Result { + outer.try_with_caller(|caller| { + caller.try_into().and_then(|o| match o { + Origin::Response(responder) => Ok(responder), + o => Err(o.into()), + }) + }) + } + + #[cfg(feature = "runtime-benchmarks")] + fn successful_origin() -> O { + O::from(Origin::Response(Here.into())) + } +} + +/// A simple passthrough where we reuse the `MultiLocation`-typed XCM origin as the inner value of +/// this crate's `Origin::Xcm` value. +pub struct XcmPassthrough(PhantomData); +impl> ConvertOrigin for XcmPassthrough { + fn convert_origin( + origin: impl Into, + kind: OriginKind, + ) -> Result { + let origin = origin.into(); + match kind { + OriginKind::Xcm => Ok(crate::Origin::Xcm(origin).into()), + _ => Err(origin), + } + } +} diff --git a/vendor/pallet-xcm/src/mock.rs b/vendor/pallet-xcm/src/mock.rs new file mode 100644 index 000000000..7ccdfa9f4 --- /dev/null +++ b/vendor/pallet-xcm/src/mock.rs @@ -0,0 +1,357 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use frame_support::{construct_runtime, parameter_types, traits::Everything, weights::Weight}; +use polkadot_parachain::primitives::Id as ParaId; +use polkadot_runtime_parachains::origin; +use sp_core::H256; +use sp_runtime::{testing::Header, traits::IdentityLookup, AccountId32}; +pub use sp_std::{cell::RefCell, fmt::Debug, marker::PhantomData}; +use xcm::latest::prelude::*; +use xcm_builder::{ + AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, Case, ChildParachainAsNative, ChildParachainConvertsVia, + ChildSystemParachainAsSuperuser, CurrencyAdapter as XcmCurrencyAdapter, FixedRateOfFungible, + FixedWeightBounds, IsConcrete, LocationInverter, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, +}; +use xcm_executor::XcmExecutor; + +use crate as pallet_xcm; + +pub type AccountId = AccountId32; +pub type Balance = u128; +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +#[frame_support::pallet] +pub mod pallet_test_notifier { + use crate::{ensure_response, QueryId}; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + use sp_runtime::DispatchResult; + use xcm::latest::prelude::*; + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config + crate::Config { + type Event: IsType<::Event> + From>; + type Origin: IsType<::Origin> + + Into::Origin>>; + type Call: IsType<::Call> + From>; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + QueryPrepared(QueryId), + NotifyQueryPrepared(QueryId), + ResponseReceived(MultiLocation, QueryId, Response), + } + + #[pallet::error] + pub enum Error { + UnexpectedId, + BadAccountFormat, + } + + #[pallet::call] + impl Pallet { + #[pallet::weight(1_000_000)] + pub fn prepare_new_query(origin: OriginFor) -> DispatchResult { + let who = ensure_signed(origin)?; + let id = who + .using_encoded(|mut d| <[u8; 32]>::decode(&mut d)) + .map_err(|_| Error::::BadAccountFormat)?; + let qid = crate::Pallet::::new_query( + Junction::AccountId32 { network: Any, id }.into(), + 100u32.into(), + ); + Self::deposit_event(Event::::QueryPrepared(qid)); + Ok(()) + } + + #[pallet::weight(1_000_000)] + pub fn prepare_new_notify_query(origin: OriginFor) -> DispatchResult { + let who = ensure_signed(origin)?; + let id = who + .using_encoded(|mut d| <[u8; 32]>::decode(&mut d)) + .map_err(|_| Error::::BadAccountFormat)?; + let call = Call::::notification_received { + query_id: 0, + response: Default::default(), + }; + let qid = crate::Pallet::::new_notify_query( + Junction::AccountId32 { network: Any, id }.into(), + ::Call::from(call), + 100u32.into(), + ); + Self::deposit_event(Event::::NotifyQueryPrepared(qid)); + Ok(()) + } + + #[pallet::weight(1_000_000)] + pub fn notification_received( + origin: OriginFor, + query_id: QueryId, + response: Response, + ) -> DispatchResult { + let responder = ensure_response(::Origin::from(origin))?; + Self::deposit_event(Event::::ResponseReceived(responder, query_id, response)); + Ok(()) + } + } +} + +construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + ParasOrigin: origin::{Pallet, Origin}, + XcmPallet: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config}, + TestNotifier: pallet_test_notifier::{Pallet, Call, Event}, + } +); + +thread_local! { + pub static SENT_XCM: RefCell)>> = RefCell::new(Vec::new()); +} +pub(crate) fn sent_xcm() -> Vec<(MultiLocation, Xcm<()>)> { + SENT_XCM.with(|q| (*q.borrow()).clone()) +} +pub(crate) fn take_sent_xcm() -> Vec<(MultiLocation, Xcm<()>)> { + SENT_XCM.with(|q| { + let mut r = Vec::new(); + std::mem::swap(&mut r, &mut *q.borrow_mut()); + r + }) +} +/// Sender that never returns error, always sends +pub struct TestSendXcm; +impl SendXcm for TestSendXcm { + fn send_xcm(dest: impl Into, msg: Xcm<()>) -> SendResult { + SENT_XCM.with(|q| q.borrow_mut().push((dest.into(), msg))); + Ok(()) + } +} +/// Sender that returns error if `X8` junction and stops routing +pub struct TestSendXcmErrX8; +impl SendXcm for TestSendXcmErrX8 { + fn send_xcm(dest: impl Into, msg: Xcm<()>) -> SendResult { + let dest = dest.into(); + if dest.len() == 8 { + Err(SendError::Transport("Destination location full")) + } else { + SENT_XCM.with(|q| q.borrow_mut().push((dest, msg))); + Ok(()) + } + } +} + +parameter_types! { + pub const BlockHashCount: u64 = 250; +} + +impl frame_system::Config for Test { + type Origin = Origin; + type Call = Call; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type Event = Event; + type BlockHashCount = BlockHashCount; + type BlockWeights = (); + type BlockLength = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + pub ExistentialDeposit: Balance = 1; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for Test { + type MaxLocks = MaxLocks; + type Balance = Balance; + type Event = Event; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; +} + +parameter_types! { + pub const RelayLocation: MultiLocation = Here.into(); + pub const AnyNetwork: NetworkId = NetworkId::Any; + pub Ancestry: MultiLocation = Here.into(); + pub UnitWeightCost: Weight = 1_000; +} + +pub type SovereignAccountOf = ( + ChildParachainConvertsVia, + AccountId32Aliases, +); + +pub type LocalAssetTransactor = + XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; + +type LocalOriginConverter = ( + SovereignSignedViaLocation, + ChildParachainAsNative, + SignedAccountId32AsNative, + ChildSystemParachainAsSuperuser, +); + +parameter_types! { + pub const BaseXcmWeight: Weight = 1_000; + pub CurrencyPerSecond: (AssetId, u128) = (Concrete(RelayLocation::get()), 1); + pub TrustedAssets: (MultiAssetFilter, MultiLocation) = (All.into(), Here.into()); + pub const MaxInstructions: u32 = 100; +} + +pub type Barrier = ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom, + AllowKnownQueryResponses, + AllowSubscriptionsFrom, +); + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type Call = Call; + type XcmSender = TestSendXcm; + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = LocalOriginConverter; + type IsReserve = (); + type IsTeleporter = Case; + type LocationInverter = LocationInverter; + type Barrier = Barrier; + type Weigher = FixedWeightBounds; + type Trader = FixedRateOfFungible; + type ResponseHandler = XcmPallet; + type AssetTrap = XcmPallet; + type AssetClaims = XcmPallet; + type SubscriptionService = XcmPallet; +} + +pub type LocalOriginToLocation = SignedToAccountId32; + +parameter_types! { + pub static AdvertisedXcmVersion: pallet_xcm::XcmVersion = 2; +} + +impl pallet_xcm::Config for Test { + type Event = Event; + type SendXcmOrigin = xcm_builder::EnsureXcmOrigin; + type XcmRouter = (TestSendXcmErrX8, TestSendXcm); + type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin; + type XcmExecuteFilter = Everything; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type LocationInverter = LocationInverter; + type Origin = Origin; + type Call = Call; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = AdvertisedXcmVersion; +} + +impl origin::Config for Test {} + +impl pallet_test_notifier::Config for Test { + type Event = Event; + type Origin = Origin; + type Call = Call; +} + +pub(crate) fn last_event() -> Event { + System::events().pop().expect("Event expected").event +} + +pub(crate) fn last_events(n: usize) -> Vec { + System::events() + .into_iter() + .map(|e| e.event) + .rev() + .take(n) + .rev() + .collect() +} + +pub(crate) fn buy_execution(fees: impl Into) -> Instruction { + use xcm::latest::prelude::*; + BuyExecution { + fees: fees.into(), + weight_limit: Unlimited, + } +} + +pub(crate) fn buy_limited_execution(fees: impl Into, weight: u64) -> Instruction { + use xcm::latest::prelude::*; + BuyExecution { + fees: fees.into(), + weight_limit: Limited(weight), + } +} + +pub(crate) fn new_test_ext_with_balances( + balances: Vec<(AccountId, Balance)>, +) -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { balances } + .assimilate_storage(&mut t) + .unwrap(); + + >::assimilate_storage( + &pallet_xcm::GenesisConfig { + safe_xcm_version: Some(2), + }, + &mut t, + ) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| System::set_block_number(1)); + ext +} diff --git a/vendor/pallet-xcm/src/tests.rs b/vendor/pallet-xcm/src/tests.rs new file mode 100644 index 000000000..324496c89 --- /dev/null +++ b/vendor/pallet-xcm/src/tests.rs @@ -0,0 +1,1301 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::{ + mock::*, AssetTraps, CurrentMigration, Error, LatestVersionedMultiLocation, Queries, + QueryStatus, VersionDiscoveryQueue, VersionNotifiers, VersionNotifyTargets, +}; +use frame_support::{ + assert_noop, assert_ok, + traits::{Currency, Hooks}, +}; +use polkadot_parachain::primitives::{AccountIdConversion, Id as ParaId}; +use sp_runtime::traits::{BlakeTwo256, Hash}; +use xcm::prelude::*; +use xcm_builder::AllowKnownQueryResponses; +use xcm_executor::{traits::ShouldExecute, XcmExecutor}; + +const ALICE: AccountId = AccountId::new([0u8; 32]); +const BOB: AccountId = AccountId::new([1u8; 32]); +const PARA_ID: u32 = 2000; +const INITIAL_BALANCE: u128 = 100; +const SEND_AMOUNT: u128 = 10; + +#[test] +fn report_outcome_notify_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + let sender = AccountId32 { + network: AnyNetwork::get(), + id: ALICE.into(), + } + .into(); + let mut message = Xcm(vec![TransferAsset { + assets: (Here, SEND_AMOUNT).into(), + beneficiary: sender.clone(), + }]); + let call = pallet_test_notifier::Call::notification_received { + query_id: 0, + response: Default::default(), + }; + let notify = Call::TestNotifier(call); + new_test_ext_with_balances(balances).execute_with(|| { + XcmPallet::report_outcome_notify(&mut message, Parachain(PARA_ID).into(), notify, 100) + .unwrap(); + assert_eq!( + message, + Xcm(vec![ + SetAppendix(Xcm(vec![ReportError { + query_id: 0, + dest: Parent.into(), + max_response_weight: 1_000_000 + },])), + TransferAsset { + assets: (Here, SEND_AMOUNT).into(), + beneficiary: sender.clone() + }, + ]) + ); + let status = QueryStatus::Pending { + responder: MultiLocation::from(Parachain(PARA_ID)).into(), + maybe_notify: Some((4, 2)), + timeout: 100, + }; + assert_eq!( + crate::Queries::::iter().collect::>(), + vec![(0, status)] + ); + + let r = XcmExecutor::::execute_xcm( + Parachain(PARA_ID).into(), + Xcm(vec![QueryResponse { + query_id: 0, + response: Response::ExecutionResult(None), + max_weight: 1_000_000, + }]), + 1_000_000_000, + ); + assert_eq!(r, Outcome::Complete(1_000)); + assert_eq!( + last_events(2), + vec![ + Event::TestNotifier(pallet_test_notifier::Event::ResponseReceived( + Parachain(PARA_ID).into(), + 0, + Response::ExecutionResult(None), + )), + Event::XcmPallet(crate::Event::Notified(0, 4, 2)), + ] + ); + assert_eq!(crate::Queries::::iter().collect::>(), vec![]); + }); +} + +#[test] +fn report_outcome_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + let sender = AccountId32 { + network: AnyNetwork::get(), + id: ALICE.into(), + } + .into(); + let mut message = Xcm(vec![TransferAsset { + assets: (Here, SEND_AMOUNT).into(), + beneficiary: sender.clone(), + }]); + new_test_ext_with_balances(balances).execute_with(|| { + XcmPallet::report_outcome(&mut message, Parachain(PARA_ID).into(), 100).unwrap(); + assert_eq!( + message, + Xcm(vec![ + SetAppendix(Xcm(vec![ReportError { + query_id: 0, + dest: Parent.into(), + max_response_weight: 0 + },])), + TransferAsset { + assets: (Here, SEND_AMOUNT).into(), + beneficiary: sender.clone() + }, + ]) + ); + let status = QueryStatus::Pending { + responder: MultiLocation::from(Parachain(PARA_ID)).into(), + maybe_notify: None, + timeout: 100, + }; + assert_eq!( + crate::Queries::::iter().collect::>(), + vec![(0, status)] + ); + + let r = XcmExecutor::::execute_xcm( + Parachain(PARA_ID).into(), + Xcm(vec![QueryResponse { + query_id: 0, + response: Response::ExecutionResult(None), + max_weight: 0, + }]), + 1_000_000_000, + ); + assert_eq!(r, Outcome::Complete(1_000)); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::ResponseReady( + 0, + Response::ExecutionResult(None), + )) + ); + + let response = Some((Response::ExecutionResult(None), 1)); + assert_eq!(XcmPallet::take_response(0), response); + }); +} + +/// Test sending an `XCM` message (`XCM::ReserveAssetDeposit`) +/// +/// Asserts that the expected message is sent and the event is emitted +#[test] +fn send_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + new_test_ext_with_balances(balances).execute_with(|| { + let sender: MultiLocation = AccountId32 { + network: AnyNetwork::get(), + id: ALICE.into(), + } + .into(); + let message = Xcm(vec![ + ReserveAssetDeposited((Parent, SEND_AMOUNT).into()), + ClearOrigin, + buy_execution((Parent, SEND_AMOUNT)), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: sender.clone(), + }, + ]); + let versioned_dest = Box::new(RelayLocation::get().into()); + let versioned_message = Box::new(VersionedXcm::from(message.clone())); + assert_ok!(XcmPallet::send( + Origin::signed(ALICE), + versioned_dest, + versioned_message + )); + assert_eq!( + sent_xcm(), + vec![( + Here.into(), + Xcm(Some(DescendOrigin(sender.clone().try_into().unwrap())) + .into_iter() + .chain(message.0.clone().into_iter()) + .collect()) + )], + ); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::Sent(sender, RelayLocation::get(), message)) + ); + }); +} + +/// Test that sending an `XCM` message fails when the `XcmRouter` blocks the +/// matching message format +/// +/// Asserts that `send` fails with `Error::SendFailure` +#[test] +fn send_fails_when_xcm_router_blocks() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + new_test_ext_with_balances(balances).execute_with(|| { + let sender: MultiLocation = Junction::AccountId32 { + network: AnyNetwork::get(), + id: ALICE.into(), + } + .into(); + let message = Xcm(vec![ + ReserveAssetDeposited((Parent, SEND_AMOUNT).into()), + buy_execution((Parent, SEND_AMOUNT)), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: sender.clone(), + }, + ]); + assert_noop!( + XcmPallet::send( + Origin::signed(ALICE), + Box::new(MultiLocation::ancestor(8).into()), + Box::new(VersionedXcm::from(message.clone())), + ), + crate::Error::::SendFailure + ); + }); +} + +/// Test `teleport_assets` +/// +/// Asserts that the sender's balance is decreased as a result of execution of +/// local effects. +#[test] +fn teleport_assets_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + new_test_ext_with_balances(balances).execute_with(|| { + let weight = 2 * BaseXcmWeight::get(); + assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); + let dest: MultiLocation = AccountId32 { + network: Any, + id: BOB.into(), + } + .into(); + assert_ok!(XcmPallet::teleport_assets( + Origin::signed(ALICE), + Box::new(RelayLocation::get().into()), + Box::new(dest.clone().into()), + Box::new((Here, SEND_AMOUNT).into()), + 0, + )); + assert_eq!( + Balances::total_balance(&ALICE), + INITIAL_BALANCE - SEND_AMOUNT + ); + assert_eq!( + sent_xcm(), + vec![( + RelayLocation::get().into(), + Xcm(vec![ + ReceiveTeleportedAsset((Here, SEND_AMOUNT).into()), + ClearOrigin, + buy_limited_execution((Here, SEND_AMOUNT), 4000), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest + }, + ]), + )] + ); + let versioned_sent = VersionedXcm::from(sent_xcm().into_iter().next().unwrap().1); + let _check_v0_ok: xcm::v0::Xcm<()> = versioned_sent.try_into().unwrap(); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight))) + ); + }); +} + +/// Test `limited_teleport_assets` +/// +/// Asserts that the sender's balance is decreased as a result of execution of +/// local effects. +#[test] +fn limmited_teleport_assets_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + new_test_ext_with_balances(balances).execute_with(|| { + let weight = 2 * BaseXcmWeight::get(); + assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); + let dest: MultiLocation = AccountId32 { + network: Any, + id: BOB.into(), + } + .into(); + assert_ok!(XcmPallet::limited_teleport_assets( + Origin::signed(ALICE), + Box::new(RelayLocation::get().into()), + Box::new(dest.clone().into()), + Box::new((Here, SEND_AMOUNT).into()), + 0, + WeightLimit::Limited(5000), + )); + assert_eq!( + Balances::total_balance(&ALICE), + INITIAL_BALANCE - SEND_AMOUNT + ); + assert_eq!( + sent_xcm(), + vec![( + RelayLocation::get().into(), + Xcm(vec![ + ReceiveTeleportedAsset((Here, SEND_AMOUNT).into()), + ClearOrigin, + buy_limited_execution((Here, SEND_AMOUNT), 5000), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest + }, + ]), + )] + ); + let versioned_sent = VersionedXcm::from(sent_xcm().into_iter().next().unwrap().1); + let _check_v0_ok: xcm::v0::Xcm<()> = versioned_sent.try_into().unwrap(); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight))) + ); + }); +} + +/// Test `limited_teleport_assets` with unlimited weight +/// +/// Asserts that the sender's balance is decreased as a result of execution of +/// local effects. +#[test] +fn unlimmited_teleport_assets_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + new_test_ext_with_balances(balances).execute_with(|| { + let weight = 2 * BaseXcmWeight::get(); + assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); + let dest: MultiLocation = AccountId32 { + network: Any, + id: BOB.into(), + } + .into(); + assert_ok!(XcmPallet::limited_teleport_assets( + Origin::signed(ALICE), + Box::new(RelayLocation::get().into()), + Box::new(dest.clone().into()), + Box::new((Here, SEND_AMOUNT).into()), + 0, + WeightLimit::Unlimited, + )); + assert_eq!( + Balances::total_balance(&ALICE), + INITIAL_BALANCE - SEND_AMOUNT + ); + assert_eq!( + sent_xcm(), + vec![( + RelayLocation::get().into(), + Xcm(vec![ + ReceiveTeleportedAsset((Here, SEND_AMOUNT).into()), + ClearOrigin, + buy_execution((Here, SEND_AMOUNT)), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest + }, + ]), + )] + ); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight))) + ); + }); +} + +/// Test `reserve_transfer_assets` +/// +/// Asserts that the sender's balance is decreased and the beneficiary's balance +/// is increased. Verifies the correct message is sent and event is emitted. +#[test] +fn reserve_transfer_assets_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + new_test_ext_with_balances(balances).execute_with(|| { + let weight = BaseXcmWeight::get(); + let dest: MultiLocation = Junction::AccountId32 { + network: NetworkId::Any, + id: ALICE.into(), + } + .into(); + assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); + assert_ok!(XcmPallet::reserve_transfer_assets( + Origin::signed(ALICE), + Box::new(Parachain(PARA_ID).into().into()), + Box::new(dest.clone().into()), + Box::new((Here, SEND_AMOUNT).into()), + 0, + )); + // Alice spent amount + assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE - SEND_AMOUNT); + // Destination account (parachain account) has amount + let para_acc: AccountId = ParaId::from(PARA_ID).into_account(); + assert_eq!( + Balances::free_balance(para_acc), + INITIAL_BALANCE + SEND_AMOUNT + ); + assert_eq!( + sent_xcm(), + vec![( + Parachain(PARA_ID).into(), + Xcm(vec![ + ReserveAssetDeposited((Parent, SEND_AMOUNT).into()), + ClearOrigin, + buy_limited_execution((Parent, SEND_AMOUNT), 4000), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest + }, + ]), + )] + ); + let versioned_sent = VersionedXcm::from(sent_xcm().into_iter().next().unwrap().1); + let _check_v0_ok: xcm::v0::Xcm<()> = versioned_sent.try_into().unwrap(); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight))) + ); + }); +} + +/// Test `limited_reserve_transfer_assets` +/// +/// Asserts that the sender's balance is decreased and the beneficiary's balance +/// is increased. Verifies the correct message is sent and event is emitted. +#[test] +fn limited_reserve_transfer_assets_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + new_test_ext_with_balances(balances).execute_with(|| { + let weight = BaseXcmWeight::get(); + let dest: MultiLocation = Junction::AccountId32 { + network: NetworkId::Any, + id: ALICE.into(), + } + .into(); + assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); + assert_ok!(XcmPallet::limited_reserve_transfer_assets( + Origin::signed(ALICE), + Box::new(Parachain(PARA_ID).into().into()), + Box::new(dest.clone().into()), + Box::new((Here, SEND_AMOUNT).into()), + 0, + WeightLimit::Limited(5000), + )); + // Alice spent amount + assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE - SEND_AMOUNT); + // Destination account (parachain account) has amount + let para_acc: AccountId = ParaId::from(PARA_ID).into_account(); + assert_eq!( + Balances::free_balance(para_acc), + INITIAL_BALANCE + SEND_AMOUNT + ); + assert_eq!( + sent_xcm(), + vec![( + Parachain(PARA_ID).into(), + Xcm(vec![ + ReserveAssetDeposited((Parent, SEND_AMOUNT).into()), + ClearOrigin, + buy_limited_execution((Parent, SEND_AMOUNT), 5000), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest + }, + ]), + )] + ); + let versioned_sent = VersionedXcm::from(sent_xcm().into_iter().next().unwrap().1); + let _check_v0_ok: xcm::v0::Xcm<()> = versioned_sent.try_into().unwrap(); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight))) + ); + }); +} + +/// Test `limited_reserve_transfer_assets` with unlimited weight purchasing +/// +/// Asserts that the sender's balance is decreased and the beneficiary's balance +/// is increased. Verifies the correct message is sent and event is emitted. +#[test] +fn unlimited_reserve_transfer_assets_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + new_test_ext_with_balances(balances).execute_with(|| { + let weight = BaseXcmWeight::get(); + let dest: MultiLocation = Junction::AccountId32 { + network: NetworkId::Any, + id: ALICE.into(), + } + .into(); + assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); + assert_ok!(XcmPallet::limited_reserve_transfer_assets( + Origin::signed(ALICE), + Box::new(Parachain(PARA_ID).into().into()), + Box::new(dest.clone().into()), + Box::new((Here, SEND_AMOUNT).into()), + 0, + WeightLimit::Unlimited, + )); + // Alice spent amount + assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE - SEND_AMOUNT); + // Destination account (parachain account) has amount + let para_acc: AccountId = ParaId::from(PARA_ID).into_account(); + assert_eq!( + Balances::free_balance(para_acc), + INITIAL_BALANCE + SEND_AMOUNT + ); + assert_eq!( + sent_xcm(), + vec![( + Parachain(PARA_ID).into(), + Xcm(vec![ + ReserveAssetDeposited((Parent, SEND_AMOUNT).into()), + ClearOrigin, + buy_execution((Parent, SEND_AMOUNT)), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest + }, + ]), + )] + ); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight))) + ); + }); +} + +/// Test `reserve_withdraw_assets` +/// +/// Asserts that the sender's balance is decreased and the beneficiary's balance +/// is increased. Verifies the correct message is sent and event is emitted. +#[test] +fn reserve_withdraw_assets_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + new_test_ext_with_balances(balances).execute_with(|| { + let weight = BaseXcmWeight::get(); + let dest: MultiLocation = Junction::AccountId32 { + network: NetworkId::Any, + id: ALICE.into(), + } + .into(); + assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); + assert_ok!(XcmPallet::reserve_withdraw_assets( + Origin::signed(ALICE), + Box::new(Parachain(PARA_ID).into().into()), + Box::new(dest.clone().into()), + Box::new((Here, SEND_AMOUNT).into()), + 0, + )); + // Alice spent amount + assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE - SEND_AMOUNT); + // Check destination XCM program + assert_eq!( + sent_xcm(), + vec![( + Parachain(PARA_ID).into(), + Xcm(vec![ + WithdrawAsset((Parent, SEND_AMOUNT).into()), + ClearOrigin, + buy_limited_execution((Parent, SEND_AMOUNT), 4000), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest + }, + ]), + )] + ); + let versioned_sent = VersionedXcm::from(sent_xcm().into_iter().next().unwrap().1); + let _check_v2_ok: xcm::v2::Xcm<()> = versioned_sent.try_into().unwrap(); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(2 * weight))) + ); + }); +} + +/// Test local execution of XCM +/// +/// Asserts that the sender's balance is decreased and the beneficiary's balance +/// is increased. Verifies the expected event is emitted. +#[test] +fn execute_withdraw_to_deposit_works() { + let balances = vec![ + (ALICE, INITIAL_BALANCE), + (ParaId::from(PARA_ID).into_account(), INITIAL_BALANCE), + ]; + new_test_ext_with_balances(balances).execute_with(|| { + let weight = 3 * BaseXcmWeight::get(); + let dest: MultiLocation = Junction::AccountId32 { + network: NetworkId::Any, + id: BOB.into(), + } + .into(); + assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); + assert_ok!(XcmPallet::execute( + Origin::signed(ALICE), + Box::new(VersionedXcm::from(Xcm(vec![ + WithdrawAsset((Here, SEND_AMOUNT).into()), + buy_execution((Here, SEND_AMOUNT)), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest + }, + ]))), + weight + )); + assert_eq!( + Balances::total_balance(&ALICE), + INITIAL_BALANCE - SEND_AMOUNT + ); + assert_eq!(Balances::total_balance(&BOB), SEND_AMOUNT); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight))) + ); + }); +} + +/// Test drop/claim assets. +#[test] +fn trapped_assets_can_be_claimed() { + let balances = vec![(ALICE, INITIAL_BALANCE), (BOB, INITIAL_BALANCE)]; + new_test_ext_with_balances(balances).execute_with(|| { + let weight = 6 * BaseXcmWeight::get(); + let dest: MultiLocation = Junction::AccountId32 { + network: NetworkId::Any, + id: BOB.into(), + } + .into(); + + assert_ok!(XcmPallet::execute( + Origin::signed(ALICE), + Box::new(VersionedXcm::from(Xcm(vec![ + WithdrawAsset((Here, SEND_AMOUNT).into()), + buy_execution((Here, SEND_AMOUNT)), + // Don't propagated the error into the result. + SetErrorHandler(Xcm(vec![ClearError])), + // This will make an error. + Trap(0), + // This would succeed, but we never get to it. + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest.clone() + }, + ]))), + weight + )); + let source: MultiLocation = Junction::AccountId32 { + network: NetworkId::Any, + id: ALICE.into(), + } + .into(); + let trapped = AssetTraps::::iter().collect::>(); + let vma = VersionedMultiAssets::from(MultiAssets::from((Here, SEND_AMOUNT))); + let hash = BlakeTwo256::hash_of(&(source.clone(), vma.clone())); + assert_eq!( + last_events(2), + vec![ + Event::XcmPallet(crate::Event::AssetsTrapped(hash.clone(), source, vma)), + Event::XcmPallet(crate::Event::Attempted(Outcome::Complete( + 5 * BaseXcmWeight::get() + ))) + ] + ); + assert_eq!( + Balances::total_balance(&ALICE), + INITIAL_BALANCE - SEND_AMOUNT + ); + assert_eq!(Balances::total_balance(&BOB), INITIAL_BALANCE); + + let expected = vec![(hash, 1u32)]; + assert_eq!(trapped, expected); + + let weight = 3 * BaseXcmWeight::get(); + assert_ok!(XcmPallet::execute( + Origin::signed(ALICE), + Box::new(VersionedXcm::from(Xcm(vec![ + ClaimAsset { + assets: (Here, SEND_AMOUNT).into(), + ticket: Here.into() + }, + buy_execution((Here, SEND_AMOUNT)), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest.clone() + }, + ]))), + weight + )); + + assert_eq!( + Balances::total_balance(&ALICE), + INITIAL_BALANCE - SEND_AMOUNT + ); + assert_eq!(Balances::total_balance(&BOB), INITIAL_BALANCE + SEND_AMOUNT); + assert_eq!(AssetTraps::::iter().collect::>(), vec![]); + + let weight = 3 * BaseXcmWeight::get(); + assert_ok!(XcmPallet::execute( + Origin::signed(ALICE), + Box::new(VersionedXcm::from(Xcm(vec![ + ClaimAsset { + assets: (Here, SEND_AMOUNT).into(), + ticket: Here.into() + }, + buy_execution((Here, SEND_AMOUNT)), + DepositAsset { + assets: All.into(), + max_assets: 1, + beneficiary: dest + }, + ]))), + weight + )); + assert_eq!( + last_event(), + Event::XcmPallet(crate::Event::Attempted(Outcome::Incomplete( + BaseXcmWeight::get(), + XcmError::UnknownClaim + ))) + ); + }); +} + +#[test] +fn fake_latest_versioned_multilocation_works() { + use codec::Encode; + let remote = Parachain(1000).into(); + let versioned_remote = LatestVersionedMultiLocation(&remote); + assert_eq!( + versioned_remote.encode(), + VersionedMultiLocation::from(remote.clone()).encode() + ); +} + +#[test] +fn basic_subscription_works() { + new_test_ext_with_balances(vec![]).execute_with(|| { + let remote = Parachain(1000).into(); + assert_ok!(XcmPallet::force_subscribe_version_notify( + Origin::root(), + Box::new(remote.clone().into()), + )); + + assert_eq!( + Queries::::iter().collect::>(), + vec![( + 0, + QueryStatus::VersionNotifier { + origin: remote.clone().into(), + is_active: false + } + )] + ); + assert_eq!( + VersionNotifiers::::iter().collect::>(), + vec![(2, remote.clone().into(), 0)] + ); + + assert_eq!( + take_sent_xcm(), + vec![( + remote.clone(), + Xcm(vec![SubscribeVersion { + query_id: 0, + max_response_weight: 0 + }]), + ),] + ); + + let weight = BaseXcmWeight::get(); + let mut message = Xcm::<()>(vec![ + // Remote supports XCM v1 + QueryResponse { + query_id: 0, + max_weight: 0, + response: Response::Version(1), + }, + ]); + assert_ok!(AllowKnownQueryResponses::::should_execute( + &remote, + &mut message, + weight, + &mut 0 + )); + }); +} + +#[test] +fn subscriptions_increment_id() { + new_test_ext_with_balances(vec![]).execute_with(|| { + let remote = Parachain(1000).into(); + assert_ok!(XcmPallet::force_subscribe_version_notify( + Origin::root(), + Box::new(remote.clone().into()), + )); + + let remote2 = Parachain(1001).into(); + assert_ok!(XcmPallet::force_subscribe_version_notify( + Origin::root(), + Box::new(remote2.clone().into()), + )); + + assert_eq!( + take_sent_xcm(), + vec![ + ( + remote.clone(), + Xcm(vec![SubscribeVersion { + query_id: 0, + max_response_weight: 0 + }]), + ), + ( + remote2.clone(), + Xcm(vec![SubscribeVersion { + query_id: 1, + max_response_weight: 0 + }]), + ), + ] + ); + }); +} + +#[test] +fn double_subscription_fails() { + new_test_ext_with_balances(vec![]).execute_with(|| { + let remote = Parachain(1000).into(); + assert_ok!(XcmPallet::force_subscribe_version_notify( + Origin::root(), + Box::new(remote.clone().into()), + )); + assert_noop!( + XcmPallet::force_subscribe_version_notify( + Origin::root(), + Box::new(remote.clone().into()) + ), + Error::::AlreadySubscribed, + ); + }) +} + +#[test] +fn unsubscribe_works() { + new_test_ext_with_balances(vec![]).execute_with(|| { + let remote = Parachain(1000).into(); + assert_ok!(XcmPallet::force_subscribe_version_notify( + Origin::root(), + Box::new(remote.clone().into()), + )); + assert_ok!(XcmPallet::force_unsubscribe_version_notify( + Origin::root(), + Box::new(remote.clone().into()) + )); + assert_noop!( + XcmPallet::force_unsubscribe_version_notify( + Origin::root(), + Box::new(remote.clone().into()) + ), + Error::::NoSubscription, + ); + + assert_eq!( + take_sent_xcm(), + vec![ + ( + remote.clone(), + Xcm(vec![SubscribeVersion { + query_id: 0, + max_response_weight: 0 + }]), + ), + (remote.clone(), Xcm(vec![UnsubscribeVersion]),), + ] + ); + }); +} + +/// Parachain 1000 is asking us for a version subscription. +#[test] +fn subscription_side_works() { + new_test_ext_with_balances(vec![]).execute_with(|| { + AdvertisedXcmVersion::set(1); + + let remote = Parachain(1000).into(); + let weight = BaseXcmWeight::get(); + let message = Xcm(vec![SubscribeVersion { + query_id: 0, + max_response_weight: 0, + }]); + let r = XcmExecutor::::execute_xcm(remote.clone(), message, weight); + assert_eq!(r, Outcome::Complete(weight)); + + let instr = QueryResponse { + query_id: 0, + max_weight: 0, + response: Response::Version(1), + }; + assert_eq!(take_sent_xcm(), vec![(remote.clone(), Xcm(vec![instr]))]); + + // A runtime upgrade which doesn't alter the version sends no notifications. + XcmPallet::on_runtime_upgrade(); + XcmPallet::on_initialize(1); + assert_eq!(take_sent_xcm(), vec![]); + + // New version. + AdvertisedXcmVersion::set(2); + + // A runtime upgrade which alters the version does send notifications. + XcmPallet::on_runtime_upgrade(); + XcmPallet::on_initialize(2); + let instr = QueryResponse { + query_id: 0, + max_weight: 0, + response: Response::Version(2), + }; + assert_eq!(take_sent_xcm(), vec![(remote.clone(), Xcm(vec![instr]))]); + }); +} + +#[test] +fn subscription_side_upgrades_work_with_notify() { + new_test_ext_with_balances(vec![]).execute_with(|| { + AdvertisedXcmVersion::set(1); + + // An entry from a previous runtime with v0 XCM. + let v0_location = xcm::v0::MultiLocation::X1(xcm::v0::Junction::Parachain(1000)); + let v0_location = VersionedMultiLocation::from(v0_location); + VersionNotifyTargets::::insert(0, v0_location, (69, 0, 1)); + let v1_location = Parachain(1001).into().versioned(); + VersionNotifyTargets::::insert(1, v1_location, (70, 0, 1)); + let v2_location = Parachain(1002).into().versioned(); + VersionNotifyTargets::::insert(2, v2_location, (71, 0, 1)); + + // New version. + AdvertisedXcmVersion::set(2); + + // A runtime upgrade which alters the version does send notifications. + XcmPallet::on_runtime_upgrade(); + XcmPallet::on_initialize(1); + + let instr0 = QueryResponse { + query_id: 69, + max_weight: 0, + response: Response::Version(2), + }; + let instr1 = QueryResponse { + query_id: 70, + max_weight: 0, + response: Response::Version(2), + }; + let instr2 = QueryResponse { + query_id: 71, + max_weight: 0, + response: Response::Version(2), + }; + let mut sent = take_sent_xcm(); + sent.sort_by_key(|k| match (k.1).0[0] { + QueryResponse { query_id: q, .. } => q, + _ => 0, + }); + assert_eq!( + sent, + vec![ + (Parachain(1000).into(), Xcm(vec![instr0])), + (Parachain(1001).into(), Xcm(vec![instr1])), + (Parachain(1002).into(), Xcm(vec![instr2])), + ] + ); + + let mut contents = VersionNotifyTargets::::iter().collect::>(); + contents.sort_by_key(|k| k.2); + assert_eq!( + contents, + vec![ + (2, Parachain(1000).into().versioned(), (69, 0, 2)), + (2, Parachain(1001).into().versioned(), (70, 0, 2)), + (2, Parachain(1002).into().versioned(), (71, 0, 2)), + ] + ); + }); +} + +#[test] +fn subscription_side_upgrades_work_without_notify() { + new_test_ext_with_balances(vec![]).execute_with(|| { + // An entry from a previous runtime with v0 XCM. + let v0_location = xcm::v0::MultiLocation::X1(xcm::v0::Junction::Parachain(1000)); + let v0_location = VersionedMultiLocation::from(v0_location); + VersionNotifyTargets::::insert(0, v0_location, (69, 0, 2)); + let v1_location = Parachain(1001).into().versioned(); + VersionNotifyTargets::::insert(1, v1_location, (70, 0, 2)); + let v2_location = Parachain(1002).into().versioned(); + VersionNotifyTargets::::insert(2, v2_location, (71, 0, 2)); + + // A runtime upgrade which alters the version does send notifications. + XcmPallet::on_runtime_upgrade(); + XcmPallet::on_initialize(1); + + let mut contents = VersionNotifyTargets::::iter().collect::>(); + contents.sort_by_key(|k| k.2); + assert_eq!( + contents, + vec![ + (2, Parachain(1000).into().versioned(), (69, 0, 2)), + (2, Parachain(1001).into().versioned(), (70, 0, 2)), + (2, Parachain(1002).into().versioned(), (71, 0, 2)), + ] + ); + }); +} + +#[test] +fn subscriber_side_subscription_works() { + new_test_ext_with_balances(vec![]).execute_with(|| { + let remote = Parachain(1000).into(); + assert_ok!(XcmPallet::force_subscribe_version_notify( + Origin::root(), + Box::new(remote.clone().into()), + )); + take_sent_xcm(); + + // Assume subscription target is working ok. + + let weight = BaseXcmWeight::get(); + let message = Xcm(vec![ + // Remote supports XCM v1 + QueryResponse { + query_id: 0, + max_weight: 0, + response: Response::Version(1), + }, + ]); + let r = XcmExecutor::::execute_xcm(remote.clone(), message, weight); + assert_eq!(r, Outcome::Complete(weight)); + assert_eq!(take_sent_xcm(), vec![]); + + // This message cannot be sent to a v1 remote. + let v2_msg = Xcm::<()>(vec![Trap(0)]); + assert_eq!(XcmPallet::wrap_version(&remote, v2_msg.clone()), Err(())); + + let message = Xcm(vec![ + // Remote upgraded to XCM v2 + QueryResponse { + query_id: 0, + max_weight: 0, + response: Response::Version(2), + }, + ]); + let r = XcmExecutor::::execute_xcm(remote.clone(), message, weight); + assert_eq!(r, Outcome::Complete(weight)); + + // This message can now be sent to remote as it's v2. + assert_eq!( + XcmPallet::wrap_version(&remote, v2_msg.clone()), + Ok(VersionedXcm::from(v2_msg)) + ); + }); +} + +/// We should auto-subscribe when we don't know the remote's version. +#[test] +fn auto_subscription_works() { + new_test_ext_with_balances(vec![]).execute_with(|| { + let remote0 = Parachain(1000).into(); + let remote1 = Parachain(1001).into(); + + assert_ok!(XcmPallet::force_default_xcm_version( + Origin::root(), + Some(1) + )); + + // Wrapping a version for a destination we don't know elicits a subscription. + let v1_msg = xcm::v1::Xcm::<()>::QueryResponse { + query_id: 1, + response: xcm::v1::Response::Assets(vec![].into()), + }; + let v2_msg = Xcm::<()>(vec![Trap(0)]); + assert_eq!( + XcmPallet::wrap_version(&remote0, v1_msg.clone()), + Ok(VersionedXcm::from(v1_msg.clone())), + ); + assert_eq!(XcmPallet::wrap_version(&remote0, v2_msg.clone()), Err(())); + let expected = vec![(remote0.clone().into(), 2)]; + assert_eq!(VersionDiscoveryQueue::::get().into_inner(), expected); + + assert_eq!(XcmPallet::wrap_version(&remote0, v2_msg.clone()), Err(())); + assert_eq!(XcmPallet::wrap_version(&remote1, v2_msg.clone()), Err(())); + let expected = vec![(remote0.clone().into(), 3), (remote1.clone().into(), 1)]; + assert_eq!(VersionDiscoveryQueue::::get().into_inner(), expected); + + XcmPallet::on_initialize(1); + assert_eq!( + take_sent_xcm(), + vec![( + remote0.clone(), + Xcm(vec![SubscribeVersion { + query_id: 0, + max_response_weight: 0 + }]), + )] + ); + + // Assume remote0 is working ok and XCM version 2. + + let weight = BaseXcmWeight::get(); + let message = Xcm(vec![ + // Remote supports XCM v2 + QueryResponse { + query_id: 0, + max_weight: 0, + response: Response::Version(2), + }, + ]); + let r = XcmExecutor::::execute_xcm(remote0.clone(), message, weight); + assert_eq!(r, Outcome::Complete(weight)); + + // This message can now be sent to remote0 as it's v2. + assert_eq!( + XcmPallet::wrap_version(&remote0, v2_msg.clone()), + Ok(VersionedXcm::from(v2_msg.clone())) + ); + + XcmPallet::on_initialize(2); + assert_eq!( + take_sent_xcm(), + vec![( + remote1.clone(), + Xcm(vec![SubscribeVersion { + query_id: 1, + max_response_weight: 0 + }]), + )] + ); + + // Assume remote1 is working ok and XCM version 1. + + let weight = BaseXcmWeight::get(); + let message = Xcm(vec![ + // Remote supports XCM v1 + QueryResponse { + query_id: 1, + max_weight: 0, + response: Response::Version(1), + }, + ]); + let r = XcmExecutor::::execute_xcm(remote1.clone(), message, weight); + assert_eq!(r, Outcome::Complete(weight)); + + // v2 messages cannot be sent to remote1... + assert_eq!( + XcmPallet::wrap_version(&remote1, v1_msg.clone()), + Ok(VersionedXcm::V1(v1_msg)) + ); + assert_eq!(XcmPallet::wrap_version(&remote1, v2_msg.clone()), Err(())); + }) +} + +#[test] +fn subscription_side_upgrades_work_with_multistage_notify() { + new_test_ext_with_balances(vec![]).execute_with(|| { + AdvertisedXcmVersion::set(1); + + // An entry from a previous runtime with v0 XCM. + let v0_location = xcm::v0::MultiLocation::X1(xcm::v0::Junction::Parachain(1000)); + let v0_location = VersionedMultiLocation::from(v0_location); + VersionNotifyTargets::::insert(0, v0_location, (69, 0, 1)); + let v1_location = Parachain(1001).into().versioned(); + VersionNotifyTargets::::insert(1, v1_location, (70, 0, 1)); + let v2_location = Parachain(1002).into().versioned(); + VersionNotifyTargets::::insert(2, v2_location, (71, 0, 1)); + + // New version. + AdvertisedXcmVersion::set(2); + + // A runtime upgrade which alters the version does send notifications. + XcmPallet::on_runtime_upgrade(); + let mut maybe_migration = CurrentMigration::::take(); + let mut counter = 0; + while let Some(migration) = maybe_migration.take() { + counter += 1; + let (_, m) = XcmPallet::check_xcm_version_change(migration, 0); + maybe_migration = m; + } + assert_eq!(counter, 4); + + let instr0 = QueryResponse { + query_id: 69, + max_weight: 0, + response: Response::Version(2), + }; + let instr1 = QueryResponse { + query_id: 70, + max_weight: 0, + response: Response::Version(2), + }; + let instr2 = QueryResponse { + query_id: 71, + max_weight: 0, + response: Response::Version(2), + }; + let mut sent = take_sent_xcm(); + sent.sort_by_key(|k| match (k.1).0[0] { + QueryResponse { query_id: q, .. } => q, + _ => 0, + }); + assert_eq!( + sent, + vec![ + (Parachain(1000).into(), Xcm(vec![instr0])), + (Parachain(1001).into(), Xcm(vec![instr1])), + (Parachain(1002).into(), Xcm(vec![instr2])), + ] + ); + + let mut contents = VersionNotifyTargets::::iter().collect::>(); + contents.sort_by_key(|k| k.2); + assert_eq!( + contents, + vec![ + (2, Parachain(1000).into().versioned(), (69, 0, 2)), + (2, Parachain(1001).into().versioned(), (70, 0, 2)), + (2, Parachain(1002).into().versioned(), (71, 0, 2)), + ] + ); + }); +}